iwlwifi: mvm: test roc running status bits before removing the sta
authorNathan Errera <nathan.errera@intel.com>
Sun, 19 Dec 2021 10:18:15 +0000 (12:18 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 21 Dec 2021 10:35:06 +0000 (12:35 +0200)
In some cases the sta is being removed twice since we do not test the
roc aux running before removing it. Start looking at the bit before
removing the sta.

Signed-off-by: Nathan Errera <nathan.errera@intel.com>
Fixes: 2c2c3647cde4 ("iwlwifi: mvm: support ADD_STA_CMD_API_S ver 12")
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211219121514.d5376ac6bcb0.Ic5f8470ea60c072bde9d1503e5f528b65e301e20@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/time-event.c

index e681331..b8c645b 100644 (file)
@@ -49,14 +49,13 @@ void iwl_mvm_roc_done_wk(struct work_struct *wk)
        struct iwl_mvm *mvm = container_of(wk, struct iwl_mvm, roc_done_wk);
 
        /*
-        * Clear the ROC_RUNNING /ROC_AUX_RUNNING status bit.
+        * Clear the ROC_RUNNING status bit.
         * This will cause the TX path to drop offchannel transmissions.
         * That would also be done by mac80211, but it is racy, in particular
         * in the case that the time event actually completed in the firmware
         * (which is handled in iwl_mvm_te_handle_notif).
         */
        clear_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status);
-       clear_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status);
 
        synchronize_net();
 
@@ -82,9 +81,19 @@ void iwl_mvm_roc_done_wk(struct work_struct *wk)
                        mvmvif = iwl_mvm_vif_from_mac80211(mvm->p2p_device_vif);
                        iwl_mvm_flush_sta(mvm, &mvmvif->bcast_sta, true);
                }
-       } else {
+       }
+
+       /*
+        * Clear the ROC_AUX_RUNNING status bit.
+        * This will cause the TX path to drop offchannel transmissions.
+        * That would also be done by mac80211, but it is racy, in particular
+        * in the case that the time event actually completed in the firmware
+        * (which is handled in iwl_mvm_te_handle_notif).
+        */
+       if (test_and_clear_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status)) {
                /* do the same in case of hot spot 2.0 */
                iwl_mvm_flush_sta(mvm, &mvm->aux_sta, true);
+
                /* In newer version of this command an aux station is added only
                 * in cases of dedicated tx queue and need to be removed in end
                 * of use */