diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2012-02-29 15:15:04 +0100 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:06:44 +0200 |
commit | 1be9f1fb645f302f42eab10b6645e05f60751be6 (patch) | |
tree | e99ec3e9f4586e47840f9d9a7eed9a4ebad36b03 | |
parent | 7cb93f57126b23f8c4bba967ed47d59b63c06652 (diff) |
cw1200: Add RCU protection for ieee80211_sta
* Add RCU protection for ieee80211_sta
* Do not call ieee80211_sta_set_buffered when
STA is not set.
ST-Ericsson ID: 399337, 368121, 374076
Change-Id: I4bbe397a5418cff60d91458192c3d112a6424662
Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/40346
-rw-r--r-- | drivers/staging/cw1200/txrx.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/staging/cw1200/txrx.c b/drivers/staging/cw1200/txrx.c index 1931e3ef88c..0d535f797a8 100644 --- a/drivers/staging/cw1200/txrx.c +++ b/drivers/staging/cw1200/txrx.c @@ -717,6 +717,7 @@ void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb) .txpriv.tid = CW1200_MAX_TID, .txpriv.rate_id = CW1200_INVALID_RATE_ID, }; + struct ieee80211_sta *sta; struct wsm_tx *wsm; bool tid_update = 0; u8 flags = 0; @@ -761,6 +762,9 @@ void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb) if (ret) goto drop; + rcu_read_lock(); + sta = rcu_dereference(t.tx_info->control.sta); + spin_lock_bh(&priv->ps_state_lock); { tid_update = cw1200_tx_h_pm_state(priv, &t); @@ -770,11 +774,13 @@ void cw1200_tx(struct ieee80211_hw *dev, struct sk_buff *skb) spin_unlock_bh(&priv->ps_state_lock); #if defined(CONFIG_CW1200_USE_STE_EXTENSIONS) - if (tid_update) - ieee80211_sta_set_buffered(t.tx_info->control.sta, + if (tid_update && sta) + ieee80211_sta_set_buffered(sta, t.txpriv.tid, true); #endif /* CONFIG_CW1200_USE_STE_EXTENSIONS */ + rcu_read_unlock(); + cw1200_bh_wakeup(priv); return; |