Commit af3aab9c authored by Johannes Berg's avatar Johannes Berg Committed by Luca Coelho

iwlwifi: mvm: d3: make key reprogramming iteration optional

Now that only reprogramming is left in the initial key iteration,
skip it entirely on unified firmware images instead of skipping
only the command sending inside of it.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210805130823.c6f77325c430.I798ce9d757492a9e3d223c1de5d4e62ebbc00b2c@changeidSigned-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent be05fae2
...@@ -101,8 +101,8 @@ static const u8 *iwl_mvm_find_max_pn(struct ieee80211_key_conf *key, ...@@ -101,8 +101,8 @@ static const u8 *iwl_mvm_find_max_pn(struct ieee80211_key_conf *key,
return ret; return ret;
} }
struct wowlan_key_data { struct wowlan_key_reprogram_data {
bool error, configure_keys; bool error;
int wep_key_idx; int wep_key_idx;
}; };
...@@ -114,7 +114,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, ...@@ -114,7 +114,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
{ {
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
struct wowlan_key_data *data = _data; struct wowlan_key_reprogram_data *data = _data;
int ret; int ret;
switch (key->cipher) { switch (key->cipher) {
...@@ -152,18 +152,14 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, ...@@ -152,18 +152,14 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
wkc.wep_key.key_offset = data->wep_key_idx; wkc.wep_key.key_offset = data->wep_key_idx;
} }
if (data->configure_keys) {
mutex_lock(&mvm->mutex); mutex_lock(&mvm->mutex);
ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, 0, ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, 0, sizeof(wkc), &wkc);
sizeof(wkc), &wkc);
data->error = ret != 0; data->error = ret != 0;
mvm->ptk_ivlen = key->iv_len; mvm->ptk_ivlen = key->iv_len;
mvm->ptk_icvlen = key->icv_len; mvm->ptk_icvlen = key->icv_len;
mvm->gtk_ivlen = key->iv_len; mvm->gtk_ivlen = key->iv_len;
mvm->gtk_icvlen = key->icv_len; mvm->gtk_icvlen = key->icv_len;
mutex_unlock(&mvm->mutex);
}
/* don't upload key again */ /* don't upload key again */
return; return;
...@@ -190,7 +186,6 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, ...@@ -190,7 +186,6 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
break; break;
} }
if (data->configure_keys) {
mutex_lock(&mvm->mutex); mutex_lock(&mvm->mutex);
/* /*
* The D3 firmware hardcodes the key offset 0 as the key it * The D3 firmware hardcodes the key offset 0 as the key it
...@@ -213,7 +208,6 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, ...@@ -213,7 +208,6 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
} }
mutex_unlock(&mvm->mutex); mutex_unlock(&mvm->mutex);
data->error = ret != 0; data->error = ret != 0;
}
} }
struct wowlan_key_rsc_tsc_data { struct wowlan_key_rsc_tsc_data {
...@@ -839,14 +833,13 @@ static int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm, ...@@ -839,14 +833,13 @@ static int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
{ {
bool unified = fw_has_capa(&mvm->fw->ucode_capa, bool unified = fw_has_capa(&mvm->fw->ucode_capa,
IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG); IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG);
struct wowlan_key_data key_data = { struct wowlan_key_reprogram_data key_data = {};
.configure_keys = !unified,
};
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
int ret; int ret;
u8 cmd_ver; u8 cmd_ver;
size_t cmd_size; size_t cmd_size;
if (!unified) {
/* /*
* if we have to configure keys, call ieee80211_iter_keys(), * if we have to configure keys, call ieee80211_iter_keys(),
* as we need non-atomic context in order to take the * as we need non-atomic context in order to take the
...@@ -854,15 +847,16 @@ static int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm, ...@@ -854,15 +847,16 @@ static int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
*/ */
/* /*
* Note that currently we don't use CMD_ASYNC in the iterator. * Note that currently we don't use CMD_ASYNC in the iterator.
* In case of key_data.configure_keys, all the configured commands * In case of key_data.configure_keys, all the configured
* are SYNC, and iwl_mvm_wowlan_program_keys() will take care of * commands are SYNC, and iwl_mvm_wowlan_program_keys() will
* locking/unlocking mvm->mutex. * take care of locking/unlocking mvm->mutex.
*/ */
ieee80211_iter_keys(mvm->hw, vif, iwl_mvm_wowlan_program_keys, ieee80211_iter_keys(mvm->hw, vif, iwl_mvm_wowlan_program_keys,
&key_data); &key_data);
if (key_data.error) if (key_data.error)
return -EIO; return -EIO;
}
ret = iwl_mvm_wowlan_config_rsc_tsc(mvm, vif); ret = iwl_mvm_wowlan_config_rsc_tsc(mvm, vif);
if (ret) if (ret)
......
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