linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / net / starfire.c
index c0a62b0..d167ded 100644 (file)
 
        Support and updates available at
        http://www.scyld.com/network/starfire.html
-       [link no longer provides useful info -jgarzik]
 
+       -----------------------------------------------------------
+
+       Linux kernel-specific changes:
+
+       LK1.1.1 (jgarzik):
+       - Use PCI driver interface
+       - Fix MOD_xxx races
+       - softnet fixups
+
+       LK1.1.2 (jgarzik):
+       - Merge Becker version 0.15
+
+       LK1.1.3 (Andrew Morton)
+       - Timer cleanups
+
+       LK1.1.4 (jgarzik):
+       - Merge Becker version 1.03
+
+       LK1.2.1 (Ion Badulescu <ionut@cs.columbia.edu>)
+       - Support hardware Rx/Tx checksumming
+       - Use the GFP firmware taken from Adaptec's Netware driver
+
+       LK1.2.2 (Ion Badulescu)
+       - Backported to 2.2.x
+
+       LK1.2.3 (Ion Badulescu)
+       - Fix the flaky mdio interface
+       - More compat clean-ups
+
+       LK1.2.4 (Ion Badulescu)
+       - More 2.2.x initialization fixes
+
+       LK1.2.5 (Ion Badulescu)
+       - Several fixes from Manfred Spraul
+
+       LK1.2.6 (Ion Badulescu)
+       - Fixed ifup/ifdown/ifup problem in 2.4.x
+
+       LK1.2.7 (Ion Badulescu)
+       - Removed unused code
+       - Made more functions static and __init
+
+       LK1.2.8 (Ion Badulescu)
+       - Quell bogus error messages, inform about the Tx threshold
+       - Removed #ifdef CONFIG_PCI, this driver is PCI only
+
+       LK1.2.9 (Ion Badulescu)
+       - Merged Jeff Garzik's changes from 2.4.4-pre5
+       - Added 2.2.x compatibility stuff required by the above changes
+
+       LK1.2.9a (Ion Badulescu)
+       - More updates from Jeff Garzik
+
+       LK1.3.0 (Ion Badulescu)
+       - Merged zerocopy support
+
+       LK1.3.1 (Ion Badulescu)
+       - Added ethtool support
+       - Added GPIO (media change) interrupt support
+
+       LK1.3.2 (Ion Badulescu)
+       - Fixed 2.2.x compatibility issues introduced in 1.3.1
+       - Fixed ethtool ioctl returning uninitialized memory
+
+       LK1.3.3 (Ion Badulescu)
+       - Initialize the TxMode register properly
+       - Don't dereference dev->priv after freeing it
+
+       LK1.3.4 (Ion Badulescu)
+       - Fixed initialization timing problems
+       - Fixed interrupt mask definitions
+
+       LK1.3.5 (jgarzik)
+       - ethtool NWAY_RST, GLINK, [GS]MSGLVL support
+
+       LK1.3.6:
+       - Sparc64 support and fixes (Ion Badulescu)
+       - Better stats and error handling (Ion Badulescu)
+       - Use new pci_set_mwi() PCI API function (jgarzik)
+
+       LK1.3.7 (Ion Badulescu)
+       - minimal implementation of tx_timeout()
+       - correctly shutdown the Rx/Tx engines in netdev_close()
+       - added calls to netif_carrier_on/off
+       (patch from Stefan Rompf <srompf@isg.de>)
+       - VLAN support
+
+       LK1.3.8 (Ion Badulescu)
+       - adjust DMA burst size on sparc64
+       - 64-bit support
+       - reworked zerocopy support for 64-bit buffers
+       - working and usable interrupt mitigation/latency
+       - reduced Tx interrupt frequency for lower interrupt overhead
+
+       LK1.3.9 (Ion Badulescu)
+       - bugfix for mcast filter
+       - enable the right kind of Tx interrupts (TxDMADone, not TxDone)
+
+       LK1.4.0 (Ion Badulescu)
+       - NAPI support
+
+       LK1.4.1 (Ion Badulescu)
+       - flush PCI posting buffers after disabling Rx interrupts
+       - put the chip to a D3 slumber on driver unload
+       - added config option to enable/disable NAPI
+
+       LK1.4.2 (Ion Badulescu)
+       - finally added firmware (GPL'ed by Adaptec)
+       - removed compatibility code for 2.2.x
+
+       LK1.4.2.1 (Ion Badulescu)
+       - fixed 32/64 bit issues on i386 + CONFIG_HIGHMEM
+       - added 32-bit padding to outgoing skb's, removed previous workaround
+
+TODO:  - fix forced speed/duplexing code (broken a long time ago, when
+       somebody converted the driver to use the generic MII code)
+       - fix VLAN support
 */
 
 #define DRV_NAME       "starfire"
-#define DRV_VERSION    "2.0"
-#define DRV_RELDATE    "June 27, 2006"
+#define DRV_VERSION    "1.03+LK1.4.2.1"
+#define DRV_RELDATE    "October 3, 2005"
 
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/pci.h>
@@ -84,7 +201,7 @@ static int max_interrupt_work = 20;
 static int mtu;
 /* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
    The Starfire has a 512 element hash table based on the Ethernet CRC. */
-static const int multicast_filter_limit = 512;
+static int multicast_filter_limit = 512;
 /* Whether to do TCP/UDP checksums in hardware */
 static int enable_hw_cksum = 1;
 
@@ -218,7 +335,7 @@ do { \
 
 
 /* These identify the driver base version and may not be removed. */
-static const char version[] __devinitdata =
+static char version[] __devinitdata =
 KERN_INFO "starfire.c:v1.03 7/26/2000  Written by Donald Becker <becker@scyld.com>\n"
 KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELDATE ")\n";
 
@@ -346,7 +463,7 @@ static struct pci_device_id starfire_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, starfire_pci_tbl);
 
 /* A chip capabilities table, matching the CH_xxx entries in xxx_pci_tbl[] above. */
-static const struct chip_info {
+static struct chip_info {
        const char *name;
        int drv_flags;
 } netdrv_tbl[] __devinitdata = {
@@ -730,6 +847,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev,
                goto err_out_free_netdev;
        }
 
+       /* ioremap is borken in Linux-2.2.x/sparc64 */
        base = ioremap(ioaddr, io_size);
        if (!base) {
                printk(KERN_ERR DRV_NAME " %d: cannot remap %#x @ %#lx, aborting\n",
@@ -953,7 +1071,7 @@ static int netdev_open(struct net_device *dev)
 
        /* Do we ever need to reset the chip??? */
 
-       retval = request_irq(dev->irq, &intr_handler, IRQF_SHARED, dev->name, dev);
+       retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev);
        if (retval)
                return retval;
 
@@ -1231,7 +1349,8 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
 
 #if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE)
        if (skb->ip_summed == CHECKSUM_HW) {
-               if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK))
+               skb = skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK);
+               if (skb == NULL)
                        return NETDEV_TX_OK;
        }
 #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */
@@ -1965,45 +2084,14 @@ static int netdev_close(struct net_device *dev)
        return 0;
 }
 
-#ifdef CONFIG_PM
-static int starfire_suspend(struct pci_dev *pdev, pm_message_t state)
-{
-       struct net_device *dev = pci_get_drvdata(pdev);
-
-       if (netif_running(dev)) {
-               netif_device_detach(dev);
-               netdev_close(dev);
-       }
-
-       pci_save_state(pdev);
-       pci_set_power_state(pdev, pci_choose_state(pdev,state));
-
-       return 0;
-}
-
-static int starfire_resume(struct pci_dev *pdev)
-{
-       struct net_device *dev = pci_get_drvdata(pdev);
-       
-       pci_set_power_state(pdev, PCI_D0);
-       pci_restore_state(pdev);
-
-       if (netif_running(dev)) {
-               netdev_open(dev);
-               netif_device_attach(dev);
-       }
-
-       return 0;
-}
-#endif /* CONFIG_PM */
-
 
 static void __devexit starfire_remove_one (struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
        struct netdev_private *np = netdev_priv(dev);
 
-       BUG_ON(!dev);
+       if (!dev)
+               BUG();
 
        unregister_netdev(dev);
 
@@ -2027,10 +2115,6 @@ static struct pci_driver starfire_driver = {
        .name           = DRV_NAME,
        .probe          = starfire_init_one,
        .remove         = __devexit_p(starfire_remove_one),
-#ifdef CONFIG_PM
-       .suspend        = starfire_suspend,
-       .resume         = starfire_resume,
-#endif /* CONFIG_PM */
        .id_table       = starfire_pci_tbl,
 };