Signed-off-by: Calvin Owens <jcalvinow...@gmail.com>
---
 drivers/net/wireless/ath/ath9k/xmit.c | 2 ++
 drivers/net/wireless/mac80211_hwsim.c | 6 ++++++
 include/net/mac80211.h                | 3 ++-
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath9k/xmit.c 
b/drivers/net/wireless/ath/ath9k/xmit.c
index 1c9b1ba..1d57015 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -142,8 +142,10 @@ static void ath_send_bar(struct ath_atx_tid *tid, u16 
seqno)
 static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
                          struct ath_buf *bf)
 {
+       rcu_read_lock();
        ieee80211_get_tx_rates(vif, sta, bf->bf_mpdu, bf->rates,
                               ARRAY_SIZE(bf->rates));
+       rcu_read_unlock();
 }
 
 static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
diff --git a/drivers/net/wireless/mac80211_hwsim.c 
b/drivers/net/wireless/mac80211_hwsim.c
index cb34c78..468a5a6 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -900,9 +900,11 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
                hwsim_check_sta_magic(control->sta);
 
        if (rctbl)
+               rcu_read_lock();
                ieee80211_get_tx_rates(txi->control.vif, control->sta, skb,
                                       txi->control.rates,
                                       ARRAY_SIZE(txi->control.rates));
+               rcu_read_unlock();
 
        txi->rate_driver_data[0] = channel;
        mac80211_hwsim_monitor_rx(hw, skb, channel);
@@ -1008,9 +1010,11 @@ static void mac80211_hwsim_tx_frame(struct ieee80211_hw 
*hw,
 
        if (rctbl) {
                struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb);
+               rcu_read_lock();
                ieee80211_get_tx_rates(txi->control.vif, NULL, skb,
                                       txi->control.rates,
                                       ARRAY_SIZE(txi->control.rates));
+               rcu_read_unlock();
        }
 
        mac80211_hwsim_monitor_rx(hw, skb, chan);
@@ -1044,9 +1048,11 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
                return;
        info = IEEE80211_SKB_CB(skb);
        if (rctbl)
+               rcu_read_lock();
                ieee80211_get_tx_rates(vif, NULL, skb,
                                       info->control.rates,
                                       ARRAY_SIZE(info->control.rates));
+               rcu_read_unlock();
 
        txrate = ieee80211_get_tx_rate(hw, info);
 
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 885898a..df345c1 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -3175,7 +3175,8 @@ void ieee80211_sta_set_buffered(struct ieee80211_sta *sta,
  *
  * Call this function in a driver with per-packet rate selection support
  * to combine the rate info in the packet tx info with the most recent
- * rate selection table for the station entry.
+ * rate selection table for the station entry. Must be called with RCU
+ * protection.
  *
  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
  * @sta: the receiver station to which this packet is sent.
-- 
1.8.2.1

_______________________________________________
ath9k-devel mailing list
ath9k-devel@lists.ath9k.org
https://lists.ath9k.org/mailman/listinfo/ath9k-devel

Reply via email to