http://bugzilla.kernel.org/show_bug.cgi?id=2944
[EMAIL PROTECTED] changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #7844|fix the subordinate number |fix the subordinate number description|of parent bridge in |of parent bridge in |yenta_socket_probe as far as|yenta_socket_probe within |possible |limits ------- Additional Comments From [EMAIL PROTECTED] 2006-04-12 11:01 ------- (From update of attachment 7844) >Fixup the subordinate number parent bridge of yenta Cardbus Bridges >before the PCI bus scan starts to make the cardbus cards which are >otherwise hidden for PCI scans work. Previous versions of this code >in the form of a test module (before putting it into yenta_socket_probe) >have been tested on a Compaq R3120 AMD 64 laptop and (I assume) a R3140 >and another R3000 series laptop. > >The number of affected systems is longer (from an internet search): >* ASUS Z71V and L3s >* Samsung X20 (fixed in latest BIOS, but older BIOSes are affected) >* Compaq R3140us and all Compaq R3000 series laptops with TI1620 Controller > (AMD64-based Laptops), also Compaq R4000 series >* HP zv5000z (AMD64 3700+, known that fixup_parent_subordinate_busnr fixes it) >* HP zv5200z >* IBM ThinkPad 240 >* An IBM ThinkPad (1.8 GHz Pentium M) debugged by Pavel Machek > gives the correspondig message which detects the breakage. >* MSI S260 / Medion SIM 2100 MD 95600 > >Signed-off-by: Bernhard Kaindl <[EMAIL PROTECTED]> > >--- linux-2.6.16/drivers/pcmcia/yenta_socket.c >+++ linux-2.6.16/drivers/pcmcia/yenta_socket.c 2006/04/08 11:51:20 >@@ -998,6 +998,77 @@ > config_writew(socket, CB_BRIDGE_CONTROL, bridge); > } > >+/** >+ * pci_fixup_parent_subordinate - Fix the subordinate number parent bridge >+ * @cardbus_bridge: Bus the CardBus bridge bridge to >+ * >+ * Checks if devices on the bus the CardBus bridge bridges to would be >+ * invisible during PCI scans because of a misconfigured subordinate number >+ * of the parent brige - some BIOSes seem to be too lazy to set it right. >+ * Does to fixup carefully by checking how far it can go without overlap. >+ */ >+static void yenta_fixup_parent_bridge(struct pci_bus *cardbus_bridge) >+{ >+ struct list_head *tmp; >+ /* Our starting point is the max PCI bus number */ >+ unsigned char upper_limit = 0xff; >+ /* >+ * We only check and fix the parent bridge: All systems which need >+ * this fixup that have been reviewed are laptops and the only bridge >+ * which needed fixing was the parent bridge of the CardBus bridge: >+ */ >+ struct pci_bus *bridge_to_fix = cardbus_bridge->parent; >+ >+ /* Check bus numbers are already set up correctly: */ >+ if (bridge_to_fix->subordinate >= cardbus_bridge->subordinate) >+ return; /* Thanks, nothing to do */ >+ >+ if (!bridge_to_fix->parent) >+ return; /* The root bridges are ok */ >+ >+ /* stay within the limits of the bus range of the parent: */ >+ upper_limit = bridge_to_fix->parent->subordinate; >+ >+ /* check the bus ranges of all silbling bridges to prevent overlap */ >+ list_for_each(tmp, &bridge_to_fix->parent->children) { >+ struct pci_bus * silbling = pci_bus_b(tmp); >+ /* >+ * If the silbling has a higher secondary bus number >+ * and it's secondary is equal or smaller than our >+ * current upper limit, set the new upper limit to >+ * the bus number below the silbling's range: >+ */ >+ if (silbling->secondary > bridge_to_fix->subordinate >+ && silbling->secondary <= upper_limit) >+ upper_limit = silbling->secondary - 1; >+ } >+ >+ /* Show that the wanted subordinate number is not possible: */ >+ if (cardbus_bridge->subordinate > upper_limit) >+ printk(KERN_WARNING "Yenta: Upper limit for fixing this " >+ "bridge's parent bridge: #%02x\n", upper_limit); >+ >+ /* If we have room to increase the bridge's subordinate number, */ >+ if (bridge_to_fix->subordinate < upper_limit) { >+ >+ /* use the highest number of the hidden bus, within limits */ >+ unsigned char subordinate_to_assign = >+ min(cardbus_bridge->subordinate, upper_limit); >+ >+ printk(KERN_INFO "Yenta: Raising subordinate bus# of parent " >+ "bus (#%02x) from #%02x to #%02x\n", >+ bridge_to_fix->number, >+ bridge_to_fix->subordinate, subordinate_to_assign); >+ >+ /* Save the new subordinate in the bus struct of the bridge */ >+ bridge_to_fix->subordinate = subordinate_to_assign; >+ >+ /* and update the PCI config space with the new subordinate */ >+ pci_write_config_byte(bridge_to_fix->self, >+ PCI_SUBORDINATE_BUS, bridge_to_fix->subordinate); >+ } >+} >+ > /* > * Initialize a cardbus controller. Make sure we have a usable > * interrupt, and that we can map the cardbus area. Fill in the >@@ -1113,6 +1184,8 @@ > yenta_get_socket_capabilities(socket, isa_interrupts); > printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, > CB_SOCKET_STATE)); > >+ yenta_fixup_parent_bridge(dev->subordinate); >+ > /* Register it with the pcmcia layer.. */ > ret = pcmcia_register_socket(&socket->socket); > if (ret == 0) { ------- You are receiving this mail because: ------- You are on the CC list for the bug, or are watching someone who is. ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ acpi-bugzilla mailing list acpi-bugzilla@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/acpi-bugzilla