Loading drivers/net/wireless/cnss2/bus.c +47 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */ /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include "bus.h" #include "debug.h" Loading Loading @@ -418,6 +418,21 @@ int cnss_bus_is_device_down(struct cnss_plat_data *plat_priv) } } int cnss_bus_check_link_status(struct cnss_plat_data *plat_priv) { if (!plat_priv) return -ENODEV; switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_check_link_status(plat_priv->bus_priv); default: cnss_pr_dbg("Unsupported bus type: %d\n", plat_priv->bus_type); return 0; } } int cnss_bus_debug_reg_read(struct cnss_plat_data *plat_priv, u32 offset, u32 *val) { Loading Loading @@ -451,3 +466,34 @@ int cnss_bus_debug_reg_write(struct cnss_plat_data *plat_priv, u32 offset, return 0; } } int cnss_bus_get_iova(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size) { if (!plat_priv) return -ENODEV; switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_get_iova(plat_priv->bus_priv, addr, size); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); return -EINVAL; } } int cnss_bus_get_iova_ipa(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size) { if (!plat_priv) return -ENODEV; switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_get_iova_ipa(plat_priv->bus_priv, addr, size); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); return -EINVAL; } } drivers/net/wireless/cnss2/bus.h +5 −2 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */ /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef _CNSS_BUS_H #define _CNSS_BUS_H Loading Loading @@ -48,9 +48,12 @@ int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv, int cnss_bus_update_status(struct cnss_plat_data *plat_priv, enum cnss_driver_status status); int cnss_bus_is_device_down(struct cnss_plat_data *plat_priv); int cnss_bus_check_link_status(struct cnss_plat_data *plat_priv); int cnss_bus_debug_reg_read(struct cnss_plat_data *plat_priv, u32 offset, u32 *val); int cnss_bus_debug_reg_write(struct cnss_plat_data *plat_priv, u32 offset, u32 val); int cnss_bus_get_iova(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size); int cnss_bus_get_iova_ipa(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size); #endif /* _CNSS_BUS_H */ drivers/net/wireless/cnss2/main.c +4 −0 Original line number Diff line number Diff line Loading @@ -996,6 +996,10 @@ static int cnss_do_recovery(struct cnss_plat_data *plat_priv, switch (reason) { case CNSS_REASON_LINK_DOWN: if (!cnss_bus_check_link_status(plat_priv)) { cnss_pr_dbg("Skip link down recovery as link is already up\n"); return 0; } if (test_bit(LINK_DOWN_SELF_RECOVERY, &plat_priv->ctrl_params.quirks)) goto self_recovery; Loading drivers/net/wireless/cnss2/pci.c +29 −1 Original line number Diff line number Diff line Loading @@ -375,7 +375,7 @@ static struct cnss_bus_bw_cfg cnss_bus_bw_table[] = { #define PCIE_REG_SIZE ARRAY_SIZE(pcie_reg_access_seq) #define WLAON_REG_SIZE ARRAY_SIZE(wlaon_reg_access_seq) static int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) { u16 device_id; Loading Loading @@ -3298,6 +3298,34 @@ static void cnss_pci_deinit_smmu(struct cnss_pci_data *pci_priv) pci_priv->iommu_domain = NULL; } int cnss_pci_get_iova(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size) { if (!pci_priv) return -ENODEV; if (!pci_priv->smmu_iova_len) return -EINVAL; *addr = pci_priv->smmu_iova_start; *size = pci_priv->smmu_iova_len; return 0; } int cnss_pci_get_iova_ipa(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size) { if (!pci_priv) return -ENODEV; if (!pci_priv->smmu_iova_ipa_len) return -EINVAL; *addr = pci_priv->smmu_iova_ipa_start; *size = pci_priv->smmu_iova_ipa_len; return 0; } struct iommu_domain *cnss_smmu_get_domain(struct device *dev) { struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev)); Loading drivers/net/wireless/cnss2/pci.h +4 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,7 @@ static inline int cnss_pci_get_drv_connected(void *bus_priv) return atomic_read(&pci_priv->drv_connected); } int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv); int cnss_suspend_pci_link(struct cnss_pci_data *pci_priv); int cnss_resume_pci_link(struct cnss_pci_data *pci_priv); int cnss_pci_init(struct cnss_plat_data *plat_priv); Loading Loading @@ -205,5 +206,8 @@ int cnss_pci_debug_reg_read(struct cnss_pci_data *pci_priv, u32 offset, u32 *val); int cnss_pci_debug_reg_write(struct cnss_pci_data *pci_priv, u32 offset, u32 val); int cnss_pci_get_iova(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size); int cnss_pci_get_iova_ipa(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size); #endif /* _CNSS_PCI_H */ Loading
drivers/net/wireless/cnss2/bus.c +47 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */ /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include "bus.h" #include "debug.h" Loading Loading @@ -418,6 +418,21 @@ int cnss_bus_is_device_down(struct cnss_plat_data *plat_priv) } } int cnss_bus_check_link_status(struct cnss_plat_data *plat_priv) { if (!plat_priv) return -ENODEV; switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_check_link_status(plat_priv->bus_priv); default: cnss_pr_dbg("Unsupported bus type: %d\n", plat_priv->bus_type); return 0; } } int cnss_bus_debug_reg_read(struct cnss_plat_data *plat_priv, u32 offset, u32 *val) { Loading Loading @@ -451,3 +466,34 @@ int cnss_bus_debug_reg_write(struct cnss_plat_data *plat_priv, u32 offset, return 0; } } int cnss_bus_get_iova(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size) { if (!plat_priv) return -ENODEV; switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_get_iova(plat_priv->bus_priv, addr, size); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); return -EINVAL; } } int cnss_bus_get_iova_ipa(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size) { if (!plat_priv) return -ENODEV; switch (plat_priv->bus_type) { case CNSS_BUS_PCI: return cnss_pci_get_iova_ipa(plat_priv->bus_priv, addr, size); default: cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type); return -EINVAL; } }
drivers/net/wireless/cnss2/bus.h +5 −2 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */ /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef _CNSS_BUS_H #define _CNSS_BUS_H Loading Loading @@ -48,9 +48,12 @@ int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv, int cnss_bus_update_status(struct cnss_plat_data *plat_priv, enum cnss_driver_status status); int cnss_bus_is_device_down(struct cnss_plat_data *plat_priv); int cnss_bus_check_link_status(struct cnss_plat_data *plat_priv); int cnss_bus_debug_reg_read(struct cnss_plat_data *plat_priv, u32 offset, u32 *val); int cnss_bus_debug_reg_write(struct cnss_plat_data *plat_priv, u32 offset, u32 val); int cnss_bus_get_iova(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size); int cnss_bus_get_iova_ipa(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size); #endif /* _CNSS_BUS_H */
drivers/net/wireless/cnss2/main.c +4 −0 Original line number Diff line number Diff line Loading @@ -996,6 +996,10 @@ static int cnss_do_recovery(struct cnss_plat_data *plat_priv, switch (reason) { case CNSS_REASON_LINK_DOWN: if (!cnss_bus_check_link_status(plat_priv)) { cnss_pr_dbg("Skip link down recovery as link is already up\n"); return 0; } if (test_bit(LINK_DOWN_SELF_RECOVERY, &plat_priv->ctrl_params.quirks)) goto self_recovery; Loading
drivers/net/wireless/cnss2/pci.c +29 −1 Original line number Diff line number Diff line Loading @@ -375,7 +375,7 @@ static struct cnss_bus_bw_cfg cnss_bus_bw_table[] = { #define PCIE_REG_SIZE ARRAY_SIZE(pcie_reg_access_seq) #define WLAON_REG_SIZE ARRAY_SIZE(wlaon_reg_access_seq) static int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) { u16 device_id; Loading Loading @@ -3298,6 +3298,34 @@ static void cnss_pci_deinit_smmu(struct cnss_pci_data *pci_priv) pci_priv->iommu_domain = NULL; } int cnss_pci_get_iova(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size) { if (!pci_priv) return -ENODEV; if (!pci_priv->smmu_iova_len) return -EINVAL; *addr = pci_priv->smmu_iova_start; *size = pci_priv->smmu_iova_len; return 0; } int cnss_pci_get_iova_ipa(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size) { if (!pci_priv) return -ENODEV; if (!pci_priv->smmu_iova_ipa_len) return -EINVAL; *addr = pci_priv->smmu_iova_ipa_start; *size = pci_priv->smmu_iova_ipa_len; return 0; } struct iommu_domain *cnss_smmu_get_domain(struct device *dev) { struct cnss_pci_data *pci_priv = cnss_get_pci_priv(to_pci_dev(dev)); Loading
drivers/net/wireless/cnss2/pci.h +4 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,7 @@ static inline int cnss_pci_get_drv_connected(void *bus_priv) return atomic_read(&pci_priv->drv_connected); } int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv); int cnss_suspend_pci_link(struct cnss_pci_data *pci_priv); int cnss_resume_pci_link(struct cnss_pci_data *pci_priv); int cnss_pci_init(struct cnss_plat_data *plat_priv); Loading Loading @@ -205,5 +206,8 @@ int cnss_pci_debug_reg_read(struct cnss_pci_data *pci_priv, u32 offset, u32 *val); int cnss_pci_debug_reg_write(struct cnss_pci_data *pci_priv, u32 offset, u32 val); int cnss_pci_get_iova(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size); int cnss_pci_get_iova_ipa(struct cnss_pci_data *pci_priv, u64 *addr, u64 *size); #endif /* _CNSS_PCI_H */