mac80211: Update to version 5.5.19
[openwrt/staging/wigyori.git] / package / kernel / mac80211 / patches / subsys / 250-mac80211-populate-debugfs-only-after-cfg80211-init.patch
diff --git a/package/kernel/mac80211/patches/subsys/250-mac80211-populate-debugfs-only-after-cfg80211-init.patch b/package/kernel/mac80211/patches/subsys/250-mac80211-populate-debugfs-only-after-cfg80211-init.patch
new file mode 100644 (file)
index 0000000..efe216c
--- /dev/null
@@ -0,0 +1,248 @@
+From 6cb5f3ea4654faf8c28b901266e960b1a4787b26 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Thu, 23 Apr 2020 11:13:49 +0200
+Subject: [PATCH] mac80211: populate debugfs only after cfg80211 init
+
+When fixing the initialization race, we neglected to account for
+the fact that debugfs is initialized in wiphy_register(), and
+some debugfs things went missing (or rather were rerooted to the
+global debugfs root).
+
+Fix this by adding debugfs entries only after wiphy_register().
+This requires some changes in the rate control code since it
+currently adds debugfs at alloc time, which can no longer be
+done after the reordering.
+
+Reported-by: Jouni Malinen <j@w1.fi>
+Reported-by: kernel test robot <rong.a.chen@intel.com>
+Reported-by: Hauke Mehrtens <hauke@hauke-m.de>
+Reported-by: Felix Fietkau <nbd@nbd.name>
+Cc: stable@vger.kernel.org
+Fixes: 52e04b4ce5d0 ("mac80211: fix race in ieee80211_register_hw()")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Acked-by: Sumit Garg <sumit.garg@linaro.org>
+Link: https://lore.kernel.org/r/20200423111344.0e00d3346f12.Iadc76a03a55093d94391fc672e996a458702875d@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+ drivers/net/wireless/intel/iwlegacy/3945-rs.c |  2 +-
+ drivers/net/wireless/intel/iwlegacy/4965-rs.c |  2 +-
+ drivers/net/wireless/intel/iwlwifi/dvm/rs.c   |  2 +-
+ drivers/net/wireless/intel/iwlwifi/mvm/rs.c   |  2 +-
+ drivers/net/wireless/realtek/rtlwifi/rc.c     |  2 +-
+ include/net/mac80211.h                        |  4 +++-
+ net/mac80211/main.c                           |  5 ++--
+ net/mac80211/rate.c                           | 15 ++++--------
+ net/mac80211/rate.h                           | 23 +++++++++++++++++++
+ net/mac80211/rc80211_minstrel_ht.c            | 19 ++++++++++-----
+ 10 files changed, 51 insertions(+), 25 deletions(-)
+
+--- a/drivers/net/wireless/intel/iwlegacy/3945-rs.c
++++ b/drivers/net/wireless/intel/iwlegacy/3945-rs.c
+@@ -374,7 +374,7 @@ out:
+ }
+ static void *
+-il3945_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
++il3945_rs_alloc(struct ieee80211_hw *hw)
+ {
+       return hw->priv;
+ }
+--- a/drivers/net/wireless/intel/iwlegacy/4965-rs.c
++++ b/drivers/net/wireless/intel/iwlegacy/4965-rs.c
+@@ -2474,7 +2474,7 @@ il4965_rs_fill_link_cmd(struct il_priv *
+ }
+ static void *
+-il4965_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
++il4965_rs_alloc(struct ieee80211_hw *hw)
+ {
+       return hw->priv;
+ }
+--- a/drivers/net/wireless/intel/iwlwifi/dvm/rs.c
++++ b/drivers/net/wireless/intel/iwlwifi/dvm/rs.c
+@@ -3019,7 +3019,7 @@ static void rs_fill_link_cmd(struct iwl_
+                       cpu_to_le16(priv->lib->bt_params->agg_time_limit);
+ }
+-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
++static void *rs_alloc(struct ieee80211_hw *hw)
+ {
+       return hw->priv;
+ }
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
+@@ -3665,7 +3665,7 @@ static void rs_fill_lq_cmd(struct iwl_mv
+                       cpu_to_le16(iwl_mvm_coex_agg_time_limit(mvm, sta));
+ }
+-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
++static void *rs_alloc(struct ieee80211_hw *hw)
+ {
+       return hw->priv;
+ }
+--- a/drivers/net/wireless/realtek/rtlwifi/rc.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rc.c
+@@ -261,7 +261,7 @@ static void rtl_rate_update(void *ppriv,
+ {
+ }
+-static void *rtl_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
++static void *rtl_rate_alloc(struct ieee80211_hw *hw)
+ {
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       return rtlpriv;
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -5969,7 +5969,9 @@ enum rate_control_capabilities {
+ struct rate_control_ops {
+       unsigned long capa;
+       const char *name;
+-      void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir);
++      void *(*alloc)(struct ieee80211_hw *hw);
++      void (*add_debugfs)(struct ieee80211_hw *hw, void *priv,
++                          struct dentry *debugfsdir);
+       void (*free)(void *priv);
+       void *(*alloc_sta)(void *priv, struct ieee80211_sta *sta, gfp_t gfp);
+--- a/net/mac80211/main.c
++++ b/net/mac80211/main.c
+@@ -1163,8 +1163,6 @@ int ieee80211_register_hw(struct ieee802
+       local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom,
+                                  IEEE80211_TX_STATUS_HEADROOM);
+-      debugfs_hw_add(local);
+-
+       /*
+        * if the driver doesn't specify a max listen interval we
+        * use 5 which should be a safe default
+@@ -1256,6 +1254,9 @@ int ieee80211_register_hw(struct ieee802
+       if (result < 0)
+               goto fail_wiphy_register;
++      debugfs_hw_add(local);
++      rate_control_add_debugfs(local);
++
+       rtnl_lock();
+       /* add one default STA interface if supported */
+--- a/net/mac80211/rate.c
++++ b/net/mac80211/rate.c
+@@ -214,17 +214,16 @@ static ssize_t rcname_read(struct file *
+                                      ref->ops->name, len);
+ }
+-static const struct file_operations rcname_ops = {
++const struct file_operations rcname_ops = {
+       .read = rcname_read,
+       .open = simple_open,
+       .llseek = default_llseek,
+ };
+ #endif
+-static struct rate_control_ref *rate_control_alloc(const char *name,
+-                                          struct ieee80211_local *local)
++static struct rate_control_ref *
++rate_control_alloc(const char *name, struct ieee80211_local *local)
+ {
+-      struct dentry *debugfsdir = NULL;
+       struct rate_control_ref *ref;
+       ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL);
+@@ -234,13 +233,7 @@ static struct rate_control_ref *rate_con
+       if (!ref->ops)
+               goto free;
+-#ifdef CPTCFG_MAC80211_DEBUGFS
+-      debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir);
+-      local->debugfs.rcdir = debugfsdir;
+-      debugfs_create_file("name", 0400, debugfsdir, ref, &rcname_ops);
+-#endif
+-
+-      ref->priv = ref->ops->alloc(&local->hw, debugfsdir);
++      ref->priv = ref->ops->alloc(&local->hw);
+       if (!ref->priv)
+               goto free;
+       return ref;
+--- a/net/mac80211/rate.h
++++ b/net/mac80211/rate.h
+@@ -60,6 +60,29 @@ static inline void rate_control_add_sta_
+ #endif
+ }
++extern const struct file_operations rcname_ops;
++
++static inline void rate_control_add_debugfs(struct ieee80211_local *local)
++{
++#ifdef CPTCFG_MAC80211_DEBUGFS
++      struct dentry *debugfsdir;
++
++      if (!local->rate_ctrl)
++              return;
++
++      if (!local->rate_ctrl->ops->add_debugfs)
++              return;
++
++      debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir);
++      local->debugfs.rcdir = debugfsdir;
++      debugfs_create_file("name", 0400, debugfsdir,
++                          local->rate_ctrl, &rcname_ops);
++
++      local->rate_ctrl->ops->add_debugfs(&local->hw, local->rate_ctrl->priv,
++                                         debugfsdir);
++#endif
++}
++
+ void ieee80211_check_rate_mask(struct ieee80211_sub_if_data *sdata);
+ /* Get a reference to the rate control algorithm. If `name' is NULL, get the
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -1635,7 +1635,7 @@ minstrel_ht_init_cck_rates(struct minstr
+ }
+ static void *
+-minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
++minstrel_ht_alloc(struct ieee80211_hw *hw)
+ {
+       struct minstrel_priv *mp;
+@@ -1673,7 +1673,17 @@ minstrel_ht_alloc(struct ieee80211_hw *h
+       mp->update_interval = HZ / 10;
+       mp->new_avg = true;
++      minstrel_ht_init_cck_rates(mp);
++
++      return mp;
++}
++
+ #ifdef CPTCFG_MAC80211_DEBUGFS
++static void minstrel_ht_add_debugfs(struct ieee80211_hw *hw, void *priv,
++                                  struct dentry *debugfsdir)
++{
++      struct minstrel_priv *mp = priv;
++
+       mp->fixed_rate_idx = (u32) -1;
+       debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir,
+                          &mp->fixed_rate_idx);
+@@ -1681,12 +1691,8 @@ minstrel_ht_alloc(struct ieee80211_hw *h
+                          &mp->sample_switch);
+       debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir,
+                          &mp->new_avg);
+-#endif
+-
+-      minstrel_ht_init_cck_rates(mp);
+-
+-      return mp;
+ }
++#endif
+ static void
+ minstrel_ht_free(void *priv)
+@@ -1725,6 +1731,7 @@ static const struct rate_control_ops mac
+       .alloc = minstrel_ht_alloc,
+       .free = minstrel_ht_free,
+ #ifdef CPTCFG_MAC80211_DEBUGFS
++      .add_debugfs = minstrel_ht_add_debugfs,
+       .add_sta_debugfs = minstrel_ht_add_sta_debugfs,
+ #endif
+       .get_expected_throughput = minstrel_ht_get_expected_throughput,