Commit 67cb2a4c authored by Marek Behún's avatar Marek Behún Committed by Lorenzo Pieralisi
Browse files

PCI: aardvark: Deduplicate code in advk_pcie_rd_conf()

Avoid code repetition in advk_pcie_rd_conf() by handling errors with
goto jump, as is customary in kernel.

Link: https://lore.kernel.org/r/20211005180952.6812-9-kabel@kernel.org


Fixes: 43f5c77b ("PCI: aardvark: Fix reporting CRS value")
Signed-off-by: default avatarMarek Behún <kabel@kernel.org>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
parent 1fb95d7d
Loading
Loading
Loading
Loading
+20 −28
Original line number Diff line number Diff line
@@ -920,18 +920,8 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
		    (le16_to_cpu(pcie->bridge.pcie_conf.rootctl) &
		     PCI_EXP_RTCTL_CRSSVE);

	if (advk_pcie_pio_is_running(pcie)) {
		/*
		 * If it is possible return Completion Retry Status so caller
		 * tries to issue the request again instead of failing.
		 */
		if (allow_crs) {
			*val = CFG_RD_CRS_VAL;
			return PCIBIOS_SUCCESSFUL;
		}
		*val = 0xffffffff;
		return PCIBIOS_SET_FAILED;
	}
	if (advk_pcie_pio_is_running(pcie))
		goto try_crs;

	/* Program the control register */
	reg = advk_readl(pcie, PIO_CTRL);
@@ -955,25 +945,13 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
	advk_writel(pcie, 1, PIO_START);

	ret = advk_pcie_wait_pio(pcie);
	if (ret < 0) {
		/*
		 * If it is possible return Completion Retry Status so caller
		 * tries to issue the request again instead of failing.
		 */
		if (allow_crs) {
			*val = CFG_RD_CRS_VAL;
			return PCIBIOS_SUCCESSFUL;
		}
		*val = 0xffffffff;
		return PCIBIOS_SET_FAILED;
	}
	if (ret < 0)
		goto try_crs;

	/* Check PIO status and get the read result */
	ret = advk_pcie_check_pio_status(pcie, allow_crs, val);
	if (ret < 0) {
		*val = 0xffffffff;
		return PCIBIOS_SET_FAILED;
	}
	if (ret < 0)
		goto fail;

	if (size == 1)
		*val = (*val >> (8 * (where & 3))) & 0xff;
@@ -981,6 +959,20 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
		*val = (*val >> (8 * (where & 3))) & 0xffff;

	return PCIBIOS_SUCCESSFUL;

try_crs:
	/*
	 * If it is possible, return Completion Retry Status so that caller
	 * tries to issue the request again instead of failing.
	 */
	if (allow_crs) {
		*val = CFG_RD_CRS_VAL;
		return PCIBIOS_SUCCESSFUL;
	}

fail:
	*val = 0xffffffff;
	return PCIBIOS_SET_FAILED;
}

static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn,