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