merge r13720 to 8.09
[openwrt/svn-archive/archive.git] / target / linux / atheros / files / drivers / net / ar2313 / ar2313.c
index fb1efa19c1677a86cf756c2a7dde4d26d213d6b3..995325a9136b86384d7bf469b6548180220ce52a 100644 (file)
@@ -188,7 +188,7 @@ int __init ar2313_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, dev);
 
-       sp = dev->priv;
+       sp = netdev_priv(dev);
        sp->dev = dev;
        sp->cfg = pdev->dev.platform_data;
 
@@ -211,7 +211,6 @@ int __init ar2313_probe(struct platform_device *pdev)
        dev->stop = &ar2313_close;
        dev->hard_start_xmit = &ar2313_start_xmit;
 
-       dev->get_stats = &ar2313_get_stats;
        dev->set_multicast_list = &ar2313_multicast_list;
 #ifdef TX_TIMEOUT
        dev->tx_timeout = ar2313_tx_timeout;
@@ -220,7 +219,7 @@ int __init ar2313_probe(struct platform_device *pdev)
        dev->do_ioctl = &ar2313_ioctl;
 
        // SAMEER: do we need this?
-       dev->features |= NETIF_F_SG | NETIF_F_HIGHDMA;
+       dev->features |= NETIF_F_HIGHDMA;
 
        tasklet_init(&sp->rx_tasklet, rx_tasklet_func, (unsigned long) dev);
        tasklet_disable(&sp->rx_tasklet);
