Blame view

net/mac80211/driver-ops.h 18.5 KB
244879813   Johannes Berg   mac80211: add dri...
1
2
3
4
5
  #ifndef __MAC80211_DRIVER_OPS
  #define __MAC80211_DRIVER_OPS
  
  #include <net/mac80211.h>
  #include "ieee80211_i.h"
0a2b8bb24   Johannes Berg   mac80211: driver ...
6
  #include "driver-trace.h"
244879813   Johannes Berg   mac80211: add dri...
7

7b7eab6fc   Johannes Berg   mac80211: verify ...
8
9
10
11
  static inline void check_sdata_in_driver(struct ieee80211_sub_if_data *sdata)
  {
  	WARN_ON(!(sdata->flags & IEEE80211_SDATA_IN_DRIVER));
  }
bc192f891   Felix Fietkau   mac80211: do not ...
12
13
14
15
16
17
18
19
20
  static inline struct ieee80211_sub_if_data *
  get_bss_sdata(struct ieee80211_sub_if_data *sdata)
  {
  	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
  		sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
  				     u.ap);
  
  	return sdata;
  }
7bb456837   Johannes Berg   mac80211: make tx...
21
  static inline void drv_tx(struct ieee80211_local *local, struct sk_buff *skb)
244879813   Johannes Berg   mac80211: add dri...
22
  {
7bb456837   Johannes Berg   mac80211: make tx...
23
  	local->ops->tx(&local->hw, skb);
244879813   Johannes Berg   mac80211: add dri...
24
  }
11127e912   Johannes Berg   mac80211: transmi...
25
26
27
28
29
30
31
  static inline void drv_tx_frags(struct ieee80211_local *local,
  				struct ieee80211_vif *vif,
  				struct ieee80211_sta *sta,
  				struct sk_buff_head *skbs)
  {
  	local->ops->tx_frags(&local->hw, vif, sta, skbs);
  }
244879813   Johannes Berg   mac80211: add dri...
32
33
  static inline int drv_start(struct ieee80211_local *local)
  {
ea77f12f2   Johannes Berg   mac80211: remove ...
34
  	int ret;
e1781ed33   Kalle Valo   mac80211: annotat...
35
  	might_sleep();
4efc76bdb   Johannes Berg   mac80211: bracket...
36
  	trace_drv_start(local);
ea77f12f2   Johannes Berg   mac80211: remove ...
37
38
39
  	local->started = true;
  	smp_mb();
  	ret = local->ops->start(&local->hw);
4efc76bdb   Johannes Berg   mac80211: bracket...
40
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
41
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
42
43
44
45
  }
  
  static inline void drv_stop(struct ieee80211_local *local)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
46
  	might_sleep();
0a2b8bb24   Johannes Berg   mac80211: driver ...
47
  	trace_drv_stop(local);
4efc76bdb   Johannes Berg   mac80211: bracket...
48
49
  	local->ops->stop(&local->hw);
  	trace_drv_return_void(local);
ea77f12f2   Johannes Berg   mac80211: remove ...
50
51
52
53
54
55
56
57
  
  	/* sync away all work on the tasklet before clearing started */
  	tasklet_disable(&local->tasklet);
  	tasklet_enable(&local->tasklet);
  
  	barrier();
  
  	local->started = false;
244879813   Johannes Berg   mac80211: add dri...
58
  }
eecc48000   Johannes Berg   mac80211: add bas...
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  #ifdef CONFIG_PM
  static inline int drv_suspend(struct ieee80211_local *local,
  			      struct cfg80211_wowlan *wowlan)
  {
  	int ret;
  
  	might_sleep();
  
  	trace_drv_suspend(local);
  	ret = local->ops->suspend(&local->hw, wowlan);
  	trace_drv_return_int(local, ret);
  	return ret;
  }
  
  static inline int drv_resume(struct ieee80211_local *local)
  {
  	int ret;
  
  	might_sleep();
  
  	trace_drv_resume(local);
  	ret = local->ops->resume(&local->hw);
  	trace_drv_return_int(local, ret);
  	return ret;
  }
  #endif
244879813   Johannes Berg   mac80211: add dri...
85
  static inline int drv_add_interface(struct ieee80211_local *local,
7b7eab6fc   Johannes Berg   mac80211: verify ...
86
  				    struct ieee80211_sub_if_data *sdata)
244879813   Johannes Berg   mac80211: add dri...
87
  {
e1781ed33   Kalle Valo   mac80211: annotat...
88
89
90
  	int ret;
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
91
92
93
94
95
96
  	if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
  		    sdata->vif.type == NL80211_IFTYPE_MONITOR))
  		return -EINVAL;
  
  	trace_drv_add_interface(local, sdata);
  	ret = local->ops->add_interface(&local->hw, &sdata->vif);
4efc76bdb   Johannes Berg   mac80211: bracket...
97
  	trace_drv_return_int(local, ret);
7b7eab6fc   Johannes Berg   mac80211: verify ...
98
99
100
  
  	if (ret == 0)
  		sdata->flags |= IEEE80211_SDATA_IN_DRIVER;
