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
	
	Block a user