]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
wifi: mac80211: add/remove driver debugfs entries as appropriate
authorBenjamin Berg <benjamin.berg@intel.com>
Wed, 20 Dec 2023 02:38:01 +0000 (04:38 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 19 Dec 2023 12:08:00 +0000 (13:08 +0100)
When an interface is removed, we should also be deleting the driver
debugfs entries (as it might still exist in DOWN state in mac80211). At
the same time, when adding an interface, we can check the
IEEE80211_SDATA_IN_DRIVER flag to know whether the interface was
previously known to the driver and is simply being reconfigured.

Fixes: a1f5dcb1c0c1 ("wifi: mac80211: add a driver callback to add vif debugfs")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20231220043149.a9f64c359424.I7076526b5297ae8f832228079c999f7b8e147a4c@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/debugfs_netdev.c
net/mac80211/driver-ops.c

index 80aeb25f1b68d1e63e2aca0049258a2524848675..dce5606ed66da5a31a476aec16bb55412e1e72cc 100644 (file)
@@ -1043,9 +1043,12 @@ void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata,
 {
        ieee80211_debugfs_remove_netdev(sdata);
        ieee80211_debugfs_add_netdev(sdata, mld_vif);
-       drv_vif_add_debugfs(sdata->local, sdata);
-       if (!mld_vif)
-               ieee80211_link_debugfs_drv_add(&sdata->deflink);
+
+       if (sdata->flags & IEEE80211_SDATA_IN_DRIVER) {
+               drv_vif_add_debugfs(sdata->local, sdata);
+               if (!mld_vif)
+                       ieee80211_link_debugfs_drv_add(&sdata->deflink);
+       }
 }
 
 void ieee80211_link_debugfs_add(struct ieee80211_link_data *link)
index 5e0435db2f9ce979be868fce6da4c08de60303aa..3b7f70073fc375c6663359d84aa73aea104dcd14 100644 (file)
@@ -75,9 +75,9 @@ int drv_add_interface(struct ieee80211_local *local,
        if (ret)
                return ret;
 
-       sdata->flags |= IEEE80211_SDATA_IN_DRIVER;
+       if (!(sdata->flags & IEEE80211_SDATA_IN_DRIVER)) {
+               sdata->flags |= IEEE80211_SDATA_IN_DRIVER;
 
-       if (!local->in_reconfig && !local->resuming) {
                drv_vif_add_debugfs(local, sdata);
                /* initially vif is not MLD */
                ieee80211_link_debugfs_drv_add(&sdata->deflink);
@@ -113,9 +113,13 @@ void drv_remove_interface(struct ieee80211_local *local,
        if (!check_sdata_in_driver(sdata))
                return;
 
+       sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
+
+       /* Remove driver debugfs entries */
+       ieee80211_debugfs_recreate_netdev(sdata, sdata->vif.valid_links);
+
        trace_drv_remove_interface(local, sdata);
        local->ops->remove_interface(&local->hw, &sdata->vif);
-       sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
        trace_drv_return_void(local);
 }