USB: fix double frees in error code paths of ipaq driver
[cascardo/linux.git] / drivers / net / smc91x.c
index 49f4b77..24e610e 100644 (file)
@@ -183,13 +183,6 @@ struct smc_local {
        struct sk_buff *pending_tx_skb;
        struct tasklet_struct tx_task;
 
-       /*
-        * these are things that the kernel wants me to keep, so users
-        * can find out semi-useless statistics of how well the card is
-        * performing
-        */
-       struct net_device_stats stats;
-
        /* version/revision of the SMC91x chip */
        int     version;
 
@@ -332,8 +325,8 @@ static void smc_reset(struct net_device *dev)
        /* free any pending tx skb */
        if (pending_skb) {
                dev_kfree_skb(pending_skb);
-               lp->stats.tx_errors++;
-               lp->stats.tx_aborted_errors++;
+               dev->stats.tx_errors++;
+               dev->stats.tx_aborted_errors++;
        }
 
        /*
@@ -512,13 +505,13 @@ static inline void  smc_rcv(struct net_device *dev)
                }
                SMC_WAIT_MMU_BUSY();
                SMC_SET_MMU_CMD(MC_RELEASE);
-               lp->stats.rx_errors++;
+               dev->stats.rx_errors++;
                if (status & RS_ALGNERR)
-                       lp->stats.rx_frame_errors++;
+                       dev->stats.rx_frame_errors++;
                if (status & (RS_TOOSHORT | RS_TOOLONG))
-                       lp->stats.rx_length_errors++;
+                       dev->stats.rx_length_errors++;
                if (status & RS_BADCRC)
-                       lp->stats.rx_crc_errors++;
+                       dev->stats.rx_crc_errors++;
        } else {
                struct sk_buff *skb;
                unsigned char *data;
@@ -526,7 +519,7 @@ static inline void  smc_rcv(struct net_device *dev)
 
                /* set multicast stats */
                if (status & RS_MULTICAST)
-                       lp->stats.multicast++;
+                       dev->stats.multicast++;
 
                /*
                 * Actual payload is packet_len - 6 (or 5 if odd byte).
@@ -542,7 +535,7 @@ static inline void  smc_rcv(struct net_device *dev)
                                dev->name);
                        SMC_WAIT_MMU_BUSY();
                        SMC_SET_MMU_CMD(MC_RELEASE);
-                       lp->stats.rx_dropped++;
+                       dev->stats.rx_dropped++;
                        return;
                }
 
@@ -568,11 +561,10 @@ static inline void  smc_rcv(struct net_device *dev)
                PRINT_PKT(data, packet_len - 4);
 
                dev->last_rx = jiffies;
-               skb->dev = dev;
                skb->protocol = eth_type_trans(skb, dev);
                netif_rx(skb);
-               lp->stats.rx_packets++;
-               lp->stats.rx_bytes += data_len;
+               dev->stats.rx_packets++;
+               dev->stats.rx_bytes += data_len;
        }
 }
 
@@ -645,8 +637,8 @@ static void smc_hardware_send_pkt(unsigned long data)
        packet_no = SMC_GET_AR();
        if (unlikely(packet_no & AR_FAILED)) {
                printk("%s: Memory allocation failed.\n", dev->name);
-               lp->stats.tx_errors++;
-               lp->stats.tx_fifo_errors++;
+               dev->stats.tx_errors++;
+               dev->stats.tx_fifo_errors++;
                smc_special_unlock(&lp->lock);
                goto done;
        }
@@ -689,8 +681,8 @@ static void smc_hardware_send_pkt(unsigned long data)
        smc_special_unlock(&lp->lock);
 
        dev->trans_start = jiffies;
-       lp->stats.tx_packets++;
-       lp->stats.tx_bytes += len;
+       dev->stats.tx_packets++;
+       dev->stats.tx_bytes += len;
 
        SMC_ENABLE_INT(IM_TX_INT | IM_TX_EMPTY_INT);
 
@@ -730,8 +722,8 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        numPages = ((skb->len & ~1) + (6 - 1)) >> 8;
        if (unlikely(numPages > 7)) {
                printk("%s: Far too big packet error.\n", dev->name);
-               lp->stats.tx_errors++;
-               lp->stats.tx_dropped++;
+               dev->stats.tx_errors++;
+               dev->stats.tx_dropped++;
                dev_kfree_skb(skb);
                return 0;
        }
@@ -804,17 +796,17 @@ static void smc_tx(struct net_device *dev)
                dev->name, tx_status, packet_no);
 
        if (!(tx_status & ES_TX_SUC))
-               lp->stats.tx_errors++;
+               dev->stats.tx_errors++;
 
        if (tx_status & ES_LOSTCARR)
-               lp->stats.tx_carrier_errors++;
+               dev->stats.tx_carrier_errors++;
 
        if (tx_status & (ES_LATCOL | ES_16COL)) {
                PRINTK("%s: %s occurred on last xmit\n", dev->name,
                       (tx_status & ES_LATCOL) ?
                        "late collision" : "too many collisions");
-               lp->stats.tx_window_errors++;
-               if (!(lp->stats.tx_window_errors & 63) && net_ratelimit()) {
+               dev->stats.tx_window_errors++;
+               if (!(dev->stats.tx_window_errors & 63) && net_ratelimit()) {
                        printk(KERN_INFO "%s: unexpectedly large number of "
                               "bad collisions. Please check duplex "
                               "setting.\n", dev->name);
@@ -1348,19 +1340,19 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id)
                        SMC_SELECT_BANK(2);
 
                        /* single collisions */
-                       lp->stats.collisions += card_stats & 0xF;
+                       dev->stats.collisions += card_stats & 0xF;
                        card_stats >>= 4;
 
                        /* multiple collisions */
-                       lp->stats.collisions += card_stats & 0xF;
+                       dev->stats.collisions += card_stats & 0xF;
                } else if (status & IM_RX_OVRN_INT) {
                        DBG(1, "%s: RX overrun (EPH_ST 0x%04x)\n", dev->name,
                               ({ int eph_st; SMC_SELECT_BANK(0);
                                  eph_st = SMC_GET_EPH_STATUS();
                                  SMC_SELECT_BANK(2); eph_st; }) );
                        SMC_ACK_INT(IM_RX_OVRN_INT);
-                       lp->stats.rx_errors++;
-                       lp->stats.rx_fifo_errors++;
+                       dev->stats.rx_errors++;
+                       dev->stats.rx_fifo_errors++;
                } else if (status & IM_EPH_INT) {
                        smc_eph_interrupt(dev);
                } else if (status & IM_MDINT) {
@@ -1628,19 +1620,6 @@ static int smc_close(struct net_device *dev)
        return 0;
 }
 
