[rt2x00-users] [PATCH 04/12] rt2x00: Make periodic beacon updates for PCI devices atomic

Gertjan van Wingerde gwingerde at gmail.com
Sat Jan 15 08:47:16 EST 2011


On 01/14/11 10:41, Helmut Schaa wrote:
> Allow the beacondone and pretbtt functions to update the beacon from
> atomic context by using the beacon update functions with caller locking.
> 
> This is a preparation for moving the periodic beacon handling into
> tasklets that require atomic context.
> 
> Signed-off-by: Helmut Schaa <helmut.schaa at googlemail.com>

Acked-by: Gertjan van Wingerde <gwingerde at gmail.com>

> ---
>  drivers/net/wireless/rt2x00/rt2x00dev.c |   26 ++++++++++++++++----------
>  1 files changed, 16 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
> index 09edc98..04bf9af 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
> @@ -174,7 +174,13 @@ static void rt2x00lib_beaconupdate_iter(void *data, u8 *mac,
>  	    vif->type != NL80211_IFTYPE_WDS)
>  		return;
>  
> -	rt2x00queue_update_beacon(rt2x00dev, vif);
> +	/*
> +	 * Update the beacon without locking. This is safe on PCI devices
> +	 * as they only update the beacon periodically here. This should
> +	 * never be called for USB devices.
> +	 */
> +	WARN_ON(rt2x00_is_usb(rt2x00dev));
> +	rt2x00queue_update_beacon_locked(rt2x00dev, vif);
>  }
>  
>  void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
> @@ -183,9 +189,9 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
>  		return;
>  
>  	/* send buffered bc/mc frames out for every bssid */
> -	ieee80211_iterate_active_interfaces(rt2x00dev->hw,
> -					    rt2x00lib_bc_buffer_iter,
> -					    rt2x00dev);
> +	ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
> +						   rt2x00lib_bc_buffer_iter,
> +						   rt2x00dev);
>  	/*
>  	 * Devices with pre tbtt interrupt don't need to update the beacon
>  	 * here as they will fetch the next beacon directly prior to
> @@ -195,9 +201,9 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
>  		return;
>  
>  	/* fetch next beacon */
> -	ieee80211_iterate_active_interfaces(rt2x00dev->hw,
> -					    rt2x00lib_beaconupdate_iter,
> -					    rt2x00dev);
> +	ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
> +						   rt2x00lib_beaconupdate_iter,
> +						   rt2x00dev);
>  }
>  EXPORT_SYMBOL_GPL(rt2x00lib_beacondone);
>  
> @@ -207,9 +213,9 @@ void rt2x00lib_pretbtt(struct rt2x00_dev *rt2x00dev)
>  		return;
>  
>  	/* fetch next beacon */
> -	ieee80211_iterate_active_interfaces(rt2x00dev->hw,
> -					    rt2x00lib_beaconupdate_iter,
> -					    rt2x00dev);
> +	ieee80211_iterate_active_interfaces_atomic(rt2x00dev->hw,
> +						   rt2x00lib_beaconupdate_iter,
> +						   rt2x00dev);
>  }
>  EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt);
>  




More information about the users mailing list