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
@@ -1219,10 +1219,13 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw,
|
||||
* the driver's configure_filter() function which frames should be
|
||||
* passed to mac80211 and which should be filtered out.
|
||||
*
|
||||
* The configure_filter() callback is invoked with the parameters
|
||||
* @mc_count and @mc_list for the combined multicast address list
|
||||
* of all virtual interfaces, @changed_flags telling which flags
|
||||
* were changed and @total_flags with the new flag states.
|
||||
* Before configure_filter() is invoked, the prepare_multicast()
|
||||
* callback is invoked with the parameters @mc_count and @mc_list
|
||||
* for the combined multicast address list of all virtual interfaces.
|
||||
* It's use is optional, and it returns a u64 that is passed to
|
||||
* configure_filter(). Additionally, configure_filter() has the
|
||||
* arguments @changed_flags telling which flags were changed and
|
||||
* @total_flags with the new flag states.
|
||||
*
|
||||
* If your device has no multicast address filters your driver will
|
||||
* need to check both the %FIF_ALLMULTI flag and the @mc_count
|
||||
@@ -1375,9 +1378,13 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* for association indication. The @changed parameter indicates which
|
||||
* of the bss parameters has changed when a call is made.
|
||||
*
|
||||
* @prepare_multicast: Prepare for multicast filter configuration.
|
||||
* This callback is optional, and its return value is passed
|
||||
* to configure_filter(). This callback must be atomic.
|
||||
*
|
||||
* @configure_filter: Configure the device's RX filter.
|
||||
* See the section "Frame filtering" for more information.
|
||||
* This callback must be implemented and atomic.
|
||||
* This callback must be implemented.
|
||||
*
|
||||
* @set_tim: Set TIM bit. mac80211 calls this function when a TIM bit
|
||||
* must be set or cleared for a given STA. Must be atomic.
|
||||
@@ -1479,10 +1486,12 @@ struct ieee80211_ops {
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *info,
|
||||
u32 changed);
|
||||
u64 (*prepare_multicast)(struct ieee80211_hw *hw,
|
||||
int mc_count, struct dev_addr_list *mc_list);
|
||||
void (*configure_filter)(struct ieee80211_hw *hw,
|
||||
unsigned int changed_flags,
|
||||
unsigned int *total_flags,
|
||||
int mc_count, struct dev_addr_list *mc_list);
|
||||
u64 multicast);
|
||||
int (*set_tim)(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
|
||||
bool set);
|
||||
int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
|
Reference in New Issue
Block a user