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