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@ra.rockwell.com Signed-off-by: Gustavo Pimentel gustavo.pimentel@synopsys.com Cc: Lorenzo Pieralisi lorenzo.pieralisi@arm.com Cc: Kishon Vijay Abraham I kishon@ti.com Cc: stable@vger.kernel.org --- 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); }