vserver 1.9.5.x5
[linux-2.6.git] / drivers / net / e100.c
index a39b58c..3acb810 100644 (file)
 
 
 #define DRV_NAME               "e100"
-#define DRV_EXT                        "-NAPI"
-#define DRV_VERSION            "3.0.27-k2"DRV_EXT
+#define DRV_EXT                "-NAPI"
+#define DRV_VERSION            "3.3.6-k2"DRV_EXT
 #define DRV_DESCRIPTION                "Intel(R) PRO/100 Network Driver"
 #define DRV_COPYRIGHT          "Copyright(c) 1999-2004 Intel Corporation"
 #define PFX                    DRV_NAME ": "
 MODULE_DESCRIPTION(DRV_DESCRIPTION);
 MODULE_AUTHOR(DRV_COPYRIGHT);
 MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_VERSION);
 
 static int debug = 3;
 module_param(debug, int, 0);
@@ -200,6 +201,7 @@ static struct pci_device_id e100_id_table[] = {
        INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
        INTEL_8255X_ETHERNET_DEVICE(0x1056, 5),
        INTEL_8255X_ETHERNET_DEVICE(0x1057, 5),
+       INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
        INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
        INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
        INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
@@ -208,7 +210,6 @@ static struct pci_device_id e100_id_table[] = {
        INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
        INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
        INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
-       INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
        INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
        INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
        INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
@@ -513,7 +514,7 @@ struct nic {
 
        spinlock_t cb_lock                      ____cacheline_aligned;
        spinlock_t cmd_lock;
-       struct csr *csr;
+       struct csr __iomem *csr;
        enum scb_cmd_lo cuc_cmd;
        unsigned int cbs_avail;
        struct cb *cbs;
@@ -563,7 +564,6 @@ struct nic {
        u16 leds;
        u16 eeprom_wc;
        u16 eeprom[256];
-       u32 pm_state[16];
 };
 
 static inline void e100_write_flush(struct nic *nic)
@@ -575,13 +575,21 @@ static inline void e100_write_flush(struct nic *nic)
 
 static inline void e100_enable_irq(struct nic *nic)
 {
+       unsigned long flags;
+
+       spin_lock_irqsave(&nic->cmd_lock, flags);
        writeb(irq_mask_none, &nic->csr->scb.cmd_hi);
+       spin_unlock_irqrestore(&nic->cmd_lock, flags);
        e100_write_flush(nic);
 }
 
 static inline void e100_disable_irq(struct nic *nic)
 {
+       unsigned long flags;
+
+       spin_lock_irqsave(&nic->cmd_lock, flags);
        writeb(irq_mask_all, &nic->csr->scb.cmd_hi);
+       spin_unlock_irqrestore(&nic->cmd_lock, flags);
        e100_write_flush(nic);
 }
 
@@ -596,16 +604,6 @@ static void e100_hw_reset(struct nic *nic)
        writel(software_reset, &nic->csr->port);
        e100_write_flush(nic); udelay(20);
 
-       /* TCO workaround - 82559 and greater */
-       if(nic->mac >= mac_82559_D101M) {
-               /* Issue a redundant CU load base without setting
-                * general pointer, and without waiting for scb to
-                * clear.  This gets us into post-driver.  Finally,
-                * wait 20 msec for reset to take effect. */
-               writeb(cuc_load_base, &nic->csr->scb.cmd_lo);
-               mdelay(20);
-       }
-
        /* Mask off our interrupt line - it's unmasked after reset */
        e100_disable_irq(nic);
 }
@@ -623,8 +621,7 @@ static int e100_self_test(struct nic *nic)
        writel(selftest | dma_addr, &nic->csr->port);
        e100_write_flush(nic);
        /* Wait 10 msec for self-test to complete */
-       set_current_state(TASK_UNINTERRUPTIBLE);
-       schedule_timeout(HZ / 100 + 1);
+       msleep(10);
 
        /* Interrupts are enabled after self-test */
        e100_disable_irq(nic);
@@ -672,8 +669,7 @@ static void e100_eeprom_write(struct nic *nic, u16 addr_len, u16 addr, u16 data)
                        e100_write_flush(nic); udelay(4);
                }
                /* Wait 10 msec for cmd to complete */
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               schedule_timeout(HZ / 100 + 1);
+               msleep(10);
 
                /* Chip deselect */
                writeb(0, &nic->csr->eeprom_ctrl_lo);
@@ -1254,8 +1250,13 @@ static void e100_watchdog(unsigned long data)
        mii_check_link(&nic->mii);
 
        /* Software generated interrupt to recover from (rare) Rx
-        * allocation failure */
-       writeb(irq_sw_gen, &nic->csr->scb.cmd_hi);
+       * allocation failure.
+       * Unfortunately have to use a spinlock to not re-enable interrupts
+       * accidentally, due to hardware that shares a register between the
+       * interrupt mask bit and the SW Interrupt generation bit */
+       spin_lock_irq(&nic->cmd_lock);
+       writeb(readb(&nic->csr->scb.cmd_hi) | irq_sw_gen,&nic->csr->scb.cmd_hi);
+       spin_unlock_irq(&nic->cmd_lock);
        e100_write_flush(nic);
 
        e100_update_stats(nic);
@@ -1305,6 +1306,7 @@ static int e100_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        switch(err) {
        case -ENOSPC:
                /* We queued the skb, but now we're out of space. */
+               DPRINTK(TX_ERR, DEBUG, "No space for CB\n");
                netif_stop_queue(netdev);
                break;
        case -ENOMEM:
@@ -1425,14 +1427,12 @@ static inline void e100_start_receiver(struct nic *nic)
 #define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
 static inline int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
 {
-       unsigned int rx_offset = 2; /* u32 align protocol headers */
-
-       if(!(rx->skb = dev_alloc_skb(RFD_BUF_LEN + rx_offset)))
+       if(!(rx->skb = dev_alloc_skb(RFD_BUF_LEN + NET_IP_ALIGN)))
                return -ENOMEM;
 
        /* Align, init, and map the RFD. */
        rx->skb->dev = nic->netdev;
-       skb_reserve(rx->skb, rx_offset);
+       skb_reserve(rx->skb, NET_IP_ALIGN);
        memcpy(rx->skb->data, &nic->blank_rfd, sizeof(struct rfd));
        rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,
                RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
@@ -1471,7 +1471,7 @@ static inline int e100_rx_indicate(struct nic *nic, struct rx *rx,
 
        /* If data isn't ready, nothing to indicate */
        if(unlikely(!(rfd_status & cb_complete)))
-                       return -EAGAIN;
+               return -EAGAIN;
 
        /* Get actual data size */
        actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
@@ -1630,6 +1630,7 @@ static void e100_netpoll(struct net_device *netdev)
        struct nic *nic = netdev_priv(netdev);
        e100_disable_irq(nic);
        e100_intr(nic->pdev->irq, netdev, NULL);
+       e100_tx_clean(nic);
        e100_enable_irq(nic);
 }
 #endif
@@ -1758,12 +1759,11 @@ static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
        memset(skb->data, 0xFF, ETH_DATA_LEN);
        e100_xmit_frame(skb, nic->netdev);
 
-       set_current_state(TASK_UNINTERRUPTIBLE);
-       schedule_timeout(HZ / 100 + 1);
+       msleep(10);
 
        if(memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd),
           skb->data, ETH_DATA_LEN))
-                       err = -EAGAIN;
+               err = -EAGAIN;
 
 err_loopback_none:
        mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR, 0);
