iwlwifi: mvm: refactor the way fw_key_table is handled
Instead of keeping the fw_key_table bits set when the keys are removed (i.e. in D3 entry or HW_RESTART flows), clear them and set them again only when the keys have been successfully re-added. This makes the bitmask more closely tied to the actual firmware programming. Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
6ae57b293b
commit
9c3deeb51b
@ -779,6 +779,9 @@ static int iwl_mvm_switch_to_d3(struct iwl_mvm *mvm)
|
|||||||
*/
|
*/
|
||||||
set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
|
set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
|
||||||
|
|
||||||
|
/* the fw is reset, so all the keys are cleared */
|
||||||
|
memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table));
|
||||||
|
|
||||||
mvm->ptk_ivlen = 0;
|
mvm->ptk_ivlen = 0;
|
||||||
mvm->ptk_icvlen = 0;
|
mvm->ptk_icvlen = 0;
|
||||||
mvm->ptk_ivlen = 0;
|
mvm->ptk_ivlen = 0;
|
||||||
|
@ -984,6 +984,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
|
|||||||
mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
|
mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
|
||||||
|
|
||||||
iwl_mvm_reset_phy_ctxts(mvm);
|
iwl_mvm_reset_phy_ctxts(mvm);
|
||||||
|
memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table));
|
||||||
memset(mvm->sta_drained, 0, sizeof(mvm->sta_drained));
|
memset(mvm->sta_drained, 0, sizeof(mvm->sta_drained));
|
||||||
memset(mvm->tfd_drained, 0, sizeof(mvm->tfd_drained));
|
memset(mvm->tfd_drained, 0, sizeof(mvm->tfd_drained));
|
||||||
memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
|
memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
|
||||||
|
@ -1198,8 +1198,6 @@ static int iwl_mvm_set_fw_key_idx(struct iwl_mvm *mvm)
|
|||||||
if (max_offs < 0)
|
if (max_offs < 0)
|
||||||
return STA_KEY_IDX_INVALID;
|
return STA_KEY_IDX_INVALID;
|
||||||
|
|
||||||
__set_bit(max_offs, mvm->fw_key_table);
|
|
||||||
|
|
||||||
return max_offs;
|
return max_offs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1507,10 +1505,8 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = __iwl_mvm_set_sta_key(mvm, vif, sta, keyconf, key_offset, mcast);
|
ret = __iwl_mvm_set_sta_key(mvm, vif, sta, keyconf, key_offset, mcast);
|
||||||
if (ret) {
|
if (ret)
|
||||||
__clear_bit(keyconf->hw_key_idx, mvm->fw_key_table);
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For WEP, the same key is used for multicast and unicast. Upload it
|
* For WEP, the same key is used for multicast and unicast. Upload it
|
||||||
@ -1523,11 +1519,13 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
|
|||||||
ret = __iwl_mvm_set_sta_key(mvm, vif, sta, keyconf,
|
ret = __iwl_mvm_set_sta_key(mvm, vif, sta, keyconf,
|
||||||
key_offset, !mcast);
|
key_offset, !mcast);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
__clear_bit(keyconf->hw_key_idx, mvm->fw_key_table);
|
|
||||||
__iwl_mvm_remove_sta_key(mvm, sta_id, keyconf, mcast);
|
__iwl_mvm_remove_sta_key(mvm, sta_id, keyconf, mcast);
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__set_bit(key_offset, mvm->fw_key_table);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
IWL_DEBUG_WEP(mvm, "key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n",
|
IWL_DEBUG_WEP(mvm, "key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n",
|
||||||
keyconf->cipher, keyconf->keylen, keyconf->keyidx,
|
keyconf->cipher, keyconf->keylen, keyconf->keyidx,
|
||||||
|
Loading…
Reference in New Issue
Block a user