Blackfin SPI Driver: fix bug - spi controller driver does not assert/deassert CS...
[safe/jmp/linux-2.6] / drivers / net / a2065.c
index d76548e..d0d0c2f 100644 (file)
@@ -119,7 +119,6 @@ struct lance_private {
        int lance_log_rx_bufs, lance_log_tx_bufs;
        int rx_ring_mod_mask, tx_ring_mod_mask;
 
-       struct net_device_stats stats;
        int tpe;                      /* cable-selection is TPE */
        int auto_select;              /* cable-selection by carrier */
        unsigned short busmaster_regval;
@@ -270,8 +269,6 @@ static int lance_rx (struct net_device *dev)
        volatile struct lance_regs *ll = lp->ll;
        volatile struct lance_rx_desc *rd;
        unsigned char bits;
-       int len = 0;                    /* XXX shut up gcc warnings */
-       struct sk_buff *skb = 0;        /* XXX shut up gcc warnings */
 
 #ifdef TEST_HITS
        int i;
@@ -294,43 +291,41 @@ static int lance_rx (struct net_device *dev)
 
                /* We got an incomplete frame? */
                if ((bits & LE_R1_POK) != LE_R1_POK) {
-                       lp->stats.rx_over_errors++;
-                       lp->stats.rx_errors++;
+                       dev->stats.rx_over_errors++;
+                       dev->stats.rx_errors++;
                        continue;
                } else if (bits & LE_R1_ERR) {
                        /* Count only the end frame as a rx error,
                         * not the beginning
                         */
-                       if (bits & LE_R1_BUF) lp->stats.rx_fifo_errors++;
-                       if (bits & LE_R1_CRC) lp->stats.rx_crc_errors++;
-                       if (bits & LE_R1_OFL) lp->stats.rx_over_errors++;
-                       if (bits & LE_R1_FRA) lp->stats.rx_frame_errors++;
-                       if (bits & LE_R1_EOP) lp->stats.rx_errors++;
+                       if (bits & LE_R1_BUF) dev->stats.rx_fifo_errors++;
+                       if (bits & LE_R1_CRC) dev->stats.rx_crc_errors++;
+                       if (bits & LE_R1_OFL) dev->stats.rx_over_errors++;
+                       if (bits & LE_R1_FRA) dev->stats.rx_frame_errors++;
+                       if (bits & LE_R1_EOP) dev->stats.rx_errors++;
                } else {
-                       len = (rd->mblength & 0xfff) - 4;
-                       skb = dev_alloc_skb (len+2);
+                       int len = (rd->mblength & 0xfff) - 4;
+                       struct sk_buff *skb = dev_alloc_skb (len+2);
 
-                       if (skb == 0) {
+                       if (!skb) {
                                printk(KERN_WARNING "%s: Memory squeeze, "
                                       "deferring packet.\n", dev->name);
-                               lp->stats.rx_dropped++;
+                               dev->stats.rx_dropped++;
                                rd->mblength = 0;
                                rd->rmd1_bits = LE_R1_OWN;
                                lp->rx_new = (lp->rx_new + 1) & lp->rx_ring_mod_mask;
                                return 0;
                        }
 
-                       skb->dev = dev;
                        skb_reserve (skb, 2);           /* 16 byte align */
                        skb_put (skb, len);             /* make room */
-                       eth_copy_and_sum(skb,
+                       skb_copy_to_linear_data(skb,
                                         (unsigned char *)&(ib->rx_buf [lp->rx_new][0]),
-                                        len, 0);
+                                        len);
                        skb->protocol = eth_type_trans (skb, dev);
                        netif_rx (skb);
-                       dev->last_rx = jiffies;
-                       lp->stats.rx_packets++;
-                       lp->stats.rx_bytes += len;
+                       dev->stats.rx_packets++;
+                       dev->stats.rx_bytes += len;
                }
 
                /* Return the packet to the pool */
@@ -365,12 +360,12 @@ static int lance_tx (struct net_device *dev)
                if (td->tmd1_bits & LE_T1_ERR) {
                        status = td->misc;
 
-                       lp->stats.tx_errors++;
-                       if (status & LE_T3_RTY)  lp->stats.tx_aborted_errors++;
-                       if (status & LE_T3_LCOL) lp->stats.tx_window_errors++;
+                       dev->stats.tx_errors++;
+                       if (status & LE_T3_RTY)  dev->stats.tx_aborted_errors++;
+                       if (status & LE_T3_LCOL) dev->stats.tx_window_errors++;
 
                        if (status & LE_T3_CLOS) {
-                               lp->stats.tx_carrier_errors++;
+                               dev->stats.tx_carrier_errors++;
                                if (lp->auto_select) {
                                        lp->tpe = 1 - lp->tpe;
                                        printk(KERN_ERR "%s: Carrier Lost, "
@@ -389,7 +384,7 @@ static int lance_tx (struct net_device *dev)
                        /* buffer errors and underflows turn off the transmitter */
                        /* Restart the adapter */
                        if (status & (LE_T3_BUF|LE_T3_UFL)) {
-                               lp->stats.tx_fifo_errors++;
+                               dev->stats.tx_fifo_errors++;
 
                                printk(KERN_ERR "%s: Tx: ERR_BUF|ERR_UFL, "
                                       "restarting\n", dev->name);
@@ -409,13 +404,13 @@ static int lance_tx (struct net_device *dev)
 
                        /* One collision before packet was sent. */
                        if (td->tmd1_bits & LE_T1_EONE)
-                               lp->stats.collisions++;
+                               dev->stats.collisions++;
 
                        /* More than one collision, be optimistic. */
                        if (td->tmd1_bits & LE_T1_EMORE)
-                               lp->stats.collisions += 2;
+                               dev->stats.collisions += 2;
 
-                       lp->stats.tx_packets++;
+                       dev->stats.tx_packets++;
                }
 
                j = (j + 1) & lp->tx_ring_mod_mask;
@@ -460,9 +455,9 @@ static irqreturn_t lance_interrupt (int irq, void *dev_id)
 
        /* Log misc errors. */
        if (csr0 & LE_C0_BABL)
-               lp->stats.tx_errors++;       /* Tx babble. */
+               dev->stats.tx_errors++;       /* Tx babble. */
        if (csr0 & LE_C0_MISS)
-               lp->stats.rx_errors++;       /* Missed a Rx frame. */
+               dev->stats.rx_errors++;       /* Missed a Rx frame. */
        if (csr0 & LE_C0_MERR) {
                printk(KERN_ERR "%s: Bus master arbitration failure, status "
                       "%4.4x.\n", dev->name, csr0);
@@ -479,16 +474,12 @@ static irqreturn_t lance_interrupt (int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-struct net_device *last_dev = 0;
-
 static int lance_open (struct net_device *dev)
 {
        struct lance_private *lp = netdev_priv(dev);
        volatile struct lance_regs *ll = lp->ll;
        int ret;
 
-       last_dev = dev;
-
        /* Stop the Lance */
        ll->rap = LE_CSR0;
        ll->rdp = LE_C0_STOP;
@@ -561,19 +552,13 @@ static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev)
        struct lance_private *lp = netdev_priv(dev);
        volatile struct lance_regs *ll = lp->ll;
        volatile struct lance_init_block *ib = lp->init_block;
-       int entry, skblen, len;
+       int entry, skblen;
        int status = 0;
-       static int outs;
        unsigned long flags;
 
-       skblen = skb->len;
-       len = skblen;
-
-       if (len < ETH_ZLEN) {
-               len = ETH_ZLEN;
-               if (skb_padto(skb, ETH_ZLEN))
-                       return 0;
-       }
+       if (skb_padto(skb, ETH_ZLEN))
+               return 0;
+       skblen = max_t(unsigned, skb->len, ETH_ZLEN);
 
        local_irq_save(flags);
 
@@ -596,20 +581,15 @@ static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev)
        }
 #endif
        entry = lp->tx_new & lp->tx_ring_mod_mask;
-       ib->btx_ring [entry].length = (-len) | 0xf000;
+       ib->btx_ring [entry].length = (-skblen) | 0xf000;
        ib->btx_ring [entry].misc = 0;
 
-       memcpy ((char *)&ib->tx_buf [entry][0], skb->data, skblen);
-
-       /* Clear the slack of the packet, do I need this? */
-       if (len != skblen)
-               memset ((char *) &ib->tx_buf [entry][skblen], 0, len - skblen);
+       skb_copy_from_linear_data(skb, (void *)&ib->tx_buf [entry][0], skblen);
 
        /* Now, give the packet to the lance */
        ib->btx_ring [entry].tmd1_bits = (LE_T1_POK|LE_T1_OWN);
        lp->tx_new = (lp->tx_new+1) & lp->tx_ring_mod_mask;
-
-       outs++;
+       dev->stats.tx_bytes += skblen;
 
        if (TX_BUFFS_AVAIL <= 0)
                netif_stop_queue(dev);
@@ -624,13 +604,6 @@ static int lance_start_xmit (struct sk_buff *skb, struct net_device *dev)
        return status;
 }
 
-static struct net_device_stats *lance_get_stats (struct net_device *dev)
-{
-       struct lance_private *lp = netdev_priv(dev);
-
-       return &lp->stats;
-}
-
 /* taken from the depca driver */
 static void lance_load_multicast (struct net_device *dev)
 {
@@ -749,7 +722,6 @@ static int __devinit a2065_init_one(struct zorro_dev *z,
                return -ENOMEM;
        }
 
-       SET_MODULE_OWNER(dev);
        priv = netdev_priv(dev);
 
        r1->name = dev->name;
@@ -786,7 +758,6 @@ static int __devinit a2065_init_one(struct zorro_dev *z,
        dev->hard_start_xmit = &lance_start_xmit;
        dev->tx_timeout = &lance_tx_timeout;
        dev->watchdog_timeo = 5*HZ;
-       dev->get_stats = &lance_get_stats;
        dev->set_multicast_list = &lance_set_multicast;
        dev->dma = 0;
 
@@ -805,9 +776,7 @@ static int __devinit a2065_init_one(struct zorro_dev *z,
        zorro_set_drvdata(z, dev);
 
        printk(KERN_INFO "%s: A2065 at 0x%08lx, Ethernet Address "
-              "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, board,
-              dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-              dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+              "%pM\n", dev->name, board, dev->dev_addr);
 
        return 0;
 }