diff --git a/drivers/net/wireless/cnss2/Kconfig b/drivers/net/wireless/cnss2/Kconfig index 3d1c448edf47..2619722b2354 100644 --- a/drivers/net/wireless/cnss2/Kconfig +++ b/drivers/net/wireless/cnss2/Kconfig @@ -87,3 +87,12 @@ config CNSS_QCA6490 CNSS QCA6490 chipset. These changes are needed to support the new hardware architecture for CNSS QCA6490 chipset. + +config CNSS_WCN7850 + bool "Enable CNSS WCN7850 chipset specific changes" + depends on CNSS2 + help + This enables the changes from WLAN host driver that are specific to + CNSS WCN7850 chipset. + These changes are needed to support the new hardware architecture + for CNSS WCN7850 chipset. diff --git a/drivers/net/wireless/cnss2/bus.h b/drivers/net/wireless/cnss2/bus.h index 2be106881ad2..0673615d9fba 100644 --- a/drivers/net/wireless/cnss2/bus.h +++ b/drivers/net/wireless/cnss2/bus.h @@ -17,6 +17,8 @@ #define QCA6390_DEVICE_ID 0x1101 #define QCA6490_VENDOR_ID 0x17CB #define QCA6490_DEVICE_ID 0x1103 +#define WCN7850_VENDOR_ID 0x17CB +#define WCN7850_DEVICE_ID 0x1107 enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev); enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id); diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 4d3ea24a3fda..c8cdea284c95 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -2190,6 +2190,7 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: ret = cnss_register_ramdump_v2(plat_priv); break; default: @@ -2209,6 +2210,7 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: cnss_unregister_ramdump_v2(plat_priv); break; default: @@ -2723,6 +2725,7 @@ static const struct platform_device_id cnss_platform_id_table[] = { { .name = "qca6290", .driver_data = QCA6290_DEVICE_ID, }, { .name = "qca6390", .driver_data = QCA6390_DEVICE_ID, }, { .name = "qca6490", .driver_data = QCA6490_DEVICE_ID, }, + { .name = "wcn7850", .driver_data = WCN7850_DEVICE_ID, }, { }, }; @@ -2739,6 +2742,9 @@ static const struct of_device_id cnss_of_match_table[] = { { .compatible = "qcom,cnss-qca6490", .data = (void *)&cnss_platform_id_table[3]}, + { + .compatible = "qcom,cnss-wcn7850", + .data = (void *)&cnss_platform_id_table[4]}, { }, }; MODULE_DEVICE_TABLE(of, cnss_of_match_table); diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 702606750674..323fc6d48ada 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -40,6 +40,7 @@ #define QCA6390_PATH_PREFIX "qca6390/" #define QCA6490_PATH_PREFIX "qca6490/" +#define WCN7850_PATH_PREFIX "wcn7850/" #define DEFAULT_M3_FILE_NAME "m3.bin" #define DEFAULT_FW_FILE_NAME "amss.bin" #define FW_V2_FILE_NAME "amss20.bin" @@ -879,6 +880,7 @@ int cnss_pci_recover_link_down(struct cnss_pci_data *pci_priv) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: break; default: return -EOPNOTSUPP; @@ -2329,6 +2331,7 @@ int cnss_pci_dev_powerup(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: ret = cnss_qca6290_powerup(pci_priv); break; default: @@ -2356,6 +2359,7 @@ int cnss_pci_dev_shutdown(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: ret = cnss_qca6290_shutdown(pci_priv); break; default: @@ -2383,6 +2387,7 @@ int cnss_pci_dev_crash_shutdown(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: cnss_qca6290_crash_shutdown(pci_priv); break; default: @@ -2410,6 +2415,7 @@ int cnss_pci_dev_ramdump(struct cnss_pci_data *pci_priv) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: ret = cnss_qca6290_ramdump(pci_priv); break; default: @@ -3308,9 +3314,14 @@ int cnss_pci_force_wake_request_sync(struct device *dev, int timeout_us) if (!pci_priv) return -ENODEV; - if (pci_priv->device_id != QCA6390_DEVICE_ID && - pci_priv->device_id != QCA6490_DEVICE_ID) + switch (pci_priv->device_id) { + case QCA6390_DEVICE_ID: + case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: + break; + default: return 0; + } mhi_ctrl = pci_priv->mhi_ctrl; if (!mhi_ctrl) @@ -3344,9 +3355,14 @@ int cnss_pci_force_wake_request(struct device *dev) if (!pci_priv) return -ENODEV; - if (pci_priv->device_id != QCA6390_DEVICE_ID && - pci_priv->device_id != QCA6490_DEVICE_ID) + switch (pci_priv->device_id) { + case QCA6390_DEVICE_ID: + case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: + break; + default: return 0; + } mhi_ctrl = pci_priv->mhi_ctrl; if (!mhi_ctrl) @@ -3374,9 +3390,14 @@ int cnss_pci_is_device_awake(struct device *dev) if (!pci_priv) return -ENODEV; - if (pci_priv->device_id != QCA6390_DEVICE_ID && - pci_priv->device_id != QCA6490_DEVICE_ID) - return true; + switch (pci_priv->device_id) { + case QCA6390_DEVICE_ID: + case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: + break; + default: + return 0; + } mhi_ctrl = pci_priv->mhi_ctrl; if (!mhi_ctrl) @@ -3396,9 +3417,14 @@ int cnss_pci_force_wake_release(struct device *dev) if (!pci_priv) return -ENODEV; - if (pci_priv->device_id != QCA6390_DEVICE_ID && - pci_priv->device_id != QCA6490_DEVICE_ID) + switch (pci_priv->device_id) { + case QCA6390_DEVICE_ID: + case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: + break; + default: return 0; + } mhi_ctrl = pci_priv->mhi_ctrl; if (!mhi_ctrl) @@ -4620,6 +4646,10 @@ void cnss_pci_add_fw_prefix_name(struct cnss_pci_data *pci_priv, scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, QCA6490_PATH_PREFIX "%s", name); break; + case WCN7850_DEVICE_ID: + scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, + WCN7850_PATH_PREFIX "%s", name); + break; default: scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, "%s", name); break; @@ -5082,6 +5112,7 @@ static int cnss_pci_probe(struct pci_dev *pci_dev, case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: cnss_pci_set_wlaon_pwr_ctrl(pci_priv, false, false, false); timer_setup(&pci_priv->dev_rddm_timer, cnss_dev_rddm_timeout_hdlr, 0); @@ -5142,6 +5173,7 @@ static void cnss_pci_remove(struct pci_dev *pci_dev) case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case WCN7850_DEVICE_ID: complete_all(&pci_priv->wake_event); del_timer(&pci_priv->dev_rddm_timer); break; @@ -5169,6 +5201,7 @@ static const struct pci_device_id cnss_pci_id_table[] = { { QCA6290_VENDOR_ID, QCA6290_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6390_VENDOR_ID, QCA6390_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6490_VENDOR_ID, QCA6490_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, + { WCN7850_VENDOR_ID, WCN7850_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { 0 } }; MODULE_DEVICE_TABLE(pci, cnss_pci_id_table);