0a2b8bb24   Johannes Berg   mac80211: driver ...
101
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
102
  }
34d4bc4d4   Johannes Berg   mac80211: support...
103
104
  static inline int drv_change_interface(struct ieee80211_local *local,
  				       struct ieee80211_sub_if_data *sdata,
2ca27bcff   Johannes Berg   mac80211: add p2p...
105
  				       enum nl80211_iftype type, bool p2p)
34d4bc4d4   Johannes Berg   mac80211: support...
106
107
108
109
  {
  	int ret;
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
110
  	check_sdata_in_driver(sdata);
2ca27bcff   Johannes Berg   mac80211: add p2p...
111
112
  	trace_drv_change_interface(local, sdata, type, p2p);
  	ret = local->ops->change_interface(&local->hw, &sdata->vif, type, p2p);
34d4bc4d4   Johannes Berg   mac80211: support...
113
114
115
  	trace_drv_return_int(local, ret);
  	return ret;
  }
244879813   Johannes Berg   mac80211: add dri...
116
  static inline void drv_remove_interface(struct ieee80211_local *local,
7b7eab6fc   Johannes Berg   mac80211: verify ...
117
  					struct ieee80211_sub_if_data *sdata)
244879813   Johannes Berg   mac80211: add dri...
118
  {
e1781ed33   Kalle Valo   mac80211: annotat...
119
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
120
121
122
123
124
  	check_sdata_in_driver(sdata);
  
  	trace_drv_remove_interface(local, sdata);
  	local->ops->remove_interface(&local->hw, &sdata->vif);
  	sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
4efc76bdb   Johannes Berg   mac80211: bracket...
125
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
126
127
128
129
  }
  
  static inline int drv_config(struct ieee80211_local *local, u32 changed)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
130
131
132
  	int ret;
  
  	might_sleep();
4efc76bdb   Johannes Berg   mac80211: bracket...
133
  	trace_drv_config(local, changed);
e1781ed33   Kalle Valo   mac80211: annotat...
134
  	ret = local->ops->config(&local->hw, changed);
4efc76bdb   Johannes Berg   mac80211: bracket...
135
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
136
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
137
138
139
  }
  
  static inline void drv_bss_info_changed(struct ieee80211_local *local,
12375ef93   Johannes Berg   mac80211: trace i...
140
  					struct ieee80211_sub_if_data *sdata,
244879813   Johannes Berg   mac80211: add dri...
141
142
143
  					struct ieee80211_bss_conf *info,
  					u32 changed)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
144
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
145
  	check_sdata_in_driver(sdata);
4efc76bdb   Johannes Berg   mac80211: bracket...
146
  	trace_drv_bss_info_changed(local, sdata, info, changed);
244879813   Johannes Berg   mac80211: add dri...
147
  	if (local->ops->bss_info_changed)
12375ef93   Johannes Berg   mac80211: trace i...
148
  		local->ops->bss_info_changed(&local->hw, &sdata->vif, info, changed);
4efc76bdb   Johannes Berg   mac80211: bracket...
149
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
150
  }
b2abb6e2b   Johannes Berg   mac80211: sync dr...
151
152
153
154
155
156
157
158
  static inline int drv_tx_sync(struct ieee80211_local *local,
  			      struct ieee80211_sub_if_data *sdata,
  			      const u8 *bssid,
  			      enum ieee80211_tx_sync_type type)
  {
  	int ret = 0;
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
159
  	check_sdata_in_driver(sdata);
b2abb6e2b   Johannes Berg   mac80211: sync dr...
160
161
162
163
164
165
166
167
168
169
170
171
172
173
  	trace_drv_tx_sync(local, sdata, bssid, type);
  	if (local->ops->tx_sync)
  		ret = local->ops->tx_sync(&local->hw, &sdata->vif,
  					  bssid, type);
  	trace_drv_return_int(local, ret);
  	return ret;
  }
  
  static inline void drv_finish_tx_sync(struct ieee80211_local *local,
  				      struct ieee80211_sub_if_data *sdata,
  				      const u8 *bssid,
  				      enum ieee80211_tx_sync_type type)
  {
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
174
  	check_sdata_in_driver(sdata);
b2abb6e2b   Johannes Berg   mac80211: sync dr...
175
176
177
178
179
180
  	trace_drv_finish_tx_sync(local, sdata, bssid, type);
  	if (local->ops->finish_tx_sync)
  		local->ops->finish_tx_sync(&local->hw, &sdata->vif,
  					   bssid, type);
  	trace_drv_return_void(local);
  }
3ac64beec   Johannes Berg   mac80211: allow c...
181
  static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
22bedad3c   Jiri Pirko   net: convert mult...
182
  					struct netdev_hw_addr_list *mc_list)
