Commit 934b7024f0ed29003c95cef447d92737ab86dc4f

Authored by Linus Torvalds
1 parent 29591b92e1

Fix cardbus resource allocation

Commit 884525655d07fdee9245716b998ecdc45cdd8007 ("PCI: clean up resource
alignment management") didn't set the alignment information for the
cardbus window resources, causing their subsequent allocations to fail
miserably with a message like

  yenta_cardbus 0000:15:00.0: device not available because of BAR 7 [100:1ff] collisions
  yenta_cardbus: probe of 0000:15:00.0 failed with error -16

or similar.

This fixes it and clarifies the code a bit too (we used to have to use
the insane PCI bridge alignment logic that put the alignment in the
"start" field, this makes it use the slightly easier-to-understand
size-based alignment, and allows us to set the resource start to zero
until it gets allocated).

Reported-and-tested-by: Jeff Chua <jeff.chua.linux@gmail.com>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 15 additions and 15 deletions Side-by-side Diff

drivers/pci/setup-bus.c
... ... @@ -416,13 +416,13 @@
416 416 * Reserve some resources for CardBus. We reserve
417 417 * a fixed amount of bus space for CardBus bridges.
418 418 */
419   - b_res[0].start = pci_cardbus_io_size;
420   - b_res[0].end = b_res[0].start + pci_cardbus_io_size - 1;
421   - b_res[0].flags |= IORESOURCE_IO;
  419 + b_res[0].start = 0;
  420 + b_res[0].end = pci_cardbus_io_size - 1;
  421 + b_res[0].flags |= IORESOURCE_IO | IORESOURCE_SIZEALIGN;
422 422  
423   - b_res[1].start = pci_cardbus_io_size;
424   - b_res[1].end = b_res[1].start + pci_cardbus_io_size - 1;
425   - b_res[1].flags |= IORESOURCE_IO;
  423 + b_res[1].start = 0;
  424 + b_res[1].end = pci_cardbus_io_size - 1;
  425 + b_res[1].flags |= IORESOURCE_IO | IORESOURCE_SIZEALIGN;
426 426  
427 427 /*
428 428 * Check whether prefetchable memory is supported
429 429  
430 430  
... ... @@ -441,17 +441,17 @@
441 441 * twice the size.
442 442 */
443 443 if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) {
444   - b_res[2].start = pci_cardbus_mem_size;
445   - b_res[2].end = b_res[2].start + pci_cardbus_mem_size - 1;
446   - b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH;
  444 + b_res[2].start = 0;
  445 + b_res[2].end = pci_cardbus_mem_size - 1;
  446 + b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH | IORESOURCE_SIZEALIGN;
447 447  
448   - b_res[3].start = pci_cardbus_mem_size;
449   - b_res[3].end = b_res[3].start + pci_cardbus_mem_size - 1;
450   - b_res[3].flags |= IORESOURCE_MEM;
  448 + b_res[3].start = 0;
  449 + b_res[3].end = pci_cardbus_mem_size - 1;
  450 + b_res[3].flags |= IORESOURCE_MEM | IORESOURCE_SIZEALIGN;
451 451 } else {
452   - b_res[3].start = pci_cardbus_mem_size * 2;
453   - b_res[3].end = b_res[3].start + pci_cardbus_mem_size * 2 - 1;
454   - b_res[3].flags |= IORESOURCE_MEM;
  452 + b_res[3].start = 0;
  453 + b_res[3].end = pci_cardbus_mem_size * 2 - 1;
  454 + b_res[3].flags |= IORESOURCE_MEM | IORESOURCE_SIZEALIGN;
455 455 }
456 456 }
457 457