return 0;
 }
 
+static void rockchip_pcie_enable_l0s(struct dw_pcie *pci)
+{
+       u32 cap, lnkcap;
+
+       /* Enable L0S capability for all SoCs */
+       cap = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
+       if (cap) {
+               lnkcap = dw_pcie_readl_dbi(pci, cap + PCI_EXP_LNKCAP);
+               lnkcap |= PCI_EXP_LNKCAP_ASPM_L0S;
+               dw_pcie_dbi_ro_wr_en(pci);
+               dw_pcie_writel_dbi(pci, cap + PCI_EXP_LNKCAP, lnkcap);
+               dw_pcie_dbi_ro_wr_dis(pci);
+       }
+}
+
 static int rockchip_pcie_start_link(struct dw_pcie *pci)
 {
        struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
        irq_set_chained_handler_and_data(irq, rockchip_pcie_intx_handler,
                                         rockchip);
 
+       rockchip_pcie_enable_l0s(pci);
+
        return 0;
 }
 
        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
        enum pci_barno bar;
 
+       rockchip_pcie_enable_l0s(pci);
+
        for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
                dw_pcie_ep_reset_bar(pci, bar);
 };
        rockchip->pci.ops = &dw_pcie_ops;
        rockchip->data = data;
 
+       /* Default N_FTS value (210) is broken, override it to 255 */
+       rockchip->pci.n_fts[0] = 255; /* Gen1 */
+       rockchip->pci.n_fts[1] = 255; /* Gen2+ */
+
        ret = rockchip_pcie_resource_get(pdev, rockchip);
        if (ret)
                return ret;