summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2012-02-29 15:15:04 +0100
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:06:44 +0200
commit1be9f1fb645f302f42eab10b6645e05f60751be6 (patch)
treee99ec3e9f4586e47840f9d9a7eed9a4ebad36b03
parent7cb93f57126b23f8c4bba967ed47d59b63c06652 (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.c10
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;