Can you test the enclosed patch. It seems to be both simple and to resolve the resource collisions and the "No IRQ known" problem. I added a smal comment (and modified another) so future janitors won't move pci_enable above pci_assign_resource again. If everyone is ok, I can send it to Linus for inclusion in BK (I have the green light of Dave Jones). Thanks, Yaacov Akiba Slama Mikael Pettersson wrote: >Jens Taprogge writes: > > The cardbus problems are caused by > > > > ChangeSet _at_ 1.797.145.6 2002-11-25 18:31:10-08:00 davej _at_ 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. > >Thanks. Your patch fixed the cardbus hotplug issue perfectly on my laptop. >It survives multiple insert/eject cycles without any problems. > >The patch posted by Yaacov Akiba Slama today also fixed cardbus hotplug >for me, but with his patch the kernel still prints "PCI: No IRQ known for >interrupt pin A of device xx:xx.x. Please try using pci=biosirq" when the >cardbus NIC is inserted; Jens Taprogge's patch silenced that warning. > >/Mikael > > >
--- drivers/pcmcia/cardbus.c.original 2003-01-14 19:38:49.000000000 +0200
+++ drivers/pcmcia/cardbus.c 2003-01-15 18:21:40.000000000 +0200
@@ -285,25 +285,29 @@
dev->dev.dma_mask = &dev->dma_mask;
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? */
+ /* We need to assign resources for expansion ROM. */
for (r = 0; r < 7; r++) {
struct resource *res = dev->resource + r;
- if (res->flags)
+ if (!res->start && res->end)
pci_assign_resource(dev, r);
}
/* 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);
- }
+
+ /* pci_enable_device needs to be called after pci_assign_resource */
+ /* because it returns an error if (!res->start && res->end). */
+ if (pci_enable_device(dev))
+ continue;
+ if (irq_pin)
+ pci_writeb(dev, PCI_INTERRUPT_LINE, irq);
+
device_register(&dev->dev);
pci_insert_device(dev, bus);
}
Follow-Ups: References:
- Re: [BUG] cardbus/hotplugging still broken in 2.5.56Jens Taprogge
- Re: [BUG] cardbus/hotplugging still broken in 2.5.56Mikael Pettersson
- Prev by Date: Re: [WAY OFFTOPIC] RMS and reactions to him (best viewed in times new roman)
- Next by Date: Re: Changing argv[0] under Linux.
- Previous by thread: Re: [BUG] cardbus/hotplugging still broken in 2.5.56
- Next by thread: Re: [PATCH] Re: [BUG] cardbus/hotplugging still broken in 2.5.56
- Indexes:[Main][Thread]