| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright 2002-2005, Instant802 Networks, Inc. |
|---|
| 3 | 4 | * Copyright 2005, Devicescape Software, Inc. |
|---|
| 4 | 5 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
|---|
| 5 | 6 | * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> |
|---|
| 6 | 7 | * Copyright 2013-2015 Intel Mobile Communications GmbH |
|---|
| 7 | | - * Copyright (C) 2018 Intel Corporation |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 10 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 11 | | - * published by the Free Software Foundation. |
|---|
| 8 | + * Copyright (C) 2018-2020 Intel Corporation |
|---|
| 12 | 9 | */ |
|---|
| 13 | 10 | |
|---|
| 14 | 11 | #ifndef IEEE80211_I_H |
|---|
| .. | .. |
|---|
| 96 | 93 | size_t supp_rates_len; |
|---|
| 97 | 94 | struct ieee80211_rate *beacon_rate; |
|---|
| 98 | 95 | |
|---|
| 96 | + u32 vht_cap_info; |
|---|
| 97 | + |
|---|
| 99 | 98 | /* |
|---|
| 100 | 99 | * During association, we save an ERP value from a probe response so |
|---|
| 101 | 100 | * that we can feed ERP info to the driver when handling the |
|---|
| .. | .. |
|---|
| 147 | 146 | #define TX_DROP ((__force ieee80211_tx_result) 1u) |
|---|
| 148 | 147 | #define TX_QUEUED ((__force ieee80211_tx_result) 2u) |
|---|
| 149 | 148 | |
|---|
| 150 | | -#define IEEE80211_TX_NO_SEQNO BIT(0) |
|---|
| 151 | 149 | #define IEEE80211_TX_UNICAST BIT(1) |
|---|
| 152 | 150 | #define IEEE80211_TX_PS_BUFFERED BIT(2) |
|---|
| 153 | 151 | |
|---|
| .. | .. |
|---|
| 201 | 199 | }; |
|---|
| 202 | 200 | |
|---|
| 203 | 201 | struct ieee80211_rx_data { |
|---|
| 204 | | - struct napi_struct *napi; |
|---|
| 202 | + struct list_head *list; |
|---|
| 205 | 203 | struct sk_buff *skb; |
|---|
| 206 | 204 | struct ieee80211_local *local; |
|---|
| 207 | 205 | struct ieee80211_sub_if_data *sdata; |
|---|
| .. | .. |
|---|
| 250 | 248 | u8 *head, *tail; |
|---|
| 251 | 249 | int head_len, tail_len; |
|---|
| 252 | 250 | struct ieee80211_meshconf_ie *meshconf; |
|---|
| 253 | | - u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM]; |
|---|
| 254 | | - u8 csa_current_counter; |
|---|
| 251 | + u16 cntdwn_counter_offsets[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; |
|---|
| 252 | + u8 cntdwn_current_counter; |
|---|
| 255 | 253 | struct rcu_head rcu_head; |
|---|
| 256 | 254 | }; |
|---|
| 257 | 255 | |
|---|
| 258 | 256 | struct probe_resp { |
|---|
| 259 | 257 | struct rcu_head rcu_head; |
|---|
| 260 | 258 | int len; |
|---|
| 261 | | - u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM]; |
|---|
| 262 | | - u8 data[0]; |
|---|
| 259 | + u16 cntdwn_counter_offsets[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; |
|---|
| 260 | + u8 data[]; |
|---|
| 261 | +}; |
|---|
| 262 | + |
|---|
| 263 | +struct fils_discovery_data { |
|---|
| 264 | + struct rcu_head rcu_head; |
|---|
| 265 | + int len; |
|---|
| 266 | + u8 data[]; |
|---|
| 267 | +}; |
|---|
| 268 | + |
|---|
| 269 | +struct unsol_bcast_probe_resp_data { |
|---|
| 270 | + struct rcu_head rcu_head; |
|---|
| 271 | + int len; |
|---|
| 272 | + u8 data[]; |
|---|
| 263 | 273 | }; |
|---|
| 264 | 274 | |
|---|
| 265 | 275 | struct ps_data { |
|---|
| .. | .. |
|---|
| 277 | 287 | struct ieee80211_if_ap { |
|---|
| 278 | 288 | struct beacon_data __rcu *beacon; |
|---|
| 279 | 289 | struct probe_resp __rcu *probe_resp; |
|---|
| 290 | + struct fils_discovery_data __rcu *fils_discovery; |
|---|
| 291 | + struct unsol_bcast_probe_resp_data __rcu *unsol_bcast_probe_resp; |
|---|
| 280 | 292 | |
|---|
| 281 | 293 | /* to be used after channel switch. */ |
|---|
| 282 | 294 | struct cfg80211_beacon_data *next_beacon; |
|---|
| .. | .. |
|---|
| 284 | 296 | |
|---|
| 285 | 297 | struct ps_data ps; |
|---|
| 286 | 298 | atomic_t num_mcast_sta; /* number of stations receiving multicast */ |
|---|
| 287 | | - enum ieee80211_smps_mode req_smps, /* requested smps mode */ |
|---|
| 288 | | - driver_smps_mode; /* smps mode request */ |
|---|
| 289 | 299 | |
|---|
| 290 | | - struct work_struct request_smps_work; |
|---|
| 291 | 300 | bool multicast_to_unicast; |
|---|
| 292 | 301 | }; |
|---|
| 293 | 302 | |
|---|
| .. | .. |
|---|
| 365 | 374 | |
|---|
| 366 | 375 | u8 key[WLAN_KEY_LEN_WEP104]; |
|---|
| 367 | 376 | u8 key_len, key_idx; |
|---|
| 368 | | - bool done; |
|---|
| 377 | + bool done, waiting; |
|---|
| 378 | + bool peer_confirmed; |
|---|
| 369 | 379 | bool timeout_started; |
|---|
| 370 | 380 | |
|---|
| 371 | 381 | u16 sae_trans, sae_status; |
|---|
| .. | .. |
|---|
| 444 | 454 | |
|---|
| 445 | 455 | u8 bssid[ETH_ALEN] __aligned(2); |
|---|
| 446 | 456 | |
|---|
| 447 | | - u16 aid; |
|---|
| 448 | | - |
|---|
| 449 | 457 | bool powersave; /* powersave requested for this iface */ |
|---|
| 450 | 458 | bool broken_ap; /* AP is broken -- turn off powersave */ |
|---|
| 451 | 459 | bool have_beacon; |
|---|
| .. | .. |
|---|
| 488 | 496 | unsigned int uapsd_max_sp_len; |
|---|
| 489 | 497 | |
|---|
| 490 | 498 | int wmm_last_param_set; |
|---|
| 499 | + int mu_edca_last_param_set; |
|---|
| 491 | 500 | |
|---|
| 492 | 501 | u8 use_4addr; |
|---|
| 493 | 502 | |
|---|
| .. | .. |
|---|
| 524 | 533 | struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */ |
|---|
| 525 | 534 | struct ieee80211_vht_cap vht_capa; /* configured VHT overrides */ |
|---|
| 526 | 535 | struct ieee80211_vht_cap vht_capa_mask; /* Valid parts of vht_capa */ |
|---|
| 536 | + struct ieee80211_s1g_cap s1g_capa; /* configured S1G overrides */ |
|---|
| 537 | + struct ieee80211_s1g_cap s1g_capa_mask; /* valid s1g_capa bits */ |
|---|
| 527 | 538 | |
|---|
| 528 | 539 | /* TDLS support */ |
|---|
| 529 | 540 | u8 tdls_peer[ETH_ALEN] __aligned(2); |
|---|
| .. | .. |
|---|
| 543 | 554 | * get stuck in a downgraded situation and flush takes forever. |
|---|
| 544 | 555 | */ |
|---|
| 545 | 556 | struct delayed_work tx_tspec_wk; |
|---|
| 557 | + |
|---|
| 558 | + /* Information elements from the last transmitted (Re)Association |
|---|
| 559 | + * Request frame. |
|---|
| 560 | + */ |
|---|
| 561 | + u8 *assoc_req_ies; |
|---|
| 562 | + size_t assoc_req_ies_len; |
|---|
| 546 | 563 | }; |
|---|
| 547 | 564 | |
|---|
| 548 | 565 | struct ieee80211_if_ibss { |
|---|
| .. | .. |
|---|
| 627 | 644 | struct cfg80211_csa_settings settings; |
|---|
| 628 | 645 | }; |
|---|
| 629 | 646 | |
|---|
| 647 | +/** |
|---|
| 648 | + * struct mesh_table |
|---|
| 649 | + * |
|---|
| 650 | + * @known_gates: list of known mesh gates and their mpaths by the station. The |
|---|
| 651 | + * gate's mpath may or may not be resolved and active. |
|---|
| 652 | + * @gates_lock: protects updates to known_gates |
|---|
| 653 | + * @rhead: the rhashtable containing struct mesh_paths, keyed by dest addr |
|---|
| 654 | + * @walk_head: linked list containing all mesh_path objects |
|---|
| 655 | + * @walk_lock: lock protecting walk_head |
|---|
| 656 | + * @entries: number of entries in the table |
|---|
| 657 | + */ |
|---|
| 658 | +struct mesh_table { |
|---|
| 659 | + struct hlist_head known_gates; |
|---|
| 660 | + spinlock_t gates_lock; |
|---|
| 661 | + struct rhashtable rhead; |
|---|
| 662 | + struct hlist_head walk_head; |
|---|
| 663 | + spinlock_t walk_lock; |
|---|
| 664 | + atomic_t entries; /* Up to MAX_MESH_NEIGHBOURS */ |
|---|
| 665 | +}; |
|---|
| 666 | + |
|---|
| 630 | 667 | struct ieee80211_if_mesh { |
|---|
| 631 | 668 | struct timer_list housekeeping_timer; |
|---|
| 632 | 669 | struct timer_list mesh_path_timer; |
|---|
| .. | .. |
|---|
| 701 | 738 | /* offset from skb->data while building IE */ |
|---|
| 702 | 739 | int meshconf_offset; |
|---|
| 703 | 740 | |
|---|
| 704 | | - struct mesh_table *mesh_paths; |
|---|
| 705 | | - struct mesh_table *mpp_paths; /* Store paths for MPP&MAP */ |
|---|
| 741 | + struct mesh_table mesh_paths; |
|---|
| 742 | + struct mesh_table mpp_paths; /* Store paths for MPP&MAP */ |
|---|
| 706 | 743 | int mesh_paths_generation; |
|---|
| 707 | 744 | int mpp_paths_generation; |
|---|
| 708 | 745 | }; |
|---|
| .. | .. |
|---|
| 807 | 844 | IEEE80211_TXQ_STOP, |
|---|
| 808 | 845 | IEEE80211_TXQ_AMPDU, |
|---|
| 809 | 846 | IEEE80211_TXQ_NO_AMSDU, |
|---|
| 847 | + IEEE80211_TXQ_STOP_NETIF_TX, |
|---|
| 810 | 848 | }; |
|---|
| 811 | 849 | |
|---|
| 812 | 850 | /** |
|---|
| .. | .. |
|---|
| 817 | 855 | * a fq_flow which is already owned by a different tin |
|---|
| 818 | 856 | * @def_cvars: codel vars for @def_flow |
|---|
| 819 | 857 | * @frags: used to keep fragments created after dequeue |
|---|
| 858 | + * @schedule_order: used with ieee80211_local->active_txqs |
|---|
| 859 | + * @schedule_round: counter to prevent infinite loops on TXQ scheduling |
|---|
| 820 | 860 | */ |
|---|
| 821 | 861 | struct txq_info { |
|---|
| 822 | 862 | struct fq_tin tin; |
|---|
| .. | .. |
|---|
| 824 | 864 | struct codel_vars def_cvars; |
|---|
| 825 | 865 | struct codel_stats cstats; |
|---|
| 826 | 866 | struct sk_buff_head frags; |
|---|
| 867 | + struct list_head schedule_order; |
|---|
| 868 | + u16 schedule_round; |
|---|
| 827 | 869 | unsigned long flags; |
|---|
| 828 | 870 | |
|---|
| 829 | 871 | /* keep last! */ |
|---|
| .. | .. |
|---|
| 881 | 923 | /* bit field of ACM bits (BIT(802.1D tag)) */ |
|---|
| 882 | 924 | u8 wmm_acm; |
|---|
| 883 | 925 | |
|---|
| 884 | | - struct ieee80211_key __rcu *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS]; |
|---|
| 926 | + struct ieee80211_key __rcu *keys[NUM_DEFAULT_KEYS + |
|---|
| 927 | + NUM_DEFAULT_MGMT_KEYS + |
|---|
| 928 | + NUM_DEFAULT_BEACON_KEYS]; |
|---|
| 885 | 929 | struct ieee80211_key __rcu *default_unicast_key; |
|---|
| 886 | 930 | struct ieee80211_key __rcu *default_multicast_key; |
|---|
| 887 | 931 | struct ieee80211_key __rcu *default_mgmt_key; |
|---|
| 932 | + struct ieee80211_key __rcu *default_beacon_key; |
|---|
| 888 | 933 | |
|---|
| 889 | 934 | u16 sequence_number; |
|---|
| 890 | 935 | __be16 control_port_protocol; |
|---|
| 891 | 936 | bool control_port_no_encrypt; |
|---|
| 937 | + bool control_port_no_preauth; |
|---|
| 892 | 938 | bool control_port_over_nl80211; |
|---|
| 893 | 939 | int encrypt_headroom; |
|---|
| 894 | 940 | |
|---|
| .. | .. |
|---|
| 940 | 986 | bool rc_has_vht_mcs_mask[NUM_NL80211_BANDS]; |
|---|
| 941 | 987 | u16 rc_rateidx_vht_mcs_mask[NUM_NL80211_BANDS][NL80211_VHT_NSS_MAX]; |
|---|
| 942 | 988 | |
|---|
| 989 | + /* Beacon frame (non-MCS) rate (as a bitmap) */ |
|---|
| 990 | + u32 beacon_rateidx_mask[NUM_NL80211_BANDS]; |
|---|
| 991 | + bool beacon_rate_set; |
|---|
| 992 | + |
|---|
| 943 | 993 | union { |
|---|
| 944 | 994 | struct ieee80211_if_ap ap; |
|---|
| 945 | 995 | struct ieee80211_if_wds wds; |
|---|
| .. | .. |
|---|
| 958 | 1008 | struct dentry *default_unicast_key; |
|---|
| 959 | 1009 | struct dentry *default_multicast_key; |
|---|
| 960 | 1010 | struct dentry *default_mgmt_key; |
|---|
| 1011 | + struct dentry *default_beacon_key; |
|---|
| 961 | 1012 | } debugfs; |
|---|
| 962 | 1013 | #endif |
|---|
| 963 | 1014 | |
|---|
| .. | .. |
|---|
| 1072 | 1123 | * a scan complete for an aborted scan. |
|---|
| 1073 | 1124 | * @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being |
|---|
| 1074 | 1125 | * cancelled. |
|---|
| 1126 | + * @SCAN_BEACON_WAIT: Set whenever we're passive scanning because of radar/no-IR |
|---|
| 1127 | + * and could send a probe request after receiving a beacon. |
|---|
| 1128 | + * @SCAN_BEACON_DONE: Beacon received, we can now send a probe request |
|---|
| 1075 | 1129 | */ |
|---|
| 1076 | 1130 | enum { |
|---|
| 1077 | 1131 | SCAN_SW_SCANNING, |
|---|
| .. | .. |
|---|
| 1080 | 1134 | SCAN_COMPLETED, |
|---|
| 1081 | 1135 | SCAN_ABORTED, |
|---|
| 1082 | 1136 | SCAN_HW_CANCELLED, |
|---|
| 1137 | + SCAN_BEACON_WAIT, |
|---|
| 1138 | + SCAN_BEACON_DONE, |
|---|
| 1083 | 1139 | }; |
|---|
| 1084 | 1140 | |
|---|
| 1085 | 1141 | /** |
|---|
| .. | .. |
|---|
| 1114 | 1170 | struct codel_vars *cvars; |
|---|
| 1115 | 1171 | struct codel_params cparams; |
|---|
| 1116 | 1172 | |
|---|
| 1173 | + /* protects active_txqs and txqi->schedule_order */ |
|---|
| 1174 | + spinlock_t active_txq_lock[IEEE80211_NUM_ACS]; |
|---|
| 1175 | + struct list_head active_txqs[IEEE80211_NUM_ACS]; |
|---|
| 1176 | + u16 schedule_round[IEEE80211_NUM_ACS]; |
|---|
| 1177 | + |
|---|
| 1178 | + u16 airtime_flags; |
|---|
| 1179 | + u32 aql_txq_limit_low[IEEE80211_NUM_ACS]; |
|---|
| 1180 | + u32 aql_txq_limit_high[IEEE80211_NUM_ACS]; |
|---|
| 1181 | + u32 aql_threshold; |
|---|
| 1182 | + atomic_t aql_total_pending_airtime; |
|---|
| 1183 | + |
|---|
| 1117 | 1184 | const struct ieee80211_ops *ops; |
|---|
| 1118 | 1185 | |
|---|
| 1119 | 1186 | /* |
|---|
| .. | .. |
|---|
| 1132 | 1199 | /* number of interfaces with corresponding FIF_ flags */ |
|---|
| 1133 | 1200 | int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll, |
|---|
| 1134 | 1201 | fif_probe_req; |
|---|
| 1135 | | - int probe_req_reg; |
|---|
| 1202 | + bool probe_req_reg; |
|---|
| 1203 | + bool rx_mcast_action_reg; |
|---|
| 1136 | 1204 | unsigned int filter_flags; /* FIF_* */ |
|---|
| 1137 | 1205 | |
|---|
| 1138 | 1206 | bool wiphy_ciphers_allocated; |
|---|
| .. | .. |
|---|
| 1186 | 1254 | /* number of RX chains the hardware has */ |
|---|
| 1187 | 1255 | u8 rx_chains; |
|---|
| 1188 | 1256 | |
|---|
| 1257 | + /* bitmap of which sbands were copied */ |
|---|
| 1258 | + u8 sband_allocated; |
|---|
| 1259 | + |
|---|
| 1189 | 1260 | int tx_headroom; /* required headroom for hardware/radiotap */ |
|---|
| 1190 | 1261 | |
|---|
| 1191 | 1262 | /* Tasklet and skb queue to process calls from IRQ mode. All frames |
|---|
| .. | .. |
|---|
| 1214 | 1285 | |
|---|
| 1215 | 1286 | struct sk_buff_head pending[IEEE80211_MAX_QUEUES]; |
|---|
| 1216 | 1287 | struct tasklet_struct tx_pending_tasklet; |
|---|
| 1288 | + struct tasklet_struct wake_txqs_tasklet; |
|---|
| 1217 | 1289 | |
|---|
| 1218 | 1290 | atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES]; |
|---|
| 1219 | 1291 | |
|---|
| .. | .. |
|---|
| 1222 | 1294 | |
|---|
| 1223 | 1295 | struct rate_control_ref *rate_ctrl; |
|---|
| 1224 | 1296 | |
|---|
| 1225 | | - struct crypto_cipher *wep_tx_tfm; |
|---|
| 1226 | | - struct crypto_cipher *wep_rx_tfm; |
|---|
| 1297 | + struct arc4_ctx wep_tx_ctx; |
|---|
| 1298 | + struct arc4_ctx wep_rx_ctx; |
|---|
| 1227 | 1299 | u32 wep_iv; |
|---|
| 1228 | 1300 | |
|---|
| 1229 | 1301 | /* see iface.c */ |
|---|
| .. | .. |
|---|
| 1233 | 1305 | |
|---|
| 1234 | 1306 | /* |
|---|
| 1235 | 1307 | * Key mutex, protects sdata's key_list and sta_info's |
|---|
| 1236 | | - * key pointers (write access, they're RCU.) |
|---|
| 1308 | + * key pointers and ptk_idx (write access, they're RCU.) |
|---|
| 1237 | 1309 | */ |
|---|
| 1238 | 1310 | struct mutex key_mtx; |
|---|
| 1239 | 1311 | |
|---|
| .. | .. |
|---|
| 1319 | 1391 | */ |
|---|
| 1320 | 1392 | |
|---|
| 1321 | 1393 | bool pspolling; |
|---|
| 1322 | | - bool offchannel_ps_enabled; |
|---|
| 1323 | 1394 | /* |
|---|
| 1324 | 1395 | * PS can only be enabled when we have exactly one managed |
|---|
| 1325 | 1396 | * interface (and monitors) in PS, this then points there. |
|---|
| .. | .. |
|---|
| 1348 | 1419 | struct dentry *rcdir; |
|---|
| 1349 | 1420 | struct dentry *keys; |
|---|
| 1350 | 1421 | } debugfs; |
|---|
| 1422 | + bool force_tx_status; |
|---|
| 1351 | 1423 | #endif |
|---|
| 1352 | 1424 | |
|---|
| 1353 | 1425 | /* |
|---|
| .. | .. |
|---|
| 1417 | 1489 | u8 ttl; |
|---|
| 1418 | 1490 | u16 pre_value; |
|---|
| 1419 | 1491 | u16 reason_code; |
|---|
| 1492 | + u32 max_switch_time; |
|---|
| 1420 | 1493 | }; |
|---|
| 1421 | 1494 | |
|---|
| 1422 | 1495 | /* Parsed Information Elements */ |
|---|
| .. | .. |
|---|
| 1432 | 1505 | const u8 *supp_rates; |
|---|
| 1433 | 1506 | const u8 *ds_params; |
|---|
| 1434 | 1507 | const struct ieee80211_tim_ie *tim; |
|---|
| 1435 | | - const u8 *challenge; |
|---|
| 1436 | 1508 | const u8 *rsn; |
|---|
| 1509 | + const u8 *rsnx; |
|---|
| 1437 | 1510 | const u8 *erp_info; |
|---|
| 1438 | 1511 | const u8 *ext_supp_rates; |
|---|
| 1439 | 1512 | const u8 *wmm_info; |
|---|
| .. | .. |
|---|
| 1445 | 1518 | const struct ieee80211_meshconf_ie *mesh_config; |
|---|
| 1446 | 1519 | const u8 *he_cap; |
|---|
| 1447 | 1520 | const struct ieee80211_he_operation *he_operation; |
|---|
| 1521 | + const struct ieee80211_he_spr *he_spr; |
|---|
| 1448 | 1522 | const struct ieee80211_mu_edca_param_set *mu_edca_param_set; |
|---|
| 1523 | + const struct ieee80211_he_6ghz_capa *he_6ghz_capa; |
|---|
| 1449 | 1524 | const u8 *uora_element; |
|---|
| 1450 | 1525 | const u8 *mesh_id; |
|---|
| 1451 | 1526 | const u8 *peering; |
|---|
| .. | .. |
|---|
| 1457 | 1532 | const struct ieee80211_channel_sw_ie *ch_switch_ie; |
|---|
| 1458 | 1533 | const struct ieee80211_ext_chansw_ie *ext_chansw_ie; |
|---|
| 1459 | 1534 | const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie; |
|---|
| 1535 | + const u8 *max_channel_switch_time; |
|---|
| 1460 | 1536 | const u8 *country_elem; |
|---|
| 1461 | 1537 | const u8 *pwr_constr_elem; |
|---|
| 1462 | 1538 | const u8 *cisco_dtpc_elem; |
|---|
| .. | .. |
|---|
| 1465 | 1541 | const struct ieee80211_sec_chan_offs_ie *sec_chan_offs; |
|---|
| 1466 | 1542 | struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie; |
|---|
| 1467 | 1543 | const struct ieee80211_bss_max_idle_period_ie *max_idle_period_ie; |
|---|
| 1544 | + const struct ieee80211_multiple_bssid_configuration *mbssid_config_ie; |
|---|
| 1545 | + const struct ieee80211_bssid_index *bssid_index; |
|---|
| 1546 | + u8 max_bssid_indicator; |
|---|
| 1547 | + u8 dtim_count; |
|---|
| 1548 | + u8 dtim_period; |
|---|
| 1549 | + const struct ieee80211_addba_ext_ie *addba_ext_ie; |
|---|
| 1550 | + const struct ieee80211_s1g_cap *s1g_capab; |
|---|
| 1551 | + const struct ieee80211_s1g_oper_ie *s1g_oper; |
|---|
| 1552 | + const struct ieee80211_s1g_bcn_compat_ie *s1g_bcn_compat; |
|---|
| 1553 | + const struct ieee80211_aid_response_ie *aid_resp; |
|---|
| 1468 | 1554 | |
|---|
| 1469 | 1555 | /* length of them, respectively */ |
|---|
| 1470 | 1556 | u8 ext_capab_len; |
|---|
| 1471 | 1557 | u8 ssid_len; |
|---|
| 1472 | 1558 | u8 supp_rates_len; |
|---|
| 1473 | 1559 | u8 tim_len; |
|---|
| 1474 | | - u8 challenge_len; |
|---|
| 1475 | 1560 | u8 rsn_len; |
|---|
| 1561 | + u8 rsnx_len; |
|---|
| 1476 | 1562 | u8 ext_supp_rates_len; |
|---|
| 1477 | 1563 | u8 wmm_info_len; |
|---|
| 1478 | 1564 | u8 wmm_param_len; |
|---|
| .. | .. |
|---|
| 1483 | 1569 | u8 prep_len; |
|---|
| 1484 | 1570 | u8 perr_len; |
|---|
| 1485 | 1571 | u8 country_elem_len; |
|---|
| 1572 | + u8 bssid_index_len; |
|---|
| 1573 | + |
|---|
| 1574 | + void *nontx_profile; |
|---|
| 1486 | 1575 | |
|---|
| 1487 | 1576 | /* whether a parse error occurred while retrieving these elements */ |
|---|
| 1488 | 1577 | bool parse_error; |
|---|
| .. | .. |
|---|
| 1581 | 1670 | void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata); |
|---|
| 1582 | 1671 | void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, |
|---|
| 1583 | 1672 | struct sk_buff *skb); |
|---|
| 1673 | +void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata, |
|---|
| 1674 | + struct sk_buff *skb); |
|---|
| 1584 | 1675 | void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata); |
|---|
| 1585 | 1676 | void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata); |
|---|
| 1586 | 1677 | void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata); |
|---|
| .. | .. |
|---|
| 1642 | 1733 | struct ieee80211_rx_status *rx_status, |
|---|
| 1643 | 1734 | struct ieee80211_mgmt *mgmt, |
|---|
| 1644 | 1735 | size_t len, |
|---|
| 1645 | | - struct ieee802_11_elems *elems, |
|---|
| 1646 | 1736 | struct ieee80211_channel *channel); |
|---|
| 1647 | 1737 | void ieee80211_rx_bss_put(struct ieee80211_local *local, |
|---|
| 1648 | 1738 | struct ieee80211_bss *bss); |
|---|
| .. | .. |
|---|
| 1680 | 1770 | struct cfg80211_csa_settings *params); |
|---|
| 1681 | 1771 | |
|---|
| 1682 | 1772 | /* interface handling */ |
|---|
| 1773 | +#define MAC80211_SUPPORTED_FEATURES_TX (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \ |
|---|
| 1774 | + NETIF_F_HW_CSUM | NETIF_F_SG | \ |
|---|
| 1775 | + NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE) |
|---|
| 1776 | +#define MAC80211_SUPPORTED_FEATURES_RX (NETIF_F_RXCSUM) |
|---|
| 1777 | +#define MAC80211_SUPPORTED_FEATURES (MAC80211_SUPPORTED_FEATURES_TX | \ |
|---|
| 1778 | + MAC80211_SUPPORTED_FEATURES_RX) |
|---|
| 1779 | + |
|---|
| 1683 | 1780 | int ieee80211_iface_init(void); |
|---|
| 1684 | 1781 | void ieee80211_iface_exit(void); |
|---|
| 1685 | 1782 | int ieee80211_if_add(struct ieee80211_local *local, const char *name, |
|---|
| .. | .. |
|---|
| 1702 | 1799 | bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata); |
|---|
| 1703 | 1800 | void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata, |
|---|
| 1704 | 1801 | bool update_bss); |
|---|
| 1802 | +void ieee80211_recalc_offload(struct ieee80211_local *local); |
|---|
| 1705 | 1803 | |
|---|
| 1706 | 1804 | static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) |
|---|
| 1707 | 1805 | { |
|---|
| .. | .. |
|---|
| 1715 | 1813 | struct net_device *dev); |
|---|
| 1716 | 1814 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, |
|---|
| 1717 | 1815 | struct net_device *dev); |
|---|
| 1816 | +netdev_tx_t ieee80211_subif_start_xmit_8023(struct sk_buff *skb, |
|---|
| 1817 | + struct net_device *dev); |
|---|
| 1718 | 1818 | void __ieee80211_subif_start_xmit(struct sk_buff *skb, |
|---|
| 1719 | 1819 | struct net_device *dev, |
|---|
| 1720 | 1820 | u32 info_flags, |
|---|
| 1721 | | - u32 ctrl_flags); |
|---|
| 1821 | + u32 ctrl_flags, |
|---|
| 1822 | + u64 *cookie); |
|---|
| 1722 | 1823 | void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, |
|---|
| 1723 | 1824 | struct sk_buff_head *skbs); |
|---|
| 1724 | 1825 | struct sk_buff * |
|---|
| .. | .. |
|---|
| 1726 | 1827 | struct sk_buff *skb, u32 info_flags); |
|---|
| 1727 | 1828 | void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb, |
|---|
| 1728 | 1829 | struct ieee80211_supported_band *sband, |
|---|
| 1729 | | - int retry_count, int shift, bool send_to_cooked); |
|---|
| 1830 | + int retry_count, int shift, bool send_to_cooked, |
|---|
| 1831 | + struct ieee80211_tx_status *status); |
|---|
| 1730 | 1832 | |
|---|
| 1731 | 1833 | void ieee80211_check_fast_xmit(struct sta_info *sta); |
|---|
| 1732 | 1834 | void ieee80211_check_fast_xmit_all(struct ieee80211_local *local); |
|---|
| .. | .. |
|---|
| 1734 | 1836 | void ieee80211_clear_fast_xmit(struct sta_info *sta); |
|---|
| 1735 | 1837 | int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev, |
|---|
| 1736 | 1838 | const u8 *buf, size_t len, |
|---|
| 1737 | | - const u8 *dest, __be16 proto, bool unencrypted); |
|---|
| 1839 | + const u8 *dest, __be16 proto, bool unencrypted, |
|---|
| 1840 | + u64 *cookie); |
|---|
| 1841 | +int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev, |
|---|
| 1842 | + const u8 *buf, size_t len); |
|---|
| 1738 | 1843 | |
|---|
| 1739 | 1844 | /* HT */ |
|---|
| 1740 | 1845 | void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, |
|---|
| .. | .. |
|---|
| 1761 | 1866 | void ___ieee80211_start_rx_ba_session(struct sta_info *sta, |
|---|
| 1762 | 1867 | u8 dialog_token, u16 timeout, |
|---|
| 1763 | 1868 | u16 start_seq_num, u16 ba_policy, u16 tid, |
|---|
| 1764 | | - u16 buf_size, bool tx, bool auto_seq); |
|---|
| 1869 | + u16 buf_size, bool tx, bool auto_seq, |
|---|
| 1870 | + const struct ieee80211_addba_ext_ie *addbaext); |
|---|
| 1765 | 1871 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, |
|---|
| 1766 | 1872 | enum ieee80211_agg_stop_reason reason); |
|---|
| 1767 | 1873 | void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, |
|---|
| .. | .. |
|---|
| 1825 | 1931 | ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata, |
|---|
| 1826 | 1932 | struct ieee80211_supported_band *sband, |
|---|
| 1827 | 1933 | const u8 *he_cap_ie, u8 he_cap_len, |
|---|
| 1934 | + const struct ieee80211_he_6ghz_capa *he_6ghz_capa, |
|---|
| 1828 | 1935 | struct sta_info *sta); |
|---|
| 1936 | +void |
|---|
| 1937 | +ieee80211_he_spr_ie_to_bss_conf(struct ieee80211_vif *vif, |
|---|
| 1938 | + const struct ieee80211_he_spr *he_spr_ie_elem); |
|---|
| 1939 | + |
|---|
| 1940 | +void |
|---|
| 1941 | +ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif, |
|---|
| 1942 | + const struct ieee80211_he_operation *he_op_ie_elem); |
|---|
| 1943 | + |
|---|
| 1944 | +/* S1G */ |
|---|
| 1945 | +void ieee80211_s1g_sta_rate_init(struct sta_info *sta); |
|---|
| 1829 | 1946 | |
|---|
| 1830 | 1947 | /* Spectrum management */ |
|---|
| 1831 | 1948 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, |
|---|
| .. | .. |
|---|
| 1836 | 1953 | * @sdata: the sdata of the interface which has received the frame |
|---|
| 1837 | 1954 | * @elems: parsed 802.11 elements received with the frame |
|---|
| 1838 | 1955 | * @current_band: indicates the current band |
|---|
| 1956 | + * @vht_cap_info: VHT capabilities of the transmitter |
|---|
| 1839 | 1957 | * @sta_flags: contains information about own capabilities and restrictions |
|---|
| 1840 | 1958 | * to decide which channel switch announcements can be accepted. Only the |
|---|
| 1841 | 1959 | * following subset of &enum ieee80211_sta_flags are evaluated: |
|---|
| .. | .. |
|---|
| 1850 | 1968 | int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata, |
|---|
| 1851 | 1969 | struct ieee802_11_elems *elems, |
|---|
| 1852 | 1970 | enum nl80211_band current_band, |
|---|
| 1971 | + u32 vht_cap_info, |
|---|
| 1853 | 1972 | u32 sta_flags, u8 *bssid, |
|---|
| 1854 | 1973 | struct ieee80211_csa_ie *csa_ie); |
|---|
| 1855 | 1974 | |
|---|
| .. | .. |
|---|
| 1883 | 2002 | void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata, |
|---|
| 1884 | 2003 | bool bss_notify, bool enable_qos); |
|---|
| 1885 | 2004 | void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, |
|---|
| 1886 | | - struct sta_info *sta, struct sk_buff *skb, |
|---|
| 1887 | | - u32 txdata_flags); |
|---|
| 2005 | + struct sta_info *sta, struct sk_buff *skb); |
|---|
| 1888 | 2006 | |
|---|
| 1889 | 2007 | void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata, |
|---|
| 1890 | 2008 | struct sk_buff *skb, int tid, |
|---|
| 1891 | | - enum nl80211_band band, u32 txdata_flags); |
|---|
| 2009 | + enum nl80211_band band); |
|---|
| 2010 | + |
|---|
| 2011 | +/* sta_out needs to be checked for ERR_PTR() before using */ |
|---|
| 2012 | +int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata, |
|---|
| 2013 | + struct sk_buff *skb, |
|---|
| 2014 | + struct sta_info **sta_out); |
|---|
| 1892 | 2015 | |
|---|
| 1893 | 2016 | static inline void |
|---|
| 1894 | 2017 | ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata, |
|---|
| 1895 | 2018 | struct sk_buff *skb, int tid, |
|---|
| 1896 | | - enum nl80211_band band, u32 txdata_flags) |
|---|
| 2019 | + enum nl80211_band band) |
|---|
| 1897 | 2020 | { |
|---|
| 1898 | 2021 | rcu_read_lock(); |
|---|
| 1899 | | - __ieee80211_tx_skb_tid_band(sdata, skb, tid, band, txdata_flags); |
|---|
| 2022 | + __ieee80211_tx_skb_tid_band(sdata, skb, tid, band); |
|---|
| 1900 | 2023 | rcu_read_unlock(); |
|---|
| 1901 | 2024 | } |
|---|
| 1902 | 2025 | |
|---|
| .. | .. |
|---|
| 1914 | 2037 | } |
|---|
| 1915 | 2038 | |
|---|
| 1916 | 2039 | __ieee80211_tx_skb_tid_band(sdata, skb, tid, |
|---|
| 1917 | | - chanctx_conf->def.chan->band, 0); |
|---|
| 2040 | + chanctx_conf->def.chan->band); |
|---|
| 1918 | 2041 | rcu_read_unlock(); |
|---|
| 1919 | 2042 | } |
|---|
| 1920 | 2043 | |
|---|
| .. | .. |
|---|
| 1927 | 2050 | |
|---|
| 1928 | 2051 | u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, |
|---|
| 1929 | 2052 | struct ieee802_11_elems *elems, |
|---|
| 1930 | | - u64 filter, u32 crc); |
|---|
| 2053 | + u64 filter, u32 crc, u8 *transmitter_bssid, |
|---|
| 2054 | + u8 *bss_bssid); |
|---|
| 1931 | 2055 | static inline void ieee802_11_parse_elems(const u8 *start, size_t len, |
|---|
| 1932 | 2056 | bool action, |
|---|
| 1933 | | - struct ieee802_11_elems *elems) |
|---|
| 2057 | + struct ieee802_11_elems *elems, |
|---|
| 2058 | + u8 *transmitter_bssid, |
|---|
| 2059 | + u8 *bss_bssid) |
|---|
| 1934 | 2060 | { |
|---|
| 1935 | | - ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0); |
|---|
| 2061 | + ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0, |
|---|
| 2062 | + transmitter_bssid, bss_bssid); |
|---|
| 1936 | 2063 | } |
|---|
| 1937 | 2064 | |
|---|
| 1938 | 2065 | |
|---|
| .. | .. |
|---|
| 1949 | 2076 | void ieee80211_send_nullfunc(struct ieee80211_local *local, |
|---|
| 1950 | 2077 | struct ieee80211_sub_if_data *sdata, |
|---|
| 1951 | 2078 | bool powersave); |
|---|
| 1952 | | -void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, |
|---|
| 1953 | | - struct ieee80211_hdr *hdr); |
|---|
| 2079 | +void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local, |
|---|
| 2080 | + struct ieee80211_sub_if_data *sdata); |
|---|
| 1954 | 2081 | void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, |
|---|
| 1955 | 2082 | struct ieee80211_hdr *hdr, bool ack, u16 tx_time); |
|---|
| 1956 | 2083 | |
|---|
| .. | .. |
|---|
| 2034 | 2161 | struct ieee80211_sub_if_data *sdata); |
|---|
| 2035 | 2162 | void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats, |
|---|
| 2036 | 2163 | struct txq_info *txqi); |
|---|
| 2164 | +void ieee80211_wake_txqs(unsigned long data); |
|---|
| 2037 | 2165 | void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, |
|---|
| 2038 | 2166 | u16 transaction, u16 auth_alg, u16 status, |
|---|
| 2039 | 2167 | const u8 *extra, size_t extra_len, const u8 *bssid, |
|---|
| 2040 | 2168 | const u8 *da, const u8 *key, u8 key_len, u8 key_idx, |
|---|
| 2041 | 2169 | u32 tx_flags); |
|---|
| 2042 | 2170 | void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata, |
|---|
| 2043 | | - const u8 *bssid, u16 stype, u16 reason, |
|---|
| 2171 | + const u8 *da, const u8 *bssid, |
|---|
| 2172 | + u16 stype, u16 reason, |
|---|
| 2044 | 2173 | bool send_frame, u8 *frame_buf); |
|---|
| 2045 | 2174 | |
|---|
| 2046 | 2175 | enum { |
|---|
| .. | .. |
|---|
| 2049 | 2178 | IEEE80211_PROBE_FLAG_RANDOM_SN = BIT(2), |
|---|
| 2050 | 2179 | }; |
|---|
| 2051 | 2180 | |
|---|
| 2052 | | -int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, |
|---|
| 2181 | +int ieee80211_build_preq_ies(struct ieee80211_sub_if_data *sdata, u8 *buffer, |
|---|
| 2053 | 2182 | size_t buffer_len, |
|---|
| 2054 | 2183 | struct ieee80211_scan_ies *ie_desc, |
|---|
| 2055 | 2184 | const u8 *ie, size_t ie_len, |
|---|
| .. | .. |
|---|
| 2068 | 2197 | enum nl80211_band band, u32 *basic_rates); |
|---|
| 2069 | 2198 | int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata, |
|---|
| 2070 | 2199 | enum ieee80211_smps_mode smps_mode); |
|---|
| 2071 | | -int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata, |
|---|
| 2072 | | - enum ieee80211_smps_mode smps_mode); |
|---|
| 2073 | 2200 | void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata); |
|---|
| 2074 | 2201 | void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata); |
|---|
| 2075 | 2202 | |
|---|
| .. | .. |
|---|
| 2085 | 2212 | u32 cap); |
|---|
| 2086 | 2213 | u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap, |
|---|
| 2087 | 2214 | const struct cfg80211_chan_def *chandef); |
|---|
| 2215 | +u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata, u8 iftype); |
|---|
| 2088 | 2216 | u8 *ieee80211_ie_build_he_cap(u8 *pos, |
|---|
| 2089 | 2217 | const struct ieee80211_sta_he_cap *he_cap, |
|---|
| 2090 | 2218 | u8 *end); |
|---|
| 2219 | +void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata, |
|---|
| 2220 | + struct sk_buff *skb); |
|---|
| 2221 | +u8 *ieee80211_ie_build_he_oper(u8 *pos, struct cfg80211_chan_def *chandef); |
|---|
| 2091 | 2222 | int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef, |
|---|
| 2092 | 2223 | const struct ieee80211_supported_band *sband, |
|---|
| 2093 | 2224 | const u8 *srates, int srates_len, u32 *rates); |
|---|
| .. | .. |
|---|
| 2098 | 2229 | struct sk_buff *skb, bool need_basic, |
|---|
| 2099 | 2230 | enum nl80211_band band); |
|---|
| 2100 | 2231 | u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo); |
|---|
| 2232 | +void ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata, |
|---|
| 2233 | + struct ieee80211_sta_s1g_cap *caps, |
|---|
| 2234 | + struct sk_buff *skb); |
|---|
| 2235 | +void ieee80211_add_aid_request_ie(struct ieee80211_sub_if_data *sdata, |
|---|
| 2236 | + struct sk_buff *skb); |
|---|
| 2101 | 2237 | |
|---|
| 2102 | 2238 | /* channel management */ |
|---|
| 2103 | 2239 | bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper, |
|---|
| 2104 | 2240 | struct cfg80211_chan_def *chandef); |
|---|
| 2105 | | -bool ieee80211_chandef_vht_oper(const struct ieee80211_vht_operation *oper, |
|---|
| 2241 | +bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, u32 vht_cap_info, |
|---|
| 2242 | + const struct ieee80211_vht_operation *oper, |
|---|
| 2243 | + const struct ieee80211_ht_operation *htop, |
|---|
| 2244 | + struct cfg80211_chan_def *chandef); |
|---|
| 2245 | +bool ieee80211_chandef_he_6ghz_oper(struct ieee80211_sub_if_data *sdata, |
|---|
| 2246 | + const struct ieee80211_he_operation *he_oper, |
|---|
| 2247 | + struct cfg80211_chan_def *chandef); |
|---|
| 2248 | +bool ieee80211_chandef_s1g_oper(const struct ieee80211_s1g_oper_ie *oper, |
|---|
| 2106 | 2249 | struct cfg80211_chan_def *chandef); |
|---|
| 2107 | 2250 | u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c); |
|---|
| 2108 | 2251 | |
|---|
| .. | .. |
|---|
| 2182 | 2325 | void ieee80211_tdls_handle_disconnect(struct ieee80211_sub_if_data *sdata, |
|---|
| 2183 | 2326 | const u8 *peer, u16 reason); |
|---|
| 2184 | 2327 | const char *ieee80211_get_reason_code_string(u16 reason_code); |
|---|
| 2328 | +u16 ieee80211_encode_usf(int val); |
|---|
| 2329 | +u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len, |
|---|
| 2330 | + enum nl80211_iftype type); |
|---|
| 2185 | 2331 | |
|---|
| 2186 | 2332 | extern const struct ethtool_ops ieee80211_ethtool_ops; |
|---|
| 2187 | 2333 | |
|---|
| 2334 | +u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw, |
|---|
| 2335 | + struct ieee80211_vif *vif, |
|---|
| 2336 | + struct ieee80211_sta *pubsta, |
|---|
| 2337 | + int len, bool ampdu); |
|---|
| 2188 | 2338 | #ifdef CONFIG_MAC80211_NOINLINE |
|---|
| 2189 | 2339 | #define debug_noinline noinline |
|---|
| 2190 | 2340 | #else |
|---|