Please disregard the previous patch sent.  It has an embarassing bug
within it (as you probably have seen).  This is the fixed version.  Please
accept it if it is suitable.

--- linux-2.4.17stock/drivers/usb/usb-ohci.c    Fri Dec 21 11:41:55 2001
+++ linux/drivers/usb/usb-ohci.c        Tue Jan 22 11:18:46 2002
@@ -12,6 +12,8 @@
  *
  * History:
  *
+ * 2002/01/18 Fixes to make driver cleanup after itself if it doesn't
+ *     load properly
  * 2001/09/19 USB_ZERO_PACKET support (Jean Tourrilhes)
  * 2001/07/17 power management and pmac cleanup (Benjamin Herrenschmidt)
  * 2001/03/24 td/ed hashing to remove bus_to_virt (Steve Longerbeam);
@@ -47,6 +49,7 @@
  * v1.0 1999/04/27 initial release
  */

+
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -2381,6 +2384,8 @@

        bus = usb_alloc_bus (&sohci_device_operations);
        if (!bus) {
+               pci_set_drvdata(dev, NULL);
+               pci_free_consistent(ohci->ohci_dev, sizeof *ohci->hcca, ohci->hcca, 
+ohci->hcca_dma);
                kfree (ohci);
                return NULL;
        }
@@ -2413,8 +2418,11 @@
        }
        pci_set_drvdata(ohci->ohci_dev, NULL);

-       usb_deregister_bus (ohci->bus);
-       usb_free_bus (ohci->bus);
+       if (ohci->bus) {
+               if (ohci->bus->busnum)
+                       usb_deregister_bus (ohci->bus);
+               usb_free_bus (ohci->bus);
+       }

        list_del (&ohci->ohci_hcd_list);
        INIT_LIST_HEAD (&ohci->ohci_hcd_list);
@@ -2560,6 +2568,7 @@
 static int __devinit
 ohci_pci_probe (struct pci_dev *dev, const struct pci_device_id *id)
 {
+       int res = 0;
        unsigned long mem_resource, mem_len;
        void *mem_base;

@@ -2568,6 +2577,7 @@

         if (!dev->irq) {
                err("found OHCI device with no IRQ assigned. check BIOS settings!");
+               pci_disable_device(dev);
                return -ENODEV;
         }

@@ -2576,19 +2586,31 @@
        mem_len = pci_resource_len(dev, 0);
        if (!request_mem_region (mem_resource, mem_len, ohci_pci_driver.name)) {
                dbg ("controller already in use");
+               pci_disable_device(dev);
                return -EBUSY;
        }

        mem_base = ioremap_nocache (mem_resource, mem_len);
        if (!mem_base) {
                err("Error mapping OHCI memory");
+               release_mem_region(mem_resource, mem_len);
+               pci_disable_device(dev);
                return -EFAULT;
        }

        /* controller writes into our memory */
        pci_set_master (dev);

-       return hc_found_ohci (dev, dev->irq, mem_base, id);
+       res = hc_found_ohci (dev, dev->irq, mem_base, id);
+       if (res < 0) {
+               iounmap(mem_base);
+               release_mem_region(mem_resource, mem_len);
+               pci_disable_device(dev);
+       }
+
+       return res;
+
+
 }


/*-------------------------------------------------------------------------*/

Thanks,
Matthew Fredrickson




_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to