diff options
Diffstat (limited to 'drivers/pcmcia/yenta_socket.c')
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 006749dc8d75..d9d005ec920c 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -1005,6 +1005,77 @@ static void yenta_config_init(struct yenta_socket *socket) | |||
1005 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); | 1005 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); |
1006 | } | 1006 | } |
1007 | 1007 | ||
1008 | /** | ||
1009 | * yenta_fixup_parent_subordinate - Fix subordinate bus# of the parent bridge | ||
1010 | * @cardbus_bridge: The PCI bus which the CardBus bridge bridges to | ||
1011 | * | ||
1012 | * Checks if devices on the bus which the CardBus bridge bridges to would be | ||
1013 | * invisible during PCI scans because of a misconfigured subordinate number | ||
1014 | * of the parent brige - some BIOSes seem to be too lazy to set it right. | ||
1015 | * Does the fixup carefully by checking how far it can go without conflicts. | ||
1016 | * See http://bugzilla.kernel.org/show_bug.cgi?id=2944 for more information. | ||
1017 | */ | ||
1018 | static void yenta_fixup_parent_bridge(struct pci_bus *cardbus_bridge) | ||
1019 | { | ||
1020 | struct list_head *tmp; | ||
1021 | unsigned char upper_limit; | ||
1022 | /* | ||
1023 | * We only check and fix the parent bridge: All systems which need | ||
1024 | * this fixup that have been reviewed are laptops and the only bridge | ||
1025 | * which needed fixing was the parent bridge of the CardBus bridge: | ||
1026 | */ | ||
1027 | struct pci_bus *bridge_to_fix = cardbus_bridge->parent; | ||
1028 | |||
1029 | /* Check bus numbers are already set up correctly: */ | ||
1030 | if (bridge_to_fix->subordinate >= cardbus_bridge->subordinate) | ||
1031 | return; /* The subordinate number is ok, nothing to do */ | ||
1032 | |||
1033 | if (!bridge_to_fix->parent) | ||
1034 | return; /* Root bridges are ok */ | ||
1035 | |||
1036 | /* stay within the limits of the bus range of the parent: */ | ||
1037 | upper_limit = bridge_to_fix->parent->subordinate; | ||
1038 | |||
1039 | /* check the bus ranges of all silbling bridges to prevent overlap */ | ||
1040 | list_for_each(tmp, &bridge_to_fix->parent->children) { | ||
1041 | struct pci_bus * silbling = pci_bus_b(tmp); | ||
1042 | /* | ||
1043 | * If the silbling has a higher secondary bus number | ||
1044 | * and it's secondary is equal or smaller than our | ||
1045 | * current upper limit, set the new upper limit to | ||
1046 | * the bus number below the silbling's range: | ||
1047 | */ | ||
1048 | if (silbling->secondary > bridge_to_fix->subordinate | ||
1049 | && silbling->secondary <= upper_limit) | ||
1050 | upper_limit = silbling->secondary - 1; | ||
1051 | } | ||
1052 | |||
1053 | /* Show that the wanted subordinate number is not possible: */ | ||
1054 | if (cardbus_bridge->subordinate > upper_limit) | ||
1055 | printk(KERN_WARNING "Yenta: Upper limit for fixing this " | ||
1056 | "bridge's parent bridge: #%02x\n", upper_limit); | ||
1057 | |||
1058 | /* If we have room to increase the bridge's subordinate number, */ | ||
1059 | if (bridge_to_fix->subordinate < upper_limit) { | ||
1060 | |||
1061 | /* use the highest number of the hidden bus, within limits */ | ||
1062 | unsigned char subordinate_to_assign = | ||
1063 | min(cardbus_bridge->subordinate, upper_limit); | ||
1064 | |||
1065 | printk(KERN_INFO "Yenta: Raising subordinate bus# of parent " | ||
1066 | "bus (#%02x) from #%02x to #%02x\n", | ||
1067 | bridge_to_fix->number, | ||
1068 | bridge_to_fix->subordinate, subordinate_to_assign); | ||
1069 | |||
1070 | /* Save the new subordinate in the bus struct of the bridge */ | ||
1071 | bridge_to_fix->subordinate = subordinate_to_assign; | ||
1072 | |||
1073 | /* and update the PCI config space with the new subordinate */ | ||
1074 | pci_write_config_byte(bridge_to_fix->self, | ||
1075 | PCI_SUBORDINATE_BUS, bridge_to_fix->subordinate); | ||
1076 | } | ||
1077 | } | ||
1078 | |||
1008 | /* | 1079 | /* |
1009 | * Initialize a cardbus controller. Make sure we have a usable | 1080 | * Initialize a cardbus controller. Make sure we have a usable |
1010 | * interrupt, and that we can map the cardbus area. Fill in the | 1081 | * interrupt, and that we can map the cardbus area. Fill in the |
@@ -1120,6 +1191,8 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i | |||
1120 | yenta_get_socket_capabilities(socket, isa_interrupts); | 1191 | yenta_get_socket_capabilities(socket, isa_interrupts); |
1121 | printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); | 1192 | printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE)); |
1122 | 1193 | ||
1194 | yenta_fixup_parent_bridge(dev->subordinate); | ||
1195 | |||
1123 | /* Register it with the pcmcia layer.. */ | 1196 | /* Register it with the pcmcia layer.. */ |
1124 | ret = pcmcia_register_socket(&socket->socket); | 1197 | ret = pcmcia_register_socket(&socket->socket); |
1125 | if (ret == 0) { | 1198 | if (ret == 0) { |