@@ -1845,8 +1845,7 @@ static void e100_get_regs(struct net_device *netdev,
                        mdio_read(netdev, nic->mii.phy_id, i);
        memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));
        e100_exec_cb(nic, NULL, e100_dump);
-       set_current_state(TASK_UNINTERRUPTIBLE);
-       schedule_timeout(HZ / 100 + 1);
+       msleep(10);
        memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf,
                sizeof(nic->mem->dump_buf));
 }
@@ -1956,12 +1955,17 @@ static int e100_set_ringparam(struct net_device *netdev,
        struct param_range *rfds = &nic->params.rfds;
        struct param_range *cbs = &nic->params.cbs;
 
+       if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) 
+               return -EINVAL;
+
        if(netif_running(netdev))
                e100_down(nic);
        rfds->count = max(ring->rx_pending, rfds->min);
        rfds->count = min(rfds->count, rfds->max);
        cbs->count = max(ring->tx_pending, cbs->min);
        cbs->count = min(cbs->count, cbs->max);
+       DPRINTK(DRV, INFO, "Ring Param settings: rx: %d, tx %d\n",
+               rfds->count, cbs->count);
        if(netif_running(netdev))
                e100_up(nic);
 
@@ -2020,8 +2024,7 @@ static int e100_phys_id(struct net_device *netdev, u32 data)
        if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
                data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
        mod_timer(&nic->blink_timer, jiffies);