-/*
- * Get the current statistics.
- * This may be called with the card open or closed.
- */
-static struct net_device_stats *smc_query_statistics(struct net_device *dev)
-{
-       struct smc_local *lp = netdev_priv(dev);
-
-       DBG(2, "%s: %s\n", dev->name, __FUNCTION__);
-
-       return &lp->stats;
-}
-
 /*
  * Ethtool support
  */
@@ -1843,9 +1822,10 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
 {
        struct smc_local *lp = netdev_priv(dev);
        static int version_printed = 0;
-       int i, retval;
+       int retval;
        unsigned int val, revision_register;
        const char *version_string;
+       DECLARE_MAC_BUF(mac);
 
        DBG(2, "%s: %s\n", CARDNAME, __FUNCTION__);
 
@@ -1966,7 +1946,6 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
        dev->hard_start_xmit = smc_hard_start_xmit;
        dev->tx_timeout = smc_timeout;
        dev->watchdog_timeo = msecs_to_jiffies(watchdog);
-       dev->get_stats = smc_query_statistics;
        dev->set_multicast_list = smc_set_multicast_list;
        dev->ethtool_ops = &smc_ethtool_ops;
 #ifdef CONFIG_NET_POLL_CONTROLLER
@@ -2036,10 +2015,8 @@ static int __init smc_probe(struct net_device *dev, void __iomem *ioaddr)
                               "set using ifconfig\n", dev->name);
                } else {
                        /* Print the Ethernet address */
-                       printk("%s: Ethernet addr: ", dev->name);
-                       for (i = 0; i < 5; i++)
-                               printk("%2.2x:", dev->dev_addr[i]);
-                       printk("%2.2x\n", dev->dev_addr[5]);
+                       printk("%s: Ethernet addr: %s\n",
+                              dev->name, print_mac(mac, dev->dev_addr));
                }
 
                if (lp->phy_type == 0) {
@@ -2213,7 +2190,6 @@ static int smc_drv_probe(struct platform_device *pdev)
                ret = -ENOMEM;
                goto out_release_io;
        }
-       SET_MODULE_OWNER(ndev);
        SET_NETDEV_DEV(ndev, &pdev->dev);
 
        ndev->dma = (unsigned char)-1;