@@ -316,7 +315,7 @@ int __init ar2313_probe(struct platform_device *pdev)
 static void ar2313_dump_regs(struct net_device *dev)
 {
        unsigned int *ptr, i;
-       struct ar2313_private *sp = (struct ar2313_private *) dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
 
        ptr = (unsigned int *) sp->eth_regs;
        for (i = 0; i < (sizeof(ETHERNET_STRUCT) / sizeof(unsigned int));
@@ -345,7 +344,7 @@ static void ar2313_dump_regs(struct net_device *dev)
 #ifdef TX_TIMEOUT
 static void ar2313_tx_timeout(struct net_device *dev)
 {
-       struct ar2313_private *sp = (struct ar2313_private *) dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        unsigned long flags;
 
 #if DEBUG_TX
@@ -383,7 +382,7 @@ static void ar2313_multicast_list(struct net_device *dev)
         * Always listen to broadcasts and
         * treat IFF bits independently
         */
-       struct ar2313_private *sp = (struct ar2313_private *) dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        unsigned int recognise;
 
        recognise = sp->eth_regs->mac_control;
@@ -418,7 +417,7 @@ static void ar2313_multicast_list(struct net_device *dev)
 
 static void rx_tasklet_cleanup(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
 
        /*
         * Tasklet may be scheduled. Need to get it removed from the list
@@ -483,7 +482,7 @@ module_exit(ar2313_module_cleanup);
 
 static void ar2313_free_descriptors(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        if (sp->rx_ring != NULL) {
                kfree((void *) KSEG0ADDR(sp->rx_ring));
                sp->rx_ring = NULL;
@@ -494,7 +493,7 @@ static void ar2313_free_descriptors(struct net_device *dev)
 
 static int ar2313_allocate_descriptors(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        int size;
        int j;
        ar2313_descr_t *space;
@@ -545,7 +544,7 @@ static int ar2313_allocate_descriptors(struct net_device *dev)
  */
 static void ar2313_init_cleanup(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        struct sk_buff *skb;
        int j;
 
@@ -583,7 +582,7 @@ static void ar2313_init_cleanup(struct net_device *dev)
 
 static int ar2313_setup_timer(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
 
        init_timer(&sp->link_timer);
 
@@ -599,7 +598,7 @@ static int ar2313_setup_timer(struct net_device *dev)
 static void ar2313_link_timer_fn(unsigned long data)
 {
        struct net_device *dev = (struct net_device *) data;
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
 
        // see if the link status changed
        // This was needed to make sure we set the PHY to the
@@ -617,7 +616,7 @@ static void ar2313_link_timer_fn(unsigned long data)
 
 static void ar2313_check_link(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        u16 phyData;
 
        phyData = mdiobus_read(&sp->mii_bus, sp->phy, MII_BMSR);
@@ -663,7 +662,7 @@ static void ar2313_check_link(struct net_device *dev)
 
 static int ar2313_reset_reg(struct net_device *dev)
 {
-       struct ar2313_private *sp = (struct ar2313_private *) dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        unsigned int ethsal, ethsah;
        unsigned int flags;
 
@@ -725,7 +724,7 @@ static int ar2313_reset_reg(struct net_device *dev)
 
 static int ar2313_init(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        int ecode = 0;
 
        /*
@@ -781,7 +780,7 @@ static int ar2313_init(struct net_device *dev)
        /*
         * Zero the stats before starting the interface
         */
-       memset(&sp->stats, 0, sizeof(sp->stats));
+       memset(&dev->stats, 0, sizeof(dev->stats));
 
        /*
         * We load the ring here as there seem to be no way to tell the
@@ -827,7 +826,7 @@ static int ar2313_init(struct net_device *dev)
 static void ar2313_load_rx_ring(struct net_device *dev, int nr_bufs)
 {
 
-       struct ar2313_private *sp = ((struct net_device *) dev)->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        short i, idx;
 
        idx = sp->rx_skbprd;
@@ -889,7 +888,7 @@ static void ar2313_load_rx_ring(struct net_device *dev, int nr_bufs)
 
 static int ar2313_rx_int(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        struct sk_buff *skb, *skb_new;
        ar2313_descr_t *rxdesc;
        unsigned int status;
@@ -928,20 +927,20 @@ static int ar2313_rx_int(struct net_device *dev)
 #if DEBUG_RX
                        printk("%s: rx ERROR %08x\n", __FUNCTION__, status);
 #endif
-                       sp->stats.rx_errors++;
-                       sp->stats.rx_dropped++;
+                       dev->stats.rx_errors++;
+                       dev->stats.rx_dropped++;
 
                        /* add statistics counters */
                        if (status & DMA_RX_ERR_CRC)
-                               sp->stats.rx_crc_errors++;
+                               dev->stats.rx_crc_errors++;
                        if (status & DMA_RX_ERR_COL)
-                               sp->stats.rx_over_errors++;
+                               dev->stats.rx_over_errors++;
                        if (status & DMA_RX_ERR_LENGTH)
-                               sp->stats.rx_length_errors++;
+                               dev->stats.rx_length_errors++;
                        if (status & DMA_RX_ERR_RUNT)
-                               sp->stats.rx_over_errors++;
+                               dev->stats.rx_over_errors++;
                        if (status & DMA_RX_ERR_DESC)
-                               sp->stats.rx_over_errors++;
+                               dev->stats.rx_over_errors++;
 
                } else {
                        /* alloc new buffer. */
@@ -953,7 +952,7 @@ static int ar2313_rx_int(struct net_device *dev)
                                skb_put(skb,
                                                ((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN);
 
-                               sp->stats.rx_bytes += skb->len;
+                               dev->stats.rx_bytes += skb->len;
                                skb->protocol = eth_type_trans(skb, dev);
                                /* pass the packet to upper layers */
                                netif_rx(skb);
@@ -964,10 +963,10 @@ static int ar2313_rx_int(struct net_device *dev)
                                /* reset descriptor's curr_addr */
                                rxdesc->addr = virt_to_phys(skb_new->data);
 
-                               sp->stats.rx_packets++;
+                               dev->stats.rx_packets++;
                                sp->rx_skb[idx] = skb_new;
                        } else {
-                               sp->stats.rx_dropped++;
+                               dev->stats.rx_dropped++;
                        }
                }
 
@@ -986,7 +985,7 @@ static int ar2313_rx_int(struct net_device *dev)
 
 static void ar2313_tx_int(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        u32 idx;
        struct sk_buff *skb;
        ar2313_descr_t *txdesc;
@@ -1016,27 +1015,27 @@ static void ar2313_tx_int(struct net_device *dev)
                txdesc->status = 0;
 
                if (status & DMA_TX_ERROR) {
-                       sp->stats.tx_errors++;
-                       sp->stats.tx_dropped++;
+                       dev->stats.tx_errors++;
+                       dev->stats.tx_dropped++;
                        if (status & DMA_TX_ERR_UNDER)
-                               sp->stats.tx_fifo_errors++;
+                               dev->stats.tx_fifo_errors++;
                        if (status & DMA_TX_ERR_HB)
-                               sp->stats.tx_heartbeat_errors++;
+                               dev->stats.tx_heartbeat_errors++;
                        if (status & (DMA_TX_ERR_LOSS | DMA_TX_ERR_LINK))
-                               sp->stats.tx_carrier_errors++;
+                               dev->stats.tx_carrier_errors++;
                        if (status & (DMA_TX_ERR_LATE |
                                                  DMA_TX_ERR_COL |
                                                  DMA_TX_ERR_JABBER | DMA_TX_ERR_DEFER))
-                               sp->stats.tx_aborted_errors++;
+                               dev->stats.tx_aborted_errors++;
                } else {
                        /* transmit OK */
-                       sp->stats.tx_packets++;
+                       dev->stats.tx_packets++;
                }
 
                skb = sp->tx_skb[idx];
                sp->tx_skb[idx] = NULL;
                idx = DSC_NEXT(idx);
-               sp->stats.tx_bytes += skb->len;
+               dev->stats.tx_bytes += skb->len;
                dev_kfree_skb_irq(skb);
        }
 
@@ -1049,7 +1048,7 @@ static void ar2313_tx_int(struct net_device *dev)
 static void rx_tasklet_func(unsigned long data)
 {
        struct net_device *dev = (struct net_device *) data;
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
 
        if (sp->unloading) {
                return;
@@ -1067,7 +1066,7 @@ static void rx_tasklet_func(unsigned long data)
 
 static void rx_schedule(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
 
        sp->dma_regs->intr_ena &= ~DMA_STATUS_RI;
 
@@ -1077,7 +1076,7 @@ static void rx_schedule(struct net_device *dev)
 static irqreturn_t ar2313_interrupt(int irq, void *dev_id)
 {
        struct net_device *dev = (struct net_device *) dev_id;
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        unsigned int status, enabled;
 
        /* clear interrupt */
@@ -1120,9 +1119,10 @@ static irqreturn_t ar2313_interrupt(int irq, void *dev_id)
 
 static int ar2313_open(struct net_device *dev)
 {
-       struct ar2313_private *sp;
+       struct ar2313_private *sp = netdev_priv(dev);
 
-       sp = dev->priv;
+       /* reset the hardware, in case the MAC address changed */
+       ar2313_reset_reg(dev);
 
        dev->mtu = 1500;
        netif_start_queue(dev);
@@ -1134,7 +1134,7 @@ static int ar2313_open(struct net_device *dev)
 
 static void ar2313_halt(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        int j;
 
        tasklet_disable(&sp->rx_tasklet);
@@ -1202,7 +1202,7 @@ static int ar2313_close(struct net_device *dev)
 
 static int ar2313_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        ar2313_descr_t *td;
        u32 idx;
 
@@ -1214,7 +1214,7 @@ static int ar2313_start_xmit(struct sk_buff *skb, struct net_device *dev)
                printk("%s: No space left to Tx\n", __FUNCTION__);
 #endif
                /* free skbuf and lie to the caller that we sent it out */
-               sp->stats.tx_dropped++;
+               dev->stats.tx_dropped++;
                dev_kfree_skb(skb);
 
                /* restart transmitter in case locked */
@@ -1249,7 +1249,7 @@ static int ar2313_start_xmit(struct sk_buff *skb, struct net_device *dev)
 static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
        struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_data;
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        int ret;
 
        switch (cmd) {
@@ -1284,16 +1284,9 @@ static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        return -EOPNOTSUPP;
 }
 
-static struct net_device_stats *ar2313_get_stats(struct net_device *dev)
-{
-       struct ar2313_private *sp = dev->priv;
-       return &sp->stats;
-}
-
-
 static void ar2313_adjust_link(struct net_device *dev)
 {
-       struct ar2313_private *sp = dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        unsigned int mc;
 
        if (!sp->phy_dev->link)
@@ -1318,7 +1311,7 @@ static int
 mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum)
 {
        struct net_device *const dev = bus->priv;
-       struct ar2313_private *sp = (struct ar2313_private *) dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        volatile ETHERNET_STRUCT *ethernet = sp->phy_regs;
 
        ethernet->mii_addr = MII_ADDR(phy_addr, regnum);
@@ -1331,7 +1324,7 @@ mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum,
              u16 value)
 {
        struct net_device *const dev = bus->priv;
-       struct ar2313_private *sp = (struct ar2313_private *) dev->priv;
+       struct ar2313_private *sp = netdev_priv(dev);
        volatile ETHERNET_STRUCT *ethernet = sp->phy_regs;
 
        while (ethernet->mii_addr & MII_ADDR_BUSY);
@@ -1352,7 +1345,7 @@ static int mdiobus_reset(struct mii_bus *bus)
 
 static int mdiobus_probe (struct net_device *dev)
 {
-       struct ar2313_private *const sp = (struct ar2313_private *) dev->priv;
+       struct ar2313_private *const sp = netdev_priv(dev);
        struct phy_device *phydev = NULL;
        int phy_addr;