Messages in this thread Patch in this message | | | Date | Wed, 15 Jan 2003 09:11:09 +0100 | From | Jens Taprogge <> | Subject | Re: [BUG] cardbus/hotplugging still broken in 2.5.56 |
| |
The cardbus problems are caused by
ChangeSet@1.797.145.6 2002-11-25 18:31:10-08:00 davej@codemonkey.org.uk
as far as I can tell.
pci_enable_device() will fail at least on i386 (see arch/i386/pci/i386.c: pcibios_enable_resource (line 260)) if the resources have not been assigned previously. Hence the ostensible resource collisions.
The attached patch should fix the problem.
I have send the patch to Dave Jones some time ago but did not hear from him yet.
I am not subscribed to the list so please cc me on replys.
Jens
-- Jens Taprogge diff -ur linux-2.5.51/drivers/pcmcia/cardbus.c linux-2.5.51_jlt/drivers/pcmcia/cardbus.c --- linux-2.5.51/drivers/pcmcia/cardbus.c 2002-12-10 03:45:52.000000000 +0100 +++ linux-2.5.51_jlt/drivers/pcmcia/cardbus.c 2002-12-10 22:19:46.000000000 +0100 @@ -229,6 +229,17 @@ =====================================================================*/ +static void cb_free_resources(struct pci_dev *dev) +{ + int i; + + for (i = 0; i < 7; i++) { + struct resource *res = dev->resource + i; + if (res->parent) + release_resource(res); + } +} + int cb_alloc(socket_info_t * s) { struct pci_bus *bus; @@ -283,25 +294,31 @@ dev->hdr_type = hdr & 0x7f; pci_setup_device(dev); - if (pci_enable_device(dev)) - continue; strcpy(dev->dev.bus_id, dev->slot_name); /* FIXME: Do we need to enable the expansion ROM? */ for (r = 0; r < 7; r++) { struct resource *res = dev->resource + r; - if (res->flags) - pci_assign_resource(dev, r); + if (res->flags && pci_assign_resource(dev, r) < 0) { + cb_free_resources(dev); + continue; + } } /* Does this function have an interrupt at all? */ pci_readb(dev, PCI_INTERRUPT_PIN, &irq_pin); - if (irq_pin) { + if (irq_pin) dev->irq = irq; - pci_writeb(dev, PCI_INTERRUPT_LINE, irq); + + if (pci_enable_device(dev)) { + cb_free_resources(dev); + continue; } + if (irq_pin) + pci_writeb(dev, PCI_INTERRUPT_LINE, irq); + device_register(&dev->dev); pci_insert_device(dev, bus); }
| |