mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
wifi: mac80211: handle debugfs when switching to/from MLO
In MLO, we have a per-link debugfs directory which contains the per-link files. In case of non-MLO we would like to put the per-link files in the netdev directory to keep it how it was before MLO. - Upon interface creation the netdev will be created with the per-link files in it. - Upon switching to MLO: delete the entire netdev directory and then recreate it without the per-link files. Then the per-link directories with the per-link files in it will be created in ieee80211_link_init() - Upon switching to non-MLO: delete the entire netdev directory (including the per-link directories) and recreate it with the per-link files in it. Note that this also aligns to always call the vif link debugfs method for the deflink as promised in the documentation, which wasn't done before. Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230928172905.082e698caca9.I5bef7b2026e0f58b4a958b3d1f459ac5baeccfc9@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
a1f5dcb1c0
commit
c942398f95
@ -934,18 +934,20 @@ static void add_link_files(struct ieee80211_link_data *link,
|
||||
}
|
||||
}
|
||||
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata)
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif)
|
||||
{
|
||||
char buf[10+IFNAMSIZ];
|
||||
|
||||
sprintf(buf, "netdev:%s", sdata->name);
|
||||
sdata->vif.debugfs_dir = debugfs_create_dir(buf,
|
||||
sdata->local->hw.wiphy->debugfsdir);
|
||||
/* deflink also has this */
|
||||
sdata->deflink.debugfs_dir = sdata->vif.debugfs_dir;
|
||||
sdata->debugfs.subdir_stations = debugfs_create_dir("stations",
|
||||
sdata->vif.debugfs_dir);
|
||||
add_files(sdata);
|
||||
|
||||
if (!(sdata->local->hw.wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO))
|
||||
if (!mld_vif)
|
||||
add_link_files(&sdata->deflink, sdata->vif.debugfs_dir);
|
||||
}
|
||||
|
||||
@ -973,11 +975,21 @@ void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata)
|
||||
debugfs_rename(dir->d_parent, dir, dir->d_parent, buf);
|
||||
}
|
||||
|
||||
void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
void ieee80211_link_debugfs_add(struct ieee80211_link_data *link)
|
||||
{
|
||||
char link_dir_name[10];
|
||||
|
||||
if (WARN_ON(!link->sdata->vif.debugfs_dir))
|
||||
if (WARN_ON(!link->sdata->vif.debugfs_dir || link->debugfs_dir))
|
||||
return;
|
||||
|
||||
/* For now, this should not be called for non-MLO capable drivers */
|
||||
@ -1014,7 +1026,8 @@ void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link)
|
||||
|
||||
void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link)
|
||||
{
|
||||
if (WARN_ON(!link->debugfs_dir))
|
||||
if (link->sdata->vif.type == NL80211_IFTYPE_MONITOR ||
|
||||
WARN_ON(!link->debugfs_dir))
|
||||
return;
|
||||
|
||||
drv_link_add_debugfs(link->sdata->local, link->sdata,
|
||||
|
@ -1,4 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Portions:
|
||||
* Copyright (C) 2023 Intel Corporation
|
||||
*/
|
||||
/* routines exported for debugfs handling */
|
||||
|
||||
#ifndef __IEEE80211_DEBUGFS_NETDEV_H
|
||||
@ -7,9 +11,12 @@
|
||||
#include "ieee80211_i.h"
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif);
|
||||
void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif);
|
||||
|
||||
void ieee80211_link_debugfs_add(struct ieee80211_link_data *link);
|
||||
void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link);
|
||||
@ -18,7 +25,7 @@ void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link);
|
||||
void ieee80211_link_debugfs_drv_remove(struct ieee80211_link_data *link);
|
||||
#else
|
||||
static inline void ieee80211_debugfs_add_netdev(
|
||||
struct ieee80211_sub_if_data *sdata)
|
||||
struct ieee80211_sub_if_data *sdata, bool mld_vif)
|
||||
{}
|
||||
static inline void ieee80211_debugfs_remove_netdev(
|
||||
struct ieee80211_sub_if_data *sdata)
|
||||
@ -26,7 +33,9 @@ static inline void ieee80211_debugfs_remove_netdev(
|
||||
static inline void ieee80211_debugfs_rename_netdev(
|
||||
struct ieee80211_sub_if_data *sdata)
|
||||
{}
|
||||
|
||||
static inline void ieee80211_debugfs_recreate_netdev(
|
||||
struct ieee80211_sub_if_data *sdata, bool mld_vif)
|
||||
{}
|
||||
static inline void ieee80211_link_debugfs_add(struct ieee80211_link_data *link)
|
||||
{}
|
||||
static inline void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link)
|
||||
|
@ -77,8 +77,11 @@ int drv_add_interface(struct ieee80211_local *local,
|
||||
|
||||
sdata->flags |= IEEE80211_SDATA_IN_DRIVER;
|
||||
|
||||
if (!local->in_reconfig)
|
||||
if (!local->in_reconfig) {
|
||||
drv_vif_add_debugfs(local, sdata);
|
||||
/* initially vif is not MLD */
|
||||
ieee80211_link_debugfs_drv_add(&sdata->deflink);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1775,7 +1775,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
|
||||
/* need to do this after the switch so vif.type is correct */
|
||||
ieee80211_link_setup(&sdata->deflink);
|
||||
|
||||
ieee80211_debugfs_add_netdev(sdata);
|
||||
ieee80211_debugfs_add_netdev(sdata, false);
|
||||
}
|
||||
|
||||
static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
|
||||
|
@ -235,6 +235,9 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,
|
||||
RCU_INIT_POINTER(sdata->vif.link_conf[link_id], NULL);
|
||||
}
|
||||
|
||||
if (!old_links)
|
||||
ieee80211_debugfs_recreate_netdev(sdata, true);
|
||||
|
||||
/* link them into data structures */
|
||||
for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
|
||||
WARN_ON(!use_deflink &&
|
||||
@ -261,6 +264,8 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,
|
||||
old_links & old_active,
|
||||
new_links & sdata->vif.active_links,
|
||||
old);
|
||||
if (!new_links)
|
||||
ieee80211_debugfs_recreate_netdev(sdata, false);
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
|
Loading…
Reference in New Issue
Block a user