diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c index 1a03ceceae16..df8f66dd9dd1 100644 --- a/hif/src/pcie/if_pci.c +++ b/hif/src/pcie/if_pci.c @@ -2130,6 +2130,7 @@ void hif_pci_close(struct hif_softc *hif_sc) #define BAR_NUM 0 +#ifndef CONFIG_PLD_PCIE_INIT static int hif_enable_pci(struct hif_pci_softc *sc, struct pci_dev *pdev, const struct pci_device_id *id) @@ -2170,6 +2171,7 @@ static int hif_enable_pci(struct hif_pci_softc *sc, ret = -EIO; goto err_region; } + #ifdef CONFIG_ARM_LPAE /* if CONFIG_ARM_LPAE is enabled, we have to set 64 bits mask * for 32 bits device also. */ @@ -2230,11 +2232,8 @@ static int hif_enable_pci(struct hif_pci_softc *sc, __func__, sc->mem); } - sc->pdev = pdev; - sc->dev = &pdev->dev; - sc->devid = id->device; - sc->cacheline_sz = dma_get_cache_alignment(); ol_sc->mem = mem; + ol_sc->mem_pa = pci_resource_start(pdev, BAR_NUM); sc->pci_enabled = true; return ret; @@ -2246,6 +2245,29 @@ err_region: pci_disable_device(pdev); return ret; } +#else +int hif_enable_pci(struct hif_pci_softc *sc, + struct pci_dev *pdev, + const struct pci_device_id *id) +{ + PCI_CFG_TO_DISABLE_L1SS_STATES(pdev, 0x188); + sc->pci_enabled = true; + return 0; +} +#endif + + +#ifndef CONFIG_PLD_PCIE_INIT +static inline void hif_pci_deinit(struct hif_pci_softc *sc) +{ + pci_iounmap(sc->pdev, sc->mem); + pci_clear_master(sc->pdev); + pci_release_region(sc->pdev, BAR_NUM); + pci_disable_device(sc->pdev); +} +#else +static inline void hif_pci_deinit(struct hif_pci_softc *sc) {} +#endif static void hif_disable_pci(struct hif_pci_softc *sc) { @@ -2256,12 +2278,11 @@ static void hif_disable_pci(struct hif_pci_softc *sc) return; } hif_pci_device_reset(sc); - pci_iounmap(sc->pdev, sc->mem); + + hif_pci_deinit(sc); + sc->mem = NULL; ol_sc->mem = NULL; - pci_clear_master(sc->pdev); - pci_release_region(sc->pdev, BAR_NUM); - pci_disable_device(sc->pdev); } #ifndef QCA_WIFI_NAPIER_EMULATION @@ -2607,17 +2628,16 @@ void hif_pci_disable_bus(struct hif_softc *scn) #endif mem = (void __iomem *)sc->mem; if (mem) { +#ifndef CONFIG_PLD_PCIE_INIT pci_disable_msi(pdev); +#endif hif_dump_pipe_debug_count(scn); if (scn->athdiag_procfs_inited) { athdiag_procfs_remove(); scn->athdiag_procfs_inited = false; } - pci_iounmap(pdev, mem); + hif_pci_deinit(sc); scn->mem = NULL; - pci_release_region(pdev, BAR_NUM); - pci_clear_master(pdev); - pci_disable_device(pdev); } HIF_INFO("%s: X", __func__); } @@ -3593,6 +3613,21 @@ static void hif_target_sync(struct hif_softc *scn) } #endif /* QCA_WIFI_QCA8074_VP */ +#ifdef CONFIG_PLD_PCIE_INIT +static void hif_pci_get_soc_info(struct hif_pci_softc *sc, struct device *dev) +{ + struct pld_soc_info info; + + pld_get_soc_info(dev, &info); + sc->mem = info.v_addr; + sc->ce_sc.ol_sc.mem = info.v_addr; + sc->ce_sc.ol_sc.mem_pa = info.p_addr; +} +#else +static void hif_pci_get_soc_info(struct hif_pci_softc *sc, struct device *dev) +{} +#endif + /** * hif_enable_bus(): enable bus * @@ -3633,6 +3668,7 @@ QDF_STATUS hif_pci_enable_bus(struct hif_softc *ol_sc, sc->devid = id->device; sc->cacheline_sz = dma_get_cache_alignment(); tgt_info = hif_get_target_info_handle(hif_hdl); + hif_pci_get_soc_info(sc, dev); again: ret = hif_enable_pci(sc, pdev, id); if (ret < 0) { @@ -3681,13 +3717,11 @@ again: tgt_info->target_type = target_type; - sc->soc_pcie_bar0 = pci_resource_start(pdev, BAR_NUM); - if (!sc->soc_pcie_bar0) { - HIF_ERROR("%s: ERROR - cannot get CE BAR0", __func__); + if (!ol_sc->mem_pa) { + HIF_ERROR("%s: ERROR - BAR0 uninitialized", __func__); ret = -EIO; goto err_tgtstate; } - ol_sc->mem_pa = sc->soc_pcie_bar0; if ((id->device != RUMIM2M_DEVICE_ID_NODE0) && (id->device != RUMIM2M_DEVICE_ID_NODE1)) { diff --git a/hif/src/pcie/if_pci.h b/hif/src/pcie/if_pci.h index ab89f7d6d6ca..d8efba2dcb87 100644 --- a/hif/src/pcie/if_pci.h +++ b/hif/src/pcie/if_pci.h @@ -122,7 +122,6 @@ struct hif_pci_softc { int irq_event; int cacheline_sz; u16 devid; - qdf_dma_addr_t soc_pcie_bar0; struct hif_tasklet_entry tasklet_entries[HIF_MAX_TASKLET_NUM]; bool pci_enabled; qdf_spinlock_t irq_lock;