3ac64beec   Johannes Berg   mac80211: allow c...
183
184
  {
  	u64 ret = 0;
4efc76bdb   Johannes Berg   mac80211: bracket...
185
  	trace_drv_prepare_multicast(local, mc_list->count);
3ac64beec   Johannes Berg   mac80211: allow c...
186
  	if (local->ops->prepare_multicast)
22bedad3c   Jiri Pirko   net: convert mult...
187
  		ret = local->ops->prepare_multicast(&local->hw, mc_list);
3ac64beec   Johannes Berg   mac80211: allow c...
188

4efc76bdb   Johannes Berg   mac80211: bracket...
189
  	trace_drv_return_u64(local, ret);
3ac64beec   Johannes Berg   mac80211: allow c...
190
191
192
  
  	return ret;
  }
244879813   Johannes Berg   mac80211: add dri...
193
194
195
  static inline void drv_configure_filter(struct ieee80211_local *local,
  					unsigned int changed_flags,
  					unsigned int *total_flags,
3ac64beec   Johannes Berg   mac80211: allow c...
196
  					u64 multicast)
244879813   Johannes Berg   mac80211: add dri...
197
  {
3ac64beec   Johannes Berg   mac80211: allow c...
198
  	might_sleep();
0a2b8bb24   Johannes Berg   mac80211: driver ...
199
  	trace_drv_configure_filter(local, changed_flags, total_flags,
3ac64beec   Johannes Berg   mac80211: allow c...
200
  				   multicast);
4efc76bdb   Johannes Berg   mac80211: bracket...
201
202
203
  	local->ops->configure_filter(&local->hw, changed_flags, total_flags,
  				     multicast);
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
204
205
206
207
208
  }
  
  static inline int drv_set_tim(struct ieee80211_local *local,
  			      struct ieee80211_sta *sta, bool set)
  {
0a2b8bb24   Johannes Berg   mac80211: driver ...
209
  	int ret = 0;
4efc76bdb   Johannes Berg   mac80211: bracket...
210
  	trace_drv_set_tim(local, sta, set);
244879813   Johannes Berg   mac80211: add dri...
211
  	if (local->ops->set_tim)
0a2b8bb24   Johannes Berg   mac80211: driver ...
212
  		ret = local->ops->set_tim(&local->hw, sta, set);
4efc76bdb   Johannes Berg   mac80211: bracket...
213
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
214
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
215
216
217
  }
  
  static inline int drv_set_key(struct ieee80211_local *local,
12375ef93   Johannes Berg   mac80211: trace i...
218
219
  			      enum set_key_cmd cmd,
  			      struct ieee80211_sub_if_data *sdata,
244879813   Johannes Berg   mac80211: add dri...
220
221
222
  			      struct ieee80211_sta *sta,
  			      struct ieee80211_key_conf *key)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
223
224
225
  	int ret;
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
226
  	check_sdata_in_driver(sdata);
4efc76bdb   Johannes Berg   mac80211: bracket...
227
  	trace_drv_set_key(local, cmd, sdata, sta, key);
e1781ed33   Kalle Valo   mac80211: annotat...
228
  	ret = local->ops->set_key(&local->hw, cmd, &sdata->vif, sta, key);
4efc76bdb   Johannes Berg   mac80211: bracket...
229
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
230
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
231
232
233
  }
  
  static inline void drv_update_tkip_key(struct ieee80211_local *local,
b3fbdcf49   Johannes Berg   mac80211: pass vi...
234
  				       struct ieee80211_sub_if_data *sdata,
244879813   Johannes Berg   mac80211: add dri...
235
  				       struct ieee80211_key_conf *conf,
b3fbdcf49   Johannes Berg   mac80211: pass vi...
236
  				       struct sta_info *sta, u32 iv32,
244879813   Johannes Berg   mac80211: add dri...
237
238
  				       u16 *phase1key)
  {
b3fbdcf49   Johannes Berg   mac80211: pass vi...
239
  	struct ieee80211_sta *ista = NULL;
b3fbdcf49   Johannes Berg   mac80211: pass vi...
240
241
  	if (sta)
  		ista = &sta->sta;
7b7eab6fc   Johannes Berg   mac80211: verify ...
242
  	check_sdata_in_driver(sdata);
4efc76bdb   Johannes Berg   mac80211: bracket...
243
  	trace_drv_update_tkip_key(local, sdata, conf, ista, iv32);
244879813   Johannes Berg   mac80211: add dri...
244
  	if (local->ops->update_tkip_key)
b3fbdcf49   Johannes Berg   mac80211: pass vi...
245
246
  		local->ops->update_tkip_key(&local->hw, &sdata->vif, conf,
  					    ista, iv32, phase1key);
4efc76bdb   Johannes Berg   mac80211: bracket...
247
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
248
249
250
  }
  
  static inline int drv_hw_scan(struct ieee80211_local *local,
a060bbfe4   Johannes Berg   mac80211: give vi...
251
  			      struct ieee80211_sub_if_data *sdata,
244879813   Johannes Berg   mac80211: add dri...
252
253
  			      struct cfg80211_scan_request *req)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
254
255
256
  	int ret;
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
257
  	check_sdata_in_driver(sdata);
79f460ca4   Luciano Coelho   mac80211: add sup...
258
  	trace_drv_hw_scan(local, sdata);
a060bbfe4   Johannes Berg   mac80211: give vi...
259
  	ret = local->ops->hw_scan(&local->hw, &sdata->vif, req);
