ipmi: fix statistics counting issues
[safe/jmp/linux-2.6] / drivers / net / atarilance.c
index 97cca50..5425ab0 100644 (file)
@@ -224,7 +224,6 @@ struct lance_private {
        int                     dirty_tx;               /* Ring entries to be freed. */
                                /* copy function */
        void                    *(*memcpy_f)( void *, const void *, size_t );
-       struct net_device_stats stats;
 /* This must be long for set_bit() */
        long                    tx_full;
        spinlock_t              devlock;
@@ -244,7 +243,7 @@ struct lance_private {
 
 /* Possible memory/IO addresses for probing */
 
-struct lance_addr {
+static struct lance_addr {
        unsigned long   memaddr;
        unsigned long   ioaddr;
        int                             slow_flag;
@@ -263,7 +262,7 @@ struct lance_addr {
                                                                           (highest byte stripped) */
 };
 
-#define        N_LANCE_ADDR    (sizeof(lance_addr_list)/sizeof(*lance_addr_list))
+#define        N_LANCE_ADDR    ARRAY_SIZE(lance_addr_list)
 
 
 /* Definitions for the Lance */
@@ -337,8 +336,6 @@ struct lance_addr {
 
 /***************************** Prototypes *****************************/
 
-static int addr_accessible( volatile void *regp, int wordflag, int
-                            writeflag );
 static unsigned long lance_probe1( struct net_device *dev, struct lance_addr
                                    *init_rec );
 static int lance_open( struct net_device *dev );
@@ -347,7 +344,6 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev );
 static irqreturn_t lance_interrupt( int irq, void *dev_id );
 static int lance_rx( struct net_device *dev );
 static int lance_close( struct net_device *dev );
-static struct net_device_stats *lance_get_stats( struct net_device *dev );
 static void set_multicast_list( struct net_device *dev );
 static int lance_set_mac_address( struct net_device *dev, void *addr );
 static void lance_tx_timeout (struct net_device *dev);
@@ -408,7 +404,8 @@ struct net_device * __init atarilance_probe(int unit)
 
 /* Derived from hwreg_present() in atari/config.c: */
 
-static int __init addr_accessible( volatile void *regp, int wordflag, int writeflag )
+static noinline int __init addr_accessible(volatile void *regp, int wordflag,
+                                          int writeflag)
 {
        int             ret;
        long    flags;
@@ -456,6 +453,16 @@ static int __init addr_accessible( volatile void *regp, int wordflag, int writef
        return( ret );
 }
 
+static const struct net_device_ops lance_netdev_ops = {
+       .ndo_open               = lance_open,
+       .ndo_stop               = lance_close,
+       .ndo_start_xmit         = lance_start_xmit,
+       .ndo_set_multicast_list = set_multicast_list,
+       .ndo_set_mac_address    = lance_set_mac_address,
+       .ndo_tx_timeout         = lance_tx_timeout,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_change_mtu         = eth_change_mtu,
+};
 
 static unsigned long __init lance_probe1( struct net_device *dev,
                                           struct lance_addr *init_rec )
@@ -523,7 +530,7 @@ static unsigned long __init lance_probe1( struct net_device *dev,
        return( 0 );
 
   probe_ok:
-       lp = (struct lance_private *)dev->priv;
+       lp = netdev_priv(dev);
        MEM = (struct lance_memory *)memaddr;
        IO = lp->iobase = (struct lance_ioreg *)ioaddr;
        dev->base_addr = (unsigned long)ioaddr; /* informational only */
@@ -597,8 +604,7 @@ static unsigned long __init lance_probe1( struct net_device *dev,
                i = IO->mem;
                break;
        }
-       for( i = 0; i < 6; ++i )
-               printk( "%02x%s", dev->dev_addr[i], (i < 5) ? ":" : "\n" );
+       printk("%pM\n", dev->dev_addr);
        if (lp->cardtype == OLD_RIEBL) {
                printk( "%s: Warning: This is a default ethernet address!\n",
                                dev->name );
@@ -627,32 +633,18 @@ static unsigned long __init lance_probe1( struct net_device *dev,
        if (did_version++ == 0)
                DPRINTK( 1, ( version ));
 
-       /* The LANCE-specific entries in the device structure. */
-       dev->open = &lance_open;
-       dev->hard_start_xmit = &lance_start_xmit;
-       dev->stop = &lance_close;
-       dev->get_stats = &lance_get_stats;
-       dev->set_multicast_list = &set_multicast_list;
-       dev->set_mac_address = &lance_set_mac_address;
+       dev->netdev_ops = &lance_netdev_ops;
 
        /* XXX MSch */
-       dev->tx_timeout = lance_tx_timeout;
        dev->watchdog_timeo = TX_TIMEOUT;
 
-
-#if 0
-       dev->start = 0;
-#endif
-
-       memset( &lp->stats, 0, sizeof(lp->stats) );
-
        return( 1 );
 }
 
 
 static int lance_open( struct net_device *dev )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
+{
+       struct lance_private *lp = netdev_priv(dev);
        struct lance_ioreg       *IO = lp->iobase;
        int i;
 
@@ -692,8 +684,8 @@ static int lance_open( struct net_device *dev )
 /* Initialize the LANCE Rx and Tx rings. */
 
 static void lance_init_ring( struct net_device *dev )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
+{
+       struct lance_private *lp = netdev_priv(dev);
        int i;
        unsigned offset;
 
@@ -741,7 +733,7 @@ static void lance_init_ring( struct net_device *dev )
 
 static void lance_tx_timeout (struct net_device *dev)
 {
-       struct lance_private *lp = (struct lance_private *) dev->priv;
+       struct lance_private *lp = netdev_priv(dev);
        struct lance_ioreg       *IO = lp->iobase;
 
        AREG = CSR0;
@@ -753,7 +745,7 @@ static void lance_tx_timeout (struct net_device *dev)
         * little endian mode.
         */
        REGA( CSR3 ) = CSR3_BSWP | (lp->cardtype == PAM_CARD ? CSR3_ACON : 0);
-       lp->stats.tx_errors++;
+       dev->stats.tx_errors++;
 #ifndef final_version
                {       int i;
                        DPRINTK( 2, ( "Ring data: dirty_tx %d cur_tx %d%s cur_rx %d\n",
@@ -783,8 +775,8 @@ static void lance_tx_timeout (struct net_device *dev)
 /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
 
 static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
+{
+       struct lance_private *lp = netdev_priv(dev);
        struct lance_ioreg       *IO = lp->iobase;
        int entry, len;
        struct lance_tx_head *head;
@@ -811,17 +803,11 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
 
        /* Fill in a Tx ring entry */
        if (lance_debug >= 3) {
-               u_char *p;
-               int i;
-               printk( "%s: TX pkt type 0x%04x from ", dev->name,
-                               ((u_short *)skb->data)[6]);
-               for( p = &((u_char *)skb->data)[6], i = 0; i < 6; i++ )
-                       printk("%02x%s", *p++, i != 5 ? ":" : "" );
-               printk(" to ");
-               for( p = (u_char *)skb->data, i = 0; i < 6; i++ )
-                       printk("%02x%s", *p++, i != 5 ? ":" : "" );
-               printk(" data at 0x%08x len %d\n", (int)skb->data,
-                          (int)skb->len );
+               printk( "%s: TX pkt type 0x%04x from %pM to %pM"
+                               " data at 0x%08x len %d\n",
+                               dev->name, ((u_short *)skb->data)[6],
+                               &skb->data[6], skb->data,
+                               (int)skb->data, (int)skb->len );
        }
 
        /* We're not prepared for the int until the last flags are set/reset. And
@@ -841,7 +827,7 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
        head->misc = 0;
        lp->memcpy_f( PKTBUF_ADDR(head), (void *)skb->data, skb->len );
        head->flag = TMD1_OWN_CHIP | TMD1_ENP | TMD1_STP;
-       lp->stats.tx_bytes += skb->len;
+       dev->stats.tx_bytes += skb->len;
        dev_kfree_skb( skb );
        lp->cur_tx++;
        while( lp->cur_tx >= TX_RING_SIZE && lp->dirty_tx >= TX_RING_SIZE ) {
@@ -878,7 +864,7 @@ static irqreturn_t lance_interrupt( int irq, void *dev_id )
                return IRQ_NONE;
        }
 
-       lp = (struct lance_private *)dev->priv;
+       lp = netdev_priv(dev);
        IO = lp->iobase;
        spin_lock (&lp->devlock);
 
@@ -912,13 +898,13 @@ static irqreturn_t lance_interrupt( int irq, void *dev_id )
                                if (status & TMD1_ERR) {
                                        /* There was an major error, log it. */
                                        int err_status = MEM->tx_head[entry].misc;
-                                       lp->stats.tx_errors++;
-                                       if (err_status & TMD3_RTRY) lp->stats.tx_aborted_errors++;
-                                       if (err_status & TMD3_LCAR) lp->stats.tx_carrier_errors++;
-                                       if (err_status & TMD3_LCOL) lp->stats.tx_window_errors++;
+                                       dev->stats.tx_errors++;
+                                       if (err_status & TMD3_RTRY) dev->stats.tx_aborted_errors++;
+                                       if (err_status & TMD3_LCAR) dev->stats.tx_carrier_errors++;
+                                       if (err_status & TMD3_LCOL) dev->stats.tx_window_errors++;
                                        if (err_status & TMD3_UFLO) {
                                                /* Ackk!  On FIFO errors the Tx unit is turned off! */
-                                               lp->stats.tx_fifo_errors++;
+                                               dev->stats.tx_fifo_errors++;
                                                /* Remove this verbosity later! */
                                                DPRINTK( 1, ( "%s: Tx FIFO error! Status %04x\n",
                                                                          dev->name, csr0 ));
@@ -927,8 +913,8 @@ static irqreturn_t lance_interrupt( int irq, void *dev_id )
                                        }
                                } else {
                                        if (status & (TMD1_MORE | TMD1_ONE | TMD1_DEF))
-                                               lp->stats.collisions++;
-                                       lp->stats.tx_packets++;
+                                               dev->stats.collisions++;
+                                       dev->stats.tx_packets++;
                                }
 
                                /* XXX MSch: free skb?? */
@@ -955,8 +941,8 @@ static irqreturn_t lance_interrupt( int irq, void *dev_id )
                }
 
                /* Log misc errors. */
-               if (csr0 & CSR0_BABL) lp->stats.tx_errors++; /* Tx babble. */
-               if (csr0 & CSR0_MISS) lp->stats.rx_errors++; /* Missed a Rx frame. */
+               if (csr0 & CSR0_BABL) dev->stats.tx_errors++; /* Tx babble. */
+               if (csr0 & CSR0_MISS) dev->stats.rx_errors++; /* Missed a Rx frame. */
                if (csr0 & CSR0_MERR) {
                        DPRINTK( 1, ( "%s: Bus master arbitration failure (?!?), "
                                                  "status %04x.\n", dev->name, csr0 ));
@@ -978,8 +964,8 @@ static irqreturn_t lance_interrupt( int irq, void *dev_id )
 
 
 static int lance_rx( struct net_device *dev )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
+{
+       struct lance_private *lp = netdev_priv(dev);
        int entry = lp->cur_rx & RX_RING_MOD_MASK;
        int i;
 
@@ -997,11 +983,11 @@ static int lance_rx( struct net_device *dev )
                           buffers it's possible for a jabber packet to use two
                           buffers, with only the last correctly noting the error. */
                        if (status & RMD1_ENP)  /* Only count a general error at the */
-                               lp->stats.rx_errors++; /* end of a packet.*/
-                       if (status & RMD1_FRAM) lp->stats.rx_frame_errors++;
-                       if (status & RMD1_OFLO) lp->stats.rx_over_errors++;
-                       if (status & RMD1_CRC) lp->stats.rx_crc_errors++;
-                       if (status & RMD1_BUFF) lp->stats.rx_fifo_errors++;
+                               dev->stats.rx_errors++; /* end of a packet.*/
+                       if (status & RMD1_FRAM) dev->stats.rx_frame_errors++;
+                       if (status & RMD1_OFLO) dev->stats.rx_over_errors++;
+                       if (status & RMD1_CRC) dev->stats.rx_crc_errors++;
+                       if (status & RMD1_BUFF) dev->stats.rx_fifo_errors++;
                        head->flag &= (RMD1_ENP|RMD1_STP);
                } else {
                        /* Malloc up new buffer, compatible with net-3. */
@@ -1010,7 +996,7 @@ static int lance_rx( struct net_device *dev )
 
                        if (pkt_len < 60) {
                                printk( "%s: Runt packet!\n", dev->name );
-                               lp->stats.rx_errors++;
+                               dev->stats.rx_errors++;
                        }
                        else {
                                skb = dev_alloc_skb( pkt_len+2 );
@@ -1023,7 +1009,7 @@ static int lance_rx( struct net_device *dev )
                                                        break;
 
                                        if (i > RX_RING_SIZE - 2) {
-                                               lp->stats.rx_dropped++;
+                                               dev->stats.rx_dropped++;
                                                head->flag |= RMD1_OWN_CHIP;
                                                lp->cur_rx++;
                                        }
@@ -1031,19 +1017,16 @@ static int lance_rx( struct net_device *dev )
                                }
 
                                if (lance_debug >= 3) {
-                                       u_char *data = PKTBUF_ADDR(head), *p;
-                                       printk( "%s: RX pkt type 0x%04x from ", dev->name,
-                                                       ((u_short *)data)[6]);
-                                       for( p = &data[6], i = 0; i < 6; i++ )
-                                               printk("%02x%s", *p++, i != 5 ? ":" : "" );
-                                       printk(" to ");
-                                       for( p = data, i = 0; i < 6; i++ )
-                                               printk("%02x%s", *p++, i != 5 ? ":" : "" );
-                                       printk(" data %02x %02x %02x %02x %02x %02x %02x %02x "
+                                       u_char *data = PKTBUF_ADDR(head);
+
+                                       printk(KERN_DEBUG "%s: RX pkt type 0x%04x from %pM to %pM "
+                                                  "data %02x %02x %02x %02x %02x %02x %02x %02x "
                                                   "len %d\n",
+                                                  dev->name, ((u_short *)data)[6],
+                                                  &data[6], data,
                                                   data[15], data[16], data[17], data[18],
                                                   data[19], data[20], data[21], data[22],
-                                                  pkt_len );
+                                                  pkt_len);
                                }
 
                                skb_reserve( skb, 2 );  /* 16 byte align */
@@ -1051,9 +1034,8 @@ static int lance_rx( struct net_device *dev )
                                lp->memcpy_f( skb->data, PKTBUF_ADDR(head), pkt_len );
                                skb->protocol = eth_type_trans( skb, dev );
                                netif_rx( skb );
-                               dev->last_rx = jiffies;
-                               lp->stats.rx_packets++;
-                               lp->stats.rx_bytes += pkt_len;
+                               dev->stats.rx_packets++;
+                               dev->stats.rx_bytes += pkt_len;
                        }
                }
 
@@ -1071,8 +1053,8 @@ static int lance_rx( struct net_device *dev )
 
 
 static int lance_close( struct net_device *dev )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
+{
+       struct lance_private *lp = netdev_priv(dev);
        struct lance_ioreg       *IO = lp->iobase;
 
        netif_stop_queue (dev);
@@ -1090,14 +1072,6 @@ static int lance_close( struct net_device *dev )
 }
 
 
-static struct net_device_stats *lance_get_stats( struct net_device *dev )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
-
-       return &lp->stats;
-}
-
-
 /* Set or clear the multicast filter for this adaptor.
    num_addrs == -1             Promiscuous mode, receive all packets
    num_addrs == 0              Normal mode, clear multicast list
@@ -1106,8 +1080,8 @@ static struct net_device_stats *lance_get_stats( struct net_device *dev )
  */
 
 static void set_multicast_list( struct net_device *dev )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
+{
+       struct lance_private *lp = netdev_priv(dev);
        struct lance_ioreg       *IO = lp->iobase;
 
        if (netif_running(dev))
@@ -1148,8 +1122,8 @@ static void set_multicast_list( struct net_device *dev )
 /* This is needed for old RieblCards and possible for new RieblCards */
 
 static int lance_set_mac_address( struct net_device *dev, void *addr )
-
-{      struct lance_private *lp = (struct lance_private *)dev->priv;
+{
+       struct lance_private *lp = netdev_priv(dev);
        struct sockaddr *saddr = addr;
        int i;
 
@@ -1177,7 +1151,7 @@ static int lance_set_mac_address( struct net_device *dev, void *addr )
 #ifdef MODULE
 static struct net_device *atarilance_dev;
 
-int __init init_module(void)
+static int __init atarilance_module_init(void)
 {
        atarilance_dev = atarilance_probe(-1);
        if (IS_ERR(atarilance_dev))
@@ -1185,13 +1159,14 @@ int __init init_module(void)
        return 0;
 }
 
-void __exit cleanup_module(void)
+static void __exit atarilance_module_exit(void)
 {
        unregister_netdev(atarilance_dev);
        free_irq(atarilance_dev->irq, atarilance_dev);
        free_netdev(atarilance_dev);
 }
-
+module_init(atarilance_module_init);
+module_exit(atarilance_module_exit);
 #endif /* MODULE */