Re: trouble with PCI: Call pci_read_bridge_bases() from core instead of arch code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Sep 9, 2015 at 9:59 AM, Yinghai Lu <yinghai@xxxxxxxxxx> wrote:
> On Wed, Sep 9, 2015 at 4:32 AM, Lorenzo Pieralisi
> <lorenzo.pieralisi@xxxxxxx> wrote:
>> Subject: [PATCH] PCI: remove dead code in pci_claim_bridge_resource()
>>
> That should be regression from c770cb4cb505 ("PCI: Mark invalid BARs
> as unassigned")
> so right fix should be:

completed format as attached:
From: Lorenzo Pieralisi <lorenzo.pieralisi@xxxxxxx>
Subject: [PATCH] PCI: Fix clipped bridge resource reserve

Commit 8505e729a2f6eb ("PCI: Add pci_claim_bridge_resource() to clip
window if necessary") introduced a new API to claim bridge resources.
pci_claim_bridge_resource() tries to claim a bridge resource, and if
the claiming fails the function tries to clip the resource to make
it fit within the parent resource window.
If the clipping succeeds the bridge apertures are set-up accordingly
and the pci_claim_bridge_resource() tries to claim the resource
again.

Commit c770cb4cb505 ("PCI: Mark invalid BARs as unassigned") added
code that sets the IORESOURCE_UNSET flag on claiming failure.

This means that the second resource claiming after window clipping will
always fail, since the resource flags contain IORESOURCE_UNSET,
previously set on failure by pci_claim_resource(), so the subsequent
pci_claim_resource() call ends up spitting a log message and return
failure with no chance whatsoever to succeed.

This patch clear the UNSET in resource flags, and it makes second
pci_claim_resource() work again.

Fixes: c770cb4cb505 ("PCI: Mark invalid BARs as unassigned")
Cc: stable@xxxxxxxxxxxxxxx [v4.1+]
[change to clear UNSET instead, Yinghai]
Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>

diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 508cc56..76b3349 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -733,6 +733,7 @@ int pci_claim_bridge_resource(struct pci_dev *bridge, int i)
 		return -EINVAL;
 	}
 
+	bridge->resource[i].flags &= ~IORESOURCE_UNSET;
 	if (pci_claim_resource(bridge, i) == 0)
 		return 0;	/* claimed a smaller window */
 

[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux