[rt2x00-users] [PATCH 02/12] rt2x00: Introduce beacon_update_locked that requires caller locking
Gertjan van Wingerde
gwingerde at gmail.com
Sat Jan 15 08:45:08 EST 2011
On 01/14/11 10:41, Helmut Schaa wrote:
> 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: Helmut Schaa <helmut.schaa at googlemail.com>
Acked-by: Gertjan van Wingerde <gwingerde at gmail.com>
> ---
> drivers/net/wireless/rt2x00/rt2x00lib.h | 12 +++++++++++-
> drivers/net/wireless/rt2x00/rt2x00queue.c | 24 ++++++++++++++++--------
> 2 files changed, 27 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h
> index 6c6a8f1..2d94cba 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
> @@ -157,7 +157,8 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
> 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.
> * @vif: Interface for which the beacon should be updated.
> */
> @@ -165,6 +166,15 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
> 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
> * @rt2x00dev: Pointer to &struct rt2x00_dev.
> * @vif: Interface for which the beacon should be updated.
> diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
> index 24bcdb4..7d7fbe0 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
> @@ -593,8 +593,8 @@ int rt2x00queue_clear_beacon(struct rt2x00_dev *rt2x00dev,
> return 0;
> }
>
> -int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
> - struct ieee80211_vif *vif)
> +int rt2x00queue_update_beacon_locked(struct rt2x00_dev *rt2x00dev,
> + struct ieee80211_vif *vif)
> {
> struct rt2x00_intf *intf = vif_to_intf(vif);
> struct skb_frame_desc *skbdesc;
> @@ -603,18 +603,14 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
> if (unlikely(!intf->beacon))
> return -ENOBUFS;
>
> - mutex_lock(&intf->beacon_skb_mutex);
> -
> /*
> * Clean up the beacon skb.
> */
> rt2x00queue_free_skb(intf->beacon);
>
> intf->beacon->skb = ieee80211_beacon_get(rt2x00dev->hw, vif);
> - if (!intf->beacon->skb) {
> - mutex_unlock(&intf->beacon_skb_mutex);
> + if (!intf->beacon->skb)
> return -ENOMEM;
> - }
>
> /*
> * Copy all TX descriptor information into txdesc,
> @@ -635,9 +631,21 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
> */
> 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);
>
> - return 0;
> + return ret;
> }
>
> void rt2x00queue_for_each_entry(struct data_queue *queue,
More information about the users
mailing list