cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

driver-ops.h (39128B)


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