}
 }
 
+static void advk_pcie_issue_perst(struct advk_pcie *pcie)
+{
+       u32 reg;
+
+       if (!pcie->reset_gpio)
+               return;
+
+       /* PERST does not work for some cards when link training is enabled */
+       reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+       reg &= ~LINK_TRAINING_EN;
+       advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+
+       /* 10ms delay is needed for some cards */
+       dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n");
+       gpiod_set_value_cansleep(pcie->reset_gpio, 1);
+       usleep_range(10000, 11000);
+       gpiod_set_value_cansleep(pcie->reset_gpio, 0);
+}
+
 static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen)
 {
        int ret, neg_gen;
        struct device *dev = &pcie->pdev->dev;
        int neg_gen = -1, gen;
 
+       /*
+        * Reset PCIe card via PERST# signal. Some cards are not detected
+        * during link training when they are in some non-initial state.
+        */
+       advk_pcie_issue_perst(pcie);
+
+       /*
+        * PERST# signal could have been asserted by pinctrl subsystem before
+        * probe() callback has been called or issued explicitly by reset gpio
+        * function advk_pcie_issue_perst(), making the endpoint going into
+        * fundamental reset. As required by PCI Express spec a delay for at
+        * least 100ms after such a reset before link training is needed.
+        */
+       msleep(PCI_PM_D3COLD_WAIT);
+
        /*
         * Try link training at link gen specified by device tree property
         * 'max-link-speed'. If this fails, iteratively train at lower gen.
        dev_err(dev, "link never came up\n");
 }
 
-static void advk_pcie_issue_perst(struct advk_pcie *pcie)
-{
-       u32 reg;
-
-       if (!pcie->reset_gpio)
-               return;
-
-       /* PERST does not work for some cards when link training is enabled */
-       reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
-       reg &= ~LINK_TRAINING_EN;
-       advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
-
-       /* 10ms delay is needed for some cards */
-       dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n");
-       gpiod_set_value_cansleep(pcie->reset_gpio, 1);
-       usleep_range(10000, 11000);
-       gpiod_set_value_cansleep(pcie->reset_gpio, 0);
-}
-
 static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 {
        u32 reg;
 
-       advk_pcie_issue_perst(pcie);
-
        /* Enable TX */
        reg = advk_readl(pcie, PCIE_CORE_REF_CLK_REG);
        reg |= PCIE_CORE_REF_CLK_TX_ENABLE;
        reg |= PIO_CTRL_ADDR_WIN_DISABLE;
        advk_writel(pcie, reg, PIO_CTRL);
 
-       /*
-        * PERST# signal could have been asserted by pinctrl subsystem before
-        * probe() callback has been called or issued explicitly by reset gpio
-        * function advk_pcie_issue_perst(), making the endpoint going into
-        * fundamental reset. As required by PCI Express spec a delay for at
-        * least 100ms after such a reset before link training is needed.
-        */
-       msleep(PCI_PM_D3COLD_WAIT);
-
        advk_pcie_train_link(pcie);
 
        /*