Commit 8414ff07 authored by Helmut Schaa's avatar Helmut Schaa Committed by John W. Linville

rt2x00: Introduce beacon_update_locked that requires caller locking

Introduce a beacon_update_locked function that does not acquire the
according beacon mutex to allow beacon updates from atomic context. The
caller has to take care of synchronization.

No functional changes. Just preparation for beacon updates from tasklet
context.
Signed-off-by: default avatarHelmut Schaa <helmut.schaa@googlemail.com>
Acked-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 69cf36a4
...@@ -157,13 +157,23 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, ...@@ -157,13 +157,23 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
bool local); bool local);
/** /**
* rt2x00queue_update_beacon - Send new beacon from mac80211 to hardware * rt2x00queue_update_beacon - Send new beacon from mac80211
* to hardware. Handles locking by itself (mutex).
* @rt2x00dev: Pointer to &struct rt2x00_dev. * @rt2x00dev: Pointer to &struct rt2x00_dev.
* @vif: Interface for which the beacon should be updated. * @vif: Interface for which the beacon should be updated.
*/ */
int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
struct ieee80211_vif *vif); struct ieee80211_vif *vif);
/**
* rt2x00queue_update_beacon_locked - Send new beacon from mac80211
* to hardware. Caller needs to ensure locking.
* @rt2x00dev: Pointer to &struct rt2x00_dev.
* @vif: Interface for which the beacon should be updated.
*/
int rt2x00queue_update_beacon_locked(struct rt2x00_dev *rt2x00dev,
struct ieee80211_vif *vif);
/** /**
* rt2x00queue_clear_beacon - Clear beacon in hardware * rt2x00queue_clear_beacon - Clear beacon in hardware
* @rt2x00dev: Pointer to &struct rt2x00_dev. * @rt2x00dev: Pointer to &struct rt2x00_dev.
......
...@@ -593,8 +593,8 @@ int rt2x00queue_clear_beacon(struct rt2x00_dev *rt2x00dev, ...@@ -593,8 +593,8 @@ int rt2x00queue_clear_beacon(struct rt2x00_dev *rt2x00dev,
return 0; return 0;
} }
int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, int rt2x00queue_update_beacon_locked(struct rt2x00_dev *rt2x00dev,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct rt2x00_intf *intf = vif_to_intf(vif); struct rt2x00_intf *intf = vif_to_intf(vif);
struct skb_frame_desc *skbdesc; struct skb_frame_desc *skbdesc;
...@@ -603,18 +603,14 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, ...@@ -603,18 +603,14 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
if (unlikely(!intf->beacon)) if (unlikely(!intf->beacon))
return -ENOBUFS; return -ENOBUFS;
mutex_lock(&intf->beacon_skb_mutex);
/* /*
* Clean up the beacon skb. * Clean up the beacon skb.
*/ */
rt2x00queue_free_skb(intf->beacon); rt2x00queue_free_skb(intf->beacon);
intf->beacon->skb = ieee80211_beacon_get(rt2x00dev->hw, vif); intf->beacon->skb = ieee80211_beacon_get(rt2x00dev->hw, vif);
if (!intf->beacon->skb) { if (!intf->beacon->skb)
mutex_unlock(&intf->beacon_skb_mutex);
return -ENOMEM; return -ENOMEM;
}
/* /*
* Copy all TX descriptor information into txdesc, * Copy all TX descriptor information into txdesc,
...@@ -635,9 +631,21 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, ...@@ -635,9 +631,21 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
*/ */
rt2x00dev->ops->lib->write_beacon(intf->beacon, &txdesc); rt2x00dev->ops->lib->write_beacon(intf->beacon, &txdesc);
return 0;
}
int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
struct ieee80211_vif *vif)
{
struct rt2x00_intf *intf = vif_to_intf(vif);
int ret;
mutex_lock(&intf->beacon_skb_mutex);
ret = rt2x00queue_update_beacon_locked(rt2x00dev, vif);
mutex_unlock(&intf->beacon_skb_mutex); mutex_unlock(&intf->beacon_skb_mutex);
return 0; return ret;
} }
void rt2x00queue_for_each_entry(struct data_queue *queue, void rt2x00queue_for_each_entry(struct data_queue *queue,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment