9p: Remove INET dependency
[linux-block.git] / net / mac80211 / driver-ops.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
f59374eb
SS
2/*
3* Portions of this file
4* Copyright(c) 2016 Intel Deutschland GmbH
15fae341 5* Copyright (C) 2018 - 2019, 2021 Intel Corporation
f59374eb
SS
6*/
7
24487981
JB
8#ifndef __MAC80211_DRIVER_OPS
9#define __MAC80211_DRIVER_OPS
10
11#include <net/mac80211.h>
12#include "ieee80211_i.h"
011ad0e9 13#include "trace.h"
24487981 14
c8ad0106
JB
15#define check_sdata_in_driver(sdata) ({ \
16 !WARN_ONCE(!(sdata->flags & IEEE80211_SDATA_IN_DRIVER), \
17 "%s: Failed check-sdata-in-driver check, flags: 0x%x\n", \
18 sdata->dev ? sdata->dev->name : sdata->name, sdata->flags); \
19})
7b7eab6f 20
bc192f89
FF
21static inline struct ieee80211_sub_if_data *
22get_bss_sdata(struct ieee80211_sub_if_data *sdata)
23{
24 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
25 sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
26 u.ap);
27
28 return sdata;
29}
30
36323f81
TH
31static inline void drv_tx(struct ieee80211_local *local,
32 struct ieee80211_tx_control *control,
33 struct sk_buff *skb)
24487981 34{
36323f81 35 local->ops->tx(&local->hw, control, skb);
24487981
JB
36}
37
f59374eb
SS
38static inline void drv_sync_rx_queues(struct ieee80211_local *local,
39 struct sta_info *sta)
40{
41 if (local->ops->sync_rx_queues) {
42 trace_drv_sync_rx_queues(local, sta->sdata, &sta->sta);
43 local->ops->sync_rx_queues(&local->hw);
44 trace_drv_return_void(local);
45 }
46}
47
e352114f
BG
48static inline void drv_get_et_strings(struct ieee80211_sub_if_data *sdata,
49 u32 sset, u8 *data)
50{
51 struct ieee80211_local *local = sdata->local;
52 if (local->ops->get_et_strings) {
53 trace_drv_get_et_strings(local, sset);
54 local->ops->get_et_strings(&local->hw, &sdata->vif, sset, data);
55 trace_drv_return_void(local);
56 }
57}
58
59static inline void drv_get_et_stats(struct ieee80211_sub_if_data *sdata,
60 struct ethtool_stats *stats,
61 u64 *data)
62{
63 struct ieee80211_local *local = sdata->local;
64 if (local->ops->get_et_stats) {
65 trace_drv_get_et_stats(local);
66 local->ops->get_et_stats(&local->hw, &sdata->vif, stats, data);
67 trace_drv_return_void(local);
68 }
69}
70
71static inline int drv_get_et_sset_count(struct ieee80211_sub_if_data *sdata,
72 int sset)
73{
74 struct ieee80211_local *local = sdata->local;
75 int rv = 0;
76 if (local->ops->get_et_sset_count) {
77 trace_drv_get_et_sset_count(local, sset);
78 rv = local->ops->get_et_sset_count(&local->hw, &sdata->vif,
79 sset);
80 trace_drv_return_int(local, rv);
81 }
82 return rv;
83}
84
968a76ce
EP
85int drv_start(struct ieee80211_local *local);
86void drv_stop(struct ieee80211_local *local);
24487981 87
eecc4800
JB
88#ifdef CONFIG_PM
89static inline int drv_suspend(struct ieee80211_local *local,
90 struct cfg80211_wowlan *wowlan)
91{
92 int ret;
93
94 might_sleep();
95
96 trace_drv_suspend(local);
97 ret = local->ops->suspend(&local->hw, wowlan);
98 trace_drv_return_int(local, ret);
99 return ret;
100}
101
102static inline int drv_resume(struct ieee80211_local *local)
103{
104 int ret;
105
106 might_sleep();
107
108 trace_drv_resume(local);
109 ret = local->ops->resume(&local->hw);
110 trace_drv_return_int(local, ret);
111 return ret;
112}
6d52563f
JB
113
114static inline void drv_set_wakeup(struct ieee80211_local *local,
115 bool enabled)
116{
117 might_sleep();
118
119 if (!local->ops->set_wakeup)
120 return;
121
122 trace_drv_set_wakeup(local, enabled);
123 local->ops->set_wakeup(&local->hw, enabled);
124 trace_drv_return_void(local);
125}
eecc4800
JB
126#endif
127
9aae296a
DV
128int drv_add_interface(struct ieee80211_local *local,
129 struct ieee80211_sub_if_data *sdata);
7b7eab6f 130
9aae296a
DV
131int drv_change_interface(struct ieee80211_local *local,
132 struct ieee80211_sub_if_data *sdata,
133 enum nl80211_iftype type, bool p2p);
7b7eab6f 134
9aae296a
DV
135void drv_remove_interface(struct ieee80211_local *local,
136 struct ieee80211_sub_if_data *sdata);
24487981
JB
137
138static inline int drv_config(struct ieee80211_local *local, u32 changed)
139{
e1781ed3
KV
140 int ret;
141
142 might_sleep();
143
4efc76bd 144 trace_drv_config(local, changed);
e1781ed3 145 ret = local->ops->config(&local->hw, changed);
4efc76bd 146 trace_drv_return_int(local, ret);
0a2b8bb2 147 return ret;
24487981
JB
148}
149
7b7090b4
JB
150static inline void drv_vif_cfg_changed(struct ieee80211_local *local,
151 struct ieee80211_sub_if_data *sdata,
152 u64 changed)
153{
154 might_sleep();
155
156 if (!check_sdata_in_driver(sdata))
157 return;
158
159 trace_drv_vif_cfg_changed(local, sdata, changed);
160 if (local->ops->vif_cfg_changed)
161 local->ops->vif_cfg_changed(&local->hw, &sdata->vif, changed);
162 else if (local->ops->bss_info_changed)
163 local->ops->bss_info_changed(&local->hw, &sdata->vif,
164 &sdata->vif.bss_conf, changed);
165 trace_drv_return_void(local);
166}
167
efe9c2bf
JB
168void drv_link_info_changed(struct ieee80211_local *local,
169 struct ieee80211_sub_if_data *sdata,
170 struct ieee80211_bss_conf *info,
171 int link_id, u64 changed);
24487981 172
3ac64bee 173static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
22bedad3 174 struct netdev_hw_addr_list *mc_list)
3ac64bee
JB
175{
176 u64 ret = 0;
177
4efc76bd
JB
178 trace_drv_prepare_multicast(local, mc_list->count);
179
3ac64bee 180 if (local->ops->prepare_multicast)
22bedad3 181 ret = local->ops->prepare_multicast(&local->hw, mc_list);
3ac64bee 182
4efc76bd 183 trace_drv_return_u64(local, ret);
3ac64bee
JB
184
185 return ret;
186}
187
24487981
JB
188static inline void drv_configure_filter(struct ieee80211_local *local,
189 unsigned int changed_flags,
190 unsigned int *total_flags,
3ac64bee 191 u64 multicast)
24487981 192{
3ac64bee
JB
193 might_sleep();
194
0a2b8bb2 195 trace_drv_configure_filter(local, changed_flags, total_flags,
3ac64bee 196 multicast);
4efc76bd
JB
197 local->ops->configure_filter(&local->hw, changed_flags, total_flags,
198 multicast);
199 trace_drv_return_void(local);
24487981
JB
200}
201
1b09b556
AO
202static inline void drv_config_iface_filter(struct ieee80211_local *local,
203 struct ieee80211_sub_if_data *sdata,
204 unsigned int filter_flags,
205 unsigned int changed_flags)
206{
207 might_sleep();
208
209 trace_drv_config_iface_filter(local, sdata, filter_flags,
210 changed_flags);
211 if (local->ops->config_iface_filter)
212 local->ops->config_iface_filter(&local->hw, &sdata->vif,
213 filter_flags,
214 changed_flags);
215 trace_drv_return_void(local);
216}
217
24487981
JB
218static inline int drv_set_tim(struct ieee80211_local *local,
219 struct ieee80211_sta *sta, bool set)
220{
0a2b8bb2 221 int ret = 0;
4efc76bd 222 trace_drv_set_tim(local, sta, set);
24487981 223 if (local->ops->set_tim)
0a2b8bb2 224 ret = local->ops->set_tim(&local->hw, sta, set);
4efc76bd 225 trace_drv_return_int(local, ret);
0a2b8bb2 226 return ret;
24487981
JB
227}
228
efe9c2bf
JB
229int drv_set_key(struct ieee80211_local *local,
230 enum set_key_cmd cmd,
231 struct ieee80211_sub_if_data *sdata,
232 struct ieee80211_sta *sta,
233 struct ieee80211_key_conf *key);
24487981
JB
234
235static inline void drv_update_tkip_key(struct ieee80211_local *local,
b3fbdcf4 236 struct ieee80211_sub_if_data *sdata,
24487981 237 struct ieee80211_key_conf *conf,
b3fbdcf4 238 struct sta_info *sta, u32 iv32,
24487981
JB
239 u16 *phase1key)
240{
b3fbdcf4
JB
241 struct ieee80211_sta *ista = NULL;
242
b3fbdcf4
JB
243 if (sta)
244 ista = &sta->sta;
245
077f4939 246 sdata = get_bss_sdata(sdata);
f6837ba8
JB
247 if (!check_sdata_in_driver(sdata))
248 return;
7b7eab6f 249
4efc76bd 250 trace_drv_update_tkip_key(local, sdata, conf, ista, iv32);
24487981 251 if (local->ops->update_tkip_key)
b3fbdcf4
JB
252 local->ops->update_tkip_key(&local->hw, &sdata->vif, conf,
253 ista, iv32, phase1key);
4efc76bd 254 trace_drv_return_void(local);
24487981
JB
255}
256
257static inline int drv_hw_scan(struct ieee80211_local *local,
a060bbfe 258 struct ieee80211_sub_if_data *sdata,
c56ef672 259 struct ieee80211_scan_request *req)
24487981 260{
e1781ed3
KV
261 int ret;
262
263 might_sleep();
264
f6837ba8
JB
265 if (!check_sdata_in_driver(sdata))
266 return -EIO;
7b7eab6f 267
79f460ca 268 trace_drv_hw_scan(local, sdata);
a060bbfe 269 ret = local->ops->hw_scan(&local->hw, &sdata->vif, req);
4efc76bd 270 trace_drv_return_int(local, ret);
0a2b8bb2 271 return ret;
24487981
JB
272}
273
b856439b
EP
274static inline void drv_cancel_hw_scan(struct ieee80211_local *local,
275 struct ieee80211_sub_if_data *sdata)
276{
277 might_sleep();
278
f6837ba8
JB
279 if (!check_sdata_in_driver(sdata))
280 return;
7b7eab6f 281
b856439b
EP
282 trace_drv_cancel_hw_scan(local, sdata);
283 local->ops->cancel_hw_scan(&local->hw, &sdata->vif);
284 trace_drv_return_void(local);
285}
286
79f460ca
LC
287static inline int
288drv_sched_scan_start(struct ieee80211_local *local,
289 struct ieee80211_sub_if_data *sdata,
290 struct cfg80211_sched_scan_request *req,
633e2713 291 struct ieee80211_scan_ies *ies)
79f460ca
LC
292{
293 int ret;
294
295 might_sleep();
296
f6837ba8
JB
297 if (!check_sdata_in_driver(sdata))
298 return -EIO;
7b7eab6f 299
79f460ca
LC
300 trace_drv_sched_scan_start(local, sdata);
301 ret = local->ops->sched_scan_start(&local->hw, &sdata->vif,
302 req, ies);
303 trace_drv_return_int(local, ret);
304 return ret;
305}
306
37e3308c
JB
307static inline int drv_sched_scan_stop(struct ieee80211_local *local,
308 struct ieee80211_sub_if_data *sdata)
79f460ca 309{
37e3308c
JB
310 int ret;
311
79f460ca
LC
312 might_sleep();
313
f6837ba8
JB
314 if (!check_sdata_in_driver(sdata))
315 return -EIO;
7b7eab6f 316
79f460ca 317 trace_drv_sched_scan_stop(local, sdata);
37e3308c
JB
318 ret = local->ops->sched_scan_stop(&local->hw, &sdata->vif);
319 trace_drv_return_int(local, ret);
320
321 return ret;
79f460ca
LC
322}
323
a344d677
JB
324static inline void drv_sw_scan_start(struct ieee80211_local *local,
325 struct ieee80211_sub_if_data *sdata,
326 const u8 *mac_addr)
24487981 327{
e1781ed3
KV
328 might_sleep();
329
a344d677 330 trace_drv_sw_scan_start(local, sdata, mac_addr);
24487981 331 if (local->ops->sw_scan_start)
a344d677 332 local->ops->sw_scan_start(&local->hw, &sdata->vif, mac_addr);
4efc76bd 333 trace_drv_return_void(local);
24487981
JB
334}
335
a344d677
JB
336static inline void drv_sw_scan_complete(struct ieee80211_local *local,
337 struct ieee80211_sub_if_data *sdata)
24487981 338{
e1781ed3
KV
339 might_sleep();
340
a344d677 341 trace_drv_sw_scan_complete(local, sdata);
24487981 342 if (local->ops->sw_scan_complete)
a344d677 343 local->ops->sw_scan_complete(&local->hw, &sdata->vif);
4efc76bd 344 trace_drv_return_void(local);
24487981
JB
345}
346
347static inline int drv_get_stats(struct ieee80211_local *local,
348 struct ieee80211_low_level_stats *stats)
349{
0a2b8bb2
JB
350 int ret = -EOPNOTSUPP;
351
e1781ed3
KV
352 might_sleep();
353
0a2b8bb2
JB
354 if (local->ops->get_stats)
355 ret = local->ops->get_stats(&local->hw, stats);
356 trace_drv_get_stats(local, stats, ret);
357
358 return ret;
24487981
JB
359}
360
9352c19f
JB
361static inline void drv_get_key_seq(struct ieee80211_local *local,
362 struct ieee80211_key *key,
363 struct ieee80211_key_seq *seq)
24487981 364{
9352c19f
JB
365 if (local->ops->get_key_seq)
366 local->ops->get_key_seq(&local->hw, &key->conf, seq);
367 trace_drv_get_key_seq(local, &key->conf);
24487981
JB
368}
369
f23a4780
AN
370static inline int drv_set_frag_threshold(struct ieee80211_local *local,
371 u32 value)
372{
373 int ret = 0;
374
375 might_sleep();
376
377 trace_drv_set_frag_threshold(local, value);
378 if (local->ops->set_frag_threshold)
379 ret = local->ops->set_frag_threshold(&local->hw, value);
380 trace_drv_return_int(local, ret);
381 return ret;
382}
383
24487981
JB
384static inline int drv_set_rts_threshold(struct ieee80211_local *local,
385 u32 value)
386{
0a2b8bb2 387 int ret = 0;
e1781ed3
KV
388
389 might_sleep();
390
4efc76bd 391 trace_drv_set_rts_threshold(local, value);
24487981 392 if (local->ops->set_rts_threshold)
0a2b8bb2 393 ret = local->ops->set_rts_threshold(&local->hw, value);
4efc76bd 394 trace_drv_return_int(local, ret);
0a2b8bb2 395 return ret;
24487981
JB
396}
397
310bc676 398static inline int drv_set_coverage_class(struct ieee80211_local *local,
a4bcaf55 399 s16 value)
310bc676
LT
400{
401 int ret = 0;
402 might_sleep();
403
4efc76bd 404 trace_drv_set_coverage_class(local, value);
310bc676
LT
405 if (local->ops->set_coverage_class)
406 local->ops->set_coverage_class(&local->hw, value);
407 else
408 ret = -EOPNOTSUPP;
409
4efc76bd 410 trace_drv_return_int(local, ret);
310bc676
LT
411 return ret;
412}
413
24487981 414static inline void drv_sta_notify(struct ieee80211_local *local,
12375ef9 415 struct ieee80211_sub_if_data *sdata,
24487981
JB
416 enum sta_notify_cmd cmd,
417 struct ieee80211_sta *sta)
418{
bc192f89 419 sdata = get_bss_sdata(sdata);
f6837ba8
JB
420 if (!check_sdata_in_driver(sdata))
421 return;
7b7eab6f 422
4efc76bd 423 trace_drv_sta_notify(local, sdata, cmd, sta);
24487981 424 if (local->ops->sta_notify)
12375ef9 425 local->ops->sta_notify(&local->hw, &sdata->vif, cmd, sta);
4efc76bd 426 trace_drv_return_void(local);
24487981
JB
427}
428
34e89507
JB
429static inline int drv_sta_add(struct ieee80211_local *local,
430 struct ieee80211_sub_if_data *sdata,
431 struct ieee80211_sta *sta)
432{
433 int ret = 0;
434
435 might_sleep();
436
bc192f89 437 sdata = get_bss_sdata(sdata);
f6837ba8
JB
438 if (!check_sdata_in_driver(sdata))
439 return -EIO;
7b7eab6f 440
4efc76bd 441 trace_drv_sta_add(local, sdata, sta);
34e89507
JB
442 if (local->ops->sta_add)
443 ret = local->ops->sta_add(&local->hw, &sdata->vif, sta);
34e89507 444
4efc76bd 445 trace_drv_return_int(local, ret);
34e89507
JB
446
447 return ret;
448}
449
450static inline void drv_sta_remove(struct ieee80211_local *local,
451 struct ieee80211_sub_if_data *sdata,
452 struct ieee80211_sta *sta)
453{
454 might_sleep();
455
bc192f89 456 sdata = get_bss_sdata(sdata);
f6837ba8
JB
457 if (!check_sdata_in_driver(sdata))
458 return;
7b7eab6f 459
4efc76bd 460 trace_drv_sta_remove(local, sdata, sta);
34e89507
JB
461 if (local->ops->sta_remove)
462 local->ops->sta_remove(&local->hw, &sdata->vif, sta);
34e89507 463
4efc76bd 464 trace_drv_return_void(local);
34e89507
JB
465}
466
77d2ece6 467#ifdef CONFIG_MAC80211_DEBUGFS
170cd6a6
BB
468static inline void drv_link_add_debugfs(struct ieee80211_local *local,
469 struct ieee80211_sub_if_data *sdata,
470 struct ieee80211_bss_conf *link_conf,
471 struct dentry *dir)
472{
473 might_sleep();
474
475 sdata = get_bss_sdata(sdata);
476 if (!check_sdata_in_driver(sdata))
477 return;
478
479 if (local->ops->link_add_debugfs)
480 local->ops->link_add_debugfs(&local->hw, &sdata->vif,
481 link_conf, dir);
482}
483
77d2ece6
SM
484static inline void drv_sta_add_debugfs(struct ieee80211_local *local,
485 struct ieee80211_sub_if_data *sdata,
486 struct ieee80211_sta *sta,
487 struct dentry *dir)
488{
489 might_sleep();
490
491 sdata = get_bss_sdata(sdata);
f6837ba8
JB
492 if (!check_sdata_in_driver(sdata))
493 return;
77d2ece6
SM
494
495 if (local->ops->sta_add_debugfs)
496 local->ops->sta_add_debugfs(&local->hw, &sdata->vif,
497 sta, dir);
498}
d2caad52
BB
499
500static inline void drv_link_sta_add_debugfs(struct ieee80211_local *local,
501 struct ieee80211_sub_if_data *sdata,
502 struct ieee80211_link_sta *link_sta,
503 struct dentry *dir)
504{
505 might_sleep();
506
507 sdata = get_bss_sdata(sdata);
508 if (!check_sdata_in_driver(sdata))
509 return;
510
511 if (local->ops->link_sta_add_debugfs)
512 local->ops->link_sta_add_debugfs(&local->hw, &sdata->vif,
513 link_sta, dir);
514}
77d2ece6
SM
515#endif
516
6a9d1b91
JB
517static inline void drv_sta_pre_rcu_remove(struct ieee80211_local *local,
518 struct ieee80211_sub_if_data *sdata,
519 struct sta_info *sta)
520{
521 might_sleep();
522
523 sdata = get_bss_sdata(sdata);
f6837ba8
JB
524 if (!check_sdata_in_driver(sdata))
525 return;
6a9d1b91
JB
526
527 trace_drv_sta_pre_rcu_remove(local, sdata, &sta->sta);
528 if (local->ops->sta_pre_rcu_remove)
529 local->ops->sta_pre_rcu_remove(&local->hw, &sdata->vif,
530 &sta->sta);
531 trace_drv_return_void(local);
532}
533
727da60b 534__must_check
f09603a2
JB
535int drv_sta_state(struct ieee80211_local *local,
536 struct ieee80211_sub_if_data *sdata,
537 struct sta_info *sta,
538 enum ieee80211_sta_state old_state,
727da60b 539 enum ieee80211_sta_state new_state);
f09603a2 540
ba905bf4
ARN
541__must_check
542int drv_sta_set_txpwr(struct ieee80211_local *local,
543 struct ieee80211_sub_if_data *sdata,
544 struct sta_info *sta);
545
4fbd572c
DV
546void drv_sta_rc_update(struct ieee80211_local *local,
547 struct ieee80211_sub_if_data *sdata,
548 struct ieee80211_sta *sta, u32 changed);
8f727ef3 549
f815e2b3
JB
550static inline void drv_sta_rate_tbl_update(struct ieee80211_local *local,
551 struct ieee80211_sub_if_data *sdata,
552 struct ieee80211_sta *sta)
553{
554 sdata = get_bss_sdata(sdata);
555 if (!check_sdata_in_driver(sdata))
556 return;
557
558 trace_drv_sta_rate_tbl_update(local, sdata, sta);
559 if (local->ops->sta_rate_tbl_update)
560 local->ops->sta_rate_tbl_update(&local->hw, &sdata->vif, sta);
561
562 trace_drv_return_void(local);
563}
564
2b9a7e1b
JB
565static inline void drv_sta_statistics(struct ieee80211_local *local,
566 struct ieee80211_sub_if_data *sdata,
567 struct ieee80211_sta *sta,
568 struct station_info *sinfo)
569{
570 sdata = get_bss_sdata(sdata);
571 if (!check_sdata_in_driver(sdata))
572 return;
573
574 trace_drv_sta_statistics(local, sdata, sta);
575 if (local->ops->sta_statistics)
576 local->ops->sta_statistics(&local->hw, &sdata->vif, sta, sinfo);
577 trace_drv_return_void(local);
578}
579
b23dcd4a 580int drv_conf_tx(struct ieee80211_local *local,
b3e2130b 581 struct ieee80211_link_data *link, u16 ac,
b23dcd4a 582 const struct ieee80211_tx_queue_params *params);
24487981 583
416eb9fc
DV
584u64 drv_get_tsf(struct ieee80211_local *local,
585 struct ieee80211_sub_if_data *sdata);
586void drv_set_tsf(struct ieee80211_local *local,
587 struct ieee80211_sub_if_data *sdata,
588 u64 tsf);
354d381b
PT
589void drv_offset_tsf(struct ieee80211_local *local,
590 struct ieee80211_sub_if_data *sdata,
591 s64 offset);
416eb9fc
DV
592void drv_reset_tsf(struct ieee80211_local *local,
593 struct ieee80211_sub_if_data *sdata);
24487981
JB
594
595static inline int drv_tx_last_beacon(struct ieee80211_local *local)
596{
02582e9b 597 int ret = 0; /* default unsupported op for less congestion */
e1781ed3
KV
598
599 might_sleep();
600
4efc76bd 601 trace_drv_tx_last_beacon(local);
24487981 602 if (local->ops->tx_last_beacon)
0a2b8bb2 603 ret = local->ops->tx_last_beacon(&local->hw);
4efc76bd 604 trace_drv_return_int(local, ret);
0a2b8bb2 605 return ret;
24487981
JB
606}
607
6db96838
DV
608int drv_ampdu_action(struct ieee80211_local *local,
609 struct ieee80211_sub_if_data *sdata,
50ea05ef 610 struct ieee80211_ampdu_params *params);
1f87f7d3 611
1289723e
HS
612static inline int drv_get_survey(struct ieee80211_local *local, int idx,
613 struct survey_info *survey)
614{
615 int ret = -EOPNOTSUPP;
c466d4ef
JL
616
617 trace_drv_get_survey(local, idx, survey);
618
35dd0509 619 if (local->ops->get_survey)
1289723e 620 ret = local->ops->get_survey(&local->hw, idx, survey);
c466d4ef
JL
621
622 trace_drv_return_int(local, ret);
623
1289723e
HS
624 return ret;
625}
1f87f7d3
JB
626
627static inline void drv_rfkill_poll(struct ieee80211_local *local)
628{
e1781ed3
KV
629 might_sleep();
630
1f87f7d3
JB
631 if (local->ops->rfkill_poll)
632 local->ops->rfkill_poll(&local->hw);
633}
a80f7c0b 634
39ecc01d 635static inline void drv_flush(struct ieee80211_local *local,
77be2c54 636 struct ieee80211_sub_if_data *sdata,
39ecc01d 637 u32 queues, bool drop)
a80f7c0b 638{
77be2c54
EG
639 struct ieee80211_vif *vif = sdata ? &sdata->vif : NULL;
640
e1781ed3
KV
641 might_sleep();
642
f6837ba8
JB
643 if (sdata && !check_sdata_in_driver(sdata))
644 return;
77be2c54 645
39ecc01d 646 trace_drv_flush(local, queues, drop);
a80f7c0b 647 if (local->ops->flush)
77be2c54 648 local->ops->flush(&local->hw, vif, queues, drop);
4efc76bd 649 trace_drv_return_void(local);
a80f7c0b 650}
5ce6e438 651
d00800a2
JB
652static inline void drv_flush_sta(struct ieee80211_local *local,
653 struct ieee80211_sub_if_data *sdata,
654 struct sta_info *sta)
655{
656 might_sleep();
657
658 if (sdata && !check_sdata_in_driver(sdata))
659 return;
660
661 trace_drv_flush_sta(local, sdata, &sta->sta);
662 if (local->ops->flush_sta)
663 local->ops->flush_sta(&local->hw, &sdata->vif, &sta->sta);
664 trace_drv_return_void(local);
665}
666
5ce6e438 667static inline void drv_channel_switch(struct ieee80211_local *local,
0f791eb4
LC
668 struct ieee80211_sub_if_data *sdata,
669 struct ieee80211_channel_switch *ch_switch)
5ce6e438
JB
670{
671 might_sleep();
672
0f791eb4
LC
673 trace_drv_channel_switch(local, sdata, ch_switch);
674 local->ops->channel_switch(&local->hw, &sdata->vif, ch_switch);
4efc76bd 675 trace_drv_return_void(local);
5ce6e438
JB
676}
677
15d96753
BR
678
679static inline int drv_set_antenna(struct ieee80211_local *local,
680 u32 tx_ant, u32 rx_ant)
681{
682 int ret = -EOPNOTSUPP;
683 might_sleep();
684 if (local->ops->set_antenna)
685 ret = local->ops->set_antenna(&local->hw, tx_ant, rx_ant);
686 trace_drv_set_antenna(local, tx_ant, rx_ant, ret);
687 return ret;
688}
689
690static inline int drv_get_antenna(struct ieee80211_local *local,
691 u32 *tx_ant, u32 *rx_ant)
692{
693 int ret = -EOPNOTSUPP;
694 might_sleep();
695 if (local->ops->get_antenna)
696 ret = local->ops->get_antenna(&local->hw, tx_ant, rx_ant);
697 trace_drv_get_antenna(local, *tx_ant, *rx_ant, ret);
698 return ret;
699}
700
21f83589 701static inline int drv_remain_on_channel(struct ieee80211_local *local,
49884568 702 struct ieee80211_sub_if_data *sdata,
21f83589 703 struct ieee80211_channel *chan,
d339d5ca
IP
704 unsigned int duration,
705 enum ieee80211_roc_type type)
21f83589
JB
706{
707 int ret;
708
709 might_sleep();
710
d339d5ca 711 trace_drv_remain_on_channel(local, sdata, chan, duration, type);
49884568 712 ret = local->ops->remain_on_channel(&local->hw, &sdata->vif,
d339d5ca 713 chan, duration, type);
21f83589
JB
714 trace_drv_return_int(local, ret);
715
716 return ret;
717}
718
5db4c4b9
EG
719static inline int
720drv_cancel_remain_on_channel(struct ieee80211_local *local,
721 struct ieee80211_sub_if_data *sdata)
21f83589
JB
722{
723 int ret;
724
725 might_sleep();
726
5db4c4b9
EG
727 trace_drv_cancel_remain_on_channel(local, sdata);
728 ret = local->ops->cancel_remain_on_channel(&local->hw, &sdata->vif);
21f83589 729 trace_drv_return_int(local, ret);
5f16a436
JB
730
731 return ret;
732}
733
38c09159
JL
734static inline int drv_set_ringparam(struct ieee80211_local *local,
735 u32 tx, u32 rx)
736{
737 int ret = -ENOTSUPP;
738
739 might_sleep();
740
741 trace_drv_set_ringparam(local, tx, rx);
742 if (local->ops->set_ringparam)
743 ret = local->ops->set_ringparam(&local->hw, tx, rx);
744 trace_drv_return_int(local, ret);
745
746 return ret;
747}
748
749static inline void drv_get_ringparam(struct ieee80211_local *local,
750 u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max)
751{
752 might_sleep();
753
754 trace_drv_get_ringparam(local, tx, tx_max, rx, rx_max);
755 if (local->ops->get_ringparam)
756 local->ops->get_ringparam(&local->hw, tx, tx_max, rx, rx_max);
757 trace_drv_return_void(local);
758}
759
e8306f98
VN
760static inline bool drv_tx_frames_pending(struct ieee80211_local *local)
761{
762 bool ret = false;
763
764 might_sleep();
765
766 trace_drv_tx_frames_pending(local);
767 if (local->ops->tx_frames_pending)
768 ret = local->ops->tx_frames_pending(&local->hw);
769 trace_drv_return_bool(local, ret);
770
771 return ret;
772}
bdbfd6b5
SM
773
774static inline int drv_set_bitrate_mask(struct ieee80211_local *local,
775 struct ieee80211_sub_if_data *sdata,
776 const struct cfg80211_bitrate_mask *mask)
777{
778 int ret = -EOPNOTSUPP;
779
780 might_sleep();
781
f6837ba8
JB
782 if (!check_sdata_in_driver(sdata))
783 return -EIO;
7b7eab6f 784
bdbfd6b5
SM
785 trace_drv_set_bitrate_mask(local, sdata, mask);
786 if (local->ops->set_bitrate_mask)
787 ret = local->ops->set_bitrate_mask(&local->hw,
788 &sdata->vif, mask);
789 trace_drv_return_int(local, ret);
790
791 return ret;
792}
793
c68f4b89
JB
794static inline void drv_set_rekey_data(struct ieee80211_local *local,
795 struct ieee80211_sub_if_data *sdata,
796 struct cfg80211_gtk_rekey_data *data)
797{
f6837ba8
JB
798 if (!check_sdata_in_driver(sdata))
799 return;
7b7eab6f 800
c68f4b89
JB
801 trace_drv_set_rekey_data(local, sdata, data);
802 if (local->ops->set_rekey_data)
803 local->ops->set_rekey_data(&local->hw, &sdata->vif, data);
804 trace_drv_return_void(local);
805}
806
a8182929
EG
807static inline void drv_event_callback(struct ieee80211_local *local,
808 struct ieee80211_sub_if_data *sdata,
809 const struct ieee80211_event *event)
615f7b9b 810{
a8182929
EG
811 trace_drv_event_callback(local, sdata, event);
812 if (local->ops->event_callback)
813 local->ops->event_callback(&local->hw, &sdata->vif, event);
615f7b9b
MV
814 trace_drv_return_void(local);
815}
4049e09a
JB
816
817static inline void
818drv_release_buffered_frames(struct ieee80211_local *local,
819 struct sta_info *sta, u16 tids, int num_frames,
820 enum ieee80211_frame_release_type reason,
821 bool more_data)
822{
823 trace_drv_release_buffered_frames(local, &sta->sta, tids, num_frames,
824 reason, more_data);
825 if (local->ops->release_buffered_frames)
826 local->ops->release_buffered_frames(&local->hw, &sta->sta, tids,
827 num_frames, reason,
828 more_data);
829 trace_drv_return_void(local);
830}
40b96408
JB
831
832static inline void
833drv_allow_buffered_frames(struct ieee80211_local *local,
834 struct sta_info *sta, u16 tids, int num_frames,
835 enum ieee80211_frame_release_type reason,
836 bool more_data)
837{
838 trace_drv_allow_buffered_frames(local, &sta->sta, tids, num_frames,
839 reason, more_data);
840 if (local->ops->allow_buffered_frames)
841 local->ops->allow_buffered_frames(&local->hw, &sta->sta,
842 tids, num_frames, reason,
843 more_data);
844 trace_drv_return_void(local);
845}
66572cfc 846
a1845fc7 847static inline void drv_mgd_prepare_tx(struct ieee80211_local *local,
d4e36e55 848 struct ieee80211_sub_if_data *sdata,
15fae341 849 struct ieee80211_prep_tx_info *info)
a1845fc7
JB
850{
851 might_sleep();
852
f6837ba8
JB
853 if (!check_sdata_in_driver(sdata))
854 return;
a1845fc7
JB
855 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION);
856
15fae341
JB
857 trace_drv_mgd_prepare_tx(local, sdata, info->duration,
858 info->subtype, info->success);
a1845fc7 859 if (local->ops->mgd_prepare_tx)
15fae341
JB
860 local->ops->mgd_prepare_tx(&local->hw, &sdata->vif, info);
861 trace_drv_return_void(local);
862}
863
864static inline void drv_mgd_complete_tx(struct ieee80211_local *local,
865 struct ieee80211_sub_if_data *sdata,
866 struct ieee80211_prep_tx_info *info)
867{
868 might_sleep();
869
870 if (!check_sdata_in_driver(sdata))
871 return;
872 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION);
873
874 trace_drv_mgd_complete_tx(local, sdata, info->duration,
875 info->subtype, info->success);
876 if (local->ops->mgd_complete_tx)
877 local->ops->mgd_complete_tx(&local->hw, &sdata->vif, info);
a1845fc7
JB
878 trace_drv_return_void(local);
879}
c3645eac 880
ee10f2c7
AN
881static inline void
882drv_mgd_protect_tdls_discover(struct ieee80211_local *local,
883 struct ieee80211_sub_if_data *sdata)
884{
885 might_sleep();
886
887 if (!check_sdata_in_driver(sdata))
888 return;
889 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION);
890
891 trace_drv_mgd_protect_tdls_discover(local, sdata);
892 if (local->ops->mgd_protect_tdls_discover)
893 local->ops->mgd_protect_tdls_discover(&local->hw, &sdata->vif);
894 trace_drv_return_void(local);
895}
896
c3645eac
MK
897static inline int drv_add_chanctx(struct ieee80211_local *local,
898 struct ieee80211_chanctx *ctx)
899{
900 int ret = -EOPNOTSUPP;
901
dcae9e02
C
902 might_sleep();
903
c3645eac
MK
904 trace_drv_add_chanctx(local, ctx);
905 if (local->ops->add_chanctx)
906 ret = local->ops->add_chanctx(&local->hw, &ctx->conf);
907 trace_drv_return_int(local, ret);
8a61af65
JB
908 if (!ret)
909 ctx->driver_present = true;
c3645eac
MK
910
911 return ret;
912}
913
914static inline void drv_remove_chanctx(struct ieee80211_local *local,
915 struct ieee80211_chanctx *ctx)
916{
dcae9e02
C
917 might_sleep();
918
f6837ba8
JB
919 if (WARN_ON(!ctx->driver_present))
920 return;
921
c3645eac
MK
922 trace_drv_remove_chanctx(local, ctx);
923 if (local->ops->remove_chanctx)
924 local->ops->remove_chanctx(&local->hw, &ctx->conf);
925 trace_drv_return_void(local);
8a61af65 926 ctx->driver_present = false;
c3645eac
MK
927}
928
929static inline void drv_change_chanctx(struct ieee80211_local *local,
930 struct ieee80211_chanctx *ctx,
931 u32 changed)
932{
dcae9e02
C
933 might_sleep();
934
c3645eac 935 trace_drv_change_chanctx(local, ctx, changed);
8a61af65
JB
936 if (local->ops->change_chanctx) {
937 WARN_ON_ONCE(!ctx->driver_present);
c3645eac 938 local->ops->change_chanctx(&local->hw, &ctx->conf, changed);
8a61af65 939 }
c3645eac
MK
940 trace_drv_return_void(local);
941}
942
727eff4d
GG
943static inline void drv_verify_link_exists(struct ieee80211_sub_if_data *sdata,
944 struct ieee80211_bss_conf *link_conf)
945{
946 /* deflink always exists, so need to check only for other links */
947 if (sdata->deflink.conf != link_conf)
948 sdata_assert_lock(sdata);
949}
950
efe9c2bf
JB
951int drv_assign_vif_chanctx(struct ieee80211_local *local,
952 struct ieee80211_sub_if_data *sdata,
953 struct ieee80211_bss_conf *link_conf,
954 struct ieee80211_chanctx *ctx);
955void drv_unassign_vif_chanctx(struct ieee80211_local *local,
956 struct ieee80211_sub_if_data *sdata,
957 struct ieee80211_bss_conf *link_conf,
958 struct ieee80211_chanctx *ctx);
42677ed3
DV
959int drv_switch_vif_chanctx(struct ieee80211_local *local,
960 struct ieee80211_vif_chanctx_switch *vifs,
961 int n_vifs, enum ieee80211_chanctx_switch_mode mode);
1a5f0c13 962
1041638f 963static inline int drv_start_ap(struct ieee80211_local *local,
ae7ba17b 964 struct ieee80211_sub_if_data *sdata,
b327c84c 965 struct ieee80211_bss_conf *link_conf)
1041638f
JB
966{
967 int ret = 0;
968
b327c84c 969 /* make sure link_conf is protected */
727eff4d 970 drv_verify_link_exists(sdata, link_conf);
b327c84c 971
dcae9e02
C
972 might_sleep();
973
f6837ba8
JB
974 if (!check_sdata_in_driver(sdata))
975 return -EIO;
1041638f 976
b327c84c 977 trace_drv_start_ap(local, sdata, link_conf);
1041638f 978 if (local->ops->start_ap)
b327c84c 979 ret = local->ops->start_ap(&local->hw, &sdata->vif, link_conf);
1041638f
JB
980 trace_drv_return_int(local, ret);
981 return ret;
982}
983
984static inline void drv_stop_ap(struct ieee80211_local *local,
ae7ba17b 985 struct ieee80211_sub_if_data *sdata,
b327c84c 986 struct ieee80211_bss_conf *link_conf)
1041638f 987{
b327c84c 988 /* make sure link_conf is protected */
727eff4d 989 drv_verify_link_exists(sdata, link_conf);
b327c84c 990
f6837ba8
JB
991 if (!check_sdata_in_driver(sdata))
992 return;
1041638f 993
b327c84c 994 trace_drv_stop_ap(local, sdata, link_conf);
1041638f 995 if (local->ops->stop_ap)
b327c84c 996 local->ops->stop_ap(&local->hw, &sdata->vif, link_conf);
1041638f
JB
997 trace_drv_return_void(local);
998}
999
cf2c92d8
EP
1000static inline void
1001drv_reconfig_complete(struct ieee80211_local *local,
1002 enum ieee80211_reconfig_type reconfig_type)
9214ad7f
JB
1003{
1004 might_sleep();
1005
cf2c92d8
EP
1006 trace_drv_reconfig_complete(local, reconfig_type);
1007 if (local->ops->reconfig_complete)
1008 local->ops->reconfig_complete(&local->hw, reconfig_type);
9214ad7f
JB
1009 trace_drv_return_void(local);
1010}
1011
de5fad81
YD
1012static inline void
1013drv_set_default_unicast_key(struct ieee80211_local *local,
1014 struct ieee80211_sub_if_data *sdata,
1015 int key_idx)
1016{
f6837ba8
JB
1017 if (!check_sdata_in_driver(sdata))
1018 return;
de5fad81
YD
1019
1020 WARN_ON_ONCE(key_idx < -1 || key_idx > 3);
1021
1022 trace_drv_set_default_unicast_key(local, sdata, key_idx);
1023 if (local->ops->set_default_unicast_key)
1024 local->ops->set_default_unicast_key(&local->hw, &sdata->vif,
1025 key_idx);
1026 trace_drv_return_void(local);
1027}
1028
a65240c1
JB
1029#if IS_ENABLED(CONFIG_IPV6)
1030static inline void drv_ipv6_addr_change(struct ieee80211_local *local,
1031 struct ieee80211_sub_if_data *sdata,
1032 struct inet6_dev *idev)
1033{
1034 trace_drv_ipv6_addr_change(local, sdata);
1035 if (local->ops->ipv6_addr_change)
1036 local->ops->ipv6_addr_change(&local->hw, &sdata->vif, idev);
1037 trace_drv_return_void(local);
1038}
1039#endif
1040
73da7d5b
SW
1041static inline void
1042drv_channel_switch_beacon(struct ieee80211_sub_if_data *sdata,
1043 struct cfg80211_chan_def *chandef)
1044{
1045 struct ieee80211_local *local = sdata->local;
1046
1047 if (local->ops->channel_switch_beacon) {
1048 trace_drv_channel_switch_beacon(local, sdata, chandef);
1049 local->ops->channel_switch_beacon(&local->hw, &sdata->vif,
1050 chandef);
1051 }
1052}
1053
6d027bcc
LC
1054static inline int
1055drv_pre_channel_switch(struct ieee80211_sub_if_data *sdata,
1056 struct ieee80211_channel_switch *ch_switch)
1057{
1058 struct ieee80211_local *local = sdata->local;
1059 int ret = 0;
1060
1061 if (!check_sdata_in_driver(sdata))
1062 return -EIO;
1063
1064 trace_drv_pre_channel_switch(local, sdata, ch_switch);
1065 if (local->ops->pre_channel_switch)
1066 ret = local->ops->pre_channel_switch(&local->hw, &sdata->vif,
1067 ch_switch);
1068 trace_drv_return_int(local, ret);
1069 return ret;
1070}
1071
f1d65583
LC
1072static inline int
1073drv_post_channel_switch(struct ieee80211_sub_if_data *sdata)
1074{
1075 struct ieee80211_local *local = sdata->local;
1076 int ret = 0;
1077
1078 if (!check_sdata_in_driver(sdata))
1079 return -EIO;
1080
1081 trace_drv_post_channel_switch(local, sdata);
1082 if (local->ops->post_channel_switch)
1083 ret = local->ops->post_channel_switch(&local->hw, &sdata->vif);
1084 trace_drv_return_int(local, ret);
1085 return ret;
1086}
1087
b9cc81d8
SS
1088static inline void
1089drv_abort_channel_switch(struct ieee80211_sub_if_data *sdata)
1090{
1091 struct ieee80211_local *local = sdata->local;
1092
1093 if (!check_sdata_in_driver(sdata))
1094 return;
1095
1096 trace_drv_abort_channel_switch(local, sdata);
1097
1098 if (local->ops->abort_channel_switch)
1099 local->ops->abort_channel_switch(&local->hw, &sdata->vif);
1100}
1101
fafd2bce
SS
1102static inline void
1103drv_channel_switch_rx_beacon(struct ieee80211_sub_if_data *sdata,
1104 struct ieee80211_channel_switch *ch_switch)
1105{
1106 struct ieee80211_local *local = sdata->local;
1107
1108 if (!check_sdata_in_driver(sdata))
1109 return;
1110
1111 trace_drv_channel_switch_rx_beacon(local, sdata, ch_switch);
1112 if (local->ops->channel_switch_rx_beacon)
1113 local->ops->channel_switch_rx_beacon(&local->hw, &sdata->vif,
1114 ch_switch);
1115}
1116
55fff501
JB
1117static inline int drv_join_ibss(struct ieee80211_local *local,
1118 struct ieee80211_sub_if_data *sdata)
1119{
1120 int ret = 0;
1121
1122 might_sleep();
f6837ba8
JB
1123 if (!check_sdata_in_driver(sdata))
1124 return -EIO;
55fff501
JB
1125
1126 trace_drv_join_ibss(local, sdata, &sdata->vif.bss_conf);
1127 if (local->ops->join_ibss)
1128 ret = local->ops->join_ibss(&local->hw, &sdata->vif);
1129 trace_drv_return_int(local, ret);
1130 return ret;
1131}
1132
1133static inline void drv_leave_ibss(struct ieee80211_local *local,
1134 struct ieee80211_sub_if_data *sdata)
1135{
1136 might_sleep();
f6837ba8
JB
1137 if (!check_sdata_in_driver(sdata))
1138 return;
55fff501
JB
1139
1140 trace_drv_leave_ibss(local, sdata);
1141 if (local->ops->leave_ibss)
1142 local->ops->leave_ibss(&local->hw, &sdata->vif);
1143 trace_drv_return_void(local);
1144}
1145
cca674d4 1146static inline u32 drv_get_expected_throughput(struct ieee80211_local *local,
4fdbc67a 1147 struct sta_info *sta)
cca674d4
AQ
1148{
1149 u32 ret = 0;
1150
4fdbc67a
MA
1151 trace_drv_get_expected_throughput(&sta->sta);
1152 if (local->ops->get_expected_throughput && sta->uploaded)
1153 ret = local->ops->get_expected_throughput(&local->hw, &sta->sta);
cca674d4
AQ
1154 trace_drv_return_u32(local, ret);
1155
1156 return ret;
1157}
1158
5b3dc42b
FF
1159static inline int drv_get_txpower(struct ieee80211_local *local,
1160 struct ieee80211_sub_if_data *sdata, int *dbm)
1161{
1162 int ret;
1163
1164 if (!local->ops->get_txpower)
1165 return -EOPNOTSUPP;
1166
1167 ret = local->ops->get_txpower(&local->hw, &sdata->vif, dbm);
1168 trace_drv_get_txpower(local, sdata, *dbm, ret);
1169
1170 return ret;
1171}
1172
a7a6bdd0
AN
1173static inline int
1174drv_tdls_channel_switch(struct ieee80211_local *local,
1175 struct ieee80211_sub_if_data *sdata,
1176 struct ieee80211_sta *sta, u8 oper_class,
1177 struct cfg80211_chan_def *chandef,
1178 struct sk_buff *tmpl_skb, u32 ch_sw_tm_ie)
1179{
1180 int ret;
1181
1182 might_sleep();
1183 if (!check_sdata_in_driver(sdata))
1184 return -EIO;
1185
1186 if (!local->ops->tdls_channel_switch)
1187 return -EOPNOTSUPP;
1188
1189 trace_drv_tdls_channel_switch(local, sdata, sta, oper_class, chandef);
1190 ret = local->ops->tdls_channel_switch(&local->hw, &sdata->vif, sta,
1191 oper_class, chandef, tmpl_skb,
1192 ch_sw_tm_ie);
1193 trace_drv_return_int(local, ret);
1194 return ret;
1195}
1196
1197static inline void
1198drv_tdls_cancel_channel_switch(struct ieee80211_local *local,
1199 struct ieee80211_sub_if_data *sdata,
1200 struct ieee80211_sta *sta)
1201{
1202 might_sleep();
1203 if (!check_sdata_in_driver(sdata))
1204 return;
1205
1206 if (!local->ops->tdls_cancel_channel_switch)
1207 return;
1208
1209 trace_drv_tdls_cancel_channel_switch(local, sdata, sta);
1210 local->ops->tdls_cancel_channel_switch(&local->hw, &sdata->vif, sta);
1211 trace_drv_return_void(local);
1212}
1213
8a4d32f3
AN
1214static inline void
1215drv_tdls_recv_channel_switch(struct ieee80211_local *local,
1216 struct ieee80211_sub_if_data *sdata,
1217 struct ieee80211_tdls_ch_sw_params *params)
1218{
1219 trace_drv_tdls_recv_channel_switch(local, sdata, params);
1220 if (local->ops->tdls_recv_channel_switch)
1221 local->ops->tdls_recv_channel_switch(&local->hw, &sdata->vif,
1222 params);
1223 trace_drv_return_void(local);
1224}
1225
e7881bd5
JB
1226static inline void drv_wake_tx_queue(struct ieee80211_local *local,
1227 struct txq_info *txq)
ba8c3d6f 1228{
e7881bd5
JB
1229 struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->txq.vif);
1230
db7205af
JB
1231 /* In reconfig don't transmit now, but mark for waking later */
1232 if (local->in_reconfig) {
4444bc21 1233 set_bit(IEEE80211_TXQ_DIRTY, &txq->flags);
4856bfd2 1234 return;
db7205af 1235 }
4856bfd2 1236
e7881bd5
JB
1237 if (!check_sdata_in_driver(sdata))
1238 return;
1239
1240 trace_drv_wake_tx_queue(local, sdata, txq);
1241 local->ops->wake_tx_queue(&local->hw, &txq->txq);
ba8c3d6f
FF
1242}
1243
18667600
THJ
1244static inline void schedule_and_wake_txq(struct ieee80211_local *local,
1245 struct txq_info *txqi)
1246{
390298e8 1247 ieee80211_schedule_txq(&local->hw, &txqi->txq);
18667600
THJ
1248 drv_wake_tx_queue(local, txqi);
1249}
1250
9739fe29
SS
1251static inline int drv_can_aggregate_in_amsdu(struct ieee80211_local *local,
1252 struct sk_buff *head,
1253 struct sk_buff *skb)
1254{
1255 if (!local->ops->can_aggregate_in_amsdu)
1256 return true;
1257
1258 return local->ops->can_aggregate_in_amsdu(&local->hw, head, skb);
1259}
1260
bc847970
PKC
1261static inline int
1262drv_get_ftm_responder_stats(struct ieee80211_local *local,
1263 struct ieee80211_sub_if_data *sdata,
1264 struct cfg80211_ftm_responder_stats *ftm_stats)
1265{
1266 u32 ret = -EOPNOTSUPP;
1267
1268 if (local->ops->get_ftm_responder_stats)
1269 ret = local->ops->get_ftm_responder_stats(&local->hw,
1270 &sdata->vif,
1271 ftm_stats);
1272 trace_drv_get_ftm_responder_stats(local, sdata, ftm_stats);
1273
1274 return ret;
1275}
1276
cee7013b
JB
1277static inline int drv_start_pmsr(struct ieee80211_local *local,
1278 struct ieee80211_sub_if_data *sdata,
1279 struct cfg80211_pmsr_request *request)
1280{
1281 int ret = -EOPNOTSUPP;
1282
1283 might_sleep();
1284 if (!check_sdata_in_driver(sdata))
1285 return -EIO;
1286
1287 trace_drv_start_pmsr(local, sdata);
1288
1289 if (local->ops->start_pmsr)
1290 ret = local->ops->start_pmsr(&local->hw, &sdata->vif, request);
1291 trace_drv_return_int(local, ret);
1292
1293 return ret;
1294}
1295
1296static inline void drv_abort_pmsr(struct ieee80211_local *local,
1297 struct ieee80211_sub_if_data *sdata,
1298 struct cfg80211_pmsr_request *request)
1299{
1300 trace_drv_abort_pmsr(local, sdata);
1301
1302 might_sleep();
1303 if (!check_sdata_in_driver(sdata))
1304 return;
1305
1306 if (local->ops->abort_pmsr)
1307 local->ops->abort_pmsr(&local->hw, &sdata->vif, request);
1308 trace_drv_return_void(local);
1309}
1310
708d50ed
AB
1311static inline int drv_start_nan(struct ieee80211_local *local,
1312 struct ieee80211_sub_if_data *sdata,
1313 struct cfg80211_nan_conf *conf)
1314{
1315 int ret;
1316
1317 might_sleep();
1318 check_sdata_in_driver(sdata);
1319
1320 trace_drv_start_nan(local, sdata, conf);
1321 ret = local->ops->start_nan(&local->hw, &sdata->vif, conf);
1322 trace_drv_return_int(local, ret);
1323 return ret;
1324}
1325
1326static inline void drv_stop_nan(struct ieee80211_local *local,
1327 struct ieee80211_sub_if_data *sdata)
1328{
1329 might_sleep();
1330 check_sdata_in_driver(sdata);
1331
1332 trace_drv_stop_nan(local, sdata);
1333 local->ops->stop_nan(&local->hw, &sdata->vif);
1334 trace_drv_return_void(local);
1335}
1336
5953ff6d
AB
1337static inline int drv_nan_change_conf(struct ieee80211_local *local,
1338 struct ieee80211_sub_if_data *sdata,
1339 struct cfg80211_nan_conf *conf,
1340 u32 changes)
1341{
1342 int ret;
1343
1344 might_sleep();
1345 check_sdata_in_driver(sdata);
1346
1347 if (!local->ops->nan_change_conf)
1348 return -EOPNOTSUPP;
1349
1350 trace_drv_nan_change_conf(local, sdata, conf, changes);
1351 ret = local->ops->nan_change_conf(&local->hw, &sdata->vif, conf,
1352 changes);
1353 trace_drv_return_int(local, ret);
1354
1355 return ret;
1356}
1357
167e33f4
AB
1358static inline int drv_add_nan_func(struct ieee80211_local *local,
1359 struct ieee80211_sub_if_data *sdata,
1360 const struct cfg80211_nan_func *nan_func)
1361{
1362 int ret;
1363
1364 might_sleep();
1365 check_sdata_in_driver(sdata);
1366
1367 if (!local->ops->add_nan_func)
1368 return -EOPNOTSUPP;
1369
1370 trace_drv_add_nan_func(local, sdata, nan_func);
1371 ret = local->ops->add_nan_func(&local->hw, &sdata->vif, nan_func);
1372 trace_drv_return_int(local, ret);
1373
1374 return ret;
1375}
1376
1377static inline void drv_del_nan_func(struct ieee80211_local *local,
1378 struct ieee80211_sub_if_data *sdata,
1379 u8 instance_id)
1380{
1381 might_sleep();
1382 check_sdata_in_driver(sdata);
1383
1384 trace_drv_del_nan_func(local, sdata, instance_id);
1385 if (local->ops->del_nan_func)
1386 local->ops->del_nan_func(&local->hw, &sdata->vif, instance_id);
1387 trace_drv_return_void(local);
1388}
1389
370f51d5
T
1390static inline int drv_set_tid_config(struct ieee80211_local *local,
1391 struct ieee80211_sub_if_data *sdata,
1392 struct ieee80211_sta *sta,
1393 struct cfg80211_tid_config *tid_conf)
1394{
1395 int ret;
1396
1397 might_sleep();
1398 ret = local->ops->set_tid_config(&local->hw, &sdata->vif, sta,
1399 tid_conf);
1400 trace_drv_return_int(local, ret);
1401
1402 return ret;
1403}
1404
1405static inline int drv_reset_tid_config(struct ieee80211_local *local,
1406 struct ieee80211_sub_if_data *sdata,
60c2ef0e 1407 struct ieee80211_sta *sta, u8 tids)
370f51d5
T
1408{
1409 int ret;
1410
1411 might_sleep();
60c2ef0e 1412 ret = local->ops->reset_tid_config(&local->hw, &sdata->vif, sta, tids);
370f51d5
T
1413 trace_drv_return_int(local, ret);
1414
1415 return ret;
1416}
6aea26ce
FF
1417
1418static inline void drv_update_vif_offload(struct ieee80211_local *local,
1419 struct ieee80211_sub_if_data *sdata)
1420{
1421 might_sleep();
1422 check_sdata_in_driver(sdata);
1423
1424 if (!local->ops->update_vif_offload)
1425 return;
1426
1427 trace_drv_update_vif_offload(local, sdata);
1428 local->ops->update_vif_offload(&local->hw, &sdata->vif);
1429 trace_drv_return_void(local);
1430}
1431
1ff4e8f2
FF
1432static inline void drv_sta_set_4addr(struct ieee80211_local *local,
1433 struct ieee80211_sub_if_data *sdata,
1434 struct ieee80211_sta *sta, bool enabled)
1435{
1436 sdata = get_bss_sdata(sdata);
1437 if (!check_sdata_in_driver(sdata))
1438 return;
1439
1440 trace_drv_sta_set_4addr(local, sdata, sta, enabled);
1441 if (local->ops->sta_set_4addr)
1442 local->ops->sta_set_4addr(&local->hw, &sdata->vif, sta, enabled);
1443 trace_drv_return_void(local);
1444}
1445
80a915ec
FF
1446static inline void drv_sta_set_decap_offload(struct ieee80211_local *local,
1447 struct ieee80211_sub_if_data *sdata,
1448 struct ieee80211_sta *sta,
1449 bool enabled)
1450{
1451 sdata = get_bss_sdata(sdata);
1452 if (!check_sdata_in_driver(sdata))
1453 return;
1454
1455 trace_drv_sta_set_decap_offload(local, sdata, sta, enabled);
1456 if (local->ops->sta_set_decap_offload)
1457 local->ops->sta_set_decap_offload(&local->hw, &sdata->vif, sta,
1458 enabled);
1459 trace_drv_return_void(local);
1460}
1461
f5a4c24e
LB
1462static inline void drv_add_twt_setup(struct ieee80211_local *local,
1463 struct ieee80211_sub_if_data *sdata,
1464 struct ieee80211_sta *sta,
1465 struct ieee80211_twt_setup *twt)
1466{
1467 struct ieee80211_twt_params *twt_agrt;
1468
1469 might_sleep();
1470
1471 if (!check_sdata_in_driver(sdata))
1472 return;
1473
1474 twt_agrt = (void *)twt->params;
1475
1476 trace_drv_add_twt_setup(local, sta, twt, twt_agrt);
1477 local->ops->add_twt_setup(&local->hw, sta, twt);
1478 trace_drv_return_void(local);
1479}
1480
1481static inline void drv_twt_teardown_request(struct ieee80211_local *local,
1482 struct ieee80211_sub_if_data *sdata,
1483 struct ieee80211_sta *sta,
1484 u8 flowid)
1485{
1486 might_sleep();
1487 if (!check_sdata_in_driver(sdata))
1488 return;
1489
1490 if (!local->ops->twt_teardown_request)
1491 return;
1492
1493 trace_drv_twt_teardown_request(local, sta, flowid);
1494 local->ops->twt_teardown_request(&local->hw, sta, flowid);
1495 trace_drv_return_void(local);
1496}
1497
d787a3e3
FF
1498static inline int drv_net_fill_forward_path(struct ieee80211_local *local,
1499 struct ieee80211_sub_if_data *sdata,
1500 struct ieee80211_sta *sta,
1501 struct net_device_path_ctx *ctx,
1502 struct net_device_path *path)
1503{
1504 int ret = -EOPNOTSUPP;
1505
1506 sdata = get_bss_sdata(sdata);
1507 if (!check_sdata_in_driver(sdata))
1508 return -EIO;
1509
1510 trace_drv_net_fill_forward_path(local, sdata, sta);
1511 if (local->ops->net_fill_forward_path)
1512 ret = local->ops->net_fill_forward_path(&local->hw,
1513 &sdata->vif, sta,
1514 ctx, path);
1515 trace_drv_return_int(local, ret);
1516
1517 return ret;
1518}
1519
61587f15
FF
1520static inline int drv_net_setup_tc(struct ieee80211_local *local,
1521 struct ieee80211_sub_if_data *sdata,
1522 struct net_device *dev,
1523 enum tc_setup_type type, void *type_data)
1524{
1525 int ret = -EOPNOTSUPP;
1526
1527 sdata = get_bss_sdata(sdata);
1528 trace_drv_net_setup_tc(local, sdata, type);
1529 if (local->ops->net_setup_tc)
1530 ret = local->ops->net_setup_tc(&local->hw, &sdata->vif, dev,
1531 type, type_data);
1532 trace_drv_return_int(local, ret);
1533
1534 return ret;
1535}
1536
efe9c2bf
JB
1537int drv_change_vif_links(struct ieee80211_local *local,
1538 struct ieee80211_sub_if_data *sdata,
1539 u16 old_links, u16 new_links,
1540 struct ieee80211_bss_conf *old[IEEE80211_MLD_MAX_NUM_LINKS]);
1541int drv_change_sta_links(struct ieee80211_local *local,
1542 struct ieee80211_sub_if_data *sdata,
1543 struct ieee80211_sta *sta,
1544 u16 old_links, u16 new_links);
cb71f1d1 1545
24487981 1546#endif /* __MAC80211_DRIVER_OPS */