From a7e70356a517426e40f0886bb80ed360777d3a56 Mon Sep 17 00:00:00 2001 From: Anilkumar Kolli Date: Mon, 18 May 2020 18:34:45 +0530 Subject: [PATCH] ath11k: cleanup bdf download sequence both ahb and pci radios working Signed-off-by: Anilkumar Kolli --- drivers/net/wireless/ath/ath11k/qmi.c | 252 ++++++++++++++++++++++++++++++++- drivers/net/wireless/ath/ath11k/qmi.h | 22 ++- 6 files changed, 315 insertions(+), 21 deletions(-) Index: backports-20200415-4.4.60-9de9a9b19d3f/drivers/net/wireless/ath/ath11k/qmi.c =================================================================== --- backports-20200415-4.4.60-9de9a9b19d3f.orig/drivers/net/wireless/ath/ath11k/qmi.c +++ backports-20200415-4.4.60-9de9a9b19d3f/drivers/net/wireless/ath/ath11k/qmi.c @@ -454,6 +454,42 @@ static struct qmi_elem_info qmi_wlanfw_h mem_cfg_mode), }, { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1D, + .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, + cal_duration_valid), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(u16), + .array_type = NO_ARRAY, + .tlv_type = 0x1D, + .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, + cal_duration), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1E, + .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, + platform_name_valid), + }, + { + .data_type = QMI_STRING, + .elem_len = QMI_WLFW_MAX_PLATFORM_NAME_LEN_V01 + 1, + .elem_size = sizeof(char), + .array_type = NO_ARRAY, + .tlv_type = 0x1E, + .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, + platform_name), + }, + { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, @@ -696,6 +732,115 @@ static struct qmi_elem_info qmi_wlanfw_i cal_done_enable), }, { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1C, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + qdss_trace_req_mem_enable_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1C, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + qdss_trace_req_mem_enable), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1D, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + qdss_trace_save_enable_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1D, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + qdss_trace_save_enable), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1E, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + qdss_trace_free_enable_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1E, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + qdss_trace_free_enable), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1F, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + respond_get_info_enable_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x1F, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + respond_get_info_enable), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x20, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + m3_dump_upload_req_enable_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x20, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + m3_dump_upload_req_enable), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x21, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + hang_event_ind_msg_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x21, + .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, + hang_event_ind_msg), + }, + + { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, @@ -1140,6 +1285,78 @@ static struct qmi_elem_info qmi_wlanfw_c num_macs), }, { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + voltage_mv_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(u32), + .array_type = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + voltage_mv), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x17, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + time_freq_hz_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(u32), + .array_type = NO_ARRAY, + .tlv_type = 0x17, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + time_freq_hz), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + otp_version_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(u32), + .array_type = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + otp_version), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(u8), + .array_type = NO_ARRAY, + .tlv_type = 0x19, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + eeprom_caldata_read_timeout_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(u32), + .array_type = NO_ARRAY, + .tlv_type = 0x19, + .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, + eeprom_caldata_read_timeout), + }, + { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, @@ -1851,6 +2068,8 @@ static int ath11k_qmi_host_cap_send(stru struct qmi_wlanfw_host_cap_resp_msg_v01 resp; struct qmi_txn txn = {}; int ret = 0; + const char *model = NULL; + struct device_node *root; memset(&req, 0, sizeof(req)); memset(&resp, 0, sizeof(resp)); @@ -1877,6 +2096,17 @@ static int ath11k_qmi_host_cap_send(stru req.cal_done_valid = 1; req.cal_done = ab->qmi.cal_done; + root = of_find_node_by_path("/"); + if (root) { + model = of_get_property(root, "model", NULL); + if (model) { + req.platform_name_valid = 1; + strlcpy(req.platform_name, model, + QMI_WLFW_MAX_PLATFORM_NAME_LEN_V01); + pr_err("platform name: %s", req.platform_name); + } + } + ret = qmi_txn_init(&ab->qmi.handle, &txn, qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp); if (ret < 0) @@ -2086,10 +2316,14 @@ static int ath11k_qmi_assign_target_mem_ if (of_property_read_u32(dev->of_node, "qcom,caldb-addr", &addr)) ath11k_warn(ab, "qmi fail to get caldb-addr in dt\n"); - ab->qmi.target_mem[idx].paddr = (phys_addr_t)addr; - - ab->qmi.target_mem[idx].vaddr = (u32)ioremap(ab->qmi.target_mem[idx].paddr, + if (ab->fixed_bdf_addr) { + ab->qmi.target_mem[idx].paddr = 0UL; + ab->qmi.target_mem[idx].vaddr = 0UL; + } else { + ab->qmi.target_mem[idx].paddr = (phys_addr_t)addr; + ab->qmi.target_mem[idx].vaddr = (u32)ioremap(ab->qmi.target_mem[idx].paddr, ab->qmi.target_mem[i].size); + } ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size; ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type; idx++; @@ -2167,6 +2401,12 @@ static int ath11k_qmi_request_target_cap strlcpy(ab->qmi.target.fw_build_id, resp.fw_build_id, sizeof(ab->qmi.target.fw_build_id)); + if (resp.eeprom_caldata_read_timeout_valid) { + ab->qmi.target.eeprom_caldata_read_timeout = + resp.eeprom_caldata_read_timeout; + ath11k_info(ab, "cal data supported from eeprom\n"); + } + ath11k_info(ab, "qmi target: chip_id: 0x%x, chip_family: 0x%x, board_id: 0x%x, soc_id: 0x%x\n", ab->qmi.target.chip_id, ab->qmi.target.chip_family, ab->qmi.target.board_id, ab->qmi.target.soc_id); @@ -2826,6 +3066,7 @@ static void ath11k_qmi_msg_fw_ready_cb(s struct ath11k_base *ab = qmi->ab; ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware ready\n"); + ath11k_info(ab, "qmi firmware ready\n"); ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_READY, NULL); } Index: backports-20200415-4.4.60-9de9a9b19d3f/drivers/net/wireless/ath/ath11k/qmi.h =================================================================== --- backports-20200415-4.4.60-9de9a9b19d3f.orig/drivers/net/wireless/ath/ath11k/qmi.h +++ backports-20200415-4.4.60-9de9a9b19d3f/drivers/net/wireless/ath/ath11k/qmi.h @@ -30,6 +30,8 @@ #define ATH11K_QMI_HOST_FWADDR_SZ_QCN9000 0x2F00000 #define ATH11K_QMI_CALDB_SIZE_QCN9000 0x800000 #define ATH11K_QMI_DEFAULT_CAL_FILE_NAME "caldata.bin" +#define ATH11K_QMI_DEF_CAL_FILE_PREFIX "caldata_" +#define ATH11K_QMI_DEF_CAL_FILE_SUFFIX ".bin" #define ATH11K_QMI_MAX_QDSS_CONFIG_FILE_NAME_SIZE 64 #define ATH11K_QMI_DEFAULT_QDSS_CONFIG_FILE_NAME "qdss_trace_config.bin" #define NODE_ID_BASE 0x27 @@ -106,6 +108,7 @@ struct target_info { u32 board_id; u32 soc_id; u32 fw_version; + u32 eeprom_caldata_read_timeout; char fw_build_timestamp[ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1]; char fw_build_id[ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1]; }; @@ -180,7 +183,7 @@ struct qmi_wlanfw_qdss_trace_mode_resp_m struct qmi_response_type_v01 resp; }; -#define QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN 194 +#define QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN 261 #define QMI_WLANFW_HOST_CAP_REQ_V01 0x0034 #define QMI_WLANFW_HOST_CAP_RESP_MSG_V01_MAX_LEN 7 #define QMI_WLFW_HOST_CAP_RESP_V01 0x0034 @@ -189,6 +192,7 @@ struct qmi_wlanfw_qdss_trace_mode_resp_m #define HOST_DDR_REGION_TYPE 0x1 #define BDF_MEM_REGION_TYPE 0x2 #define CALDB_MEM_REGION_TYPE 0x4 +#define QMI_WLFW_MAX_PLATFORM_NAME_LEN_V01 64 struct qmi_wlanfw_host_cap_req_msg_v01 { u8 num_clients_valid; @@ -220,13 +224,15 @@ struct qmi_wlanfw_host_cap_req_msg_v01 { u8 mem_cfg_mode; u8 cal_duration_valid; u16 cal_duration; + u8 platform_name_valid; + char platform_name[QMI_WLFW_MAX_PLATFORM_NAME_LEN_V01 + 1]; }; struct qmi_wlanfw_host_cap_resp_msg_v01 { struct qmi_response_type_v01 resp; }; -#define QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN 74 +#define QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN 78 #define QMI_WLANFW_IND_REGISTER_REQ_V01 0x0020 #define QMI_WLANFW_IND_REGISTER_RESP_MSG_V01_MAX_LEN 18 #define QMI_WLANFW_IND_REGISTER_RESP_V01 0x0020 @@ -267,6 +273,8 @@ struct qmi_wlanfw_ind_register_req_msg_v u8 respond_get_info_enable; u8 m3_dump_upload_req_enable_valid; u8 m3_dump_upload_req_enable; + u8 hang_event_ind_msg_valid; + u8 hang_event_ind_msg; }; struct qmi_wlanfw_ind_register_resp_msg_v01 { @@ -341,7 +349,7 @@ struct qmi_wlanfw_fw_cold_cal_done_ind_m }; #define QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN 0 -#define QMI_WLANFW_CAP_RESP_MSG_V01_MAX_LEN 207 +#define QMI_WLANFW_CAP_RESP_MSG_V01_MAX_LEN 235 #define QMI_WLANFW_CAP_REQ_V01 0x0024 #define QMI_WLANFW_CAP_RESP_V01 0x0024 @@ -422,6 +430,14 @@ struct qmi_wlanfw_cap_resp_msg_v01 { char fw_build_id[ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1]; u8 num_macs_valid; u8 num_macs; + u8 voltage_mv_valid; + u32 voltage_mv; + u8 time_freq_hz_valid; + u32 time_freq_hz; + u8 otp_version_valid; + u32 otp_version; + u8 eeprom_caldata_read_timeout_valid; + u32 eeprom_caldata_read_timeout; }; struct qmi_wlanfw_cap_req_msg_v01 {