4efc76bdb   Johannes Berg   mac80211: bracket...
260
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
261
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
262
  }
b856439b1   Eliad Peller   mac80211: add can...
263
264
265
266
  static inline void drv_cancel_hw_scan(struct ieee80211_local *local,
  				      struct ieee80211_sub_if_data *sdata)
  {
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
267
  	check_sdata_in_driver(sdata);
b856439b1   Eliad Peller   mac80211: add can...
268
269
270
271
  	trace_drv_cancel_hw_scan(local, sdata);
  	local->ops->cancel_hw_scan(&local->hw, &sdata->vif);
  	trace_drv_return_void(local);
  }
79f460ca4   Luciano Coelho   mac80211: add sup...
272
273
274
275
276
277
278
279
280
  static inline int
  drv_sched_scan_start(struct ieee80211_local *local,
  		     struct ieee80211_sub_if_data *sdata,
  		     struct cfg80211_sched_scan_request *req,
  		     struct ieee80211_sched_scan_ies *ies)
  {
  	int ret;
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
281
  	check_sdata_in_driver(sdata);
79f460ca4   Luciano Coelho   mac80211: add sup...
282
283
284
285
286
287
288
289
290
291
292
  	trace_drv_sched_scan_start(local, sdata);
  	ret = local->ops->sched_scan_start(&local->hw, &sdata->vif,
  					      req, ies);
  	trace_drv_return_int(local, ret);
  	return ret;
  }
  
  static inline void drv_sched_scan_stop(struct ieee80211_local *local,
  				       struct ieee80211_sub_if_data *sdata)
  {
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
293
  	check_sdata_in_driver(sdata);
79f460ca4   Luciano Coelho   mac80211: add sup...
294
295
296
297
  	trace_drv_sched_scan_stop(local, sdata);
  	local->ops->sched_scan_stop(&local->hw, &sdata->vif);
  	trace_drv_return_void(local);
  }
244879813   Johannes Berg   mac80211: add dri...
298
299
  static inline void drv_sw_scan_start(struct ieee80211_local *local)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
300
  	might_sleep();
4efc76bdb   Johannes Berg   mac80211: bracket...
301
  	trace_drv_sw_scan_start(local);
244879813   Johannes Berg   mac80211: add dri...
302
303
  	if (local->ops->sw_scan_start)
  		local->ops->sw_scan_start(&local->hw);
4efc76bdb   Johannes Berg   mac80211: bracket...
304
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
305
306
307
308
  }
  
  static inline void drv_sw_scan_complete(struct ieee80211_local *local)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
309
  	might_sleep();
4efc76bdb   Johannes Berg   mac80211: bracket...
310
  	trace_drv_sw_scan_complete(local);
244879813   Johannes Berg   mac80211: add dri...
311
312
  	if (local->ops->sw_scan_complete)
  		local->ops->sw_scan_complete(&local->hw);
4efc76bdb   Johannes Berg   mac80211: bracket...
313
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
314
315
316
317
318
  }
  
  static inline int drv_get_stats(struct ieee80211_local *local,
  				struct ieee80211_low_level_stats *stats)
  {
0a2b8bb24   Johannes Berg   mac80211: driver ...
319
  	int ret = -EOPNOTSUPP;
e1781ed33   Kalle Valo   mac80211: annotat...
320
  	might_sleep();
0a2b8bb24   Johannes Berg   mac80211: driver ...
321
322
323
324
325
  	if (local->ops->get_stats)
  		ret = local->ops->get_stats(&local->hw, stats);
  	trace_drv_get_stats(local, stats, ret);
  
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
326
327
328
329
330
331
332
  }
  
  static inline void drv_get_tkip_seq(struct ieee80211_local *local,
  				    u8 hw_key_idx, u32 *iv32, u16 *iv16)
  {
  	if (local->ops->get_tkip_seq)
  		local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16);
0a2b8bb24   Johannes Berg   mac80211: driver ...
333
  	trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16);
244879813   Johannes Berg   mac80211: add dri...
334
  }
f23a47807   Arik Nemtsov   mac80211: support...
335
336
337
338
339
340
341
342
343
344
345
346
347
  static inline int drv_set_frag_threshold(struct ieee80211_local *local,
  					u32 value)
  {
  	int ret = 0;
  
  	might_sleep();
  
  	trace_drv_set_frag_threshold(local, value);
  	if (local->ops->set_frag_threshold)
  		ret = local->ops->set_frag_threshold(&local->hw, value);
  	trace_drv_return_int(local, ret);
  	return ret;
  }
244879813   Johannes Berg   mac80211: add dri...
348
349
350
  static inline int drv_set_rts_threshold(struct ieee80211_local *local,
  					u32 value)
  {
0a2b8bb24   Johannes Berg   mac80211: driver ...
351
  	int ret = 0;
e1781ed33   Kalle Valo   mac80211: annotat...
352
353
  
  	might_sleep();
4efc76bdb   Johannes Berg   mac80211: bracket...
354
  	trace_drv_set_rts_threshold(local, value);
244879813   Johannes Berg   mac80211: add dri...
355
  	if (local->ops->set_rts_threshold)
0a2b8bb24   Johannes Berg   mac80211: driver ...
356
  		ret = local->ops->set_rts_threshold(&local->hw, value);
4efc76bdb   Johannes Berg   mac80211: bracket...
357
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
358
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
359
  }
