Merge branch 'upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/linville...
[linux-2.6.git] / drivers / net / ns83820.c
index b0c3b6a..0dedd34 100644 (file)
@@ -96,7 +96,6 @@
 //#define dprintk              printk
 #define dprintk(x...)          do { } while (0)
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/types.h>
 #include <linux/timer.h>
 #include <linux/if_vlan.h>
 #include <linux/rtnetlink.h>
+#include <linux/jiffies.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -567,8 +567,7 @@ static inline int ns83820_add_rx_skb(struct ns83820 *dev, struct sk_buff *skb)
 #endif
 
        sg = dev->rx_info.descs + (next_empty * DESC_SIZE);
-       if (unlikely(NULL != dev->rx_info.skbs[next_empty]))
-               BUG();
+       BUG_ON(NULL != dev->rx_info.skbs[next_empty]);
        dev->rx_info.skbs[next_empty] = skb;
 
        dev->rx_info.next_empty = (next_empty + 1) % NR_RX_DESC;
@@ -651,7 +650,7 @@ static void FASTCALL(phy_intr(struct net_device *ndev));
 static void fastcall phy_intr(struct net_device *ndev)
 {
        struct ns83820 *dev = PRIV(ndev);
-       static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
+       static const char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
        u32 cfg, new_cfg;
        u32 tbisr, tanar, tanlpar;
        int speed, fullduplex, newlinkstate;
@@ -804,7 +803,7 @@ static int ns83820_setup_rx(struct net_device *ndev)
 
                writel(dev->IMR_cache, dev->base + IMR);
                writel(1, dev->base + IER);
-               spin_unlock_irq(&dev->misc_lock);
+               spin_unlock(&dev->misc_lock);
 
                kick_rx(ndev);
 
@@ -1013,8 +1012,6 @@ static void do_tx_done(struct net_device *ndev)
        struct ns83820 *dev = PRIV(ndev);
        u32 cmdsts, tx_done_idx, *desc;
 
-       spin_lock_irq(&dev->tx_lock);
-
        dprintk("do_tx_done(%p)\n", ndev);
        tx_done_idx = dev->tx_done_idx;
        desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
@@ -1070,7 +1067,6 @@ static void do_tx_done(struct net_device *ndev)
                netif_start_queue(ndev);
                netif_wake_queue(ndev);
        }
-       spin_unlock_irq(&dev->tx_lock);
 }
 
 static void ns83820_cleanup_tx(struct ns83820 *dev)
@@ -1282,11 +1278,13 @@ static struct ethtool_ops ops = {
        .get_link = ns83820_get_link
 };
 
+/* this function is called in irq context from the ISR */
 static void ns83820_mib_isr(struct ns83820 *dev)
 {
-       spin_lock(&dev->misc_lock);
+       unsigned long flags;
+       spin_lock_irqsave(&dev->misc_lock, flags);
        ns83820_update_stats(dev);
-       spin_unlock(&dev->misc_lock);
+       spin_unlock_irqrestore(&dev->misc_lock, flags);
 }
 
 static void ns83820_do_isr(struct net_device *ndev, u32 isr);
@@ -1308,6 +1306,8 @@ static irqreturn_t ns83820_irq(int foo, void *data, struct pt_regs *regs)
 static void ns83820_do_isr(struct net_device *ndev, u32 isr)
 {
        struct ns83820 *dev = PRIV(ndev);
+       unsigned long flags;
+
 #ifdef DEBUG
        if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
                Dprintk("odd isr? 0x%08x\n", isr);
@@ -1322,10 +1322,10 @@ static void ns83820_do_isr(struct net_device *ndev, u32 isr)
        if ((ISR_RXDESC | ISR_RXOK) & isr) {
                prefetch(dev->rx_info.next_rx_desc);
 
-               spin_lock_irq(&dev->misc_lock);
+               spin_lock_irqsave(&dev->misc_lock, flags);
                dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK);
                writel(dev->IMR_cache, dev->base + IMR);
-               spin_unlock_irq(&dev->misc_lock);
+               spin_unlock_irqrestore(&dev->misc_lock, flags);
 
                tasklet_schedule(&dev->rx_tasklet);
                //rx_irq(ndev);
@@ -1371,16 +1371,18 @@ static void ns83820_do_isr(struct net_device *ndev, u32 isr)
         * work has accumulated
         */
        if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) {
+               spin_lock_irqsave(&dev->tx_lock, flags);
                do_tx_done(ndev);
+               spin_unlock_irqrestore(&dev->tx_lock, flags);
 
                /* Disable TxOk if there are no outstanding tx packets.
                 */
                if ((dev->tx_done_idx == dev->tx_free_idx) &&
                    (dev->IMR_cache & ISR_TXOK)) {
-                       spin_lock_irq(&dev->misc_lock);
+                       spin_lock_irqsave(&dev->misc_lock, flags);
                        dev->IMR_cache &= ~ISR_TXOK;
                        writel(dev->IMR_cache, dev->base + IMR);
-                       spin_unlock_irq(&dev->misc_lock);
+                       spin_unlock_irqrestore(&dev->misc_lock, flags);
                }
        }
 
