Commit ea95bba4 authored by Tomas Winkler's avatar Tomas Winkler Committed by John W. Linville

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: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 98f7dfd8
...@@ -432,6 +432,7 @@ enum ieee80211_conf_flags { ...@@ -432,6 +432,7 @@ enum ieee80211_conf_flags {
* @radio_enabled: when zero, driver is required to switch off the radio. * @radio_enabled: when zero, driver is required to switch off the radio.
* TODO make a flag * TODO make a flag
* @beacon_int: beacon interval (TODO make interface config) * @beacon_int: beacon interval (TODO make interface config)
* @listen_interval: listen interval in units of beacon interval
* @flags: configuration flags defined above * @flags: configuration flags defined above
* @power_level: requested transmit power (in dBm) * @power_level: requested transmit power (in dBm)
* @max_antenna_gain: maximum antenna gain (in dBi) * @max_antenna_gain: maximum antenna gain (in dBi)
...@@ -446,6 +447,7 @@ struct ieee80211_conf { ...@@ -446,6 +447,7 @@ struct ieee80211_conf {
int radio_enabled; int radio_enabled;
int beacon_int; int beacon_int;
u16 listen_interval;
u32 flags; u32 flags;
int power_level; int power_level;
int max_antenna_gain; int max_antenna_gain;
...@@ -787,6 +789,9 @@ enum ieee80211_hw_flags { ...@@ -787,6 +789,9 @@ enum ieee80211_hw_flags {
* @max_signal: Maximum value for signal (rssi) in RX information, used * @max_signal: Maximum value for signal (rssi) in RX information, used
* only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB * 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 * @queues: number of available hardware transmit queues for
* data packets. WMM/QoS requires at least four, these * data packets. WMM/QoS requires at least four, these
* queues need to have configurable access parameters. * queues need to have configurable access parameters.
...@@ -814,7 +819,9 @@ struct ieee80211_hw { ...@@ -814,7 +819,9 @@ struct ieee80211_hw {
unsigned int extra_tx_headroom; unsigned int extra_tx_headroom;
int channel_change_time; int channel_change_time;
int vif_data_size; int vif_data_size;
u16 queues, ampdu_queues; u16 queues;
u16 ampdu_queues;
u16 max_listen_interval;
s8 max_signal; s8 max_signal;
}; };
......
...@@ -1689,6 +1689,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -1689,6 +1689,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
if (local->hw.conf.beacon_int < 10) if (local->hw.conf.beacon_int < 10)
local->hw.conf.beacon_int = 100; 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 | local->wstats_flags |= local->hw.flags & (IEEE80211_HW_SIGNAL_UNSPEC |
IEEE80211_HW_SIGNAL_DB | IEEE80211_HW_SIGNAL_DB |
IEEE80211_HW_SIGNAL_DBM) ? IEEE80211_HW_SIGNAL_DBM) ?
......
...@@ -774,7 +774,8 @@ static void ieee80211_send_assoc(struct net_device *dev, ...@@ -774,7 +774,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
IEEE80211_STYPE_REASSOC_REQ); IEEE80211_STYPE_REASSOC_REQ);
mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab); 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, memcpy(mgmt->u.reassoc_req.current_ap, ifsta->prev_bssid,
ETH_ALEN); ETH_ALEN);
} else { } else {
...@@ -782,7 +783,8 @@ static void ieee80211_send_assoc(struct net_device *dev, ...@@ -782,7 +783,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
IEEE80211_STYPE_ASSOC_REQ); IEEE80211_STYPE_ASSOC_REQ);
mgmt->u.assoc_req.capab_info = cpu_to_le16(capab); 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 */ /* SSID */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment