diff options
author | Yinghai Lu <yinghai@kernel.org> | 2012-02-23 22:23:29 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2012-02-24 11:44:38 -0500 |
commit | 0c5be0cb0edfe3b5c4b62eac68aa2aa15ec681af (patch) | |
tree | 8051eb17c0b95701186bdf53e1a263d641f8b8e7 /drivers/pci/setup-bus.c | |
parent | 823806ff6bd63f92644a5330cf0c3b68fac25ffd (diff) |
PCI: Retry on IORESOURCE_IO type allocations
When enabling pci reallocation for a pci bridge, we clear the small size
in in bridge and re-assign with requested + optional size for first
several tries, but Ram mention could have problem with one case:
https://bugzilla.kernel.org/show_bug.cgi?id=15960
After checking the booting log in
https://lkml.org/lkml/2010/4/19/44
[regression, bisected] Xonar DX invalid PCI I/O range since 977d17bb174
We should not stop too early for io ports.
Apr 19 10:19:38 [kernel] pci 0000:04:00.0: BAR 7: can't assign io (size 0x4000)
Apr 19 10:19:38 [kernel] pci 0000:05:01.0: BAR 8: assigned [mem 0x80400000-0x805fffff]
Apr 19 10:19:38 [kernel] pci 0000:05:01.0: BAR 7: can't assign io (size 0x2000)
Apr 19 10:19:38 [kernel] pci 0000:05:02.0: BAR 7: can't assign io (size 0x1000)
Apr 19 10:19:38 [kernel] pci 0000:05:03.0: BAR 7: can't assign io (size 0x1000)
Apr 19 10:19:38 [kernel] pci 0000:08:00.0: BAR 7: can't assign io (size 0x1000)
Apr 19 10:19:38 [kernel] pci 0000:09:04.0: BAR 0: can't assign io (size 0x100)
and clear 00:1c.0 to retry again.
This patch removes IORESOUCE_IO checking, and tries one more time. It
gives us a chance to get an allocation for the 00:1c.0 io port range
because the range from 0x4000 to 0x8000 will be freed and we can use it.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci/setup-bus.c')
-rw-r--r-- | drivers/pci/setup-bus.c | 12 |
1 files changed, 1 insertions, 11 deletions
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 2991a8975064..162edfb356b6 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -1292,7 +1292,6 @@ pci_assign_unassigned_resources(void) | |||
1292 | struct pci_dev_resource *fail_res; | 1292 | struct pci_dev_resource *fail_res; |
1293 | unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM | | 1293 | unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM | |
1294 | IORESOURCE_PREFETCH; | 1294 | IORESOURCE_PREFETCH; |
1295 | unsigned long failed_type; | ||
1296 | int pci_try_num = 1; | 1295 | int pci_try_num = 1; |
1297 | 1296 | ||
1298 | /* don't realloc if asked to do so */ | 1297 | /* don't realloc if asked to do so */ |
@@ -1327,16 +1326,7 @@ again: | |||
1327 | if (list_empty(&fail_head)) | 1326 | if (list_empty(&fail_head)) |
1328 | goto enable_and_dump; | 1327 | goto enable_and_dump; |
1329 | 1328 | ||
1330 | failed_type = 0; | 1329 | if (tried_times >= pci_try_num) { |
1331 | list_for_each_entry(fail_res, &fail_head, list) | ||
1332 | failed_type |= fail_res->flags; | ||
1333 | |||
1334 | /* | ||
1335 | * io port are tight, don't try extra | ||
1336 | * or if reach the limit, don't want to try more | ||
1337 | */ | ||
1338 | failed_type &= type_mask; | ||
1339 | if ((failed_type == IORESOURCE_IO) || (tried_times >= pci_try_num)) { | ||
1340 | free_list(&fail_head); | 1330 | free_list(&fail_head); |
1341 | goto enable_and_dump; | 1331 | goto enable_and_dump; |
1342 | } | 1332 | } |