@@ -1391,10 +1393,10 @@ static void ns83820_do_isr(struct net_device *ndev, u32 isr)
         * nature are expected, we must enable TxOk.
         */
        if ((ISR_TXIDLE & isr) && (dev->tx_done_idx != dev->tx_free_idx)) {
-               spin_lock_irq(&dev->misc_lock);
+               spin_lock_irqsave(&dev->misc_lock, flags);
                dev->IMR_cache |= ISR_TXOK;
                writel(dev->IMR_cache, dev->base + IMR);
-               spin_unlock_irq(&dev->misc_lock);
+               spin_unlock_irqrestore(&dev->misc_lock, flags);
        }
 
        /* MIB interrupt: one of the statistics counters is about to overflow */
@@ -1456,7 +1458,7 @@ static void ns83820_tx_timeout(struct net_device *ndev)
         u32 tx_done_idx, *desc;
        unsigned long flags;
 
-       local_irq_save(flags);
+       spin_lock_irqsave(&dev->tx_lock, flags);
 
        tx_done_idx = dev->tx_done_idx;
        desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
@@ -1483,7 +1485,7 @@ static void ns83820_tx_timeout(struct net_device *ndev)
                ndev->name,
                tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS]));
 
-       local_irq_restore(flags);
+       spin_unlock_irqrestore(&dev->tx_lock, flags);
 }
 
 static void ns83820_tx_watch(unsigned long data)
@@ -1607,7 +1609,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab
 {
        struct ns83820 *dev = PRIV(ndev);
        int timed_out = 0;
-       long start;
+       unsigned long start;
        u32 status;
        int loops = 0;
 
@@ -1625,7 +1627,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab
                        break;
                if (status & fail)
                        break;
-               if ((jiffies - start) >= HZ) {
+               if (time_after_eq(jiffies, start + HZ)) {
                        timed_out = 1;
                        break;
                }
@@ -1827,13 +1829,13 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
        int using_dac = 0;
 
        /* See if we can set the dma mask early on; failure is fatal. */
-       if (sizeof(dma_addr_t) == 8 && 
-               !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) {
+       if (sizeof(dma_addr_t) == 8 &&
+               !pci_set_dma_mask(pci_dev, DMA_64BIT_MASK)) {
                using_dac = 1;
-       } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) {
+       } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) {
                using_dac = 0;
        } else {
-               printk(KERN_WARNING "ns83820.c: pci_set_dma_mask failed!\n");
+               dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n");
                return -ENODEV;
        }
 
@@ -1856,7 +1858,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
 
        err = pci_enable_device(pci_dev);
        if (err) {
-               printk(KERN_INFO "ns83820: pci_enable_dev failed: %d\n", err);
+               dev_info(&pci_dev->dev, "pci_enable_dev failed: %d\n", err);
                goto out_free;
        }
 
@@ -1882,11 +1884,11 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
 
        dev->IMR_cache = 0;
 
-       err = request_irq(pci_dev->irq, ns83820_irq, SA_SHIRQ,
+       err = request_irq(pci_dev->irq, ns83820_irq, IRQF_SHARED,
                          DRV_NAME, ndev);
        if (err) {
-               printk(KERN_INFO "ns83820: unable to register irq %d\n",
-                       pci_dev->irq);
+               dev_info(&pci_dev->dev, "unable to register irq %d, err %d\n",
+                       pci_dev->irq, err);
                goto out_disable;
        }
 
@@ -1900,7 +1902,7 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
        rtnl_lock();
        err = dev_alloc_name(ndev, ndev->name);
        if (err < 0) {
-               printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err);
+               dev_info(&pci_dev->dev, "unable to get netdev name: %d\n", err);
                goto out_free_irq;
        }
 
@@ -2176,7 +2178,7 @@ static struct pci_driver driver = {
 static int __init ns83820_init(void)
 {
        printk(KERN_INFO "ns83820.c: National Semiconductor DP83820 10/100/1000 driver.\n");
-       return pci_module_init(&driver);
+       return pci_register_driver(&driver);
 }
 
 static void __exit ns83820_exit(void)