Commit 202e86e6 authored by Kalle Valo's avatar Kalle Valo

ath10k: add ATH10K_FW_IE_WMI_OP_VERSION

Instead of using feature flags, add new 32 bit variable for managing different
WMI versions. This makes it firmware interface tests a bit less convoluted,
especially when we add one more interface.
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 5f2144d9
...@@ -508,7 +508,7 @@ static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name) ...@@ -508,7 +508,7 @@ static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name)
int ie_id, i, index, bit, ret; int ie_id, i, index, bit, ret;
struct ath10k_fw_ie *hdr; struct ath10k_fw_ie *hdr;
const u8 *data; const u8 *data;
__le32 *timestamp; __le32 *timestamp, *version;
/* first fetch the firmware file (firmware-*.bin) */ /* first fetch the firmware file (firmware-*.bin) */
ar->firmware = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, name); ar->firmware = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, name);
...@@ -623,6 +623,17 @@ static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name) ...@@ -623,6 +623,17 @@ static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name)
ar->otp_len = ie_len; ar->otp_len = ie_len;
break; break;
case ATH10K_FW_IE_WMI_OP_VERSION:
if (ie_len != sizeof(u32))
break;
version = (__le32 *)data;
ar->wmi.op_version = le32_to_cpup(version);
ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw ie wmi op version %d\n",
ar->wmi.op_version);
break;
default: default:
ath10k_warn(ar, "Unknown FW IE: %u\n", ath10k_warn(ar, "Unknown FW IE: %u\n",
le32_to_cpu(hdr->id)); le32_to_cpu(hdr->id));
...@@ -871,12 +882,40 @@ static int ath10k_core_init_firmware_features(struct ath10k *ar) ...@@ -871,12 +882,40 @@ static int ath10k_core_init_firmware_features(struct ath10k *ar)
return -EINVAL; return -EINVAL;
} }
if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) { if (ar->wmi.op_version >= ATH10K_FW_WMI_OP_VERSION_MAX) {
ar->max_num_peers = TARGET_10X_NUM_PEERS; ath10k_err(ar, "unsupported WMI OP version (max %d): %d\n",
ar->max_num_stations = TARGET_10X_NUM_STATIONS; ATH10K_FW_WMI_OP_VERSION_MAX, ar->wmi.op_version);
} else { return -EINVAL;
}
/* Backwards compatibility for firmwares without
* ATH10K_FW_IE_WMI_OP_VERSION.
*/
if (ar->wmi.op_version == ATH10K_FW_WMI_OP_VERSION_UNSET) {
if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
if (test_bit(ATH10K_FW_FEATURE_WMI_10_2, ar->fw_features))
ar->wmi.op_version = ATH10K_FW_WMI_OP_VERSION_10_2;
else
ar->wmi.op_version = ATH10K_FW_WMI_OP_VERSION_10_1;
} else {
ar->wmi.op_version = ATH10K_FW_WMI_OP_VERSION_MAIN;
}
}
switch (ar->wmi.op_version) {
case ATH10K_FW_WMI_OP_VERSION_MAIN:
ar->max_num_peers = TARGET_NUM_PEERS; ar->max_num_peers = TARGET_NUM_PEERS;
ar->max_num_stations = TARGET_NUM_STATIONS; ar->max_num_stations = TARGET_NUM_STATIONS;
break;
case ATH10K_FW_WMI_OP_VERSION_10_1:
case ATH10K_FW_WMI_OP_VERSION_10_2:
ar->max_num_peers = TARGET_10X_NUM_PEERS;
ar->max_num_stations = TARGET_10X_NUM_STATIONS;
break;
case ATH10K_FW_WMI_OP_VERSION_UNSET:
case ATH10K_FW_WMI_OP_VERSION_MAX:
WARN_ON(1);
return -EINVAL;
} }
return 0; return 0;
......
...@@ -120,6 +120,7 @@ struct ath10k_mem_chunk { ...@@ -120,6 +120,7 @@ struct ath10k_mem_chunk {
}; };
struct ath10k_wmi { struct ath10k_wmi {
enum ath10k_fw_wmi_op_version op_version;
enum ath10k_htc_ep_id eid; enum ath10k_htc_ep_id eid;
struct completion service_ready; struct completion service_ready;
struct completion unified_ready; struct completion unified_ready;
...@@ -369,7 +370,7 @@ enum ath10k_fw_features { ...@@ -369,7 +370,7 @@ enum ath10k_fw_features {
/* wmi_mgmt_rx_hdr contains extra RSSI information */ /* wmi_mgmt_rx_hdr contains extra RSSI information */
ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0, ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0,
/* firmware from 10X branch */ /* Firmware from 10X branch. Deprecated, don't use in new code. */
ATH10K_FW_FEATURE_WMI_10X = 1, ATH10K_FW_FEATURE_WMI_10X = 1,
/* firmware support tx frame management over WMI, otherwise it's HTT */ /* firmware support tx frame management over WMI, otherwise it's HTT */
...@@ -378,8 +379,9 @@ enum ath10k_fw_features { ...@@ -378,8 +379,9 @@ enum ath10k_fw_features {
/* Firmware does not support P2P */ /* Firmware does not support P2P */
ATH10K_FW_FEATURE_NO_P2P = 3, ATH10K_FW_FEATURE_NO_P2P = 3,
/* Firmware 10.2 feature bit. The ATH10K_FW_FEATURE_WMI_10X feature bit /* Firmware 10.2 feature bit. The ATH10K_FW_FEATURE_WMI_10X feature
* is required to be set as well. * bit is required to be set as well. Deprecated, don't use in new
* code.
*/ */
ATH10K_FW_FEATURE_WMI_10_2 = 4, ATH10K_FW_FEATURE_WMI_10_2 = 4,
......
...@@ -58,6 +58,22 @@ enum ath10k_fw_ie_type { ...@@ -58,6 +58,22 @@ enum ath10k_fw_ie_type {
ATH10K_FW_IE_FEATURES = 2, ATH10K_FW_IE_FEATURES = 2,
ATH10K_FW_IE_FW_IMAGE = 3, ATH10K_FW_IE_FW_IMAGE = 3,
ATH10K_FW_IE_OTP_IMAGE = 4, ATH10K_FW_IE_OTP_IMAGE = 4,
/* WMI "operations" interface version, 32 bit value. Supported from
* FW API 4 and above.
*/
ATH10K_FW_IE_WMI_OP_VERSION = 5,
};
enum ath10k_fw_wmi_op_version {
ATH10K_FW_WMI_OP_VERSION_UNSET = 0,
ATH10K_FW_WMI_OP_VERSION_MAIN = 1,
ATH10K_FW_WMI_OP_VERSION_10_1 = 2,
ATH10K_FW_WMI_OP_VERSION_10_2 = 3,
/* keep last */
ATH10K_FW_WMI_OP_VERSION_MAX,
}; };
/* Known pecularities: /* Known pecularities:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment