Signed-off-by: Calvin Owens <jcalvinowens@xxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html