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
[email protected]
https://lists.sourceforge.net/lists/listinfo/acpi-bugzilla