mac80211: allow configure_filter callback to sleep
Over time, a whole bunch of drivers have come up with their own scheme to delay the configure_filter operation to a workqueue. To be able to simplify things, allow configure_filter to sleep, and add a new prepare_multicast callback that drivers that need the multicast address list implement. This new callback must be atomic, but most drivers either don't care or just calculate a hash which can be done atomically and then uploaded to the hardware non-atomically. A cursory look suggests that at76c50x-usb, ar9170, mwl8k (which is actually very broken now), rt2x00, wl1251, wl1271 and zd1211 should make use of this new capability. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
ea416a793d
commit
3ac64beecd
@@ -55,16 +55,32 @@ static inline void drv_bss_info_changed(struct ieee80211_local *local,
|
||||
trace_drv_bss_info_changed(local, vif, info, changed);
|
||||
}
|
||||
|
||||
static inline void drv_configure_filter(struct ieee80211_local *local,
|
||||
unsigned int changed_flags,
|
||||
unsigned int *total_flags,
|
||||
static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
|
||||
int mc_count,
|
||||
struct dev_addr_list *mc_list)
|
||||
{
|
||||
u64 ret = 0;
|
||||
|
||||
if (local->ops->prepare_multicast)
|
||||
ret = local->ops->prepare_multicast(&local->hw, mc_count,
|
||||
mc_list);
|
||||
|
||||
trace_drv_prepare_multicast(local, mc_count, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void drv_configure_filter(struct ieee80211_local *local,
|
||||
unsigned int changed_flags,
|
||||
unsigned int *total_flags,
|
||||
u64 multicast)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
local->ops->configure_filter(&local->hw, changed_flags, total_flags,
|
||||
mc_count, mc_list);
|
||||
multicast);
|
||||
trace_drv_configure_filter(local, changed_flags, total_flags,
|
||||
mc_count);
|
||||
multicast);
|
||||
}
|
||||
|
||||
static inline int drv_set_tim(struct ieee80211_local *local,
|
||||
|
Reference in New Issue
Block a user