bnx2: Refine VPD logic.
[safe/jmp/linux-2.6] / drivers / net / sb1250-mac.c
index 888b7de..564d4d7 100644 (file)
@@ -179,8 +179,7 @@ enum sbmac_state {
 #define SBMAC_MAX_TXDESCR      256
 #define SBMAC_MAX_RXDESCR      256
 
-#define ETHER_ALIGN    2
-#define ETHER_ADDR_LEN 6
+#define ETHER_ADDR_LEN         6
 #define ENET_PACKET_SIZE       1518
 /*#define ENET_PACKET_SIZE     9216 */
 
@@ -257,13 +256,11 @@ struct sbmac_softc {
        struct net_device       *sbm_dev;       /* pointer to linux device */
        struct napi_struct      napi;
        struct phy_device       *phy_dev;       /* the associated PHY device */
-       struct mii_bus          mii_bus;        /* the MII bus */
+       struct mii_bus          *mii_bus;       /* the MII bus */
        int                     phy_irq[PHY_MAX_ADDR];
        spinlock_t              sbm_lock;       /* spin lock */
        int                     sbm_devflags;   /* current device flags */
 
-       int                     sbm_buffersize;
-
        /*
         * Controller-specific things
         */
@@ -305,10 +302,11 @@ struct sbmac_softc {
 static void sbdma_initctx(struct sbmacdma *d, struct sbmac_softc *s, int chan,
                          int txrx, int maxdescr);
 static void sbdma_channel_start(struct sbmacdma *d, int rxtx);
-static int sbdma_add_rcvbuffer(struct sbmacdma *d, struct sk_buff *m);
+static int sbdma_add_rcvbuffer(struct sbmac_softc *sc, struct sbmacdma *d,
+                              struct sk_buff *m);
 static int sbdma_add_txbuffer(struct sbmacdma *d, struct sk_buff *m);
 static void sbdma_emptyring(struct sbmacdma *d);
-static void sbdma_fillring(struct sbmacdma *d);
+static void sbdma_fillring(struct sbmac_softc *sc, struct sbmacdma *d);
 static int sbdma_rx_process(struct sbmac_softc *sc, struct sbmacdma *d,
                            int work_to_do, int poll);
 static void sbdma_tx_process(struct sbmac_softc *sc, struct sbmacdma *d,
@@ -777,16 +775,13 @@ static void sbdma_channel_stop(struct sbmacdma *d)
        d->sbdma_remptr = NULL;
 }
 
-static void sbdma_align_skb(struct sk_buff *skb,int power2,int offset)
+static inline void sbdma_align_skb(struct sk_buff *skb,
+                                  unsigned int power2, unsigned int offset)
 {
-       unsigned long addr;
-       unsigned long newaddr;
-
-       addr = (unsigned long) skb->data;
+       unsigned char *addr = skb->data;
+       unsigned char *newaddr = PTR_ALIGN(addr, power2);
 
-       newaddr = (addr + power2 - 1) & ~(power2 - 1);
-
-       skb_reserve(skb,newaddr-addr+offset);
+       skb_reserve(skb, newaddr - addr + offset);
 }
 
 
@@ -797,7 +792,8 @@ static void sbdma_align_skb(struct sk_buff *skb,int power2,int offset)
  *  this queues a buffer for inbound packets.
  *
  *  Input parameters:
- *        d - DMA channel descriptor
+ *        sc - softc structure
+ *         d - DMA channel descriptor
  *        sb - sk_buff to add, or NULL if we should allocate one
  *
  *  Return value:
@@ -806,8 +802,10 @@ static void sbdma_align_skb(struct sk_buff *skb,int power2,int offset)
  ********************************************************************* */
 
 
-static int sbdma_add_rcvbuffer(struct sbmacdma *d, struct sk_buff *sb)
+static int sbdma_add_rcvbuffer(struct sbmac_softc *sc, struct sbmacdma *d,
+                              struct sk_buff *sb)
 {
+       struct net_device *dev = sc->sbm_dev;
        struct sbdmadscr *dsc;
        struct sbdmadscr *nextdsc;
        struct sk_buff *sb_new = NULL;
@@ -848,14 +846,16 @@ static int sbdma_add_rcvbuffer(struct sbmacdma *d, struct sk_buff *sb)
         */
 
        if (sb == NULL) {
-               sb_new = dev_alloc_skb(ENET_PACKET_SIZE + SMP_CACHE_BYTES * 2 + ETHER_ALIGN);
+               sb_new = netdev_alloc_skb(dev, ENET_PACKET_SIZE +
+                                              SMP_CACHE_BYTES * 2 +
+                                              NET_IP_ALIGN);
                if (sb_new == NULL) {
                        pr_info("%s: sk_buff allocation failed\n",
                               d->sbdma_eth->sbm_dev->name);
                        return -ENOBUFS;
                }
 
-               sbdma_align_skb(sb_new, SMP_CACHE_BYTES, ETHER_ALIGN);
+               sbdma_align_skb(sb_new, SMP_CACHE_BYTES, NET_IP_ALIGN);
        }
        else {
                sb_new = sb;
@@ -874,10 +874,10 @@ static int sbdma_add_rcvbuffer(struct sbmacdma *d, struct sk_buff *sb)
         * Do not interrupt per DMA transfer.
         */
        dsc->dscr_a = virt_to_phys(sb_new->data) |
-               V_DMA_DSCRA_A_SIZE(NUMCACHEBLKS(pktsize+ETHER_ALIGN)) | 0;
+               V_DMA_DSCRA_A_SIZE(NUMCACHEBLKS(pktsize + NET_IP_ALIGN)) | 0;
 #else
        dsc->dscr_a = virt_to_phys(sb_new->data) |
-               V_DMA_DSCRA_A_SIZE(NUMCACHEBLKS(pktsize+ETHER_ALIGN)) |
+               V_DMA_DSCRA_A_SIZE(NUMCACHEBLKS(pktsize + NET_IP_ALIGN)) |
                M_DMA_DSCRA_INTERRUPT;
 #endif
 
@@ -1032,18 +1032,19 @@ static void sbdma_emptyring(struct sbmacdma *d)
  *  with sk_buffs
  *
  *  Input parameters:
- *        d - DMA channel
+ *        sc - softc structure
+ *         d - DMA channel
  *
  *  Return value:
  *        nothing
  ********************************************************************* */
 
-static void sbdma_fillring(struct sbmacdma *d)
+static void sbdma_fillring(struct sbmac_softc *sc, struct sbmacdma *d)
 {
        int idx;
 
-       for (idx = 0; idx < SBMAC_MAX_RXDESCR-1; idx++) {
-               if (sbdma_add_rcvbuffer(d,NULL) != 0)
+       for (idx = 0; idx < SBMAC_MAX_RXDESCR - 1; idx++) {
+               if (sbdma_add_rcvbuffer(sc, d, NULL) != 0)
                        break;
        }
 }
@@ -1063,7 +1064,7 @@ static void sbmac_netpoll(struct net_device *netdev)
        ((M_MAC_INT_EOP_COUNT | M_MAC_INT_EOP_TIMER) << S_MAC_RX_CH0),
        sc->sbm_imr);
 #else
-       __raw_writeq((M_MAC_INT_CHANNEL << S_MAC_TX_CH0) | 
+       __raw_writeq((M_MAC_INT_CHANNEL << S_MAC_TX_CH0) |
        (M_MAC_INT_CHANNEL << S_MAC_RX_CH0), sc->sbm_imr);
 #endif
 }
@@ -1159,10 +1160,11 @@ again:
                         * packet and put it right back on the receive ring.
                         */
 
-                       if (unlikely (sbdma_add_rcvbuffer(d,NULL) ==
-                                     -ENOBUFS)) {
+                       if (unlikely(sbdma_add_rcvbuffer(sc, d, NULL) ==
+                                    -ENOBUFS)) {
                                dev->stats.rx_dropped++;
-                               sbdma_add_rcvbuffer(d,sb); /* re-add old buffer */
+                               /* Re-add old buffer */
+                               sbdma_add_rcvbuffer(sc, d, sb);
                                /* No point in continuing at the moment */
                                printk(KERN_ERR "dropped packet (1)\n");
                                d->sbdma_remptr = SBDMA_NEXTBUF(d,sbdma_remptr);
@@ -1212,7 +1214,7 @@ again:
                         * put it back on the receive ring.
                         */
                        dev->stats.rx_errors++;
-                       sbdma_add_rcvbuffer(d,sb);
+                       sbdma_add_rcvbuffer(sc, d, sb);
                }
 
 
@@ -1474,7 +1476,6 @@ static void sbmac_channel_start(struct sbmac_softc *s)
                V_MAC_TX_RL_THRSH(4) |
                V_MAC_RX_PL_THRSH(4) |
                V_MAC_RX_RD_THRSH(4) |  /* Must be '4' */
-               V_MAC_RX_PL_THRSH(4) |
                V_MAC_RX_RL_THRSH(8) |
                0;
 
@@ -1570,7 +1571,7 @@ static void sbmac_channel_start(struct sbmac_softc *s)
         * Fill the receive ring
         */
 
-       sbdma_fillring(&(s->sbm_rxdma));
+       sbdma_fillring(s, &(s->sbm_rxdma));
 
        /*
         * Turn on the rest of the bits in the enable register
@@ -2037,9 +2038,9 @@ static irqreturn_t sbmac_intr(int irq,void *dev_instance)
                sbdma_tx_process(sc,&(sc->sbm_txdma), 0);
 
        if (isr & (M_MAC_INT_CHANNEL << S_MAC_RX_CH0)) {
-               if (netif_rx_schedule_prep(dev, &sc->napi)) {
+               if (napi_schedule_prep(&sc->napi)) {
                        __raw_writeq(0, sc->sbm_imr);
-                       __netif_rx_schedule(dev, &sc->napi);
+                       __napi_schedule(&sc->napi);
                        /* Depend on the exit from poll to reenable intr */
                }
                else {
@@ -2067,9 +2068,10 @@ static irqreturn_t sbmac_intr(int irq,void *dev_instance)
 static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev)
 {
        struct sbmac_softc *sc = netdev_priv(dev);
+       unsigned long flags;
 
        /* lock eth irq */
-       spin_lock_irq (&sc->sbm_lock);
+       spin_lock_irqsave(&sc->sbm_lock, flags);
 
        /*
         * Put the buffer on the transmit ring.  If we
@@ -2079,16 +2081,16 @@ static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev)
        if (sbdma_add_txbuffer(&(sc->sbm_txdma),skb)) {
                /* XXX save skb that we could not send */
                netif_stop_queue(dev);
-               spin_unlock_irq(&sc->sbm_lock);
+               spin_unlock_irqrestore(&sc->sbm_lock, flags);
 
-               return 1;
+               return NETDEV_TX_BUSY;
        }
 
        dev->trans_start = jiffies;
 
-       spin_unlock_irq (&sc->sbm_lock);
+       spin_unlock_irqrestore(&sc->sbm_lock, flags);
 
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 /**********************************************************************
@@ -2268,6 +2270,21 @@ static int sb1250_change_mtu(struct net_device *_dev, int new_mtu)
        return 0;
 }
 
+static const struct net_device_ops sbmac_netdev_ops = {
+       .ndo_open               = sbmac_open,
+       .ndo_stop               = sbmac_close,
+       .ndo_start_xmit         = sbmac_start_tx,
+       .ndo_set_multicast_list = sbmac_set_rx_mode,
+       .ndo_tx_timeout         = sbmac_tx_timeout,
+       .ndo_do_ioctl           = sbmac_mii_ioctl,
+       .ndo_change_mtu         = sb1250_change_mtu,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_set_mac_address    = eth_mac_addr,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller    = sbmac_netpoll,
+#endif
+};
+
 /**********************************************************************
  *  SBMAC_INIT(dev)
  *
@@ -2282,14 +2299,13 @@ static int sb1250_change_mtu(struct net_device *_dev, int new_mtu)
 
 static int sbmac_init(struct platform_device *pldev, long long base)
 {
-       struct net_device *dev = pldev->dev.driver_data;
+       struct net_device *dev = dev_get_drvdata(&pldev->dev);
        int idx = pldev->id;
        struct sbmac_softc *sc = netdev_priv(dev);
        unsigned char *eaddr;
        uint64_t ea_reg;
        int i;
        int err;
-       DECLARE_MAC_BUF(mac);
 
        sc->sbm_dev = dev;
        sc->sbe_idx = idx;
@@ -2297,7 +2313,7 @@ static int sbmac_init(struct platform_device *pldev, long long base)
        eaddr = sc->sbm_hwaddr;
 
        /*
-        * Read the ethernet address.  The firwmare left this programmed
+        * Read the ethernet address.  The firmware left this programmed
         * for us in the ethernet address register for each mac.
         */
 
@@ -2312,13 +2328,6 @@ static int sbmac_init(struct platform_device *pldev, long long base)
                dev->dev_addr[i] = eaddr[i];
        }
 
-
-       /*
-        * Init packet size
-        */
-
-       sc->sbm_buffersize = ENET_PACKET_SIZE + SMP_CACHE_BYTES * 2 + ETHER_ALIGN;
-
        /*
         * Initialize context (get pointers to registers and stuff), then
         * allocate the memory for the descriptor tables.
@@ -2332,30 +2341,27 @@ static int sbmac_init(struct platform_device *pldev, long long base)
 
        spin_lock_init(&(sc->sbm_lock));
 
-       dev->open               = sbmac_open;
-       dev->hard_start_xmit    = sbmac_start_tx;
-       dev->stop               = sbmac_close;
-       dev->set_multicast_list = sbmac_set_rx_mode;
-       dev->do_ioctl           = sbmac_mii_ioctl;
-       dev->tx_timeout         = sbmac_tx_timeout;
-       dev->watchdog_timeo     = TX_TIMEOUT;
+       dev->netdev_ops = &sbmac_netdev_ops;
+       dev->watchdog_timeo = TX_TIMEOUT;
 
        netif_napi_add(dev, &sc->napi, sbmac_poll, 16);
 
-       dev->change_mtu         = sb1250_change_mtu;
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       dev->poll_controller = sbmac_netpoll;
-#endif
-
        dev->irq                = UNIT_INT(idx);
 
        /* This is needed for PASS2 for Rx H/W checksum feature */
        sbmac_set_iphdr_offset(sc);
 
+       sc->mii_bus = mdiobus_alloc();
+       if (sc->mii_bus == NULL) {
+               sbmac_uninitctx(sc);
+               return -ENOMEM;
+       }
+
        err = register_netdev(dev);
        if (err) {
                printk(KERN_ERR "%s.%d: unable to register netdev\n",
                       sbmac_string, idx);
+               mdiobus_free(sc->mii_bus);
                sbmac_uninitctx(sc);
                return err;
        }
@@ -2370,20 +2376,20 @@ static int sbmac_init(struct platform_device *pldev, long long base)
         * process so we need to finish off the config message that
         * was being displayed)
         */
-       pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %s\n",
-              dev->name, base, print_mac(mac, eaddr));
+       pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %pM\n",
+              dev->name, base, eaddr);
 
-       sc->mii_bus.name = sbmac_mdio_string;
-       snprintf(sc->mii_bus.id, MII_BUS_ID_SIZE, "%x", idx);
-       sc->mii_bus.priv = sc;
-       sc->mii_bus.read = sbmac_mii_read;
-       sc->mii_bus.write = sbmac_mii_write;
-       sc->mii_bus.irq = sc->phy_irq;
+       sc->mii_bus->name = sbmac_mdio_string;
+       snprintf(sc->mii_bus->id, MII_BUS_ID_SIZE, "%x", idx);
+       sc->mii_bus->priv = sc;
+       sc->mii_bus->read = sbmac_mii_read;
+       sc->mii_bus->write = sbmac_mii_write;
+       sc->mii_bus->irq = sc->phy_irq;
        for (i = 0; i < PHY_MAX_ADDR; ++i)
-               sc->mii_bus.irq[i] = SBMAC_PHY_INT;
+               sc->mii_bus->irq[i] = SBMAC_PHY_INT;
 
-       sc->mii_bus.dev = &pldev->dev;
-       dev_set_drvdata(&pldev->dev, &sc->mii_bus);
+       sc->mii_bus->parent = &pldev->dev;
+       dev_set_drvdata(&pldev->dev, sc->mii_bus);
 
        return 0;
 }
