Loading drivers/net/wireless/cnss2/bus.c +16 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ enum cnss_dev_bus_type cnss_get_bus_type(struct cnss_plat_data *plat_priv) case QCA6174_DEVICE_ID: case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: bus_type = CNSS_BUS_PCI; break; case QCN7605_COMPOSITE_DEVICE_ID: Loading Loading @@ -430,3 +431,18 @@ int cnss_bus_update_status(struct cnss_plat_data *plat_priv, return -EINVAL; } } int cnss_get_msi_assignment(struct cnss_plat_data *plat_priv, char *msi_name, int *num_vectors, u32 *user_base_data, u32 *base_vector) { struct cnss_pci_data *pci_priv; pci_priv = plat_priv->bus_priv; return cnss_get_user_msi_assignment(&pci_priv->pci_dev->dev, msi_name, num_vectors, user_base_data, base_vector); } drivers/net/wireless/cnss2/bus.h +5 −0 Original line number Diff line number Diff line Loading @@ -62,4 +62,9 @@ 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); bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv); int cnss_get_msi_assignment(struct cnss_plat_data *plat_priv, char *msi_name, int *num_vectors, u32 *user_base_data, u32 *base_vector); #endif /* _CNSS_BUS_H */ drivers/net/wireless/cnss2/main.c +13 −0 Original line number Diff line number Diff line Loading @@ -258,6 +258,9 @@ int cnss_wlan_enable(struct device *dev, if (mode == CNSS_WALTEST || mode == CNSS_CCPM) goto skip_cfg; if (plat_priv->device_id == QCN7605_DEVICE_ID) config->send_msi_ce = true; ret = cnss_wlfw_wlan_cfg_send_sync(plat_priv, config, host_version); if (ret) goto out; Loading Loading @@ -367,11 +370,17 @@ static int cnss_fw_mem_ready_hdlr(struct cnss_plat_data *plat_priv) cnss_wlfw_bdf_dnld_send_sync(plat_priv, CNSS_BDF_REGDB); if (plat_priv->device_id == QCN7605_DEVICE_ID) plat_priv->ctrl_params.bdf_type = CNSS_BDF_BIN; ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv, plat_priv->ctrl_params.bdf_type); if (ret) goto out; if (plat_priv->device_id == QCN7605_DEVICE_ID) return 0; ret = cnss_bus_load_m3(plat_priv); if (ret) goto out; Loading Loading @@ -1601,6 +1610,7 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_register_ramdump_v2(plat_priv); break; case QCN7605_COMPOSITE_DEVICE_ID: Loading @@ -1622,6 +1632,7 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: cnss_unregister_ramdump_v2(plat_priv); break; case QCN7605_COMPOSITE_DEVICE_ID: Loading Loading @@ -1695,6 +1706,7 @@ static ssize_t cnss_fs_ready_store(struct device *dev, switch (plat_priv->device_id) { case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: break; default: cnss_pr_err("Not supported for device ID 0x%lx\n", Loading Loading @@ -1832,6 +1844,7 @@ static const struct cnss_fw_path cnss_fw_path_table[] = { { QCA6174_DEVICE_ID, "qca6174/" }, { QCA6290_DEVICE_ID, "qca6290/" }, { QCA6390_DEVICE_ID, "qca6390/" }, { QCN7605_DEVICE_ID, "qcn7605/" }, { 0, "" } }; Loading drivers/net/wireless/cnss2/pci.c +10 −1 Original line number Diff line number Diff line Loading @@ -836,6 +836,7 @@ int cnss_pci_dev_powerup(struct cnss_pci_data *pci_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_qca6290_powerup(pci_priv); break; default: Loading @@ -862,6 +863,7 @@ int cnss_pci_dev_shutdown(struct cnss_pci_data *pci_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_qca6290_shutdown(pci_priv); break; default: Loading Loading @@ -914,6 +916,7 @@ int cnss_pci_dev_ramdump(struct cnss_pci_data *pci_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_qca6290_ramdump(pci_priv); break; default: Loading Loading @@ -2569,7 +2572,11 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv) mhi_ctrl->runtime_put = cnss_mhi_pm_runtime_put_noidle; mhi_ctrl->rddm_size = pci_priv->plat_priv->ramdump_info_v2.ramdump_size; if (pci_priv->device_id == QCN7605_DEVICE_ID) mhi_ctrl->sbl_size = SZ_256K; else mhi_ctrl->sbl_size = SZ_512K; mhi_ctrl->seg_len = SZ_512K; mhi_ctrl->fbc_download = true; Loading Loading @@ -3023,6 +3030,7 @@ static int cnss_pci_probe(struct pci_dev *pci_dev, break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: setup_timer(&pci_priv->dev_rddm_timer, cnss_dev_rddm_timeout_hdlr, (unsigned long)pci_priv); Loading Loading @@ -3105,6 +3113,7 @@ static const struct pci_device_id cnss_pci_id_table[] = { { QCA6174_VENDOR_ID, QCA6174_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6290_VENDOR_ID, QCA6290_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6390_VENDOR_ID, QCA6390_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCN7605_VENDOR_ID, QCN7605_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID}, { 0 } }; MODULE_DEVICE_TABLE(pci, cnss_pci_id_table); Loading drivers/net/wireless/cnss2/qmi.c +37 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #define BIN_BDF_FILE_NAME_PREFIX "bdwlan.b" #define REGDB_FILE_NAME "regdb.bin" #define DUMMY_BDF_FILE_NAME "bdwlan.dmy" #define CE_MSI_NAME "CE" #define QMI_WLFW_TIMEOUT_MS (plat_priv->ctrl_params.qmi_timeout) #define QMI_WLFW_TIMEOUT_JF msecs_to_jiffies(QMI_WLFW_TIMEOUT_MS) Loading Loading @@ -749,7 +750,7 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, struct wlfw_wlan_cfg_req_msg_v01 *req; struct wlfw_wlan_cfg_resp_msg_v01 *resp; struct qmi_txn txn; u32 i; u32 i, ce_id, num_vectors, user_base_data, base_vector; int ret = 0; cnss_pr_dbg("Sending WLAN config message, state: 0x%lx\n", Loading Loading @@ -796,6 +797,17 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, req->svc_cfg[i].pipe_num = config->ce_svc_cfg[i].pipe_num; } if (config->num_shadow_reg_cfg) { req->shadow_reg_valid = 1; if (config->num_shadow_reg_cfg > QMI_WLFW_MAX_NUM_SHADOW_REG_V01) req->shadow_reg_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V01; else req->shadow_reg_len = config->num_shadow_reg_cfg; memcpy(req->shadow_reg, config->shadow_reg_cfg, sizeof(struct wlfw_shadow_reg_cfg_s_v01) * req->shadow_reg_len); } req->shadow_reg_v2_valid = 1; if (config->num_shadow_reg_v2_cfg > QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01) Loading @@ -806,6 +818,30 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, memcpy(req->shadow_reg_v2, config->shadow_reg_v2_cfg, sizeof(struct wlfw_shadow_reg_v2_cfg_s_v01) * req->shadow_reg_v2_len); if (config->rri_over_ddr_cfg_valid) { req->rri_over_ddr_cfg_valid = 1; req->rri_over_ddr_cfg.base_addr_low = config->rri_over_ddr_cfg.base_addr_low; req->rri_over_ddr_cfg.base_addr_high = config->rri_over_ddr_cfg.base_addr_high; } if (config->send_msi_ce) { ret = cnss_get_msi_assignment(plat_priv, CE_MSI_NAME, &num_vectors, &user_base_data, &base_vector); if (!ret) { req->msi_cfg_valid = 1; req->msi_cfg_len = QMI_WLFW_MAX_NUM_CE_V01; for (ce_id = 0; ce_id < QMI_WLFW_MAX_NUM_CE_V01; ce_id++) { req->msi_cfg[ce_id].ce_id = ce_id; req->msi_cfg[ce_id].msi_vector = (ce_id % num_vectors) + base_vector; } } } ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_wlan_cfg_resp_msg_v01_ei, resp); Loading Loading
drivers/net/wireless/cnss2/bus.c +16 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ enum cnss_dev_bus_type cnss_get_bus_type(struct cnss_plat_data *plat_priv) case QCA6174_DEVICE_ID: case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: bus_type = CNSS_BUS_PCI; break; case QCN7605_COMPOSITE_DEVICE_ID: Loading Loading @@ -430,3 +431,18 @@ int cnss_bus_update_status(struct cnss_plat_data *plat_priv, return -EINVAL; } } int cnss_get_msi_assignment(struct cnss_plat_data *plat_priv, char *msi_name, int *num_vectors, u32 *user_base_data, u32 *base_vector) { struct cnss_pci_data *pci_priv; pci_priv = plat_priv->bus_priv; return cnss_get_user_msi_assignment(&pci_priv->pci_dev->dev, msi_name, num_vectors, user_base_data, base_vector); }
drivers/net/wireless/cnss2/bus.h +5 −0 Original line number Diff line number Diff line Loading @@ -62,4 +62,9 @@ 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); bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv); int cnss_get_msi_assignment(struct cnss_plat_data *plat_priv, char *msi_name, int *num_vectors, u32 *user_base_data, u32 *base_vector); #endif /* _CNSS_BUS_H */
drivers/net/wireless/cnss2/main.c +13 −0 Original line number Diff line number Diff line Loading @@ -258,6 +258,9 @@ int cnss_wlan_enable(struct device *dev, if (mode == CNSS_WALTEST || mode == CNSS_CCPM) goto skip_cfg; if (plat_priv->device_id == QCN7605_DEVICE_ID) config->send_msi_ce = true; ret = cnss_wlfw_wlan_cfg_send_sync(plat_priv, config, host_version); if (ret) goto out; Loading Loading @@ -367,11 +370,17 @@ static int cnss_fw_mem_ready_hdlr(struct cnss_plat_data *plat_priv) cnss_wlfw_bdf_dnld_send_sync(plat_priv, CNSS_BDF_REGDB); if (plat_priv->device_id == QCN7605_DEVICE_ID) plat_priv->ctrl_params.bdf_type = CNSS_BDF_BIN; ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv, plat_priv->ctrl_params.bdf_type); if (ret) goto out; if (plat_priv->device_id == QCN7605_DEVICE_ID) return 0; ret = cnss_bus_load_m3(plat_priv); if (ret) goto out; Loading Loading @@ -1601,6 +1610,7 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_register_ramdump_v2(plat_priv); break; case QCN7605_COMPOSITE_DEVICE_ID: Loading @@ -1622,6 +1632,7 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: cnss_unregister_ramdump_v2(plat_priv); break; case QCN7605_COMPOSITE_DEVICE_ID: Loading Loading @@ -1695,6 +1706,7 @@ static ssize_t cnss_fs_ready_store(struct device *dev, switch (plat_priv->device_id) { case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: break; default: cnss_pr_err("Not supported for device ID 0x%lx\n", Loading Loading @@ -1832,6 +1844,7 @@ static const struct cnss_fw_path cnss_fw_path_table[] = { { QCA6174_DEVICE_ID, "qca6174/" }, { QCA6290_DEVICE_ID, "qca6290/" }, { QCA6390_DEVICE_ID, "qca6390/" }, { QCN7605_DEVICE_ID, "qcn7605/" }, { 0, "" } }; Loading
drivers/net/wireless/cnss2/pci.c +10 −1 Original line number Diff line number Diff line Loading @@ -836,6 +836,7 @@ int cnss_pci_dev_powerup(struct cnss_pci_data *pci_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_qca6290_powerup(pci_priv); break; default: Loading @@ -862,6 +863,7 @@ int cnss_pci_dev_shutdown(struct cnss_pci_data *pci_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_qca6290_shutdown(pci_priv); break; default: Loading Loading @@ -914,6 +916,7 @@ int cnss_pci_dev_ramdump(struct cnss_pci_data *pci_priv) break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: ret = cnss_qca6290_ramdump(pci_priv); break; default: Loading Loading @@ -2569,7 +2572,11 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv) mhi_ctrl->runtime_put = cnss_mhi_pm_runtime_put_noidle; mhi_ctrl->rddm_size = pci_priv->plat_priv->ramdump_info_v2.ramdump_size; if (pci_priv->device_id == QCN7605_DEVICE_ID) mhi_ctrl->sbl_size = SZ_256K; else mhi_ctrl->sbl_size = SZ_512K; mhi_ctrl->seg_len = SZ_512K; mhi_ctrl->fbc_download = true; Loading Loading @@ -3023,6 +3030,7 @@ static int cnss_pci_probe(struct pci_dev *pci_dev, break; case QCA6290_DEVICE_ID: case QCA6390_DEVICE_ID: case QCN7605_DEVICE_ID: setup_timer(&pci_priv->dev_rddm_timer, cnss_dev_rddm_timeout_hdlr, (unsigned long)pci_priv); Loading Loading @@ -3105,6 +3113,7 @@ static const struct pci_device_id cnss_pci_id_table[] = { { QCA6174_VENDOR_ID, QCA6174_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6290_VENDOR_ID, QCA6290_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCA6390_VENDOR_ID, QCA6390_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID }, { QCN7605_VENDOR_ID, QCN7605_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID}, { 0 } }; MODULE_DEVICE_TABLE(pci, cnss_pci_id_table); Loading
drivers/net/wireless/cnss2/qmi.c +37 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #define BIN_BDF_FILE_NAME_PREFIX "bdwlan.b" #define REGDB_FILE_NAME "regdb.bin" #define DUMMY_BDF_FILE_NAME "bdwlan.dmy" #define CE_MSI_NAME "CE" #define QMI_WLFW_TIMEOUT_MS (plat_priv->ctrl_params.qmi_timeout) #define QMI_WLFW_TIMEOUT_JF msecs_to_jiffies(QMI_WLFW_TIMEOUT_MS) Loading Loading @@ -749,7 +750,7 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, struct wlfw_wlan_cfg_req_msg_v01 *req; struct wlfw_wlan_cfg_resp_msg_v01 *resp; struct qmi_txn txn; u32 i; u32 i, ce_id, num_vectors, user_base_data, base_vector; int ret = 0; cnss_pr_dbg("Sending WLAN config message, state: 0x%lx\n", Loading Loading @@ -796,6 +797,17 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, req->svc_cfg[i].pipe_num = config->ce_svc_cfg[i].pipe_num; } if (config->num_shadow_reg_cfg) { req->shadow_reg_valid = 1; if (config->num_shadow_reg_cfg > QMI_WLFW_MAX_NUM_SHADOW_REG_V01) req->shadow_reg_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V01; else req->shadow_reg_len = config->num_shadow_reg_cfg; memcpy(req->shadow_reg, config->shadow_reg_cfg, sizeof(struct wlfw_shadow_reg_cfg_s_v01) * req->shadow_reg_len); } req->shadow_reg_v2_valid = 1; if (config->num_shadow_reg_v2_cfg > QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01) Loading @@ -806,6 +818,30 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv, memcpy(req->shadow_reg_v2, config->shadow_reg_v2_cfg, sizeof(struct wlfw_shadow_reg_v2_cfg_s_v01) * req->shadow_reg_v2_len); if (config->rri_over_ddr_cfg_valid) { req->rri_over_ddr_cfg_valid = 1; req->rri_over_ddr_cfg.base_addr_low = config->rri_over_ddr_cfg.base_addr_low; req->rri_over_ddr_cfg.base_addr_high = config->rri_over_ddr_cfg.base_addr_high; } if (config->send_msi_ce) { ret = cnss_get_msi_assignment(plat_priv, CE_MSI_NAME, &num_vectors, &user_base_data, &base_vector); if (!ret) { req->msi_cfg_valid = 1; req->msi_cfg_len = QMI_WLFW_MAX_NUM_CE_V01; for (ce_id = 0; ce_id < QMI_WLFW_MAX_NUM_CE_V01; ce_id++) { req->msi_cfg[ce_id].ce_id = ce_id; req->msi_cfg[ce_id].msi_vector = (ce_id % num_vectors) + base_vector; } } } ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn, wlfw_wlan_cfg_resp_msg_v01_ei, resp); Loading