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: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
5f2144d9b2
commit
202e86e606
3 changed files with 65 additions and 8 deletions
|
@ -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)
|
||||||
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)
|
||||||
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 {
|
||||||
};
|
};
|
||||||
|
|
||||||
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 {
|
||||||
/* 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 {
|
||||||
/* 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 {
|
||||||
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:
|
||||||
|
|
Loading…
Add table
Reference in a new issue