This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / net / wireless / prism54 / islpci_hotplug.c
index 11b315b..35bde67 100644 (file)
@@ -36,38 +36,107 @@ MODULE_AUTHOR("[Intersil] R.Bastings and W.Termorshuizen, The prism54.org Develo
 MODULE_DESCRIPTION("The Prism54 802.11 Wireless LAN adapter");
 MODULE_LICENSE("GPL");
 
-static int     init_pcitm = 0;
-module_param(init_pcitm, int, 0);
-
 /* In this order: vendor, device, subvendor, subdevice, class, class_mask,
  * driver_data 
  * If you have an update for this please contact prism54-devel@prism54.org 
  * The latest list can be found at http://prism54.org/supported_cards.php */
 static const struct pci_device_id prism54_id_tbl[] = {
-       /* Intersil PRISM Duette/Prism GT Wireless LAN adapter */
+       /* 3COM 3CRWE154G72 Wireless LAN adapter */
        {
-        0x1260, 0x3890,
-        PCI_ANY_ID, PCI_ANY_ID,
+        PCIVENDOR_3COM, PCIDEVICE_3COM6001,
+        PCIVENDOR_3COM, PCIDEVICE_3COM6001,
         0, 0, 0
        },
 
-       /* 3COM 3CRWE154G72 Wireless LAN adapter */
+       /* D-Link Air Plus Xtreme G A1 - DWL-g650 A1 */
        {
-        0x10b7, 0x6001,
-        PCI_ANY_ID, PCI_ANY_ID,
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_DLINK, 0x3202UL, 
+        0, 0, 0
+       },
+
+       /* I-O Data WN-G54/CB - WN-G54/CB */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_IODATA, 0xd019UL, 
+        0, 0, 0
+       },
+
+       /* Netgear WG511 */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_NETGEAR, 0x4800UL,
+        0, 0, 0
+       },
+
+       /* Tekram Technology clones, Allnet, Netcomm, Zyxel */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_TTL, 0x1605UL,
+        0, 0, 0
+       },
+
+       /* SMC2802W */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_SMC, 0x2802UL,
+        0, 0, 0
+       },
+
+       /* SMC2835W */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_SMC, 0x2835UL,
+        0, 0, 0
+       },
+
+       /* Corega CG-WLCB54GT */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_ATI, 0xc104UL,
+        0, 0, 0
+       },
+
+       /* I4 Z-Com XG-600 */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_I4, 0x0014UL,
+        0, 0, 0
+       },
+
+       /* I4 Z-Com XG-900  and clones Macer, Ovislink, Planex, Peabird, */
+       /* Sitecom, Xterasys */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_I4, 0x0020UL,
+        0, 0, 0
+       },
+
+       /* SMC 2802W V2 */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_ACCTON, 0xee03UL,
+        0, 0, 0
+       },
+
+       /* SMC 2835W V2 */
+       {
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
+        PCIVENDOR_SMC, 0xa835UL,
         0, 0, 0
        },
 
        /* Intersil PRISM Indigo Wireless LAN adapter */
        {
-        0x1260, 0x3877,
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3877,
         PCI_ANY_ID, PCI_ANY_ID,
         0, 0, 0
        },
 
-       /* Intersil PRISM Javelin/Xbow Wireless LAN adapter */
+       /* Intersil PRISM Duette/Prism GT Wireless LAN adapter */
+       /* Default */
        {
-        0x1260, 0x3886,
+        PCIVENDOR_INTERSIL, PCIDEVICE_ISL3890,
         PCI_ANY_ID, PCI_ANY_ID,
         0, 0, 0
        },
@@ -94,6 +163,85 @@ static struct pci_driver prism54_driver = {
        /* .enable_wake ; we don't support this yet */
 };
 