-       set_current_state(TASK_INTERRUPTIBLE);
-       schedule_timeout(data * HZ);
+       msleep_interruptible(data * 1000);
        del_timer_sync(&nic->blink_timer);
        mdio_write(netdev, nic->mii.phy_id, MII_LED_CONTROL, 0);
 
@@ -2173,6 +2176,7 @@ static int __devinit e100_probe(struct pci_dev *pdev,
 #ifdef CONFIG_NET_POLL_CONTROLLER
        netdev->poll_controller = e100_netpoll;
 #endif
+       strcpy(netdev->name, pci_name(pdev));
 
        nic = netdev_priv(netdev);
        nic->netdev = netdev;
@@ -2197,8 +2201,6 @@ static int __devinit e100_probe(struct pci_dev *pdev,
                goto err_out_disable_pdev;
        }
 
-       pci_set_master(pdev);
-
        if((err = pci_set_dma_mask(pdev, 0xFFFFFFFFULL))) {
                DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
                goto err_out_free_res;
@@ -2219,9 +2221,18 @@ static int __devinit e100_probe(struct pci_dev *pdev,
        else
                nic->flags &= ~ich;
 
+       e100_get_defaults(nic);
+
        spin_lock_init(&nic->cb_lock);
        spin_lock_init(&nic->cmd_lock);
 
+       /* Reset the device before pci_set_master() in case device is in some
+        * funky state and has an interrupt pending - hint: we don't have the
+        * interrupt handler registered yet. */
+       e100_hw_reset(nic);
+
+       pci_set_master(pdev);
+
        init_timer(&nic->watchdog);
        nic->watchdog.function = e100_watchdog;
        nic->watchdog.data = (unsigned long)nic;
@@ -2234,8 +2245,6 @@ static int __devinit e100_probe(struct pci_dev *pdev,
                goto err_out_iounmap;
        }
 
-       e100_get_defaults(nic);
-       e100_hw_reset(nic);
        e100_phy_init(nic);
 
        if((err = e100_eeprom_load(nic)))
@@ -2256,6 +2265,7 @@ static int __devinit e100_probe(struct pci_dev *pdev,
 
        pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
 
+       strcpy(netdev->name, "eth%d");
        if((err = register_netdev(netdev))) {
                DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
                goto err_out_free;
@@ -2310,10 +2320,10 @@ static int e100_suspend(struct pci_dev *pdev, u32 state)
        e100_hw_reset(nic);
        netif_device_detach(netdev);
 
-       pci_save_state(pdev, nic->pm_state);
+       pci_save_state(pdev);
        pci_enable_wake(pdev, state, nic->flags & (wol_magic | e100_asf(nic)));
        pci_disable_device(pdev);
-       pci_set_power_state(pdev, state);
+       pci_set_power_state(pdev, pci_choose_state(pdev, state));
 
        return 0;
 }
@@ -2323,8 +2333,8 @@ static int e100_resume(struct pci_dev *pdev)
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct nic *nic = netdev_priv(netdev);
 
-       pci_set_power_state(pdev, 0);
-       pci_restore_state(pdev, nic->pm_state);
+       pci_set_power_state(pdev, PCI_D0);
+       pci_restore_state(pdev);
        e100_hw_init(nic);
 
        netif_device_attach(netdev);
@@ -2352,7 +2362,7 @@ static int __init e100_init_module(void)
                printk(KERN_INFO PFX "%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
                printk(KERN_INFO PFX "%s\n", DRV_COPYRIGHT);
        }
-        return pci_module_init(&e100_driver);
+       return pci_module_init(&e100_driver);
 }
 
 static void __exit e100_cleanup_module(void)