diff options
Diffstat (limited to 'net/wireless')
| -rw-r--r-- | net/wireless/Makefile | 2 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 32 | 
2 files changed, 23 insertions, 11 deletions
| diff --git a/net/wireless/Makefile b/net/wireless/Makefile index 4c9e39f04ef8..816c9331c8d2 100644 --- a/net/wireless/Makefile +++ b/net/wireless/Makefile @@ -17,8 +17,6 @@ cfg80211-$(CONFIG_CFG80211_INTERNAL_REGDB) += regdb.o  CFLAGS_trace.o := -I$(src) -ccflags-y += -D__CHECK_ENDIAN__ -  $(obj)/regdb.c: $(src)/db.txt $(src)/genregdb.awk  	@$(AWK) -f $(srctree)/$(src)/genregdb.awk < $< > $@ diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 3df85a751a85..aee396b9f190 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -4615,6 +4615,15 @@ int cfg80211_check_station_change(struct wiphy *wiphy,  		break;  	} +	/* +	 * Older kernel versions ignored this attribute entirely, so don't +	 * reject attempts to update it but mark it as unused instead so the +	 * driver won't look at the data. +	 */ +	if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && +	    statype != CFG80211_STA_TDLS_PEER_SETUP) +		params->opmode_notif_used = false; +  	return 0;  }  EXPORT_SYMBOL(cfg80211_check_station_change); @@ -4854,6 +4863,12 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)  		params.local_pm = pm;  	} +	if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { +		params.opmode_notif_used = true; +		params.opmode_notif = +			nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); +	} +  	/* Include parameters for TDLS peer (will check later) */  	err = nl80211_set_station_tdls(info, ¶ms);  	if (err) @@ -5901,6 +5916,7 @@ do {									    \  			break;  		}  		cfg->ht_opmode = ht_opmode; +		mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));  	}  	FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout,  				  1, 65535, mask, @@ -14502,13 +14518,17 @@ static int nl80211_netlink_notify(struct notifier_block * nb,  	list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {  		bool schedule_destroy_work = false; -		bool schedule_scan_stop = false;  		struct cfg80211_sched_scan_request *sched_scan_req =  			rcu_dereference(rdev->sched_scan_req);  		if (sched_scan_req && notify->portid && -		    sched_scan_req->owner_nlportid == notify->portid) -			schedule_scan_stop = true; +		    sched_scan_req->owner_nlportid == notify->portid) { +			sched_scan_req->owner_nlportid = 0; + +			if (rdev->ops->sched_scan_stop && +			    rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) +				schedule_work(&rdev->sched_scan_stop_wk); +		}  		list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {  			cfg80211_mlme_unregister_socket(wdev, notify->portid); @@ -14539,12 +14559,6 @@ static int nl80211_netlink_notify(struct notifier_block * nb,  				spin_unlock(&rdev->destroy_list_lock);  				schedule_work(&rdev->destroy_work);  			} -		} else if (schedule_scan_stop) { -			sched_scan_req->owner_nlportid = 0; - -			if (rdev->ops->sched_scan_stop && -			    rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) -				schedule_work(&rdev->sched_scan_stop_wk);  		}  	} |