310bc676e   Lukáš Turek   mac80211: Add new...
360
361
362
363
364
  static inline int drv_set_coverage_class(struct ieee80211_local *local,
  					 u8 value)
  {
  	int ret = 0;
  	might_sleep();
4efc76bdb   Johannes Berg   mac80211: bracket...
365
  	trace_drv_set_coverage_class(local, value);
310bc676e   Lukáš Turek   mac80211: Add new...
366
367
368
369
  	if (local->ops->set_coverage_class)
  		local->ops->set_coverage_class(&local->hw, value);
  	else
  		ret = -EOPNOTSUPP;
4efc76bdb   Johannes Berg   mac80211: bracket...
370
  	trace_drv_return_int(local, ret);
310bc676e   Lukáš Turek   mac80211: Add new...
371
372
  	return ret;
  }
244879813   Johannes Berg   mac80211: add dri...
373
  static inline void drv_sta_notify(struct ieee80211_local *local,
12375ef93   Johannes Berg   mac80211: trace i...
374
  				  struct ieee80211_sub_if_data *sdata,
244879813   Johannes Berg   mac80211: add dri...
375
376
377
  				  enum sta_notify_cmd cmd,
  				  struct ieee80211_sta *sta)
  {
bc192f891   Felix Fietkau   mac80211: do not ...
378
  	sdata = get_bss_sdata(sdata);
7b7eab6fc   Johannes Berg   mac80211: verify ...
379
  	check_sdata_in_driver(sdata);
4efc76bdb   Johannes Berg   mac80211: bracket...
380
  	trace_drv_sta_notify(local, sdata, cmd, sta);
244879813   Johannes Berg   mac80211: add dri...
381
  	if (local->ops->sta_notify)
12375ef93   Johannes Berg   mac80211: trace i...
382
  		local->ops->sta_notify(&local->hw, &sdata->vif, cmd, sta);
4efc76bdb   Johannes Berg   mac80211: bracket...
383
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
384
  }
34e895075   Johannes Berg   mac80211: allow s...
385
386
387
388
389
390
391
  static inline int drv_sta_add(struct ieee80211_local *local,
  			      struct ieee80211_sub_if_data *sdata,
  			      struct ieee80211_sta *sta)
  {
  	int ret = 0;
  
  	might_sleep();
bc192f891   Felix Fietkau   mac80211: do not ...
392
  	sdata = get_bss_sdata(sdata);
7b7eab6fc   Johannes Berg   mac80211: verify ...
393
  	check_sdata_in_driver(sdata);
4efc76bdb   Johannes Berg   mac80211: bracket...
394
  	trace_drv_sta_add(local, sdata, sta);
34e895075   Johannes Berg   mac80211: allow s...
395
396
  	if (local->ops->sta_add)
  		ret = local->ops->sta_add(&local->hw, &sdata->vif, sta);
34e895075   Johannes Berg   mac80211: allow s...
397

4efc76bdb   Johannes Berg   mac80211: bracket...
398
  	trace_drv_return_int(local, ret);
34e895075   Johannes Berg   mac80211: allow s...
399
400
401
402
403
404
405
406
407
  
  	return ret;
  }
  
  static inline void drv_sta_remove(struct ieee80211_local *local,
  				  struct ieee80211_sub_if_data *sdata,
  				  struct ieee80211_sta *sta)
  {
  	might_sleep();
bc192f891   Felix Fietkau   mac80211: do not ...
408
  	sdata = get_bss_sdata(sdata);
7b7eab6fc   Johannes Berg   mac80211: verify ...
409
  	check_sdata_in_driver(sdata);
4efc76bdb   Johannes Berg   mac80211: bracket...
410
  	trace_drv_sta_remove(local, sdata, sta);
34e895075   Johannes Berg   mac80211: allow s...
411
412
  	if (local->ops->sta_remove)
  		local->ops->sta_remove(&local->hw, &sdata->vif, sta);
34e895075   Johannes Berg   mac80211: allow s...
413

4efc76bdb   Johannes Berg   mac80211: bracket...
414
  	trace_drv_return_void(local);
34e895075   Johannes Berg   mac80211: allow s...
415
  }
f6f3def32   Eliad Peller   mac80211: save tx...
416
417
  static inline int drv_conf_tx(struct ieee80211_local *local,
  			      struct ieee80211_sub_if_data *sdata, u16 queue,
244879813   Johannes Berg   mac80211: add dri...
418
419
  			      const struct ieee80211_tx_queue_params *params)
  {
0a2b8bb24   Johannes Berg   mac80211: driver ...
420
  	int ret = -EOPNOTSUPP;
e1781ed33   Kalle Valo   mac80211: annotat...
421
422
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
423
  	check_sdata_in_driver(sdata);
f6f3def32   Eliad Peller   mac80211: save tx...
424
  	trace_drv_conf_tx(local, sdata, queue, params);
244879813   Johannes Berg   mac80211: add dri...
425
  	if (local->ops->conf_tx)
8a3a3c85e   Eliad Peller   mac80211: pass vi...
426
427
  		ret = local->ops->conf_tx(&local->hw, &sdata->vif,
  					  queue, params);
4efc76bdb   Johannes Berg   mac80211: bracket...
428
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
429
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
430
  }
