diff options
Diffstat (limited to 'net/mac80211/util.c')
| -rw-r--r-- | net/mac80211/util.c | 41 | 
1 files changed, 24 insertions, 17 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index aeb65b3d2295..d09f78bb2442 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -520,9 +520,9 @@ EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);   */  static bool ieee80211_can_queue_work(struct ieee80211_local *local)  { -        if (WARN(local->suspended, "queueing ieee80211 work while " -		 "going to suspend\n")) -                return false; +	if (WARN(local->suspended && !local->resuming, +		 "queueing ieee80211 work while going to suspend\n")) +		return false;  	return true;  } @@ -666,8 +666,8 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,  			elems->mesh_id_len = elen;  			break;  		case WLAN_EID_MESH_CONFIG: -			elems->mesh_config = pos; -			elems->mesh_config_len = elen; +			if (elen >= sizeof(struct ieee80211_meshconf_ie)) +				elems->mesh_config = (void *)pos;  			break;  		case WLAN_EID_PEER_LINK:  			elems->peer_link = pos; @@ -685,6 +685,10 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len,  			elems->perr = pos;  			elems->perr_len = elen;  			break; +		case WLAN_EID_RANN: +			if (elen >= sizeof(struct ieee80211_rann_ie)) +				elems->rann = (void *)pos; +			break;  		case WLAN_EID_CHANNEL_SWITCH:  			elems->ch_switch_elem = pos;  			elems->ch_switch_elem_len = elen; @@ -868,17 +872,19 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,  		WARN_ON(err);  	} -	ieee80211_tx_skb(sdata, skb, 0); +	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; +	ieee80211_tx_skb(sdata, skb);  }  int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, -			     const u8 *ie, size_t ie_len) +			     const u8 *ie, size_t ie_len, +			     enum ieee80211_band band)  {  	struct ieee80211_supported_band *sband;  	u8 *pos, *supp_rates_len, *esupp_rates_len = NULL;  	int i; -	sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; +	sband = local->hw.wiphy->bands[band];  	pos = buffer; @@ -966,9 +972,11 @@ void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,  	memcpy(pos, ssid, ssid_len);  	pos += ssid_len; -	skb_put(skb, ieee80211_build_preq_ies(local, pos, ie, ie_len)); +	skb_put(skb, ieee80211_build_preq_ies(local, pos, ie, ie_len, +					      local->hw.conf.channel->band)); -	ieee80211_tx_skb(sdata, skb, 0); +	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; +	ieee80211_tx_skb(sdata, skb);  }  u32 ieee80211_sta_get_rates(struct ieee80211_local *local, @@ -1025,13 +1033,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)  	struct sta_info *sta;  	unsigned long flags;  	int res; -	bool from_suspend = local->suspended; -	/* -	 * We're going to start the hardware, at that point -	 * we are no longer suspended and can RX frames. -	 */ -	local->suspended = false; +	if (local->suspended) +		local->resuming = true;  	/* restart hardware */  	if (local->open_count) { @@ -1129,11 +1133,14 @@ int ieee80211_reconfig(struct ieee80211_local *local)  	 * If this is for hw restart things are still running.  	 * We may want to change that later, however.  	 */ -	if (!from_suspend) +	if (!local->suspended)  		return 0;  #ifdef CONFIG_PM +	/* first set suspended false, then resuming */  	local->suspended = false; +	mb(); +	local->resuming = false;  	list_for_each_entry(sdata, &local->interfaces, list) {  		switch(sdata->vif.type) {  | 
