]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
PCI: Retry on IORESOURCE_IO type allocations
authorYinghai Lu <yinghai@kernel.org>
Fri, 24 Feb 2012 03:23:29 +0000 (19:23 -0800)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 24 Feb 2012 16:44:38 +0000 (08:44 -0800)
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>
drivers/pci/setup-bus.c

index 2991a89750640403b3aead0c489c1cf1ca5d14f1..162edfb356b674761b89e02780795bdabe1680ef 100644 (file)
@@ -1292,7 +1292,6 @@ pci_assign_unassigned_resources(void)
        struct pci_dev_resource *fail_res;
        unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM |
                                  IORESOURCE_PREFETCH;
-       unsigned long failed_type;
        int pci_try_num = 1;
 
        /* don't realloc if asked to do so */
@@ -1327,16 +1326,7 @@ again:
        if (list_empty(&fail_head))
                goto enable_and_dump;
 
-       failed_type = 0;
-       list_for_each_entry(fail_res, &fail_head, list)
-               failed_type |= fail_res->flags;
-
-       /*
-        * io port are tight, don't try extra
-        * or if reach the limit, don't want to try more
-        */
-       failed_type &= type_mask;
-       if ((failed_type == IORESOURCE_IO) || (tried_times >= pci_try_num)) {
+       if (tried_times >= pci_try_num) {
                free_list(&fail_head);
                goto enable_and_dump;
        }