fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / net / wireless / prism54 / islpci_hotplug.c
index b41d666..58257b4 100644 (file)
@@ -1,5 +1,4 @@
 /*
- *  
  *  Copyright (C) 2002 Intersil Americas Inc.
  *  Copyright (C) 2003 Herbert Valerio Riedel <hvr@gnu.org>
  *
@@ -22,6 +21,7 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/init.h> /* For __init, __exit */
+#include <linux/dma-mapping.h>
 
 #include "prismcompat.h"
 #include "islpci_dev.h"
@@ -39,8 +39,8 @@ 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 
+ * 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 */
@@ -124,22 +124,22 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        }
 
        /* enable PCI DMA */
-       if (pci_set_dma_mask(pdev, 0xffffffff)) {
+       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
                printk(KERN_ERR "%s: 32-bit PCI DMA not supported", DRV_NAME);
                goto do_pci_disable_device;
         }
 
        /* 0x40 is the programmable timer to configure the response timeout (TRDY_TIMEOUT)
         * 0x41 is the programmable timer to configure the retry timeout (RETRY_TIMEOUT)
-        *      The RETRY_TIMEOUT is used to set the number of retries that the core, as a
-        *      Master, will perform before abandoning a cycle. The default value for
-        *      RETRY_TIMEOUT is 0x80, which far exceeds the PCI 2.1 requirement for new
-        *      devices. A write of zero to the RETRY_TIMEOUT register disables this
-        *      function to allow use with any non-compliant legacy devices that may
-        *      execute more retries.
+        *      The RETRY_TIMEOUT is used to set the number of retries that the core, as a
+        *      Master, will perform before abandoning a cycle. The default value for
+        *      RETRY_TIMEOUT is 0x80, which far exceeds the PCI 2.1 requirement for new
+        *      devices. A write of zero to the RETRY_TIMEOUT register disables this
+        *      function to allow use with any non-compliant legacy devices that may
+        *      execute more retries.
         *
-        *      Writing zero to both these two registers will disable both timeouts and
-        *      *can* solve problems caused by devices that are slow to respond.
+        *      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 ) {
@@ -170,14 +170,15 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        pci_set_master(pdev);
 
        /* enable MWI */
-       pci_set_mwi(pdev);
+       if (!pci_set_mwi(pdev))
+               printk(KERN_INFO "%s: pci_set_mwi(pdev) succeeded\n", DRV_NAME);
 
        /* setup the network device interface and its structure */
        if (!(ndev = islpci_setup(pdev))) {
                /* error configuring the driver as a network device */
                printk(KERN_ERR "%s: could not configure network device\n",
                       DRV_NAME);
-               goto do_pci_release_regions;
+               goto do_pci_clear_mwi;
        }
 
        priv = netdev_priv(ndev);
@@ -188,7 +189,7 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        /* request for the interrupt before uploading the firmware */
        rvalue = request_irq(pdev->irq, &islpci_interrupt,
-                            SA_SHIRQ, ndev->name, priv);
+                            IRQF_SHARED, ndev->name, priv);
 
        if (rvalue) {
                /* error, could not hook the handler to the irq */
@@ -207,6 +208,8 @@ prism54_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        pci_set_drvdata(pdev, NULL);
        free_netdev(ndev);
        priv = NULL;
+      do_pci_clear_mwi:
+       pci_clear_mwi(pdev);
       do_pci_release_regions:
        pci_release_regions(pdev);
       do_pci_disable_device:
@@ -240,7 +243,7 @@ prism54_remove(struct pci_dev *pdev)
                isl38xx_disable_interrupts(priv->device_base);
                islpci_set_state(priv, PRV_STATE_OFF);
                /* This bellow causes a lockup at rmmod time. It might be
-                * because some interrupts still linger after rmmod time, 
+                * because some interrupts still linger after rmmod time,
                 * see bug #17 */
                /* pci_set_power_state(pdev, 3);*/      /* try to power-off */
        }
@@ -254,6 +257,8 @@ prism54_remove(struct pci_dev *pdev)
        free_netdev(ndev);
        priv = NULL;
 
+       pci_clear_mwi(pdev);
+
        pci_release_regions(pdev);
 
        pci_disable_device(pdev);
@@ -287,12 +292,19 @@ prism54_resume(struct pci_dev *pdev)
 {
        struct net_device *ndev = pci_get_drvdata(pdev);
        islpci_private *priv = ndev ? netdev_priv(ndev) : NULL;
-       BUG_ON(!priv);
+       int err;
 
-       pci_enable_device(pdev);
+       BUG_ON(!priv);
 
        printk(KERN_NOTICE "%s: got resume request\n", ndev->name);
 
+       err = pci_enable_device(pdev);
+       if (err) {
+               printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
+                      ndev->name);
+               return err;
+       }
+
        pci_restore_state(pdev);
 
        /* alright let's go into the PREBOOT state */
@@ -312,7 +324,7 @@ prism54_module_init(void)
 
        __bug_on_wrong_struct_sizes ();
 
-       return pci_module_init(&prism54_driver);
+       return pci_register_driver(&prism54_driver);
 }
 
 /* by the time prism54_module_exit() terminates, as a postcondition