37a41b4af   Eliad Peller   mac80211: add iee...
431
432
  static inline u64 drv_get_tsf(struct ieee80211_local *local,
  			      struct ieee80211_sub_if_data *sdata)
244879813   Johannes Berg   mac80211: add dri...
433
  {
0a2b8bb24   Johannes Berg   mac80211: driver ...
434
  	u64 ret = -1ULL;
e1781ed33   Kalle Valo   mac80211: annotat...
435
436
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
437
  	check_sdata_in_driver(sdata);
37a41b4af   Eliad Peller   mac80211: add iee...
438
  	trace_drv_get_tsf(local, sdata);
244879813   Johannes Berg   mac80211: add dri...
439
  	if (local->ops->get_tsf)
37a41b4af   Eliad Peller   mac80211: add iee...
440
  		ret = local->ops->get_tsf(&local->hw, &sdata->vif);
4efc76bdb   Johannes Berg   mac80211: bracket...
441
  	trace_drv_return_u64(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
442
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
443
  }
37a41b4af   Eliad Peller   mac80211: add iee...
444
445
446
  static inline void drv_set_tsf(struct ieee80211_local *local,
  			       struct ieee80211_sub_if_data *sdata,
  			       u64 tsf)
244879813   Johannes Berg   mac80211: add dri...
447
  {
e1781ed33   Kalle Valo   mac80211: annotat...
448
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
449
  	check_sdata_in_driver(sdata);
37a41b4af   Eliad Peller   mac80211: add iee...
450
  	trace_drv_set_tsf(local, sdata, tsf);
244879813   Johannes Berg   mac80211: add dri...
451
  	if (local->ops->set_tsf)
37a41b4af   Eliad Peller   mac80211: add iee...
452
  		local->ops->set_tsf(&local->hw, &sdata->vif, tsf);
4efc76bdb   Johannes Berg   mac80211: bracket...
453
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
454
  }
37a41b4af   Eliad Peller   mac80211: add iee...
455
456
  static inline void drv_reset_tsf(struct ieee80211_local *local,
  				 struct ieee80211_sub_if_data *sdata)
244879813   Johannes Berg   mac80211: add dri...
457
  {
e1781ed33   Kalle Valo   mac80211: annotat...
458
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
459
  	check_sdata_in_driver(sdata);
37a41b4af   Eliad Peller   mac80211: add iee...
460
  	trace_drv_reset_tsf(local, sdata);
244879813   Johannes Berg   mac80211: add dri...
461
  	if (local->ops->reset_tsf)
37a41b4af   Eliad Peller   mac80211: add iee...
462
  		local->ops->reset_tsf(&local->hw, &sdata->vif);
4efc76bdb   Johannes Berg   mac80211: bracket...
463
  	trace_drv_return_void(local);
244879813   Johannes Berg   mac80211: add dri...
464
465
466
467
  }
  
  static inline int drv_tx_last_beacon(struct ieee80211_local *local)
  {
91f44b029   Tim Harvey   mac80211 default ...
468
  	int ret = 0; /* default unsuported op for less congestion */
e1781ed33   Kalle Valo   mac80211: annotat...
469
470
  
  	might_sleep();
4efc76bdb   Johannes Berg   mac80211: bracket...
471
  	trace_drv_tx_last_beacon(local);
244879813   Johannes Berg   mac80211: add dri...
472
  	if (local->ops->tx_last_beacon)
0a2b8bb24   Johannes Berg   mac80211: driver ...
473
  		ret = local->ops->tx_last_beacon(&local->hw);
4efc76bdb   Johannes Berg   mac80211: bracket...
474
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
475
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
476
477
478
  }
  
  static inline int drv_ampdu_action(struct ieee80211_local *local,
12375ef93   Johannes Berg   mac80211: trace i...
479
  				   struct ieee80211_sub_if_data *sdata,
244879813   Johannes Berg   mac80211: add dri...
480
481
  				   enum ieee80211_ampdu_mlme_action action,
  				   struct ieee80211_sta *sta, u16 tid,
0b01f030d   Johannes Berg   mac80211: track r...
482
  				   u16 *ssn, u8 buf_size)
244879813   Johannes Berg   mac80211: add dri...
483
  {
0a2b8bb24   Johannes Berg   mac80211: driver ...
484
  	int ret = -EOPNOTSUPP;
cfcdbde35   Johannes Berg   mac80211: change ...
485
486
  
  	might_sleep();
bc192f891   Felix Fietkau   mac80211: do not ...
487
  	sdata = get_bss_sdata(sdata);
7b7eab6fc   Johannes Berg   mac80211: verify ...
488
  	check_sdata_in_driver(sdata);
0b01f030d   Johannes Berg   mac80211: track r...
489
  	trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, buf_size);
4efc76bdb   Johannes Berg   mac80211: bracket...
490

244879813   Johannes Berg   mac80211: add dri...
491
  	if (local->ops->ampdu_action)
12375ef93   Johannes Berg   mac80211: trace i...
492
  		ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action,
0b01f030d   Johannes Berg   mac80211: track r...
493
  					       sta, tid, ssn, buf_size);
