PCI: aardvark: Deduplicate code in advk_pcie_rd_conf()
authorMarek Behún <kabel@kernel.org>
Tue, 5 Oct 2021 18:09:47 +0000 (20:09 +0200)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Thu, 7 Oct 2021 13:27:58 +0000 (14:27 +0100)
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: 43f5c77bcbd2 ("PCI: aardvark: Fix reporting CRS value")
Signed-off-by: Marek Behún <kabel@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
drivers/pci/controller/pci-aardvark.c

index 3448a8c446d41a4919c07e2f8e095808fa22b645..cd5be284789e06aadf082d847b015e9f464c6fda 100644 (file)
@@ -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,