[PATCH] PCI: dwc: Fix stop condition on __dw_pcie_ep_find_next_cap()

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

 



The combination of __dw_pcie_ep_find_next_cap() and
dw_pcie_ep_find_capability() allows to search on the Endpoint
configuration space for a specific capability ID.

This search is done recursively by __dw_pcie_ep_find_next_cap() jumping
from capability to capability (using the next offset register to calculate
next jump address), stopping until the next offset register is null or
the current capability meets the desired ID.

However, if the desired capability is at the end of that list, the
recursive search will be returning because the next offset will
be null (thus filling the first stop condition) and not because it
has reached the desired ID and therefore reporting capability "not
found".

This fix will swap the stop conditions order of
__dw_pcie_ep_find_next_cap(), allowing to find the desired capability ID,
if it encounters at the end of the list.

Fixes: beb4641a787d ("PCI: dwc: Add MSI-X callbacks handler")
Reported-by: Jian Wang <jianwang@xxxxxxxxxxxxxxx>
Signed-off-by: Gustavo Pimentel <gustavo.pimentel@xxxxxxxxxxxx>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@xxxxxxx>
Cc: Kishon Vijay Abraham I <kishon@xxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
---
 drivers/pci/controller/dwc/pcie-designware-ep.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
index a543c45..0258894 100644
--- a/drivers/pci/controller/dwc/pcie-designware-ep.c
+++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
@@ -50,12 +50,12 @@ static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie *pci, u8 cap_ptr,
 	next_cap_ptr = (reg & 0xff00) >> 8;
 	cap_id = (reg & 0x00ff);
 
-	if (!next_cap_ptr || cap_id > PCI_CAP_ID_MAX)
-		return 0;
-
 	if (cap_id == cap)
 		return cap_ptr;
 
+	if (!next_cap_ptr || cap_id > PCI_CAP_ID_MAX)
+		return 0;
+
 	return __dw_pcie_ep_find_next_cap(pci, next_cap_ptr, cap);
 }
 
-- 
2.7.4




[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