Merge tag 'arc-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
[sfrench/cifs-2.6.git] / net / mac80211 / driver-ops.h
1 /*
2 * Portions of this file
3 * Copyright(c) 2016 Intel Deutschland GmbH
4 */
5
6 #ifndef __MAC80211_DRIVER_OPS
7 #define __MAC80211_DRIVER_OPS
8
9 #include <net/mac80211.h>
10 #include "ieee80211_i.h"
11 #include "trace.h"
12
13 static inline bool check_sdata_in_driver(struct ieee80211_sub_if_data *sdata)
14 {
15         return !WARN(!(sdata->flags & IEEE80211_SDATA_IN_DRIVER),
16                      "%s:  Failed check-sdata-in-driver check, flags: 0x%x\n",
17                      sdata->dev ? sdata->dev->name : sdata->name, sdata->flags);
18 }
19
20 static inline struct ieee80211_sub_if_data *
21 get_bss_sdata(struct ieee80211_sub_if_data *sdata)
22 {
23         if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
24                 sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
25                                      u.ap);
26
27         return sdata;
28 }
29
30 static inline void drv_tx(struct ieee80211_local *local,
31                           struct ieee80211_tx_control *control,
32                           struct sk_buff *skb)
33 {
34         local->ops->tx(&local->hw, control, skb);
35 }
36
37 static inline void drv_sync_rx_queues(struct ieee80211_local *local,
38                                       struct sta_info *sta)
39 {
40         if (local->ops->sync_rx_queues) {
41                 trace_drv_sync_rx_queues(local, sta->sdata, &sta->sta);
42                 local->ops->sync_rx_queues(&local->hw);
43                 trace_drv_return_void(local);
44         }
45 }
46
47 static inline void drv_get_et_strings(struct ieee80211_sub_if_data *sdata,
48                                       u32 sset, u8 *data)
49 {
50         struct ieee80211_local *local = sdata->local;
51         if (local->ops->get_et_strings) {
52                 trace_drv_get_et_strings(local, sset);
53                 local->ops->get_et_strings(&local->hw, &sdata->vif, sset, data);
54                 trace_drv_return_void(local);
55         }
56 }
57
58 static inline void drv_get_et_stats(struct ieee80211_sub_if_data *sdata,
59                                     struct ethtool_stats *stats,
60                                     u64 *data)
61 {
62         struct ieee80211_local *local = sdata->local;
63         if (local->ops->get_et_stats) {
64                 trace_drv_get_et_stats(local);
65                 local->ops->get_et_stats(&local->hw, &sdata->vif, stats, data);
66                 trace_drv_return_void(local);
67         }
68 }
69
70 static inline int drv_get_et_sset_count(struct ieee80211_sub_if_data *sdata,
71                                         int sset)
72 {
73         struct ieee80211_local *local = sdata->local;
74         int rv = 0;
75         if (local->ops->get_et_sset_count) {
76                 trace_drv_get_et_sset_count(local, sset);
77                 rv = local->ops->get_et_sset_count(&local->hw, &sdata->vif,
78                                                    sset);
79                 trace_drv_return_int(local, rv);
80         }
81         return rv;
82 }
83
84 int drv_start(struct ieee80211_local *local);
85 void drv_stop(struct ieee80211_local *local);
86
87 #ifdef CONFIG_PM
88 static inline int drv_suspend(struct ieee80211_local *local,
89                               struct cfg80211_wowlan *wowlan)
90 {
91         int ret;
92
93         might_sleep();
94
95         trace_drv_suspend(local);
96         ret = local->ops->suspend(&local->hw, wowlan);
97         trace_drv_return_int(local, ret);
98         return ret;
99 }
100
101 static inline int drv_resume(struct ieee80211_local *local)
102 {
103         int ret;
104
105         might_sleep();
106
107         trace_drv_resume(local);
108         ret = local->ops->resume(&local->hw);
109         trace_drv_return_int(local, ret);
110         return ret;
111 }
112
113 static inline void drv_set_wakeup(struct ieee80211_local *local,
114                                   bool enabled)
115 {
116         might_sleep();
117
118         if (!local->ops->set_wakeup)
119                 return;
120
121         trace_drv_set_wakeup(local, enabled);
122         local->ops->set_wakeup(&local->hw, enabled);
123         trace_drv_return_void(local);
124 }
125 #endif
126
127 int drv_add_interface(struct ieee80211_local *local,
128                       struct ieee80211_sub_if_data *sdata);
129
130 int drv_change_interface(struct ieee80211_local *local,
131                          struct ieee80211_sub_if_data *sdata,
132                          enum nl80211_iftype type, bool p2p);
133
134 void drv_remove_interface(struct ieee80211_local *local,
135                           struct ieee80211_sub_if_data *sdata);
136
137 static inline int drv_config(struct ieee80211_local *local, u32 changed)
138 {
139         int ret;
140
141         might_sleep();
142
143         trace_drv_config(local, changed);
144         ret = local->ops->config(&local->hw, changed);
145         trace_drv_return_int(local, ret);
146         return ret;
147 }
148
149 static inline void drv_bss_info_changed(struct ieee80211_local *local,
150                                         struct ieee80211_sub_if_data *sdata,
151                                         struct ieee80211_bss_conf *info,
152                                         u32 changed)
153 {
154         might_sleep();
155
156         if (WARN_ON_ONCE(changed & (BSS_CHANGED_BEACON |
157                                     BSS_CHANGED_BEACON_ENABLED) &&
158                          sdata->vif.type != NL80211_IFTYPE_AP &&
159                          sdata->vif.type != NL80211_IFTYPE_ADHOC &&
160                          sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
161                          sdata->vif.type != NL80211_IFTYPE_OCB))
162                 return;
163
164         if (WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE ||
165                          sdata->vif.type == NL80211_IFTYPE_MONITOR))
166                 return;
167
168         if (!check_sdata_in_driver(sdata))
169                 return;
170
171         trace_drv_bss_info_changed(local, sdata, info, changed);
172         if (local->ops->bss_info_changed)
173                 local->ops->bss_info_changed(&local->hw, &sdata->vif, info, changed);
174         trace_drv_return_void(local);
175 }
176
177 static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
178                                         struct netdev_hw_addr_list *mc_list)
179 {
180         u64 ret = 0;
181
182         trace_drv_prepare_multicast(local, mc_list->count);
183
184         if (local->ops->prepare_multicast)
185                 ret = local->ops->prepare_multicast(&local->hw, mc_list);
186
187         trace_drv_return_u64(local, ret);
188
189         return ret;
190 }
191
192 static inline void drv_configure_filter(struct ieee80211_local *local,
193                                         unsigned int changed_flags,
194                                         unsigned int *total_flags,
195                                         u64 multicast)
196 {
197         might_sleep();
198
199         trace_drv_configure_filter(local, changed_flags, total_flags,
200                                    multicast);
201         local->ops->configure_filter(&local->hw, changed_flags, total_flags,
202                                      multicast);
203         trace_drv_return_void(local);
204 }
205
206 static inline void drv_config_iface_filter(struct ieee80211_local *local,
207                                            struct ieee80211_sub_if_data *sdata,
208                                            unsigned int filter_flags,
209                                            unsigned int changed_flags)
210 {
211         might_sleep();
212
213         trace_drv_config_iface_filter(local, sdata, filter_flags,
214                                       changed_flags);
215         if (local->ops->config_iface_filter)
216                 local->ops->config_iface_filter(&local->hw, &sdata->vif,
217                                                 filter_flags,
218                                                 changed_flags);
219         trace_drv_return_void(local);
220 }
221
222 static inline int drv_set_tim(struct ieee80211_local *local,
223                               struct ieee80211_sta *sta, bool set)
224 {
225         int ret = 0;
226         trace_drv_set_tim(local, sta, set);
227         if (local->ops->set_tim)
228                 ret = local->ops->set_tim(&local->hw, sta, set);
229         trace_drv_return_int(local, ret);
230         return ret;
231 }
232
233 static inline int drv_set_key(struct ieee80211_local *local,
234                               enum set_key_cmd cmd,
235                               struct ieee80211_sub_if_data *sdata,
236                               struct ieee80211_sta *sta,
237                               struct ieee80211_key_conf *key)
238 {
239         int ret;
240
241         might_sleep();
242
243         sdata = get_bss_sdata(sdata);
244         if (!check_sdata_in_driver(sdata))
245                 return -EIO;
246
247         trace_drv_set_key(local, cmd, sdata, sta, key);
248         ret = local->ops->set_key(&local->hw, cmd, &sdata->vif, sta, key);
249         trace_drv_return_int(local, ret);
250         return ret;
251 }
252
253 static inline void drv_update_tkip_key(struct ieee80211_local *local,
254                                        struct ieee80211_sub_if_data *sdata,
255                                        struct ieee80211_key_conf *conf,
256                                        struct sta_info *sta, u32 iv32,
257                                        u16 *phase1key)
258 {
259         struct ieee80211_sta *ista = NULL;
260
261         if (sta)
262                 ista = &sta->sta;
263
264         sdata = get_bss_sdata(sdata);
265         if (!check_sdata_in_driver(sdata))
266                 return;
267
268         trace_drv_update_tkip_key(local, sdata, conf, ista, iv32);
269         if (local->ops->update_tkip_key)
270                 local->ops->update_tkip_key(&local->hw, &sdata->vif, conf,
271                                             ista, iv32, phase1key);
272         trace_drv_return_void(local);
273 }
274
275 static inline int drv_hw_scan(struct ieee80211_local *local,
276                               struct ieee80211_sub_if_data *sdata,
277                               struct ieee80211_scan_request *req)
278 {
279         int ret;
280
281         might_sleep();
282
283         if (!check_sdata_in_driver(sdata))
284                 return -EIO;
285
286         trace_drv_hw_scan(local, sdata);
287         ret = local->ops->hw_scan(&local->hw, &sdata->vif, req);
288         trace_drv_return_int(local, ret);
289         return ret;
290 }
291
292 static inline void drv_cancel_hw_scan(struct ieee80211_local *local,
293                                       struct ieee80211_sub_if_data *sdata)
294 {
295         might_sleep();
296
297         if (!check_sdata_in_driver(sdata))
298                 return;
299
300         trace_drv_cancel_hw_scan(local, sdata);
301         local->ops->cancel_hw_scan(&local->hw, &sdata->vif);
302         trace_drv_return_void(local);
303 }
304
305 static inline int
306 drv_sched_scan_start(struct ieee80211_local *local,
307                      struct ieee80211_sub_if_data *sdata,
308                      struct cfg80211_sched_scan_request *req,
309                      struct ieee80211_scan_ies *ies)
310 {
311         int ret;
312
313         might_sleep();
314
315         if (!check_sdata_in_driver(sdata))
316                 return -EIO;
317
318         trace_drv_sched_scan_start(local, sdata);
319         ret = local->ops->sched_scan_start(&local->hw, &sdata->vif,
320                                               req, ies);
321         trace_drv_return_int(local, ret);
322         return ret;
323 }
324
325 static inline int drv_sched_scan_stop(struct ieee80211_local *local,
326                                       struct ieee80211_sub_if_data *sdata)
327 {
328         int ret;
329
330         might_sleep();
331
332         if (!check_sdata_in_driver(sdata))
333                 return -EIO;
334
335         trace_drv_sched_scan_stop(local, sdata);
336         ret = local->ops->sched_scan_stop(&local->hw, &sdata->vif);
337         trace_drv_return_int(local, ret);
338
339         return ret;
340 }
341
342 static inline void drv_sw_scan_start(struct ieee80211_local *local,
343                                      struct ieee80211_sub_if_data *sdata,
344                                      const u8 *mac_addr)
345 {
346         might_sleep();
347
348         trace_drv_sw_scan_start(local, sdata, mac_addr);
349         if (local->ops->sw_scan_start)
350                 local->ops->sw_scan_start(&local->hw, &sdata->vif, mac_addr);
351         trace_drv_return_void(local);
352 }
353
354 static inline void drv_sw_scan_complete(struct ieee80211_local *local,
355                                         struct ieee80211_sub_if_data *sdata)
356 {
357         might_sleep();
358
359         trace_drv_sw_scan_complete(local, sdata);
360         if (local->ops->sw_scan_complete)
361                 local->ops->sw_scan_complete(&local->hw, &sdata->vif);
362         trace_drv_return_void(local);
363 }
364
365 static inline int drv_get_stats(struct ieee80211_local *local,
366                                 struct ieee80211_low_level_stats *stats)
367 {
368         int ret = -EOPNOTSUPP;
369
370         might_sleep();
371
372         if (local->ops->get_stats)
373                 ret = local->ops->get_stats(&local->hw, stats);
374         trace_drv_get_stats(local, stats, ret);
375
376         return ret;
377 }
378
379 static inline void drv_get_key_seq(struct ieee80211_local *local,
380                                    struct ieee80211_key *key,
381                                    struct ieee80211_key_seq *seq)
382 {
383         if (local->ops->get_key_seq)
384                 local->ops->get_key_seq(&local->hw, &key->conf, seq);
385         trace_drv_get_key_seq(local, &key->conf);
386 }
387
388 static inline int drv_set_frag_threshold(struct ieee80211_local *local,
389                                         u32 value)
390 {
391         int ret = 0;
392
393         might_sleep();
394
395         trace_drv_set_frag_threshold(local, value);
396         if (local->ops->set_frag_threshold)
397                 ret = local->ops->set_frag_threshold(&local->hw, value);
398         trace_drv_return_int(local, ret);
399         return ret;
400 }
401
402 static inline int drv_set_rts_threshold(struct ieee80211_local *local,
403                                         u32 value)
404 {
405         int ret = 0;
406
407         might_sleep();
408
409         trace_drv_set_rts_threshold(local, value);
410         if (local->ops->set_rts_threshold)
411                 ret = local->ops->set_rts_threshold(&local->hw, value);
412         trace_drv_return_int(local, ret);
413         return ret;
414 }
415
416 static inline int drv_set_coverage_class(struct ieee80211_local *local,
417                                          s16 value)
418 {
419         int ret = 0;
420         might_sleep();
421
422         trace_drv_set_coverage_class(local, value);
423         if (local->ops->set_coverage_class)
424                 local->ops->set_coverage_class(&local->hw, value);
425         else
426                 ret = -EOPNOTSUPP;
427
428         trace_drv_return_int(local, ret);
429         return ret;
430 }
431
432 static inline void drv_sta_notify(struct ieee80211_local *local,
433                                   struct ieee80211_sub_if_data *sdata,
434                                   enum sta_notify_cmd cmd,
435                                   struct ieee80211_sta *sta)
436 {
437         sdata = get_bss_sdata(sdata);
438         if (!check_sdata_in_driver(sdata))
439                 return;
440
441         trace_drv_sta_notify(local, sdata, cmd, sta);
442         if (local->ops->sta_notify)
443                 local->ops->sta_notify(&local->hw, &sdata->vif, cmd, sta);
444         trace_drv_return_void(local);
445 }
446
447 static inline int drv_sta_add(struct ieee80211_local *local,
448                               struct ieee80211_sub_if_data *sdata,
449                               struct ieee80211_sta *sta)
450 {
451         int ret = 0;
452
453         might_sleep();
454
455         sdata = get_bss_sdata(sdata);
456         if (!check_sdata_in_driver(sdata))
457                 return -EIO;
458
459         trace_drv_sta_add(local, sdata, sta);
460         if (local->ops->sta_add)
461                 ret = local->ops->sta_add(&local->hw, &sdata->vif, sta);
462
463         trace_drv_return_int(local, ret);
464
465         return ret;
466 }
467
468 static inline void drv_sta_remove(struct ieee80211_local *local,
469                                   struct ieee80211_sub_if_data *sdata,
470                                   struct ieee80211_sta *sta)
471 {
472         might_sleep();
473
474         sdata = get_bss_sdata(sdata);
475         if (!check_sdata_in_driver(sdata))
476                 return;
477
478         trace_drv_sta_remove(local, sdata, sta);
479         if (local->ops->sta_remove)
480                 local->ops->sta_remove(&local->hw, &sdata->vif, sta);
481
482         trace_drv_return_void(local);
483 }
484
485 #ifdef CONFIG_MAC80211_DEBUGFS
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_sta_remove_debugfs(struct ieee80211_local *local,
503                                           struct ieee80211_sub_if_data *sdata,
504                                           struct ieee80211_sta *sta,
505                                           struct dentry *dir)
506 {
507         might_sleep();
508
509         sdata = get_bss_sdata(sdata);
510         check_sdata_in_driver(sdata);
511
512         if (local->ops->sta_remove_debugfs)
513                 local->ops->sta_remove_debugfs(&local->hw, &sdata->vif,
514                                                sta, dir);
515 }
516 #endif
517
518 static inline void drv_sta_pre_rcu_remove(struct ieee80211_local *local,
519                                           struct ieee80211_sub_if_data *sdata,
520                                           struct sta_info *sta)
521 {
522         might_sleep();
523
524         sdata = get_bss_sdata(sdata);
525         if (!check_sdata_in_driver(sdata))
526                 return;
527
528         trace_drv_sta_pre_rcu_remove(local, sdata, &sta->sta);
529         if (local->ops->sta_pre_rcu_remove)
530                 local->ops->sta_pre_rcu_remove(&local->hw, &sdata->vif,
531                                                &sta->sta);
532         trace_drv_return_void(local);
533 }
534
535 __must_check
536 int drv_sta_state(struct ieee80211_local *local,
537                   struct ieee80211_sub_if_data *sdata,
538                   struct sta_info *sta,
539                   enum ieee80211_sta_state old_state,
540                   enum ieee80211_sta_state new_state);
541
542 void drv_sta_rc_update(struct ieee80211_local *local,
543                        struct ieee80211_sub_if_data *sdata,
544                        struct ieee80211_sta *sta, u32 changed);
545
546 static inline void drv_sta_rate_tbl_update(struct ieee80211_local *local,
547                                            struct ieee80211_sub_if_data *sdata,
548                                            struct ieee80211_sta *sta)
549 {
550         sdata = get_bss_sdata(sdata);
551         if (!check_sdata_in_driver(sdata))
552                 return;
553
554         trace_drv_sta_rate_tbl_update(local, sdata, sta);
555         if (local->ops->sta_rate_tbl_update)
556                 local->ops->sta_rate_tbl_update(&local->hw, &sdata->vif, sta);
557
558         trace_drv_return_void(local);
559 }
560
561 static inline void drv_sta_statistics(struct ieee80211_local *local,
562                                       struct ieee80211_sub_if_data *sdata,
563                                       struct ieee80211_sta *sta,
564                                       struct station_info *sinfo)
565 {
566         sdata = get_bss_sdata(sdata);
567         if (!check_sdata_in_driver(sdata))
568                 return;
569
570         trace_drv_sta_statistics(local, sdata, sta);
571         if (local->ops->sta_statistics)
572                 local->ops->sta_statistics(&local->hw, &sdata->vif, sta, sinfo);
573         trace_drv_return_void(local);
574 }
575
576 int drv_conf_tx(struct ieee80211_local *local,
577                 struct ieee80211_sub_if_data *sdata, u16 ac,
578                 const struct ieee80211_tx_queue_params *params);
579
580 u64 drv_get_tsf(struct ieee80211_local *local,
581                 struct ieee80211_sub_if_data *sdata);
582 void drv_set_tsf(struct ieee80211_local *local,
583                  struct ieee80211_sub_if_data *sdata,
584                  u64 tsf);
585 void drv_reset_tsf(struct ieee80211_local *local,
586                    struct ieee80211_sub_if_data *sdata);
587
588 static inline int drv_tx_last_beacon(struct ieee80211_local *local)
589 {
590         int ret = 0; /* default unsupported op for less congestion */
591
592         might_sleep();
593
594         trace_drv_tx_last_beacon(local);
595         if (local->ops->tx_last_beacon)
596                 ret = local->ops->tx_last_beacon(&local->hw);
597         trace_drv_return_int(local, ret);
598         return ret;
599 }
600
601 int drv_ampdu_action(struct ieee80211_local *local,
602                      struct ieee80211_sub_if_data *sdata,
603                      struct ieee80211_ampdu_params *params);
604
605 static inline int drv_get_survey(struct ieee80211_local *local, int idx,
606                                 struct survey_info *survey)
607 {
608         int ret = -EOPNOTSUPP;
609
610         trace_drv_get_survey(local, idx, survey);
611
612         if (local->ops->get_survey)
613                 ret = local->ops->get_survey(&local->hw, idx, survey);
614
615         trace_drv_return_int(local, ret);
616
617         return ret;
618 }
619
620 static inline void drv_rfkill_poll(struct ieee80211_local *local)
621 {
622         might_sleep();
623
624         if (local->ops->rfkill_poll)
625                 local->ops->rfkill_poll(&local->hw);
626 }
627
628 static inline void drv_flush(struct ieee80211_local *local,
629                              struct ieee80211_sub_if_data *sdata,
630                              u32 queues, bool drop)
631 {
632         struct ieee80211_vif *vif = sdata ? &sdata->vif : NULL;
633
634         might_sleep();
635
636         if (sdata && !check_sdata_in_driver(sdata))
637                 return;
638
639         trace_drv_flush(local, queues, drop);
640         if (local->ops->flush)
641                 local->ops->flush(&local->hw, vif, queues, drop);
642         trace_drv_return_void(local);
643 }
644
645 static inline void drv_channel_switch(struct ieee80211_local *local,
646                                       struct ieee80211_sub_if_data *sdata,
647                                       struct ieee80211_channel_switch *ch_switch)
648 {
649         might_sleep();
650
651         trace_drv_channel_switch(local, sdata, ch_switch);
652         local->ops->channel_switch(&local->hw, &sdata->vif, ch_switch);
653         trace_drv_return_void(local);
654 }
655
656
657 static inline int drv_set_antenna(struct ieee80211_local *local,
658                                   u32 tx_ant, u32 rx_ant)
659 {
660         int ret = -EOPNOTSUPP;
661         might_sleep();
662         if (local->ops->set_antenna)
663                 ret = local->ops->set_antenna(&local->hw, tx_ant, rx_ant);
664         trace_drv_set_antenna(local, tx_ant, rx_ant, ret);
665         return ret;
666 }
667
668 static inline int drv_get_antenna(struct ieee80211_local *local,
669                                   u32 *tx_ant, u32 *rx_ant)
670 {
671         int ret = -EOPNOTSUPP;
672         might_sleep();
673         if (local->ops->get_antenna)
674                 ret = local->ops->get_antenna(&local->hw, tx_ant, rx_ant);
675         trace_drv_get_antenna(local, *tx_ant, *rx_ant, ret);
676         return ret;
677 }
678
679 static inline int drv_remain_on_channel(struct ieee80211_local *local,
680                                         struct ieee80211_sub_if_data *sdata,
681                                         struct ieee80211_channel *chan,
682                                         unsigned int duration,
683                                         enum ieee80211_roc_type type)
684 {
685         int ret;
686
687         might_sleep();
688
689         trace_drv_remain_on_channel(local, sdata, chan, duration, type);
690         ret = local->ops->remain_on_channel(&local->hw, &sdata->vif,
691                                             chan, duration, type);
692         trace_drv_return_int(local, ret);
693
694         return ret;
695 }
696
697 static inline int drv_cancel_remain_on_channel(struct ieee80211_local *local)
698 {
699         int ret;
700
701         might_sleep();
702
703         trace_drv_cancel_remain_on_channel(local);
704         ret = local->ops->cancel_remain_on_channel(&local->hw);
705         trace_drv_return_int(local, ret);
706
707         return ret;
708 }
709
710 static inline int drv_set_ringparam(struct ieee80211_local *local,
711                                     u32 tx, u32 rx)
712 {
713         int ret = -ENOTSUPP;
714
715         might_sleep();
716
717         trace_drv_set_ringparam(local, tx, rx);
718         if (local->ops->set_ringparam)
719                 ret = local->ops->set_ringparam(&local->hw, tx, rx);
720         trace_drv_return_int(local, ret);
721
722         return ret;
723 }
724
725 static inline void drv_get_ringparam(struct ieee80211_local *local,
726                                      u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max)
727 {
728         might_sleep();
729
730         trace_drv_get_ringparam(local, tx, tx_max, rx, rx_max);
731         if (local->ops->get_ringparam)
732                 local->ops->get_ringparam(&local->hw, tx, tx_max, rx, rx_max);
733         trace_drv_return_void(local);
734 }
735
736 static inline bool drv_tx_frames_pending(struct ieee80211_local *local)
737 {
738         bool ret = false;
739
740         might_sleep();
741
742         trace_drv_tx_frames_pending(local);
743         if (local->ops->tx_frames_pending)
744                 ret = local->ops->tx_frames_pending(&local->hw);
745         trace_drv_return_bool(local, ret);
746
747         return ret;
748 }
749
750 static inline int drv_set_bitrate_mask(struct ieee80211_local *local,
751                                        struct ieee80211_sub_if_data *sdata,
752                                        const struct cfg80211_bitrate_mask *mask)
753 {
754         int ret = -EOPNOTSUPP;
755
756         might_sleep();
757
758         if (!check_sdata_in_driver(sdata))
759                 return -EIO;
760
761         trace_drv_set_bitrate_mask(local, sdata, mask);
762         if (local->ops->set_bitrate_mask)
763                 ret = local->ops->set_bitrate_mask(&local->hw,
764                                                    &sdata->vif, mask);
765         trace_drv_return_int(local, ret);
766
767         return ret;
768 }
769
770 static inline void drv_set_rekey_data(struct ieee80211_local *local,
771                                       struct ieee80211_sub_if_data *sdata,
772                                       struct cfg80211_gtk_rekey_data *data)
773 {
774         if (!check_sdata_in_driver(sdata))
775                 return;
776
777         trace_drv_set_rekey_data(local, sdata, data);
778         if (local->ops->set_rekey_data)
779                 local->ops->set_rekey_data(&local->hw, &sdata->vif, data);
780         trace_drv_return_void(local);
781 }
782
783 static inline void drv_event_callback(struct ieee80211_local *local,
784                                       struct ieee80211_sub_if_data *sdata,
785                                       const struct ieee80211_event *event)
786 {
787         trace_drv_event_callback(local, sdata, event);
788         if (local->ops->event_callback)
789                 local->ops->event_callback(&local->hw, &sdata->vif, event);
790         trace_drv_return_void(local);
791 }
792
793 static inline void
794 drv_release_buffered_frames(struct ieee80211_local *local,
795                             struct sta_info *sta, u16 tids, int num_frames,
796                             enum ieee80211_frame_release_type reason,
797                             bool more_data)
798 {
799         trace_drv_release_buffered_frames(local, &sta->sta, tids, num_frames,
800                                           reason, more_data);
801         if (local->ops->release_buffered_frames)
802                 local->ops->release_buffered_frames(&local->hw, &sta->sta, tids,
803                                                     num_frames, reason,
804                                                     more_data);
805         trace_drv_return_void(local);
806 }
807
808 static inline void
809 drv_allow_buffered_frames(struct ieee80211_local *local,
810                           struct sta_info *sta, u16 tids, int num_frames,
811                           enum ieee80211_frame_release_type reason,
812                           bool more_data)
813 {
814         trace_drv_allow_buffered_frames(local, &sta->sta, tids, num_frames,
815                                         reason, more_data);
816         if (local->ops->allow_buffered_frames)
817                 local->ops->allow_buffered_frames(&local->hw, &sta->sta,
818                                                   tids, num_frames, reason,
819                                                   more_data);
820         trace_drv_return_void(local);
821 }
822
823 static inline void drv_mgd_prepare_tx(struct ieee80211_local *local,
824                                       struct ieee80211_sub_if_data *sdata)
825 {
826         might_sleep();
827
828         if (!check_sdata_in_driver(sdata))
829                 return;
830         WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION);
831
832         trace_drv_mgd_prepare_tx(local, sdata);
833         if (local->ops->mgd_prepare_tx)
834                 local->ops->mgd_prepare_tx(&local->hw, &sdata->vif);
835         trace_drv_return_void(local);
836 }
837
838 static inline void
839 drv_mgd_protect_tdls_discover(struct ieee80211_local *local,
840                               struct ieee80211_sub_if_data *sdata)
841 {
842         might_sleep();
843
844         if (!check_sdata_in_driver(sdata))
845                 return;
846         WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION);
847
848         trace_drv_mgd_protect_tdls_discover(local, sdata);
849         if (local->ops->mgd_protect_tdls_discover)
850                 local->ops->mgd_protect_tdls_discover(&local->hw, &sdata->vif);
851         trace_drv_return_void(local);
852 }
853
854 static inline int drv_add_chanctx(struct ieee80211_local *local,
855                                   struct ieee80211_chanctx *ctx)
856 {
857         int ret = -EOPNOTSUPP;
858
859         might_sleep();
860
861         trace_drv_add_chanctx(local, ctx);
862         if (local->ops->add_chanctx)
863                 ret = local->ops->add_chanctx(&local->hw, &ctx->conf);
864         trace_drv_return_int(local, ret);
865         if (!ret)
866                 ctx->driver_present = true;
867
868         return ret;
869 }
870
871 static inline void drv_remove_chanctx(struct ieee80211_local *local,
872                                       struct ieee80211_chanctx *ctx)
873 {
874         might_sleep();
875
876         if (WARN_ON(!ctx->driver_present))
877                 return;
878
879         trace_drv_remove_chanctx(local, ctx);
880         if (local->ops->remove_chanctx)
881                 local->ops->remove_chanctx(&local->hw, &ctx->conf);
882         trace_drv_return_void(local);
883         ctx->driver_present = false;
884 }
885
886 static inline void drv_change_chanctx(struct ieee80211_local *local,
887                                       struct ieee80211_chanctx *ctx,
888                                       u32 changed)
889 {
890         might_sleep();
891
892         trace_drv_change_chanctx(local, ctx, changed);
893         if (local->ops->change_chanctx) {
894                 WARN_ON_ONCE(!ctx->driver_present);
895                 local->ops->change_chanctx(&local->hw, &ctx->conf, changed);
896         }
897         trace_drv_return_void(local);
898 }
899
900 static inline int drv_assign_vif_chanctx(struct ieee80211_local *local,
901                                          struct ieee80211_sub_if_data *sdata,
902                                          struct ieee80211_chanctx *ctx)
903 {
904         int ret = 0;
905
906         if (!check_sdata_in_driver(sdata))
907                 return -EIO;
908
909         trace_drv_assign_vif_chanctx(local, sdata, ctx);
910         if (local->ops->assign_vif_chanctx) {
911                 WARN_ON_ONCE(!ctx->driver_present);
912                 ret = local->ops->assign_vif_chanctx(&local->hw,
913                                                      &sdata->vif,
914                                                      &ctx->conf);
915         }
916         trace_drv_return_int(local, ret);
917
918         return ret;
919 }
920
921 static inline void drv_unassign_vif_chanctx(struct ieee80211_local *local,
922                                             struct ieee80211_sub_if_data *sdata,
923                                             struct ieee80211_chanctx *ctx)
924 {
925         might_sleep();
926
927         if (!check_sdata_in_driver(sdata))
928                 return;
929
930         trace_drv_unassign_vif_chanctx(local, sdata, ctx);
931         if (local->ops->unassign_vif_chanctx) {
932                 WARN_ON_ONCE(!ctx->driver_present);
933                 local->ops->unassign_vif_chanctx(&local->hw,
934                                                  &sdata->vif,
935                                                  &ctx->conf);
936         }
937         trace_drv_return_void(local);
938 }
939
940 int drv_switch_vif_chanctx(struct ieee80211_local *local,
941                            struct ieee80211_vif_chanctx_switch *vifs,
942                            int n_vifs, enum ieee80211_chanctx_switch_mode mode);
943
944 static inline int drv_start_ap(struct ieee80211_local *local,
945                                struct ieee80211_sub_if_data *sdata)
946 {
947         int ret = 0;
948
949         might_sleep();
950
951         if (!check_sdata_in_driver(sdata))
952                 return -EIO;
953
954         trace_drv_start_ap(local, sdata, &sdata->vif.bss_conf);
955         if (local->ops->start_ap)
956                 ret = local->ops->start_ap(&local->hw, &sdata->vif);
957         trace_drv_return_int(local, ret);
958         return ret;
959 }
960
961 static inline void drv_stop_ap(struct ieee80211_local *local,
962                                struct ieee80211_sub_if_data *sdata)
963 {
964         if (!check_sdata_in_driver(sdata))
965                 return;
966
967         trace_drv_stop_ap(local, sdata);
968         if (local->ops->stop_ap)
969                 local->ops->stop_ap(&local->hw, &sdata->vif);
970         trace_drv_return_void(local);
971 }
972
973 static inline void
974 drv_reconfig_complete(struct ieee80211_local *local,
975                       enum ieee80211_reconfig_type reconfig_type)
976 {
977         might_sleep();
978
979         trace_drv_reconfig_complete(local, reconfig_type);
980         if (local->ops->reconfig_complete)
981                 local->ops->reconfig_complete(&local->hw, reconfig_type);
982         trace_drv_return_void(local);
983 }
984
985 static inline void
986 drv_set_default_unicast_key(struct ieee80211_local *local,
987                             struct ieee80211_sub_if_data *sdata,
988                             int key_idx)
989 {
990         if (!check_sdata_in_driver(sdata))
991                 return;
992
993         WARN_ON_ONCE(key_idx < -1 || key_idx > 3);
994
995         trace_drv_set_default_unicast_key(local, sdata, key_idx);
996         if (local->ops->set_default_unicast_key)
997                 local->ops->set_default_unicast_key(&local->hw, &sdata->vif,
998                                                     key_idx);
999         trace_drv_return_void(local);
1000 }
1001
1002 #if IS_ENABLED(CONFIG_IPV6)
1003 static inline void drv_ipv6_addr_change(struct ieee80211_local *local,
1004                                         struct ieee80211_sub_if_data *sdata,
1005                                         struct inet6_dev *idev)
1006 {
1007         trace_drv_ipv6_addr_change(local, sdata);
1008         if (local->ops->ipv6_addr_change)
1009                 local->ops->ipv6_addr_change(&local->hw, &sdata->vif, idev);
1010         trace_drv_return_void(local);
1011 }
1012 #endif
1013
1014 static inline void
1015 drv_channel_switch_beacon(struct ieee80211_sub_if_data *sdata,
1016                           struct cfg80211_chan_def *chandef)
1017 {
1018         struct ieee80211_local *local = sdata->local;
1019
1020         if (local->ops->channel_switch_beacon) {
1021                 trace_drv_channel_switch_beacon(local, sdata, chandef);
1022                 local->ops->channel_switch_beacon(&local->hw, &sdata->vif,
1023                                                   chandef);
1024         }
1025 }
1026
1027 static inline int
1028 drv_pre_channel_switch(struct ieee80211_sub_if_data *sdata,
1029                        struct ieee80211_channel_switch *ch_switch)
1030 {
1031         struct ieee80211_local *local = sdata->local;
1032         int ret = 0;
1033
1034         if (!check_sdata_in_driver(sdata))
1035                 return -EIO;
1036
1037         trace_drv_pre_channel_switch(local, sdata, ch_switch);
1038         if (local->ops->pre_channel_switch)
1039                 ret = local->ops->pre_channel_switch(&local->hw, &sdata->vif,
1040                                                      ch_switch);
1041         trace_drv_return_int(local, ret);
1042         return ret;
1043 }
1044
1045 static inline int
1046 drv_post_channel_switch(struct ieee80211_sub_if_data *sdata)
1047 {
1048         struct ieee80211_local *local = sdata->local;
1049         int ret = 0;
1050
1051         if (!check_sdata_in_driver(sdata))
1052                 return -EIO;
1053
1054         trace_drv_post_channel_switch(local, sdata);
1055         if (local->ops->post_channel_switch)
1056                 ret = local->ops->post_channel_switch(&local->hw, &sdata->vif);
1057         trace_drv_return_int(local, ret);
1058         return ret;
1059 }
1060
1061 static inline int drv_join_ibss(struct ieee80211_local *local,
1062                                 struct ieee80211_sub_if_data *sdata)
1063 {
1064         int ret = 0;
1065
1066         might_sleep();
1067         if (!check_sdata_in_driver(sdata))
1068                 return -EIO;
1069
1070         trace_drv_join_ibss(local, sdata, &sdata->vif.bss_conf);
1071         if (local->ops->join_ibss)
1072                 ret = local->ops->join_ibss(&local->hw, &sdata->vif);
1073         trace_drv_return_int(local, ret);
1074         return ret;
1075 }
1076
1077 static inline void drv_leave_ibss(struct ieee80211_local *local,
1078                                   struct ieee80211_sub_if_data *sdata)
1079 {
1080         might_sleep();
1081         if (!check_sdata_in_driver(sdata))
1082                 return;
1083
1084         trace_drv_leave_ibss(local, sdata);
1085         if (local->ops->leave_ibss)
1086                 local->ops->leave_ibss(&local->hw, &sdata->vif);
1087         trace_drv_return_void(local);
1088 }
1089
1090 static inline u32 drv_get_expected_throughput(struct ieee80211_local *local,
1091                                               struct ieee80211_sta *sta)
1092 {
1093         u32 ret = 0;
1094
1095         trace_drv_get_expected_throughput(sta);
1096         if (local->ops->get_expected_throughput)
1097                 ret = local->ops->get_expected_throughput(sta);
1098         trace_drv_return_u32(local, ret);
1099
1100         return ret;
1101 }
1102
1103 static inline int drv_get_txpower(struct ieee80211_local *local,
1104                                   struct ieee80211_sub_if_data *sdata, int *dbm)
1105 {
1106         int ret;
1107
1108         if (!local->ops->get_txpower)
1109                 return -EOPNOTSUPP;
1110
1111         ret = local->ops->get_txpower(&local->hw, &sdata->vif, dbm);
1112         trace_drv_get_txpower(local, sdata, *dbm, ret);
1113
1114         return ret;
1115 }
1116
1117 static inline int
1118 drv_tdls_channel_switch(struct ieee80211_local *local,
1119                         struct ieee80211_sub_if_data *sdata,
1120                         struct ieee80211_sta *sta, u8 oper_class,
1121                         struct cfg80211_chan_def *chandef,
1122                         struct sk_buff *tmpl_skb, u32 ch_sw_tm_ie)
1123 {
1124         int ret;
1125
1126         might_sleep();
1127         if (!check_sdata_in_driver(sdata))
1128                 return -EIO;
1129
1130         if (!local->ops->tdls_channel_switch)
1131                 return -EOPNOTSUPP;
1132
1133         trace_drv_tdls_channel_switch(local, sdata, sta, oper_class, chandef);
1134         ret = local->ops->tdls_channel_switch(&local->hw, &sdata->vif, sta,
1135                                               oper_class, chandef, tmpl_skb,
1136                                               ch_sw_tm_ie);
1137         trace_drv_return_int(local, ret);
1138         return ret;
1139 }
1140
1141 static inline void
1142 drv_tdls_cancel_channel_switch(struct ieee80211_local *local,
1143                                struct ieee80211_sub_if_data *sdata,
1144                                struct ieee80211_sta *sta)
1145 {
1146         might_sleep();
1147         if (!check_sdata_in_driver(sdata))
1148                 return;
1149
1150         if (!local->ops->tdls_cancel_channel_switch)
1151                 return;
1152
1153         trace_drv_tdls_cancel_channel_switch(local, sdata, sta);
1154         local->ops->tdls_cancel_channel_switch(&local->hw, &sdata->vif, sta);
1155         trace_drv_return_void(local);
1156 }
1157
1158 static inline void
1159 drv_tdls_recv_channel_switch(struct ieee80211_local *local,
1160                              struct ieee80211_sub_if_data *sdata,
1161                              struct ieee80211_tdls_ch_sw_params *params)
1162 {
1163         trace_drv_tdls_recv_channel_switch(local, sdata, params);
1164         if (local->ops->tdls_recv_channel_switch)
1165                 local->ops->tdls_recv_channel_switch(&local->hw, &sdata->vif,
1166                                                      params);
1167         trace_drv_return_void(local);
1168 }
1169
1170 static inline void drv_wake_tx_queue(struct ieee80211_local *local,
1171                                      struct txq_info *txq)
1172 {
1173         struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->txq.vif);
1174
1175         if (!check_sdata_in_driver(sdata))
1176                 return;
1177
1178         trace_drv_wake_tx_queue(local, sdata, txq);
1179         local->ops->wake_tx_queue(&local->hw, &txq->txq);
1180 }
1181
1182 #endif /* __MAC80211_DRIVER_OPS */