xref: /linux/net/mac80211/driver-ops.c (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License version 2 as
4  * published by the Free Software Foundation.
5  */
6 #include <net/mac80211.h>
7 #include "ieee80211_i.h"
8 #include "trace.h"
9 #include "driver-ops.h"
10 
11 __must_check
12 int drv_sta_state(struct ieee80211_local *local,
13 		  struct ieee80211_sub_if_data *sdata,
14 		  struct sta_info *sta,
15 		  enum ieee80211_sta_state old_state,
16 		  enum ieee80211_sta_state new_state)
17 {
18 	int ret = 0;
19 
20 	might_sleep();
21 
22 	sdata = get_bss_sdata(sdata);
23 	if (!check_sdata_in_driver(sdata))
24 		return -EIO;
25 
26 	trace_drv_sta_state(local, sdata, &sta->sta, old_state, new_state);
27 	if (local->ops->sta_state) {
28 		ret = local->ops->sta_state(&local->hw, &sdata->vif, &sta->sta,
29 					    old_state, new_state);
30 	} else if (old_state == IEEE80211_STA_AUTH &&
31 		   new_state == IEEE80211_STA_ASSOC) {
32 		ret = drv_sta_add(local, sdata, &sta->sta);
33 		if (ret == 0)
34 			sta->uploaded = true;
35 	} else if (old_state == IEEE80211_STA_ASSOC &&
36 		   new_state == IEEE80211_STA_AUTH) {
37 		drv_sta_remove(local, sdata, &sta->sta);
38 	}
39 	trace_drv_return_int(local, ret);
40 	return ret;
41 }
42