Linux Audio

Check our new training course

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