mirror of https://gitee.com/openkylin/linux.git
mac80211: make listen_interval be limited by low level driver
This patch makes possible for a driver to specify maximal listen interval The possibility for user to configure listen interval is not implemented yet, currently the maximum provided by the driver or 1 is used. Mac80211 uses config handler to set listen interval for to the driver. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
98f7dfd86c
commit
ea95bba41e
|
@ -432,6 +432,7 @@ enum ieee80211_conf_flags {
|
|||
* @radio_enabled: when zero, driver is required to switch off the radio.
|
||||
* TODO make a flag
|
||||
* @beacon_int: beacon interval (TODO make interface config)
|
||||
* @listen_interval: listen interval in units of beacon interval
|
||||
* @flags: configuration flags defined above
|
||||
* @power_level: requested transmit power (in dBm)
|
||||
* @max_antenna_gain: maximum antenna gain (in dBi)
|
||||
|
@ -446,6 +447,7 @@ struct ieee80211_conf {
|
|||
int radio_enabled;
|
||||
|
||||
int beacon_int;
|
||||
u16 listen_interval;
|
||||
u32 flags;
|
||||
int power_level;
|
||||
int max_antenna_gain;
|
||||
|
@ -787,6 +789,9 @@ enum ieee80211_hw_flags {
|
|||
* @max_signal: Maximum value for signal (rssi) in RX information, used
|
||||
* only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB
|
||||
*
|
||||
* @max_listen_interval: max listen interval in units of beacon interval
|
||||
* that HW supports
|
||||
*
|
||||
* @queues: number of available hardware transmit queues for
|
||||
* data packets. WMM/QoS requires at least four, these
|
||||
* queues need to have configurable access parameters.
|
||||
|
@ -814,7 +819,9 @@ struct ieee80211_hw {
|
|||
unsigned int extra_tx_headroom;
|
||||
int channel_change_time;
|
||||
int vif_data_size;
|
||||
u16 queues, ampdu_queues;
|
||||
u16 queues;
|
||||
u16 ampdu_queues;
|
||||
u16 max_listen_interval;
|
||||
s8 max_signal;
|
||||
};
|
||||
|
||||
|
|
|
@ -1689,6 +1689,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||
if (local->hw.conf.beacon_int < 10)
|
||||
local->hw.conf.beacon_int = 100;
|
||||
|
||||
if (local->hw.max_listen_interval == 0)
|
||||
local->hw.max_listen_interval = 1;
|
||||
|
||||
local->hw.conf.listen_interval = local->hw.max_listen_interval;
|
||||
|
||||
local->wstats_flags |= local->hw.flags & (IEEE80211_HW_SIGNAL_UNSPEC |
|
||||
IEEE80211_HW_SIGNAL_DB |
|
||||
IEEE80211_HW_SIGNAL_DBM) ?
|
||||
|
|
|
@ -774,7 +774,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
|
|||
mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
|
||||
IEEE80211_STYPE_REASSOC_REQ);
|
||||
mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
|
||||
mgmt->u.reassoc_req.listen_interval = cpu_to_le16(1);
|
||||
mgmt->u.reassoc_req.listen_interval =
|
||||
cpu_to_le16(local->hw.conf.listen_interval);
|
||||
memcpy(mgmt->u.reassoc_req.current_ap, ifsta->prev_bssid,
|
||||
ETH_ALEN);
|
||||
} else {
|
||||
|
@ -782,7 +783,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
|
|||
mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
|
||||
IEEE80211_STYPE_ASSOC_REQ);
|
||||
mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
|
||||
mgmt->u.assoc_req.listen_interval = cpu_to_le16(1);
|
||||
mgmt->u.reassoc_req.listen_interval =
|
||||
cpu_to_le16(local->hw.conf.listen_interval);
|
||||
}
|
||||
|
||||
/* SSID */
|
||||
|
|
Loading…
Reference in New Issue