mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 19:03:39 +00:00
This series is based on * 2020-07-10 ipq6018-ilq-11-0_qca_oem-034672b0676c37b1f4519e5720e18e95fe6236ef Add support for * qsdk kernel/v4.4 * qsdk ethernet subsystem * v5.7 ath11k backport + QualComm staging patches (wlan_ap_1.0) * ath11k-firmware * hostapd/iw/... Feature support * full boot, system detection * sysupgrade to nand * HE support via latest hostapd * driver support for usb, crypto, hwmon, cpufreq, ... Missing * NSS/HW flow offloading - FW blob is not redistributable Using the qsdk v4.4 is an intermediate solution while the vanilla is being tested. Vanilla kernel is almost on feature par. Work has already started to upstream the ethernet and switch drivers. Once complete the target will be fully upstream. Signed-off-by: John Crispin <john@phrozen.org>
410 lines
13 KiB
Diff
410 lines
13 KiB
Diff
From a7e70356a517426e40f0886bb80ed360777d3a56 Mon Sep 17 00:00:00 2001
|
|
From: Anilkumar Kolli <akolli@codeaurora.org>
|
|
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 <akolli@codeaurora.org>
|
|
---
|
|
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 {
|