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