@@ -2404,7 +2410,7 @@ static int sbmac_open(struct net_device *dev)
         */
 
        __raw_readq(sc->sbm_isr);
-       err = request_irq(dev->irq, &sbmac_intr, IRQF_SHARED, dev->name, dev);
+       err = request_irq(dev->irq, sbmac_intr, IRQF_SHARED, dev->name, dev);
        if (err) {
                printk(KERN_ERR "%s: unable to get IRQ %d\n", dev->name,
                       dev->irq);
@@ -2414,7 +2420,7 @@ static int sbmac_open(struct net_device *dev)
        /*
         * Probe PHY address
         */
-       err = mdiobus_register(&sc->mii_bus);
+       err = mdiobus_register(sc->mii_bus);
        if (err) {
                printk(KERN_ERR "%s: unable to register MDIO bus\n",
                       dev->name);
@@ -2451,7 +2457,7 @@ static int sbmac_open(struct net_device *dev)
        return 0;
 
 out_unregister:
-       mdiobus_unregister(&sc->mii_bus);
+       mdiobus_unregister(sc->mii_bus);
 
 out_unirq:
        free_irq(dev->irq, dev);
@@ -2467,7 +2473,7 @@ static int sbmac_mii_probe(struct net_device *dev)
        int i;
 
        for (i = 0; i < PHY_MAX_ADDR; i++) {
-               phy_dev = sc->mii_bus.phy_map[i];
+               phy_dev = sc->mii_bus->phy_map[i];
                if (phy_dev)
                        break;
        }
@@ -2476,7 +2482,7 @@ static int sbmac_mii_probe(struct net_device *dev)
                return -ENXIO;
        }
 
-       phy_dev = phy_connect(dev, phy_dev->dev.bus_id, &sbmac_mii_poll, 0,
+       phy_dev = phy_connect(dev, dev_name(&phy_dev->dev), &sbmac_mii_poll, 0,
                              PHY_INTERFACE_MODE_GMII);
        if (IS_ERR(phy_dev)) {
                printk(KERN_ERR "%s: could not attach to PHY\n", dev->name);
@@ -2498,7 +2504,7 @@ static int sbmac_mii_probe(struct net_device *dev)
 
        pr_info("%s: attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
                dev->name, phy_dev->drv->name,
-               phy_dev->dev.bus_id, phy_dev->irq);
+               dev_name(&phy_dev->dev), phy_dev->irq);
 
        sc->phy_dev = phy_dev;
 
@@ -2573,14 +2579,15 @@ static void sbmac_mii_poll(struct net_device *dev)
 static void sbmac_tx_timeout (struct net_device *dev)
 {
        struct sbmac_softc *sc = netdev_priv(dev);
+       unsigned long flags;
 
-       spin_lock_irq (&sc->sbm_lock);
+       spin_lock_irqsave(&sc->sbm_lock, flags);
 
 
        dev->trans_start = jiffies;
        dev->stats.tx_errors++;
 
-       spin_unlock_irq (&sc->sbm_lock);
+       spin_unlock_irqrestore(&sc->sbm_lock, flags);
 
        printk (KERN_WARNING "%s: Transmit timed out\n",dev->name);
 }
@@ -2644,7 +2651,7 @@ static int sbmac_close(struct net_device *dev)
        phy_disconnect(sc->phy_dev);
        sc->phy_dev = NULL;
 
-       mdiobus_unregister(&sc->mii_bus);
+       mdiobus_unregister(sc->mii_bus);
 
        free_irq(dev->irq, dev);
 
@@ -2664,7 +2671,7 @@ static int sbmac_poll(struct napi_struct *napi, int budget)
        sbdma_tx_process(sc, &(sc->sbm_txdma), 1);
 
        if (work_done < budget) {
-               netif_rx_complete(dev, napi);
+               napi_complete(napi);
 
 #ifdef CONFIG_SBMAC_COALESCE
                __raw_writeq(((M_MAC_INT_EOP_COUNT | M_MAC_INT_EOP_TIMER) << S_MAC_TX_CH0) |
@@ -2680,7 +2687,7 @@ static int sbmac_poll(struct napi_struct *napi, int budget)
 }
 
 
-static int __init sbmac_probe(struct platform_device *pldev)
+static int __devinit sbmac_probe(struct platform_device *pldev)
 {
        struct net_device *dev;
        struct sbmac_softc *sc;
@@ -2694,7 +2701,7 @@ static int __init sbmac_probe(struct platform_device *pldev)
        sbm_base = ioremap_nocache(res->start, res->end - res->start + 1);
        if (!sbm_base) {
                printk(KERN_ERR "%s: unable to map device registers\n",
-                      pldev->dev.bus_id);
+                      dev_name(&pldev->dev));
                err = -ENOMEM;
                goto out_out;
        }
@@ -2705,7 +2712,7 @@ static int __init sbmac_probe(struct platform_device *pldev)
         * If we find a zero, skip this MAC.
         */
        sbmac_orig_hwaddr = __raw_readq(sbm_base + R_MAC_ETHERNET_ADDR);
-       pr_debug("%s: %sconfiguring MAC at 0x%08Lx\n", pldev->dev.bus_id,
+       pr_debug("%s: %sconfiguring MAC at 0x%08Lx\n", dev_name(&pldev->dev),
                 sbmac_orig_hwaddr ? "" : "not ", (long long)res->start);
        if (sbmac_orig_hwaddr == 0) {
                err = 0;
@@ -2718,12 +2725,12 @@ static int __init sbmac_probe(struct platform_device *pldev)
        dev = alloc_etherdev(sizeof(struct sbmac_softc));
        if (!dev) {
                printk(KERN_ERR "%s: unable to allocate etherdev\n",
-                      pldev->dev.bus_id);
+                      dev_name(&pldev->dev));
                err = -ENOMEM;
                goto out_unmap;
        }
 
-       pldev->dev.driver_data = dev;
+       dev_set_drvdata(&pldev->dev, dev);
        SET_NETDEV_DEV(dev, &pldev->dev);
 
        sc = netdev_priv(dev);
@@ -2748,11 +2755,12 @@ out_out:
 
 static int __exit sbmac_remove(struct platform_device *pldev)
 {
-       struct net_device *dev = pldev->dev.driver_data;
+       struct net_device *dev = dev_get_drvdata(&pldev->dev);
        struct sbmac_softc *sc = netdev_priv(dev);
 
        unregister_netdev(dev);
        sbmac_uninitctx(sc);
+       mdiobus_free(sc->mii_bus);
        iounmap(sc->sbm_base);
        free_netdev(dev);