+static void
+prism54_get_card_model(struct net_device *ndev)
+{
+       islpci_private  *priv;
+       char            *modelp;
+       int             notwork = 0;
+
+       priv = netdev_priv(ndev);
+       switch (priv->pdev->subsystem_device) {
+       case PCIDEVICE_ISL3877:
+               modelp = "PRISM Indigo";
+               break;
+       case PCIDEVICE_ISL3886:
+               modelp = "PRISM Javelin / Xbow";
+               break;
+       case PCIDEVICE_3COM6001:
+               modelp = "3COM 3CRWE154G72";
+               break;
+       case 0x3202UL:
+               modelp = "D-Link DWL-g650 A1";
+               break;
+       case 0xd019UL:
+               modelp = "WN-G54/CB";
+               break;
+       case 0x4800UL:
+               modelp = "Netgear WG511";
+               break;
+       case 0x2802UL:
+               modelp = "SMC2802W";
+               break;
+       case 0xee03UL:
+               modelp = "SMC2802W V2";
+               notwork = 1;
+               break;
+       case 0x2835UL:
+               modelp = "SMC2835W";
+               break;
+       case 0xa835UL:
+               modelp = "SMC2835W V2";
+               notwork = 1;
+               break;
+       case 0xc104UL:
+               modelp = "CG-WLCB54GT";
+               break;
+       case 0x1605UL:
+               modelp = "Tekram Technology clone";
+               break;
+       /* Let's leave this one out for now since it seems bogus/wrong 
+        * Even if the manufacturer did use 0x0000UL it may not be correct
+        * by their part, therefore deserving no name ;) */
+       /*      case 0x0000UL: 
+        *              modelp = "SparkLAN WL-850F";
+        *              break;*/
+
+       /* We have two reported for the one below :( */
+       case 0x0014UL:
+               modelp = "I4 Z-Com XG-600 and clones";
+               break;
+       case 0x0020UL:
+               modelp = "I4 Z-Com XG-900 and clones";
+               break;
+/* Default it */
+/*
+       case PCIDEVICE_ISL3890:
+               modelp = "PRISM Duette/GT";
+               break;
+*/
+       default:
+               modelp = "PRISM Duette/GT";
+       }
+       printk(KERN_DEBUG "%s: %s driver detected card model: %s\n",
+                       ndev->name, DRV_NAME, modelp);
+       if ( notwork ) {
+               printk(KERN_DEBUG "%s: %s Warning - This may not work\n",
+                       ndev->name, DRV_NAME);
+       }
+       return;
+}
+
 /******************************************************************************
     Module initialization functions
 ******************************************************************************/
@@ -144,14 +292,14 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
         *
         *      Writing zero to both these two registers will disable both timeouts and
         *      *can* solve problems caused by devices that are slow to respond.
-        *      Make this configurable - MSW
         */
-       if ( init_pcitm >= 0 ) {
-               pci_write_config_byte(pdev, 0x40, (u8)init_pcitm);
-               pci_write_config_byte(pdev, 0x41, (u8)init_pcitm);
-       } else {
-               printk(KERN_INFO "PCI TRDY/RETRY unchanged\n");
-       }
+       /*      I am taking these out, we should not be poking around in the
+        *      programmable timers - MSW
+       */
+/*     Do not zero the programmable timers
+       pci_write_config_byte(pdev, 0x40, 0);
+       pci_write_config_byte(pdev, 0x41, 0);
+*/
 
        /* request the pci device I/O regions */
        rvalue = pci_request_regions(pdev, DRV_NAME);
@@ -203,14 +351,17 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        /* firmware upload is triggered in islpci_open */
 
+       /* Pretty card model discovery output */
+       prism54_get_card_model(ndev);
+
        return 0;
 
       do_unregister_netdev:
        unregister_netdev(ndev);
        islpci_free_memory(priv);
-       pci_set_drvdata(pdev, NULL);
+       pci_set_drvdata(pdev, 0);
        free_netdev(ndev);
-       priv = NULL;
+       priv = 0;
       do_pci_release_regions:
        pci_release_regions(pdev);
       do_pci_disable_device:
@@ -226,7 +377,7 @@ void
 prism54_remove(struct pci_dev *pdev)
 {
        struct net_device *ndev = pci_get_drvdata(pdev);
-       islpci_private *priv = ndev ? netdev_priv(ndev) : NULL;
+       islpci_private *priv = ndev ? netdev_priv(ndev) : 0;
        BUG_ON(!priv);
 
        if (!__in_cleanup_module) {
@@ -254,9 +405,9 @@ prism54_remove(struct pci_dev *pdev)
        /* free the PCI memory and unmap the remapped page */
        islpci_free_memory(priv);
 
-       pci_set_drvdata(pdev, NULL);
+       pci_set_drvdata(pdev, 0);
        free_netdev(ndev);
-       priv = NULL;
+       priv = 0;
 
        pci_release_regions(pdev);
 
@@ -267,7 +418,7 @@ int
 prism54_suspend(struct pci_dev *pdev, u32 state)
 {
        struct net_device *ndev = pci_get_drvdata(pdev);
-       islpci_private *priv = ndev ? netdev_priv(ndev) : NULL;
+       islpci_private *priv = ndev ? netdev_priv(ndev) : 0;
        BUG_ON(!priv);
 
        printk(KERN_NOTICE "%s: got suspend request (state %d)\n",
@@ -292,7 +443,7 @@ int
 prism54_resume(struct pci_dev *pdev)
 {
        struct net_device *ndev = pci_get_drvdata(pdev);
-       islpci_private *priv = ndev ? netdev_priv(ndev) : NULL;
+       islpci_private *priv = ndev ? netdev_priv(ndev) : 0;
        BUG_ON(!priv);
 
        printk(KERN_NOTICE "%s: got resume request\n", ndev->name);