OSDN Git Service

iwlwifi: mvm: fix AUX ROC removal
authorAvraham Stern <avraham.stern@intel.com>
Sun, 19 Dec 2021 11:28:31 +0000 (13:28 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 21 Dec 2021 10:38:15 +0000 (12:38 +0200)
When IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD is set, removing a time event
always tries to cancel session protection. However, AUX ROC does
not use session protection so it was never removed. As a result,
if the driver tries to allocate another AUX ROC event right after
cancelling the first one, it will fail with a warning.
In addition, the time event data passed to iwl_mvm_remove_aux_roc_te()
is incorrect. Fix it.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211219132536.915e1f69f062.Id837e917f1c2beaca7c1eb33333d622548918a76@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/time-event.c

index b8c645b..ab06dcd 100644 (file)
@@ -696,11 +696,14 @@ static bool __iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
        iwl_mvm_te_clear_data(mvm, te_data);
        spin_unlock_bh(&mvm->time_event_lock);
 
-       /* When session protection is supported, the te_data->id field
+       /* When session protection is used, the te_data->id field
         * is reused to save session protection's configuration.
+        * For AUX ROC, HOT_SPOT_CMD is used and the te_data->id field is set
+        * to HOT_SPOT_CMD.
         */
        if (fw_has_capa(&mvm->fw->ucode_capa,
-                       IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD)) {
+                       IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD) &&
+           id != HOT_SPOT_CMD) {
                if (mvmvif && id < SESSION_PROTECT_CONF_MAX_ID) {
                        /* Session protection is still ongoing. Cancel it */
                        iwl_mvm_cancel_session_protection(mvm, mvmvif, id);
@@ -1036,7 +1039,7 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
                        iwl_mvm_p2p_roc_finished(mvm);
                } else {
                        iwl_mvm_remove_aux_roc_te(mvm, mvmvif,
-                                                 &mvmvif->time_event_data);
+                                                 &mvmvif->hs_time_event_data);
                        iwl_mvm_roc_finished(mvm);
                }