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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 Dec 2021 08:04:44 +0000 (09:04 +0100)
commit 67cb2a4c93499c2c22704998fd1fd2bc35194d8e upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/pci/controller/pci-aardvark.c

index b051d12..6eea7d5 100644 (file)
@@ -1090,18 +1090,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);
@@ -1125,25 +1115,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;
@@ -1151,6 +1129,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,