nfsd4: reshuffle lease-setting code to allow reuse
[safe/jmp/linux-2.6] / drivers / net / tulip / de2104x.c
index 17a2eba..d4255d4 100644 (file)
@@ -62,9 +62,9 @@ module_param (debug, int, 0);
 MODULE_PARM_DESC (debug, "de2104x bitmapped message enable number");
 
 /* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */
-#if defined(__alpha__) || defined(__arm__) || defined(__hppa__) \
-        || defined(__sparc_) || defined(__ia64__) \
-        || defined(__sh__) || defined(__mips__)
+#if defined(__alpha__) || defined(__arm__) || defined(__hppa__) || \
+        defined(CONFIG_SPARC) || defined(__ia64__) ||             \
+        defined(__sh__) || defined(__mips__)
 static int rx_copybreak = 1518;
 #else
 static int rx_copybreak = 100;
@@ -82,6 +82,13 @@ MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copi
                                 NETIF_MSG_RX_ERR       | \
                                 NETIF_MSG_TX_ERR)
 
+/* Descriptor skip length in 32 bit longwords. */
+#ifndef CONFIG_DE2104X_DSL
+#define DSL                    0
+#else
+#define DSL                    CONFIG_DE2104X_DSL
+#endif
+
 #define DE_RX_RING_SIZE                64
 #define DE_TX_RING_SIZE                64
 #define DE_RING_BYTES          \
@@ -124,8 +131,6 @@ MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copi
 /* Time in jiffies before concluding the transmitter is hung. */
 #define TX_TIMEOUT             (6*HZ)
 
-#define DE_UNALIGNED_16(a)     (u16)(get_unaligned((u16 *)(a)))
-
 /* This is a mysterious value that can be written to CSR11 in the 21040 (only)
    to support a pre-NWay full-duplex signaling mechanism using short frames.
    No one knows what it should be, but if left at its default value some
@@ -155,6 +160,7 @@ enum {
        CmdReset                = (1 << 0),
        CacheAlign16            = 0x00008000,
        BurstLen4               = 0x00000400,
+       DescSkipLen             = (DSL << 2),
 
        /* Rx/TxPoll bits */
        NormalTxPoll            = (1 << 0),
@@ -248,7 +254,7 @@ static const u32 de_intr_mask =
  * Set the programmable burst length to 4 longwords for all:
  * DMA errors result without these values. Cache align 16 long.
  */
-static const u32 de_bus_mode = CacheAlign16 | BurstLen4;
+static const u32 de_bus_mode = CacheAlign16 | BurstLen4 | DescSkipLen;
 
 struct de_srom_media_block {
        u8                      opts;
@@ -264,10 +270,13 @@ struct de_srom_info_leaf {
 } __attribute__((packed));
 
 struct de_desc {
-       u32                     opts1;
-       u32                     opts2;
-       u32                     addr1;
-       u32                     addr2;
+       __le32                  opts1;
+       __le32                  opts2;
+       __le32                  addr1;
+       __le32                  addr2;
+#if DSL
+       __le32                  skip[DSL];
+#endif
 };
 
 struct media_info {
@@ -394,7 +403,7 @@ static void de_rx (struct de_private *de)
        unsigned drop = 0;
        int rc;
 
-       while (rx_work--) {
+       while (--rx_work) {
                u32 status, len;
                dma_addr_t mapping;
                struct sk_buff *skb, *copy_skb;
@@ -435,7 +444,6 @@ static void de_rx (struct de_private *de)
                        rx_work = 100;
                        goto rx_next;
                }
-               copy_skb->dev = de->dev;
 
                if (!copying_skb) {
                        pci_unmap_single(de->pdev, mapping,
@@ -450,8 +458,8 @@ static void de_rx (struct de_private *de)
                } else {
                        pci_dma_sync_single_for_cpu(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
                        skb_reserve(copy_skb, RX_OFFSET);
-                       memcpy(skb_put(copy_skb, len), skb->data, len);
-
+                       skb_copy_from_linear_data(skb, skb_put(copy_skb, len),
+                                                 len);
                        pci_dma_sync_single_for_device(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
 
                        /* We'll reuse the original ring buffer. */
@@ -462,19 +470,19 @@ static void de_rx (struct de_private *de)
 
                de->net_stats.rx_packets++;
                de->net_stats.rx_bytes += skb->len;
-               de->dev->last_rx = jiffies;
                rc = netif_rx (skb);
                if (rc == NET_RX_DROP)
                        drop = 1;
 
 rx_next:
-               de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
                if (rx_tail == (DE_RX_RING_SIZE - 1))
                        de->rx_ring[rx_tail].opts2 =
                                cpu_to_le32(RingEnd | de->rx_buf_sz);
                else
                        de->rx_ring[rx_tail].opts2 = cpu_to_le32(de->rx_buf_sz);
                de->rx_ring[rx_tail].addr1 = cpu_to_le32(mapping);
+               wmb();
+               de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
                rx_tail = NEXT_RX(rx_tail);
        }
 
@@ -484,10 +492,10 @@ rx_next:
        de->rx_tail = rx_tail;
 }
 
-static irqreturn_t de_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
+static irqreturn_t de_interrupt (int irq, void *dev_instance)
 {
        struct net_device *dev = dev_instance;
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u32 status;
 
        status = dr32(MacStatus);
@@ -591,9 +599,10 @@ next:
                netif_wake_queue(de->dev);
 }
 
-static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t de_start_xmit (struct sk_buff *skb,
+                                       struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        unsigned int entry, tx_free;
        u32 mapping, len, flags = FirstFrag | LastFrag;
        struct de_desc *txd;
@@ -604,7 +613,7 @@ static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
        if (tx_free == 0) {
                netif_stop_queue(dev);
                spin_unlock_irq(&de->lock);
-               return 1;
+               return NETDEV_TX_BUSY;
        }
        tx_free--;
 
@@ -643,7 +652,7 @@ static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
        dw32(TxPoll, NormalTxPoll);
        dev->trans_start = jiffies;
 
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 /* Set or clear the multicast filter for this adaptor.
@@ -656,7 +665,7 @@ static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
 
 static void build_setup_frame_hash(u16 *setup_frm, struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u16 hash_table[32];
        struct dev_mc_list *mclist;
        int i;
@@ -687,7 +696,7 @@ static void build_setup_frame_hash(u16 *setup_frm, struct net_device *dev)
 
 static void build_setup_frame_perfect(u16 *setup_frm, struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        struct dev_mc_list *mclist;
        int i;
        u16 *eaddrs;
@@ -715,7 +724,7 @@ static void build_setup_frame_perfect(u16 *setup_frm, struct net_device *dev)
 
 static void __de_set_rx_mode (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u32 macmode;
        unsigned int entry;
        u32 mapping;
@@ -786,7 +795,6 @@ static void __de_set_rx_mode (struct net_device *dev)
 
        de->tx_head = NEXT_TX(entry);
 
-       BUG_ON(TX_BUFFS_AVAIL(de) < 0);
        if (TX_BUFFS_AVAIL(de) == 0)
                netif_stop_queue(dev);
 
@@ -801,7 +809,7 @@ out:
 static void de_set_rx_mode (struct net_device *dev)
 {
        unsigned long flags;
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        spin_lock_irqsave (&de->lock, flags);
        __de_set_rx_mode(dev);
@@ -825,7 +833,7 @@ static void __de_get_stats(struct de_private *de)
 
 static struct net_device_stats *de_get_stats(struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        /* The chip only need report frame silently dropped. */
        spin_lock_irq(&de->lock);
@@ -844,7 +852,7 @@ static inline int de_is_running (struct de_private *de)
 static void de_stop_rxtx (struct de_private *de)
 {
        u32 macmode;
-       unsigned int work = 1000;
+       unsigned int i = 1300/100;
 
        macmode = dr32(MacMode);
        if (macmode & RxTx) {
@@ -852,10 +860,14 @@ static void de_stop_rxtx (struct de_private *de)
                dr32(MacMode);
        }
 
-       while (--work > 0) {
+       /* wait until in-flight frame completes.
+        * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin)
+        * Typically expect this loop to end in < 50 us on 100BT.
+        */
+       while (--i) {
                if (!de_is_running(de))
                        return;
-               cpu_relax();
+               udelay(100);
        }
 
        printk(KERN_WARNING "%s: timeout expired stopping DMA\n", de->dev->name);
@@ -912,7 +924,8 @@ static void de_set_media (struct de_private *de)
        unsigned media = de->media_type;
        u32 macmode = dr32(MacMode);
 
-       BUG_ON(de_is_running(de));
+       if (de_is_running(de))
+               printk(KERN_WARNING "%s: chip is running while changing media!\n", de->dev->name);
 
        if (de->de21040)
                dw32(CSR11, FULL_DUPLEX_MAGIC);
@@ -932,9 +945,10 @@ static void de_set_media (struct de_private *de)
                macmode &= ~FullDuplex;
 
        if (netif_msg_link(de)) {
-               printk(KERN_INFO "%s: set link %s\n"
-                      KERN_INFO "%s:    mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n"
-                      KERN_INFO "%s:    set mode 0x%x, set sia 0x%x,0x%x,0x%x\n",
+               printk(KERN_INFO
+                      "%s: set link %s\n"
+                      "%s:    mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n"
+                      "%s:    set mode 0x%x, set sia 0x%x,0x%x,0x%x\n",
                       de->dev->name, media_name[media],
                       de->dev->name, dr32(MacMode), dr32(SIAStatus),
                       dr32(CSR13), dr32(CSR14), dr32(CSR15),
@@ -1354,7 +1368,7 @@ static void de_free_rings (struct de_private *de)
 
 static int de_open (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int rc;
 
        if (netif_msg_ifup(de))
@@ -1399,7 +1413,7 @@ err_out_free:
 
 static int de_close (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        unsigned long flags;
 
        if (netif_msg_ifdown(de))
@@ -1417,13 +1431,12 @@ static int de_close (struct net_device *dev)
 
        de_free_rings(de);
        de_adapter_sleep(de);
-       pci_disable_device(de->pdev);
        return 0;
 }
 
 static void de_tx_timeout (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        printk(KERN_DEBUG "%s: NIC status %08x mode %08x sia %08x desc %u/%u/%u\n",
               dev->name, dr32(MacStatus), dr32(MacMode), dr32(SIAStatus),
@@ -1574,7 +1587,7 @@ static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd)
 
 static void de_get_drvinfo (struct net_device *dev,struct ethtool_drvinfo *info)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        strcpy (info->driver, DRV_NAME);
        strcpy (info->version, DRV_VERSION);
@@ -1589,7 +1602,7 @@ static int de_get_regs_len(struct net_device *dev)
 
 static int de_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int rc;
 
        spin_lock_irq(&de->lock);
@@ -1601,7 +1614,7 @@ static int de_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 
 static int de_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int rc;
 
        spin_lock_irq(&de->lock);
@@ -1613,14 +1626,14 @@ static int de_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 
 static u32 de_get_msglevel(struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        return de->msg_enable;
 }
 
 static void de_set_msglevel(struct net_device *dev, u32 msglvl)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        de->msg_enable = msglvl;
 }
@@ -1628,7 +1641,7 @@ static void de_set_msglevel(struct net_device *dev, u32 msglvl)
 static int de_get_eeprom(struct net_device *dev,
                         struct ethtool_eeprom *eeprom, u8 *data)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        if (!de->ee_data)
                return -EOPNOTSUPP;
@@ -1642,7 +1655,7 @@ static int de_get_eeprom(struct net_device *dev,
 
 static int de_nway_reset(struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u32 status;
 
        if (de->media_type != DE_MEDIA_TP_AUTO)
@@ -1661,7 +1674,7 @@ static int de_nway_reset(struct net_device *dev)
 static void de_get_regs(struct net_device *dev, struct ethtool_regs *regs,
                        void *data)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        regs->version = (DE_REGS_VER << 2) | de->de21040;
 
@@ -1670,10 +1683,8 @@ static void de_get_regs(struct net_device *dev, struct ethtool_regs *regs,
        spin_unlock_irq(&de->lock);
 }
 
-static struct ethtool_ops de_ethtool_ops = {
+static const struct ethtool_ops de_ethtool_ops = {
        .get_link               = ethtool_op_get_link,
-       .get_tx_csum            = ethtool_op_get_tx_csum,
-       .get_sg                 = ethtool_op_get_sg,
        .get_drvinfo            = de_get_drvinfo,
        .get_regs_len           = de_get_regs_len,
        .get_settings           = de_get_settings,
@@ -1685,17 +1696,18 @@ static struct ethtool_ops de_ethtool_ops = {
        .get_regs               = de_get_regs,
 };
 
-static void __init de21040_get_mac_address (struct de_private *de)
+static void __devinit de21040_get_mac_address (struct de_private *de)
 {
        unsigned i;
 
        dw32 (ROMCmd, 0);       /* Reset the pointer with a dummy write. */
+       udelay(5);
 
        for (i = 0; i < 6; i++) {
                int value, boguscnt = 100000;
-               do
+               do {
                        value = dr32(ROMCmd);
-               while (value < 0 && --boguscnt > 0);
+               while (value < 0 && --boguscnt > 0);
                de->dev->dev_addr[i] = value;
                udelay(1);
                if (boguscnt <= 0)
@@ -1703,7 +1715,7 @@ static void __init de21040_get_mac_address (struct de_private *de)
        }
 }
 
-static void __init de21040_get_media_info(struct de_private *de)
+static void __devinit de21040_get_media_info(struct de_private *de)
 {
        unsigned int i;
 
@@ -1730,7 +1742,7 @@ static void __init de21040_get_media_info(struct de_private *de)
 }
 
 /* Note: this routine returns extra data bits for size detection. */
-static unsigned __init tulip_read_eeprom(void __iomem *regs, int location, int addr_len)
+static unsigned __devinit tulip_read_eeprom(void __iomem *regs, int location, int addr_len)
 {
        int i;
        unsigned retval = 0;
@@ -1765,7 +1777,7 @@ static unsigned __init tulip_read_eeprom(void __iomem *regs, int location, int a
        return retval;
 }
 
-static void __init de21041_get_srom_info (struct de_private *de)
+static void __devinit de21041_get_srom_info (struct de_private *de)
 {
        unsigned i, sa_offset = 0, ofs;
        u8 ee_data[DE_EEPROM_SIZE + 6] = {};
@@ -1775,8 +1787,8 @@ static void __init de21041_get_srom_info (struct de_private *de)
 
        /* download entire eeprom */
        for (i = 0; i < DE_EEPROM_WORDS; i++)
-               ((u16 *)ee_data)[i] =
-                       le16_to_cpu(tulip_read_eeprom(de->regs, i, ee_addr_size));
+               ((__le16 *)ee_data)[i] =
+                       cpu_to_le16(tulip_read_eeprom(de->regs, i, ee_addr_size));
 
        /* DEC now has a specification but early board makers
           just put the address in the first EEPROM locations. */
@@ -1810,7 +1822,7 @@ static void __init de21041_get_srom_info (struct de_private *de)
                goto bad_srom;
 
        /* get default media type */
-       switch (DE_UNALIGNED_16(&il->default_media)) {
+       switch (get_unaligned(&il->default_media)) {
        case 0x0001:  de->media_type = DE_MEDIA_BNC; break;
        case 0x0002:  de->media_type = DE_MEDIA_AUI; break;
        case 0x0204:  de->media_type = DE_MEDIA_TP_FD; break;
@@ -1874,9 +1886,9 @@ static void __init de21041_get_srom_info (struct de_private *de)
                bufp += sizeof (ib->opts);
 
                if (ib->opts & MediaCustomCSRs) {
-                       de->media[idx].csr13 = DE_UNALIGNED_16(&ib->csr13);
-                       de->media[idx].csr14 = DE_UNALIGNED_16(&ib->csr14);
-                       de->media[idx].csr15 = DE_UNALIGNED_16(&ib->csr15);
+                       de->media[idx].csr13 = get_unaligned(&ib->csr13);
+                       de->media[idx].csr14 = get_unaligned(&ib->csr14);
+                       de->media[idx].csr15 = get_unaligned(&ib->csr15);
                        bufp += sizeof(ib->csr13) + sizeof(ib->csr14) +
                                sizeof(ib->csr15);
 
@@ -1906,9 +1918,7 @@ fill_defaults:
                        de->media[i].csr15 = t21041_csr15[i];
        }
 
-       de->ee_data = kmalloc(DE_EEPROM_SIZE, GFP_KERNEL);
-       if (de->ee_data)
-               memcpy(de->ee_data, &ee_data[0], DE_EEPROM_SIZE);
+       de->ee_data = kmemdup(&ee_data[0], DE_EEPROM_SIZE, GFP_KERNEL);
 
        return;
 
@@ -1926,7 +1936,19 @@ bad_srom:
        goto fill_defaults;
 }
 
-static int __init de_init_one (struct pci_dev *pdev,
+static const struct net_device_ops de_netdev_ops = {
+       .ndo_open               = de_open,
+       .ndo_stop               = de_close,
+       .ndo_set_multicast_list = de_set_rx_mode,
+       .ndo_start_xmit         = de_start_xmit,
+       .ndo_get_stats          = de_get_stats,
+       .ndo_tx_timeout         = de_tx_timeout,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
+static int __devinit de_init_one (struct pci_dev *pdev,
                                  const struct pci_device_id *ent)
 {
        struct net_device *dev;
@@ -1948,18 +1970,12 @@ static int __init de_init_one (struct pci_dev *pdev,
        if (!dev)
                return -ENOMEM;
 
-       SET_MODULE_OWNER(dev);
+       dev->netdev_ops = &de_netdev_ops;
        SET_NETDEV_DEV(dev, &pdev->dev);
-       dev->open = de_open;
-       dev->stop = de_close;
-       dev->set_multicast_list = de_set_rx_mode;
-       dev->hard_start_xmit = de_start_xmit;
-       dev->get_stats = de_get_stats;
        dev->ethtool_ops = &de_ethtool_ops;
-       dev->tx_timeout = de_tx_timeout;
        dev->watchdog_timeo = TX_TIMEOUT;
 
-       de = dev->priv;
+       de = netdev_priv(dev);
        de->de21040 = ent->driver_data == 0 ? 1 : 0;
        de->pdev = pdev;
        de->dev = dev;
@@ -2049,15 +2065,11 @@ static int __init de_init_one (struct pci_dev *pdev,
                goto err_out_iomap;
 
        /* print info about board and interface just registered */
-       printk (KERN_INFO "%s: %s at 0x%lx, "
-               "%02x:%02x:%02x:%02x:%02x:%02x, "
-               "IRQ %d\n",
+       printk (KERN_INFO "%s: %s at 0x%lx, %pM, IRQ %d\n",
                dev->name,
                de->de21040 ? "21040" : "21041",
                dev->base_addr,
-               dev->dev_addr[0], dev->dev_addr[1],
-               dev->dev_addr[2], dev->dev_addr[3],
-               dev->dev_addr[4], dev->dev_addr[5],
+               dev->dev_addr,
                dev->irq);
 
        pci_set_drvdata(pdev, dev);
@@ -2082,10 +2094,10 @@ err_out_free:
        return rc;
 }
 
-static void __exit de_remove_one (struct pci_dev *pdev)
+static void __devexit de_remove_one (struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        BUG_ON(!dev);
        unregister_netdev(dev);
@@ -2102,7 +2114,7 @@ static void __exit de_remove_one (struct pci_dev *pdev)
 static int de_suspend (struct pci_dev *pdev, pm_message_t state)
 {
        struct net_device *dev = pci_get_drvdata (pdev);
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        rtnl_lock();
        if (netif_running (dev)) {
@@ -2137,7 +2149,7 @@ static int de_suspend (struct pci_dev *pdev, pm_message_t state)
 static int de_resume (struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata (pdev);
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int retval = 0;
 
        rtnl_lock();
@@ -2164,7 +2176,7 @@ static struct pci_driver de_driver = {
        .name           = DRV_NAME,
        .id_table       = de_pci_tbl,
        .probe          = de_init_one,
-       .remove         = __exit_p(de_remove_one),
+       .remove         = __devexit_p(de_remove_one),
 #ifdef CONFIG_PM
        .suspend        = de_suspend,
        .resume         = de_resume,