diff options
Diffstat (limited to 'net/mac80211/sta_info.c')
| -rw-r--r-- | net/mac80211/sta_info.c | 25 | 
1 files changed, 11 insertions, 14 deletions
| diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 78e9ecbc96e6..1711bae4abf2 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -688,7 +688,7 @@ static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending)  	}  	/* No need to do anything if the driver does all */ -	if (!local->ops->set_tim) +	if (ieee80211_hw_check(&local->hw, AP_LINK_PS))  		return;  	if (sta->dead) @@ -709,7 +709,7 @@ static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending)  	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {  		unsigned long tids; -		if (ignore_for_tim & BIT(ac)) +		if (ignore_for_tim & ieee80211_ac_to_qos_mask[ac])  			continue;  		indicate_tim |= !skb_queue_empty(&sta->tx_filtered[ac]) || @@ -1389,7 +1389,7 @@ ieee80211_sta_ps_more_data(struct sta_info *sta, u8 ignored_acs,  		return true;  	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { -		if (ignored_acs & BIT(ac)) +		if (ignored_acs & ieee80211_ac_to_qos_mask[ac])  			continue;  		if (!skb_queue_empty(&sta->tx_filtered[ac]) || @@ -1414,7 +1414,7 @@ ieee80211_sta_ps_get_frames(struct sta_info *sta, int n_frames, u8 ignored_acs,  	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {  		unsigned long tids; -		if (ignored_acs & BIT(ac)) +		if (ignored_acs & ieee80211_ac_to_qos_mask[ac])  			continue;  		tids = ieee80211_tids_for_ac(ac); @@ -1482,7 +1482,7 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,  			BIT(find_highest_prio_tid(driver_release_tids));  	if (skb_queue_empty(&frames) && !driver_release_tids) { -		int tid; +		int tid, ac;  		/*  		 * For PS-Poll, this can only happen due to a race condition @@ -1500,7 +1500,10 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,  		 */  		/* This will evaluate to 1, 3, 5 or 7. */ -		tid = 7 - ((ffs(~ignored_acs) - 1) << 1); +		for (ac = IEEE80211_AC_VO; ac < IEEE80211_NUM_ACS; ac++) +			if (ignored_acs & BIT(ac)) +				continue; +		tid = 7 - 2 * ac;  		ieee80211_send_null_response(sta, tid, reason, true, false);  	} else if (!driver_release_tids) { @@ -1871,10 +1874,7 @@ int sta_info_move_state(struct sta_info *sta,  			if (!sta->sta.support_p2p_ps)  				ieee80211_recalc_p2p_go_ps_allowed(sta->sdata);  		} else if (sta->sta_state == IEEE80211_STA_AUTHORIZED) { -			if (sta->sdata->vif.type == NL80211_IFTYPE_AP || -			    (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && -			     !sta->sdata->u.vlan.sta)) -				atomic_dec(&sta->sdata->bss->num_mcast_sta); +			ieee80211_vif_dec_num_mcast(sta->sdata);  			clear_bit(WLAN_STA_AUTHORIZED, &sta->_flags);  			ieee80211_clear_fast_xmit(sta);  			ieee80211_clear_fast_rx(sta); @@ -1882,10 +1882,7 @@ int sta_info_move_state(struct sta_info *sta,  		break;  	case IEEE80211_STA_AUTHORIZED:  		if (sta->sta_state == IEEE80211_STA_ASSOC) { -			if (sta->sdata->vif.type == NL80211_IFTYPE_AP || -			    (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && -			     !sta->sdata->u.vlan.sta)) -				atomic_inc(&sta->sdata->bss->num_mcast_sta); +			ieee80211_vif_inc_num_mcast(sta->sdata);  			set_bit(WLAN_STA_AUTHORIZED, &sta->_flags);  			ieee80211_check_fast_xmit(sta);  			ieee80211_check_fast_rx(sta); |