wifi: mac80211: fix TXQ error path and cleanup
authorJohannes Berg <johannes.berg@intel.com>
Tue, 29 Aug 2023 09:25:50 +0000 (11:25 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 11 Sep 2023 09:27:23 +0000 (11:27 +0200)
We currently call ieee80211_txq_teardown_flows() as part
of ieee80211_remove_interfaces(), but that's not really
right in case of HW registration failures, specifically
rate control. Call it separately to fix that issue.

Reported-by: Zhengchao Shao <shaozhengchao@huawei.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/iface.c
net/mac80211/main.c

index 7e3acf670f0f140e12857f5e23f5feeb95a2a420..510f8aead4f96e7fa456b8581924a69032a025ee 100644 (file)
@@ -2255,8 +2255,6 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)
        WARN(local->open_count, "%s: open count remains %d\n",
             wiphy_name(local->hw.wiphy), local->open_count);
 
-       ieee80211_txq_teardown_flows(local);
-
        mutex_lock(&local->iflist_mtx);
        list_splice_init(&local->interfaces, &unreg_list);
        mutex_unlock(&local->iflist_mtx);
index 0ab603850a85b4ab05258e539d1b6e526e270ea5..eabf6c1bf3ff35cd2f2226e0fa41780ccedc01b9 100644 (file)
@@ -1457,6 +1457,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        ieee80211_remove_interfaces(local);
        rtnl_unlock();
  fail_rate:
+       ieee80211_txq_teardown_flows(local);
  fail_flows:
        ieee80211_led_exit(local);
        destroy_workqueue(local->workqueue);
@@ -1493,6 +1494,8 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)
         */
        ieee80211_remove_interfaces(local);
 
+       ieee80211_txq_teardown_flows(local);
+
        wiphy_lock(local->hw.wiphy);
        wiphy_delayed_work_cancel(local->hw.wiphy, &local->roc_work);
        wiphy_work_cancel(local->hw.wiphy, &local->reconfig_filter);