Commit ee3ae3a1 authored by Dan Halperin's avatar Dan Halperin Committed by Luca Coelho

iwlwifi: mvm: add support for new WOWLAN_TSC_RSC_PARAM version

- Change the iwl_all_tsc_rsc struct to hold a sta_id (__le32) field,
  while preserving the union, used in the older version.
- Adjust the use of this command according to the TLV.
Signed-off-by: default avatarDan Halperin <Dan1.Halperin@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20200926002540.8c621903db59.I1cc7afedc0ff2009fe1abf007684339f299b73aa@changeidSigned-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 090a5d7c
...@@ -451,10 +451,15 @@ union iwl_all_tsc_rsc { ...@@ -451,10 +451,15 @@ union iwl_all_tsc_rsc {
struct iwl_aes_rsc_tsc aes; struct iwl_aes_rsc_tsc aes;
}; /* ALL_TSC_RSC_API_S_VER_2 */ }; /* ALL_TSC_RSC_API_S_VER_2 */
struct iwl_wowlan_rsc_tsc_params_cmd { struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 {
union iwl_all_tsc_rsc all_tsc_rsc; union iwl_all_tsc_rsc all_tsc_rsc;
} __packed; /* ALL_TSC_RSC_API_S_VER_2 */ } __packed; /* ALL_TSC_RSC_API_S_VER_2 */
struct iwl_wowlan_rsc_tsc_params_cmd {
struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 params;
__le32 sta_id;
} __packed; /* ALL_TSC_RSC_API_S_VER_4 */
#define IWL_MIC_KEY_SIZE 8 #define IWL_MIC_KEY_SIZE 8
struct iwl_mic_keys { struct iwl_mic_keys {
u8 tx[IWL_MIC_KEY_SIZE]; u8 tx[IWL_MIC_KEY_SIZE];
...@@ -534,7 +539,7 @@ struct iwl_wowlan_gtk_status_v1 { ...@@ -534,7 +539,7 @@ struct iwl_wowlan_gtk_status_v1 {
u8 reserved[3]; u8 reserved[3];
u8 decrypt_key[16]; u8 decrypt_key[16];
u8 tkip_mic_key[8]; u8 tkip_mic_key[8];
struct iwl_wowlan_rsc_tsc_params_cmd rsc; struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 rsc;
} __packed; /* WOWLAN_GTK_MATERIAL_VER_1 */ } __packed; /* WOWLAN_GTK_MATERIAL_VER_1 */
#define WOWLAN_KEY_MAX_SIZE 32 #define WOWLAN_KEY_MAX_SIZE 32
...@@ -559,7 +564,7 @@ struct iwl_wowlan_gtk_status { ...@@ -559,7 +564,7 @@ struct iwl_wowlan_gtk_status {
u8 key_flags; u8 key_flags;
u8 reserved[2]; u8 reserved[2];
u8 tkip_mic_key[8]; u8 tkip_mic_key[8];
struct iwl_wowlan_rsc_tsc_params_cmd rsc; struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 rsc;
} __packed; /* WOWLAN_GTK_MATERIAL_VER_2 */ } __packed; /* WOWLAN_GTK_MATERIAL_VER_2 */
#define IWL_WOWLAN_GTK_IDX_MASK (BIT(0) | BIT(1)) #define IWL_WOWLAN_GTK_IDX_MASK (BIT(0) | BIT(1))
......
...@@ -245,8 +245,10 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, ...@@ -245,8 +245,10 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
if (sta) { if (sta) {
u64 pn64; u64 pn64;
tkip_sc = data->rsc_tsc->all_tsc_rsc.tkip.unicast_rsc; tkip_sc =
tkip_tx_sc = &data->rsc_tsc->all_tsc_rsc.tkip.tsc; data->rsc_tsc->params.all_tsc_rsc.tkip.unicast_rsc;
tkip_tx_sc =
&data->rsc_tsc->params.all_tsc_rsc.tkip.tsc;
rx_p1ks = data->tkip->rx_uni; rx_p1ks = data->tkip->rx_uni;
...@@ -265,7 +267,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, ...@@ -265,7 +267,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
rx_mic_key = data->tkip->mic_keys.rx_unicast; rx_mic_key = data->tkip->mic_keys.rx_unicast;
} else { } else {
tkip_sc = tkip_sc =
data->rsc_tsc->all_tsc_rsc.tkip.multicast_rsc; data->rsc_tsc->params.all_tsc_rsc.tkip.multicast_rsc;
rx_p1ks = data->tkip->rx_multi; rx_p1ks = data->tkip->rx_multi;
rx_mic_key = data->tkip->mic_keys.rx_mcast; rx_mic_key = data->tkip->mic_keys.rx_mcast;
} }
...@@ -302,13 +304,16 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, ...@@ -302,13 +304,16 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
if (sta) { if (sta) {
u64 pn64; u64 pn64;
aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc; aes_sc =
aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc; data->rsc_tsc->params.all_tsc_rsc.aes.unicast_rsc;
aes_tx_sc =
&data->rsc_tsc->params.all_tsc_rsc.aes.tsc;
pn64 = atomic64_read(&key->tx_pn); pn64 = atomic64_read(&key->tx_pn);
aes_tx_sc->pn = cpu_to_le64(pn64); aes_tx_sc->pn = cpu_to_le64(pn64);
} else { } else {
aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc; aes_sc =
data->rsc_tsc->params.all_tsc_rsc.aes.multicast_rsc;
} }
/* /*
...@@ -772,10 +777,28 @@ static int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm, ...@@ -772,10 +777,28 @@ static int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
} }
if (key_data.use_rsc_tsc) { if (key_data.use_rsc_tsc) {
ret = iwl_mvm_send_cmd_pdu(mvm, int ver = iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP,
WOWLAN_TSC_RSC_PARAM, cmd_flags, WOWLAN_TSC_RSC_PARAM);
sizeof(*key_data.rsc_tsc), int size;
if (ver == 4) {
size = sizeof(*key_data.rsc_tsc);
key_data.rsc_tsc->sta_id =
cpu_to_le32(mvmvif->ap_sta_id);
} else if (ver == 2 || ver == IWL_FW_CMD_VER_UNKNOWN) {
size = sizeof(key_data.rsc_tsc->params);
} else {
ret = 0;
WARN_ON_ONCE(1);
goto out;
}
ret = iwl_mvm_send_cmd_pdu(mvm, WOWLAN_TSC_RSC_PARAM,
cmd_flags,
size,
key_data.rsc_tsc); key_data.rsc_tsc);
if (ret) if (ret)
goto out; goto out;
} }
......
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