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