85ad181ea   Johannes Berg   mac80211: allow d...
494

4efc76bdb   Johannes Berg   mac80211: bracket...
495
  	trace_drv_return_int(local, ret);
0a2b8bb24   Johannes Berg   mac80211: driver ...
496
  	return ret;
244879813   Johannes Berg   mac80211: add dri...
497
  }
1f87f7d3a   Johannes Berg   cfg80211: add rfk...
498

1289723ef   Holger Schurig   mac80211: sample ...
499
500
501
502
  static inline int drv_get_survey(struct ieee80211_local *local, int idx,
  				struct survey_info *survey)
  {
  	int ret = -EOPNOTSUPP;
c466d4efb   John W. Linville   mac80211: add bas...
503
504
  
  	trace_drv_get_survey(local, idx, survey);
35dd0509b   Holger Schurig   mac80211: fix fun...
505
  	if (local->ops->get_survey)
1289723ef   Holger Schurig   mac80211: sample ...
506
  		ret = local->ops->get_survey(&local->hw, idx, survey);
c466d4efb   John W. Linville   mac80211: add bas...
507
508
  
  	trace_drv_return_int(local, ret);
1289723ef   Holger Schurig   mac80211: sample ...
509
510
  	return ret;
  }
1f87f7d3a   Johannes Berg   cfg80211: add rfk...
511
512
513
  
  static inline void drv_rfkill_poll(struct ieee80211_local *local)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
514
  	might_sleep();
1f87f7d3a   Johannes Berg   cfg80211: add rfk...
515
516
517
  	if (local->ops->rfkill_poll)
  		local->ops->rfkill_poll(&local->hw);
  }
a80f7c0b0   Johannes Berg   mac80211: introdu...
518
519
520
  
  static inline void drv_flush(struct ieee80211_local *local, bool drop)
  {
e1781ed33   Kalle Valo   mac80211: annotat...
521
  	might_sleep();
a80f7c0b0   Johannes Berg   mac80211: introdu...
522
523
524
  	trace_drv_flush(local, drop);
  	if (local->ops->flush)
  		local->ops->flush(&local->hw, drop);
4efc76bdb   Johannes Berg   mac80211: bracket...
525
  	trace_drv_return_void(local);
a80f7c0b0   Johannes Berg   mac80211: introdu...
526
  }
5ce6e438d   Johannes Berg   mac80211: add off...
527
528
529
530
531
  
  static inline void drv_channel_switch(struct ieee80211_local *local,
  				     struct ieee80211_channel_switch *ch_switch)
  {
  	might_sleep();
5ce6e438d   Johannes Berg   mac80211: add off...
532
  	trace_drv_channel_switch(local, ch_switch);
4efc76bdb   Johannes Berg   mac80211: bracket...
533
534
  	local->ops->channel_switch(&local->hw, ch_switch);
  	trace_drv_return_void(local);
5ce6e438d   Johannes Berg   mac80211: add off...
535
  }
15d967532   Bruno Randolf   mac80211: Add ant...
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
  
  static inline int drv_set_antenna(struct ieee80211_local *local,
  				  u32 tx_ant, u32 rx_ant)
  {
  	int ret = -EOPNOTSUPP;
  	might_sleep();
  	if (local->ops->set_antenna)
  		ret = local->ops->set_antenna(&local->hw, tx_ant, rx_ant);
  	trace_drv_set_antenna(local, tx_ant, rx_ant, ret);
  	return ret;
  }
  
  static inline int drv_get_antenna(struct ieee80211_local *local,
  				  u32 *tx_ant, u32 *rx_ant)
  {
  	int ret = -EOPNOTSUPP;
  	might_sleep();
  	if (local->ops->get_antenna)
  		ret = local->ops->get_antenna(&local->hw, tx_ant, rx_ant);
  	trace_drv_get_antenna(local, *tx_ant, *rx_ant, ret);
  	return ret;
  }
21f835896   Johannes Berg   mac80211: impleme...
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
  static inline int drv_remain_on_channel(struct ieee80211_local *local,
  					struct ieee80211_channel *chan,
  					enum nl80211_channel_type chantype,
  					unsigned int duration)
  {
  	int ret;
  
  	might_sleep();
  
  	trace_drv_remain_on_channel(local, chan, chantype, duration);
  	ret = local->ops->remain_on_channel(&local->hw, chan, chantype,
  					    duration);
  	trace_drv_return_int(local, ret);
  
  	return ret;
  }
  
  static inline int drv_cancel_remain_on_channel(struct ieee80211_local *local)
  {
  	int ret;
  
  	might_sleep();
  
  	trace_drv_cancel_remain_on_channel(local);
  	ret = local->ops->cancel_remain_on_channel(&local->hw);
  	trace_drv_return_int(local, ret);
5f16a4361   Johannes Berg   mac80211: support...
584
585
586
  
  	return ret;
  }
38c091590   John W. Linville   mac80211: impleme...
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
  static inline int drv_set_ringparam(struct ieee80211_local *local,
  				    u32 tx, u32 rx)
  {
  	int ret = -ENOTSUPP;
  
  	might_sleep();
  
  	trace_drv_set_ringparam(local, tx, rx);
  	if (local->ops->set_ringparam)
  		ret = local->ops->set_ringparam(&local->hw, tx, rx);
  	trace_drv_return_int(local, ret);
  
  	return ret;
  }
  
  static inline void drv_get_ringparam(struct ieee80211_local *local,
  				     u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max)
  {
  	might_sleep();
  
  	trace_drv_get_ringparam(local, tx, tx_max, rx, rx_max);
  	if (local->ops->get_ringparam)
  		local->ops->get_ringparam(&local->hw, tx, tx_max, rx, rx_max);
  	trace_drv_return_void(local);
  }
e8306f989   Vivek Natarajan   mac80211: Check f...
612
613
614
615
616
617
618
619
620
621
622
623
624
  static inline bool drv_tx_frames_pending(struct ieee80211_local *local)
  {
  	bool ret = false;
  
  	might_sleep();
  
  	trace_drv_tx_frames_pending(local);
  	if (local->ops->tx_frames_pending)
  		ret = local->ops->tx_frames_pending(&local->hw);
  	trace_drv_return_bool(local, ret);
  
  	return ret;
  }
bdbfd6b58   Sujith Manoharan   mac80211: Add new...
625
626
627
628
629
630
631
632
  
  static inline int drv_set_bitrate_mask(struct ieee80211_local *local,
  				       struct ieee80211_sub_if_data *sdata,
  				       const struct cfg80211_bitrate_mask *mask)
  {
  	int ret = -EOPNOTSUPP;
  
  	might_sleep();
7b7eab6fc   Johannes Berg   mac80211: verify ...
633
  	check_sdata_in_driver(sdata);
bdbfd6b58   Sujith Manoharan   mac80211: Add new...
634
635
636
637
638
639
640
641
  	trace_drv_set_bitrate_mask(local, sdata, mask);
  	if (local->ops->set_bitrate_mask)
  		ret = local->ops->set_bitrate_mask(&local->hw,
  						   &sdata->vif, mask);
  	trace_drv_return_int(local, ret);
  
  	return ret;
  }
c68f4b892   Johannes Berg   mac80211: support...
642
643
644
645
  static inline void drv_set_rekey_data(struct ieee80211_local *local,
  				      struct ieee80211_sub_if_data *sdata,
  				      struct cfg80211_gtk_rekey_data *data)
  {
7b7eab6fc   Johannes Berg   mac80211: verify ...
646
  	check_sdata_in_driver(sdata);
c68f4b892   Johannes Berg   mac80211: support...
647
648
649
650
651
  	trace_drv_set_rekey_data(local, sdata, data);
  	if (local->ops->set_rekey_data)
  		local->ops->set_rekey_data(&local->hw, &sdata->vif, data);
  	trace_drv_return_void(local);
  }
615f7b9bb   Meenakshi Venkataraman   mac80211: add dri...
652
653
654
655
656
657
658
659
  static inline void drv_rssi_callback(struct ieee80211_local *local,
  				     const enum ieee80211_rssi_event event)
  {
  	trace_drv_rssi_callback(local, event);
  	if (local->ops->rssi_callback)
  		local->ops->rssi_callback(&local->hw, event);
  	trace_drv_return_void(local);
  }
4049e09ac   Johannes Berg   mac80211: allow r...
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
  
  static inline void
  drv_release_buffered_frames(struct ieee80211_local *local,
  			    struct sta_info *sta, u16 tids, int num_frames,
  			    enum ieee80211_frame_release_type reason,
  			    bool more_data)
  {
  	trace_drv_release_buffered_frames(local, &sta->sta, tids, num_frames,
  					  reason, more_data);
  	if (local->ops->release_buffered_frames)
  		local->ops->release_buffered_frames(&local->hw, &sta->sta, tids,
  						    num_frames, reason,
  						    more_data);
  	trace_drv_return_void(local);
  }
40b964088   Johannes Berg   mac80211: explici...
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
  
  static inline void
  drv_allow_buffered_frames(struct ieee80211_local *local,
  			  struct sta_info *sta, u16 tids, int num_frames,
  			  enum ieee80211_frame_release_type reason,
  			  bool more_data)
  {
  	trace_drv_allow_buffered_frames(local, &sta->sta, tids, num_frames,
  					reason, more_data);
  	if (local->ops->allow_buffered_frames)
  		local->ops->allow_buffered_frames(&local->hw, &sta->sta,
  						  tids, num_frames, reason,
  						  more_data);
  	trace_drv_return_void(local);
  }
244879813   Johannes Berg   mac80211: add dri...
690
  #endif /* __MAC80211_DRIVER_OPS */