[RAMEN9610-13131][COMMON] ASoC: abox: enable timer 0 at wake up from WFI
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / drivers / net / wireless / scsc / dev.h
CommitLineData
ec470a07
TK
1/*****************************************************************************
2 *
85aa0fce 3 * Copyright (c) 2012 - 2019 Samsung Electronics Co., Ltd. All rights reserved
ec470a07
TK
4 *
5 ****************************************************************************/
6
7#ifndef __SLSI_DEVICE_H__
8#define __SLSI_DEVICE_H__
9
10#include <linux/init.h>
11#include <linux/device.h>
12#include <linux/inetdevice.h>
13#include <net/addrconf.h>
14
15#include <linux/version.h>
16#include <linux/module.h>
17#include <linux/string.h>
18#include <linux/kernel.h>
19#include <linux/netdevice.h>
20#include <linux/etherdevice.h>
21#include <linux/ratelimit.h>
22#include <linux/ip.h>
23
24#include <linux/completion.h>
25#include <linux/workqueue.h>
26#include <linux/time.h>
27#include <linux/sched.h>
28
29#include <linux/nl80211.h>
30#include <linux/wireless.h>
31#include <linux/proc_fs.h>
32#include <linux/ieee80211.h>
33#include <net/cfg80211.h>
34#include <linux/nl80211.h>
35
36#include <scsc/scsc_mx.h>
37
38#include "fapi.h"
39#include "const.h"
40#include "utils.h"
41#include "hip.h"
42#include "log_clients.h"
43#include "src_sink.h"
44#include "scsc_wifi_fcq.h"
45#include "scsc_wifi_cm_if.h"
46#include "hip4.h"
47#include "nl80211_vendor.h"
48#include "traffic_monitor.h"
49
7c9842a5
AC
50#define FAPI_MAJOR_VERSION(v) (((v) >> 8) & 0xFF)
51#define FAPI_MINOR_VERSION(v) ((v) & 0xFF)
52
ec470a07
TK
53/* Modes for CMDGETBSSINFO and CMDGETSTAINFO */
54#define SLSI_80211_MODE_11B 0
55#define SLSI_80211_MODE_11G 1
56#define SLSI_80211_MODE_11N 2
57#define SLSI_80211_MODE_11A 3
58#define SLSI_80211_MODE_11AC 4
59
5fcd17b3
PK
60#define SLSI_FW_API_RATE_HT_SELECTOR_FIELD 0xc000
61#define SLSI_FW_API_RATE_NON_HT_SELECTED 0x4000
62#define SLSI_FW_API_RATE_HT_SELECTED 0x8000
63#define SLSI_FW_API_RATE_VHT_SELECTED 0xc000
64
65#define SLSI_FW_API_RATE_VHT_MCS_FIELD 0x000F
66#define SLSI_FW_API_RATE_HT_MCS_FIELD 0x003F
67#define SLSI_FW_API_RATE_INDEX_FIELD 0x1fff
68#define SLSI_FW_API_RATE_VHT_NSS_FIELD 0x0070
69#define SLSI_FW_API_RATE_HT_NSS_FIELD 0x0040
70
71#define SLSI_FW_API_RATE_BW_FIELD 0x0600
72#define SLSI_FW_API_RATE_BW_40MHZ 0x0200
73#define SLSI_FW_API_RATE_BW_20MHZ 0x0000
74
75#define SLSI_FW_API_RATE_SGI 0x0100
76#define SLSI_FW_API_RATE_GF 0x0080
77
78/* indices: 3= BW20->idx_0, BW40->idx_1, BW80->idx_2.
79 * 2= noSGI->idx_0, SGI->idx_1
80 * 10= mcs index
81 * rate units 100kbps
82 * This table for single stream Nss=1and does not include 160MHz BW and 80+80MHz BW.
83 */
84static const u16 slsi_rates_table[3][2][10] = {
85 { /* BW20 */
86 { /* no SGI */
87 65, 130, 195, 260, 390, 520, 585, 650, 780, 0
88 },
89 { /* SGI */
90 72, 144, 217, 289, 433, 578, 650, 722, 867, 0
91 }
92 },
93 { /* BW40 */
94 { /* no SGI */
95 135, 270, 405, 540, 810, 1080, 1215, 1350, 1620, 1800
96 },
97 { /* SGI */
98 150, 300, 450, 600, 900, 1200, 1350, 1500, 1800, 2000
99 }
100 },
101 { /* BW80 */
102 { /* no SGI */
103 293, 585, 878, 1170, 1755, 2340, 2633, 2925, 3510, 3900
104 },
105 { /* SGI */
106 325, 650, 975, 1300, 1950, 2600, 2925, 3250, 3900, 4333
107 }
108 }
109};
ec470a07
TK
110/* MSDU subframe Header */
111struct msduhdr {
112 unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
113 unsigned char h_source[ETH_ALEN]; /* source ether addr */
114 __be16 len; /* MSDU Subframe length */
115 unsigned char dsap; /* DSAP field - SNAP 0xaa */
116 unsigned char ssap; /* SSAP field - SNAP 0xaa */
117 unsigned char ui; /* Control field: U, func UI - 0x03 */
118 unsigned char oui[3]; /* Organization Code - 0x000000 */
119 __be16 type; /* Type - 0x0800 (IPv4)*/
120} __attribute__((packed));
121
122static inline void ethr_ii_to_subframe_msdu(struct sk_buff *skb)
123{
124 struct ethhdr *ehdr;
125 struct msduhdr msduh;
126
127 ehdr = eth_hdr(skb);
128 ether_addr_copy(msduh.h_dest, ehdr->h_dest);
129 ether_addr_copy(msduh.h_source, ehdr->h_source);
130 /* adjust packet length */
131 msduh.len = cpu_to_be16(skb->len - 6);
132 msduh.dsap = 0xaa;
133 msduh.ssap = 0xaa;
134 msduh.ui = 0x03;
135 memset(msduh.oui, 0x0, 3);
136 msduh.type = ehdr->h_proto;
137 (void)skb_push(skb, sizeof(struct msduhdr) - sizeof(struct ethhdr));
77c81e22
DP
138 /* update SKB mac_header to point to start of MSDU header */
139 skb->mac_header -= (sizeof(struct msduhdr) - sizeof(struct ethhdr));
ec470a07
TK
140 memcpy(skb->data, &msduh, sizeof(struct msduhdr));
141}
142
143#define SLSI_TX_PROCESS_ID_MIN (0xC001)
144#define SLSI_TX_PROCESS_ID_MAX (0xCF00)
145#define SLSI_TX_PROCESS_ID_UDI_MIN (0xCF01)
146#define SLSI_TX_PROCESS_ID_UDI_MAX (0xCFFE)
147
148/* There are no wakelocks in kernel/supplicant/hostapd.
149 * So keep the platform active for some time after receiving any data packet.
150 * This timeout value can be fine-tuned based on the test results.
151 */
152#define SLSI_RX_WAKELOCK_TIME (200)
153#define MAX_BA_BUFFER_SIZE 64
154#define NUM_BA_SESSIONS_PER_PEER 8
155#define MAX_CHANNEL_LIST 20
156#define SLSI_MAX_RX_BA_SESSIONS (8)
5fcd17b3 157#define SLSI_STA_ACTION_FRAME_BITMAP (SLSI_ACTION_FRAME_PUBLIC | SLSI_ACTION_FRAME_WMM | SLSI_ACTION_FRAME_WNM |\
85aa0fce
Y
158 SLSI_ACTION_FRAME_QOS | SLSI_ACTION_FRAME_PROTECTED_DUAL |\
159 SLSI_ACTION_FRAME_RADIO_MEASUREMENT)
ec470a07
TK
160
161/* Default value for MIB SLSI_PSID_UNIFI_DISCONNECT_TIMEOUT + 1 sec*/
162#define SLSI_DEFAULT_AP_DISCONNECT_IND_TIMEOUT 3000
163
164#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
165#define WLAN_EID_VHT_CAPABILITY 191
166#define WLAN_EID_VHT_OPERATION 192
167#endif
168
169#define NUM_COUNTRY (300)
170
171#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
172#define SLSI_MUTEX_INIT(slsi_mutex__) \
173 { \
174 (slsi_mutex__).owner = NULL; \
175 mutex_init(&(slsi_mutex__).mutex); \
176 (slsi_mutex__).valid = true; \
177 }
178
179#define SLSI_MUTEX_LOCK(slsi_mutex_to_lock) \
180 { \
181 (slsi_mutex_to_lock).line_no_before = __LINE__; \
182 (slsi_mutex_to_lock).file_name_before = __FILE__; \
183 mutex_lock(&(slsi_mutex_to_lock).mutex); \
184 (slsi_mutex_to_lock).owner = current; \
185 (slsi_mutex_to_lock).line_no_after = __LINE__; \
186 (slsi_mutex_to_lock).file_name_after = __FILE__; \
187 (slsi_mutex_to_lock).function = __func__; \
188 }
189
190#define SLSI_MUTEX_UNLOCK(slsi_mutex_to_unlock) \
191 { \
192 (slsi_mutex_to_unlock).owner = NULL; \
193 mutex_unlock(&(slsi_mutex_to_unlock).mutex); \
194 }
195#define SLSI_MUTEX_IS_LOCKED(slsi_mutex__) mutex_is_locked(&(slsi_mutex__).mutex)
196
197struct slsi_mutex {
198 bool valid;
199 u32 line_no_before;
200 const u8 *file_name_before;
201 /* a std mutex */
202 struct mutex mutex;
203 u32 line_no_after;
204 const u8 *file_name_after;
205 const u8 *function;
206 struct task_struct *owner;
207};
208
209#else
210#define SLSI_MUTEX_INIT(mutex__) mutex_init(&(mutex__))
211#define SLSI_MUTEX_LOCK(mutex_to_lock) mutex_lock(&(mutex_to_lock))
212#define SLSI_MUTEX_UNLOCK(mutex_to_unlock) mutex_unlock(&(mutex_to_unlock))
213#define SLSI_MUTEX_IS_LOCKED(mutex__) mutex_is_locked(&(mutex__))
214#endif
215
216#define OS_UNUSED_PARAMETER(x) ((void)(x))
217
218#define SLSI_HOST_TAG_TRAFFIC_QUEUE(htag) (htag & 0x00000003)
219
220/* For each mlme-req a mlme-cfm is expected to be received from the
221 * firmware. The host is not allowed to send another mlme-req until
222 * the mlme-cfm is received.
223 *
224 * However there are also instances where we need to wait for an mlme-ind
225 * following a mlme-req/cfm exchange. One example of this is the disconnect
226 * sequence:
227 * mlme-disconnect-req - host requests disconnection
228 * mlme-disconnect-cfm - firmware accepts disconnection request but hasn't
229 * disconnected yet.
230 * mlme-disconnect-ind - firmware reports final result of disconnection
231 *
232 * Assuming that waiting for the mlme-ind following on from the mlme-req/cfm
233 * is ok.
234 */
235struct slsi_sig_send {
236 /* a std spinlock */
237 spinlock_t send_signal_lock;
238#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
239 struct slsi_mutex mutex;
240#else
241 /* a std mutex */
242 struct mutex mutex;
243#endif
244 struct completion completion;
245
246 u16 process_id;
247 u16 req_id;
248 u16 cfm_id;
249 u16 ind_id;
250 struct sk_buff *cfm;
251 struct sk_buff *ind;
252 struct sk_buff *mib_error;
253};
254
255static inline void slsi_sig_send_init(struct slsi_sig_send *sig_send)
256{
257 spin_lock_init(&sig_send->send_signal_lock);
258 sig_send->req_id = 0;
259 sig_send->cfm_id = 0;
260 sig_send->process_id = SLSI_TX_PROCESS_ID_MIN;
261 SLSI_MUTEX_INIT(sig_send->mutex);
262 init_completion(&sig_send->completion);
263}
264
265struct slsi_ba_frame_desc {
266 bool active;
267 struct sk_buff *signal;
268 u16 sn;
269};
270
271struct slsi_ba_session_rx {
272 bool active;
273 bool used;
274 void *vif;
275 struct slsi_ba_frame_desc buffer[MAX_BA_BUFFER_SIZE];
276 u16 buffer_size;
277 u16 occupied_slots;
278 u16 expected_sn;
279 u16 start_sn;
280 u16 highest_received_sn;
281 bool trigger_ba_after_ssn;
282 u8 tid;
283
284 /* Aging timer parameters */
285 bool timer_on;
286 struct timer_list ba_age_timer;
287 struct slsi_spinlock ba_lock;
288 struct net_device *dev;
289};
290
291#define SLSI_TID_MAX (16)
292#define SLSI_AMPDU_F_INITIATED (0x0001)
293#define SLSI_AMPDU_F_CREATED (0x0002)
294#define SLSI_AMPDU_F_OPERATIONAL (0x0004)
295
ec470a07
TK
296#define SLSI_SCAN_HW_ID 0
297#define SLSI_SCAN_SCHED_ID 1
298#define SLSI_SCAN_MAX 3
299
300#define SLSI_SCAN_SSID_MAP_MAX 10 /* Arbitrary value */
301#define SLSI_SCAN_SSID_MAP_EXPIRY_AGE 2 /* If hidden bss not found these many scan cycles, remove map. Arbitrary value*/
302#define SLSI_FW_SCAN_DONE_TIMEOUT_MSEC (15 * 1000)
303
304struct slsi_scan_result {
305 u8 bssid[ETH_ALEN];
306 u8 hidden;
307 int rssi;
308 struct sk_buff *probe_resp;
309 struct sk_buff *beacon;
310 struct slsi_scan_result *next;
311};
312
313/* Per Interface Scan Data
314 * Access protected by: cfg80211_lock
315 */
316struct slsi_scan {
317 /* When a Scan is running this not NULL. */
318 struct cfg80211_scan_request *scan_req;
ccc5c12c 319 struct slsi_acs_request *acs_request;
ec470a07
TK
320 struct cfg80211_sched_scan_request *sched_req;
321 bool requeue_timeout_work;
322
323 /* Indicates if the scan req is blocking. i.e, waiting until scan_done_ind received */
324 bool is_blocking_scan;
325
326 struct slsi_scan_result *scan_results; /* head for scan_results list*/
327};
328
329struct slsi_ssid_map {
330 u8 bssid[ETH_ALEN];
331 u8 ssid[32];
332 u8 ssid_len;
333 u8 age;
334};
335
336struct slsi_peer {
337 /* Flag MUST be set last when creating a record and immediately when removing.
338 * Otherwise another process could test the flag and start using the data.
339 */
340 bool valid;
341 u8 address[ETH_ALEN];
342
343 /* Presently connected_state is used only for AP/GO mode*/
344 u8 connected_state;
345 u16 aid;
346 /* Presently is_wps is used only in P2P GO mode */
347 bool is_wps;
348 u16 capabilities;
349 bool qos_enabled;
350 u8 queueset;
351 struct scsc_wifi_fcq_data_qset data_qs;
352 struct scsc_wifi_fcq_ctrl_q ctrl_q;
353
354 bool authorized;
355 bool pairwise_key_set;
356
357 /* Needed for STA/AP VIF */
358 struct sk_buff *assoc_ie;
359 struct sk_buff_head buffered_frames;
360 /* Needed for STA VIF */
361 struct sk_buff *assoc_resp_ie;
362
363 /* bitmask that keeps the status of acm bit for each AC
364 * bit 7 6 5 4 3 2 1 0
365 * | | | | | | | |
366 * vo vo vi vi be bk bk be
367 */
368 u8 wmm_acm;
369 /* bitmask that keeps the status of tspec establishment for each priority
370 * bit 7 6 5 4 3 2 1 0
371 * | | | | | | | |
372 * p7 p6 p5 p4 p3 p2 p1 p0
373 */
374 u8 tspec_established;
375 u8 uapsd;
376
377 /* TODO_HARDMAC:
378 * Q: Can we obtain stats from the firmware?
379 * Yes - then this is NOT needed and we can just get from the firmware when requested.
380 * No - How much can we get from the PSCHED?
381 */
382 struct station_info sinfo;
383 /* rate limit for peer sinfo mib reads */
384 struct ratelimit_state sinfo_mib_get_rs;
385 struct slsi_ba_session_rx *ba_session_rx[NUM_BA_SESSIONS_PER_PEER];
386
387#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
388 /* qos map configured at peer end*/
389 bool qos_map_set;
390 struct cfg80211_qos_map qos_map;
391#endif
392};
393
394/* Used to update vif type on vif deactivation indicating vif is no longer available */
395#define SLSI_VIFTYPE_UNSPECIFIED 0xFFFF
396
397struct slsi_vif_mgmt_tx {
398 u64 cookie; /* Cookie assigned by Host for the tx mgmt frame */
399 u16 host_tag; /* Host tag for the tx mgmt frame */
400 const u8 *buf; /* Buffer - Mgmt frame requested for tx */
401 size_t buf_len; /* Buffer length */
402 u8 exp_frame; /* Next expected Public action frame subtype from peer */
403};
404
405struct slsi_wmm_ac {
406 u8 aci_aifsn;
407 u8 ecw;
408 u16 txop_limit;
409} __packed;
410
411/* struct slsi_wmm_parameter_element
412 *
413 * eid - Vendor Specific
414 * len - Remaining Length of IE
415 * oui - Microsoft OUI
416 * oui_type - WMM
417 * oui_subtype - Param IE
418 * version - 1
419 * qos_info - Qos
420 * reserved -
421 * ac - BE,BK,VI,VO
422 */
423struct slsi_wmm_parameter_element {
424 u8 eid;
425 u8 len;
426 u8 oui[3];
427 u8 oui_type;
428 u8 oui_subtype;
429 u8 version;
430 u8 qos_info;
431 u8 reserved;
432 struct slsi_wmm_ac ac[4];
433} __packed;
434
435#define SLSI_MIN_FILTER_ID 0x80 /* Start of filter range reserved for host */
436
437/* for AP */
438#define SLSI_AP_ALL_IPV6_PKTS_FILTER_ID 0x80
439
440/* filter IDs for filters installed by driver */
441#ifdef CONFIG_SCSC_WLAN_BLOCK_IPV6
442
443enum slsi_filter_id {
444 SLSI_LOCAL_ARP_FILTER_ID = SLSI_MIN_FILTER_ID, /* 0x80 */
445 SLSI_ALL_BC_MC_FILTER_ID, /* 0x81 */
446 SLSI_PROXY_ARP_FILTER_ID, /* 0x82 */
447 SLSI_ALL_IPV6_PKTS_FILTER_ID, /* 0x83 */
448#ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
449 SLSI_NAT_IPSEC_FILTER_ID, /* 0x84 */
450#endif
451 SLSI_REGD_MC_FILTER_ID = 0x85
452};
453#else
454
455/* for STA */
456enum slsi_filter_id {
457 SLSI_LOCAL_ARP_FILTER_ID = SLSI_MIN_FILTER_ID, /* 0x80 */
458 SLSI_ALL_BC_MC_FILTER_ID, /* 0x81 */
459 SLSI_PROXY_ARP_FILTER_ID, /* 0x82 */
460 SLSI_LOCAL_NS_FILTER_ID, /* 0x83 */
461 SLSI_PROXY_ARP_NA_FILTER_ID, /* 0x84 */
462#ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
463 SLSI_NAT_IPSEC_FILTER_ID, /* 0x85 */
464#endif
465 SLSI_REGD_MC_FILTER_ID = 0x86
466};
467
468#endif
469
470#define SLSI_MAX_PKT_FILTERS 16
471
472#ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
473/* default config */
474#define SLSI_MC_ADDR_ENTRY_MAX (SLSI_MIN_FILTER_ID + SLSI_MAX_PKT_FILTERS - SLSI_REGD_MC_FILTER_ID)
475#else
476#define SLSI_MC_ADDR_ENTRY_MAX (SLSI_MIN_FILTER_ID + SLSI_MAX_PKT_FILTERS - SLSI_REGD_MC_FILTER_ID + 1)
477#endif
478
479/* Values for vif_status field
480 *
481 * Used to indicate the status of an activated VIF, to help resolve
482 * conflicting activities with indications from the firmware eg.
483 * cfg80211 triggers a disconnection before a STA completes its
484 * connection to an AP.
485 */
486#define SLSI_VIF_STATUS_UNSPECIFIED 0
487#define SLSI_VIF_STATUS_CONNECTING 1
488#define SLSI_VIF_STATUS_CONNECTED 2
489#define SLSI_VIF_STATUS_DISCONNECTING 3
490
491/*From wifi_offload.h (N_AVAIL_ID=3)*/
492#define SLSI_MAX_KEEPALIVE_ID 3
493
494struct slsi_last_connected_bss {
495 u8 address[ETH_ALEN];
496 int antenna_mode;
497 int rssi;
498 int mode;
499 int passpoint_version;
500 int snr;
501 int noise_level;
502 u16 bandwidth;
503 u16 roaming_count;
504 u16 channel_freq;
505 u16 tx_data_rate;
506 u8 roaming_akm;
507 u8 kv;
508 u32 kvie;
509 bool mimo_used;
510};
511
512struct slsi_vif_sta {
513 /* Only valid when the VIF is activated */
514 u8 vif_status;
515 bool is_wps;
516 u16 eap_hosttag;
517 u16 m4_host_tag;
518 u16 keepalive_host_tag[SLSI_MAX_KEEPALIVE_ID];
519
520 struct sk_buff *roam_mlme_procedure_started_ind;
521
522 /* This id is used to find out which response (connect resp/roamed resp/reassoc resp)
523 * is to be sent once M4 is transmitted successfully
524 */
525 u16 resp_id;
526 bool gratuitous_arp_needed;
527
528 /* regd multicast address*/
529 u8 regd_mc_addr_count;
530 u8 regd_mc_addr[SLSI_MC_ADDR_ENTRY_MAX][ETH_ALEN];
531 bool group_key_set;
532 struct sk_buff *mlme_scan_ind_skb;
533 bool roam_in_progress;
534 int tdls_peer_sta_records;
535 bool tdls_enabled;
536 struct cfg80211_bss *sta_bss;
537 u8 *assoc_req_add_info_elem;
538 u8 assoc_req_add_info_elem_len;
539
540 /* List of seen ESS and Freq associated with them */
541 struct list_head network_map;
542
543 struct slsi_wmm_ac wmm_ac[4];
544 bool nd_offload_enabled;
545
546 /*This structure is used to store last disconnected bss info and valid even when vif is deactivated. */
547 struct slsi_last_connected_bss last_connected_bss;
548};
549
550struct slsi_vif_unsync {
551 struct delayed_work roc_expiry_work; /* Work on ROC duration expiry */
552 struct delayed_work del_vif_work; /* Work on unsync vif retention timeout */
553 struct delayed_work hs2_del_vif_work; /* Work on HS2 unsync vif retention timeout */
554 u64 roc_cookie; /* Cookie id for ROC */
555 u8 *probe_rsp_ies; /* Probe response IEs to be configured in firmware */
556 size_t probe_rsp_ies_len; /* Probe response IE length */
557 bool ies_changed; /* To indicate if Probe Response IEs have changed from that previously stored */
558 bool listen_offload; /* To indicate if Listen Offload is started */
559};
560
561struct slsi_last_disconnected_sta {
562 u8 address[ETH_ALEN];
d7f52c77
Y
563 u32 rx_retry_packets;
564 u32 rx_bc_mc_packets;
565 u16 capabilities;
ec470a07
TK
566 int bandwidth;
567 int antenna_mode;
568 int rssi;
569 int mode;
570 u16 tx_data_rate;
571 bool mimo_used;
572 u16 reason;
573};
574
575struct slsi_vif_ap {
576 struct slsi_wmm_parameter_element wmm_ie;
577 struct slsi_last_disconnected_sta last_disconnected_sta;
578 u8 *cache_wmm_ie;
579 u8 *cache_wpa_ie;
580 u8 *add_info_ies;
581 size_t wmm_ie_len;
582 size_t wpa_ie_len;
583 size_t add_info_ies_len;
584 bool p2p_gc_keys_set; /* Used in GO mode to identify that a CLI has connected after WPA2 handshake */
585 bool privacy; /* Used for port enabling based on the open/secured AP configuration */
586 bool qos_enabled;
587 int beacon_interval; /* Beacon interval in AP/GO mode */
588 int mode;
589 bool non_ht_bss_present; /* Non HT BSS observed in HT20 OBSS scan */
590 struct scsc_wifi_fcq_data_qset group_data_qs;
591 u32 cipher;
592 u16 channel_freq;
593 u8 ssid[IEEE80211_MAX_SSID_LEN];
594 u8 ssid_len;
595};
596
6189f2b5
JPS
597#define SLSI_NAN_MAX_PUBLISH_ID 16
598#define SLSI_NAN_MAX_SUBSCRIBE_ID 16
599
600struct slsi_vif_nan {
601 u32 publish_id_map;
602 u32 subscribe_id_map;
603};
604
ec470a07
TK
605#define TCP_ACK_SUPPRESSION_RECORDS_MAX 16
606#define TCP_ACK_SUPPRESSION_RECORD_UNUSED_TIMEOUT 10 /* in seconds */
607
608#define TCP_ACK_SUPPRESSION_OPTIONS_OFFSET 20
609#define TCP_ACK_SUPPRESSION_OPTION_EOL 0
610#define TCP_ACK_SUPPRESSION_OPTION_NOP 1
611#define TCP_ACK_SUPPRESSION_OPTION_MSS 2
612#define TCP_ACK_SUPPRESSION_OPTION_WINDOW 3
613#define TCP_ACK_SUPPRESSION_OPTION_SACK 5
614
615#define SLSI_IS_VIF_CHANNEL_5G(ndev_vif) (((ndev_vif)->chan) ? ((ndev_vif)->chan->hw_value > 14) : 0)
616
617struct slsi_tcp_ack_s {
618 u32 daddr;
619 u32 dport;
620 u32 saddr;
621 u32 sport;
622 struct sk_buff_head list;
623 u8 window_multiplier;
624 u16 mss;
625 u32 ack_seq;
626 u16 slow_start_count;
627 u8 count;
628 u8 max;
629 u8 age;
630 struct timer_list timer;
631 struct slsi_spinlock lock;
632 bool state;
633 ktime_t last_sent;
634 bool tcp_slow_start;
635
636 /* TCP session throughput monitor */
637 u16 hysteresis;
638 u32 last_tcp_rate;
639 ktime_t last_sample_time;
640 u32 last_ack_seq;
641 u64 num_bytes;
ec470a07
TK
642#ifdef CONFIG_SCSC_WLAN_HIP4_PROFILING
643 u8 stream_id;
644 u8 rx_window_scale;
645#endif
646};
647
648struct slsi_tcp_ack_stats {
649 u32 tack_acks;
650 u32 tack_suppressed;
651 u32 tack_sent;
652 u32 tack_max;
653 u32 tack_timeout;
654 u32 tack_dacks;
655 u32 tack_sacks;
656 u32 tack_delay_acks;
657 u32 tack_low_window;
658 u32 tack_nocache;
659 u32 tack_norecord;
660 u32 tack_hasdata;
661 u32 tack_psh;
662 u32 tack_dropped;
663 u32 tack_ktime;
664 u32 tack_lastrecord;
665 u32 tack_searchrecord;
666 u32 tack_ece;
667};
668
669struct netdev_vif {
670 struct slsi_dev *sdev;
671 struct wireless_dev wdev;
672 atomic_t is_registered; /* Has the net dev been registered */
673 bool is_available; /* Has the net dev been opened AND is usable */
674 bool is_fw_test; /* Is the device in use as a test device via UDI */
675
676 /* Structure can be accessed by cfg80211 ops, procfs/ioctls and as a result
677 * of receiving MLME indications e.g. MLME-CONNECT-IND that can affect the
678 * status of the interface eg. STA connect failure will delete the VIF.
679 */
680#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
681 struct slsi_mutex vif_mutex;
682#else
683 /* a std mutex */
684 struct mutex vif_mutex;
685#endif
686 struct slsi_sig_send sig_wait;
e04e03ea 687
ec470a07 688 struct slsi_skb_work rx_data;
5fcd17b3 689 struct slsi_skb_work rx_mlme;
ec470a07
TK
690 u16 ifnum;
691 enum nl80211_iftype iftype;
692 enum nl80211_channel_type channel_type;
693 struct ieee80211_channel *chan;
479ea86c
IP
694 u16 driver_channel;
695 bool drv_in_p2p_procedure;
ec470a07
TK
696#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 9))
697 struct cfg80211_chan_def *chandef;
698#endif
699
700 /* NOTE: The Address is a __be32
701 * It needs converting to pass to the FW
702 * But not for the Arp or trace %pI4
703 */
704 __be32 ipaddress;
705
706#ifndef CONFIG_SCSC_WLAN_BLOCK_IPV6
707 struct in6_addr ipv6address;
708 struct slsi_spinlock ipv6addr_lock;
709#endif
710 struct net_device_stats stats;
711 u32 rx_packets[SLSI_LLS_AC_MAX];
712 u32 tx_packets[SLSI_LLS_AC_MAX];
713 u32 tx_no_ack[SLSI_LLS_AC_MAX];
714#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
715 struct slsi_mutex scan_mutex;
716 struct slsi_mutex scan_result_mutex;
717#else
718 /* a std mutex */
719 struct mutex scan_mutex;
720 struct mutex scan_result_mutex;
721
722#endif
723 struct slsi_scan scan[SLSI_SCAN_MAX];
724
725 struct slsi_src_sink_params src_sink_params;
726 u16 power_mode;
727 u16 set_power_mode;
728
729 bool activated; /* VIF is created in firmware and ready to use */
730 u16 vif_type;
731 struct slsi_spinlock peer_lock;
732 int peer_sta_records;
733 struct slsi_peer *peer_sta_record[SLSI_ADHOC_PEER_CONNECTIONS_MAX];
734
735 /* Used to populate the cfg80211 station_info structure generation variable.
736 * This number should increase every time the list of stations changes
737 * i.e. when a station is added or removed, so that userspace can tell
738 * whether it got a consistent snapshot.
739 */
740 int cfg80211_sinfo_generation;
741
742 /* Block Ack MPDU Re-order */
743 struct sk_buff_head ba_complete;
744 atomic_t ba_flush;
745
746 u64 mgmt_tx_cookie; /* Cookie id for mgmt tx */
747 struct slsi_vif_mgmt_tx mgmt_tx_data;
748 struct delayed_work scan_timeout_work; /* Work on scan timeout */
749 bool delete_probe_req_ies; /* Delete probe request stored at probe_req_ies, if
750 * connected for WAP2 at mlme_del_vif or in all cases
751 * if STA
752 */
753 u8 *probe_req_ies;
754 size_t probe_req_ie_len;
755
756 struct slsi_vif_unsync unsync;
757 struct slsi_vif_sta sta;
758 struct slsi_vif_ap ap;
6189f2b5 759 struct slsi_vif_nan nan;
ec470a07
TK
760
761 /* TCP ack suppression. */
762 struct slsi_tcp_ack_s *last_tcp_ack;
763 struct slsi_tcp_ack_s ack_suppression[TCP_ACK_SUPPRESSION_RECORDS_MAX];
764 struct slsi_tcp_ack_stats tcp_ack_stats;
ec470a07 765 /* traffic monitor */
25f4f399
DP
766 ktime_t last_timer_time;
767 u32 report_time;
768 u32 num_bytes_tx_per_timer;
769 u32 num_bytes_rx_per_timer;
770 u32 num_bytes_tx_per_sec;
771 u32 num_bytes_rx_per_sec;
ec470a07
TK
772 u32 throughput_tx;
773 u32 throughput_rx;
25f4f399
DP
774 u32 throughput_tx_bps;
775 u32 throughput_rx_bps;
ec470a07
TK
776};
777
778struct slsi_802_11d_reg_domain {
ec470a07
TK
779 u8 *countrylist;
780 struct ieee80211_regdomain *regdomain;
781 int country_len;
782};
783
784#ifdef CONFIG_SCSC_WLAN_WES_NCHO
785struct slsi_wes_mode_roam_scan_channels {
786 int n;
787 u8 channels[MAX_CHANNEL_LIST];
788};
789#endif
790
791struct slsi_dev_config {
792 /* Supported Freq Band (Dynamic)
793 * Set via the freq_band procfs
794 */
795#define SLSI_FREQ_BAND_AUTO 0
796#define SLSI_FREQ_BAND_5GHZ 1
797#define SLSI_FREQ_BAND_2GHZ 2
798 int supported_band;
799
800 struct ieee80211_supported_band *band_5G;
801 struct ieee80211_supported_band *band_2G;
802
803 /* current user suspend mode
804 * Set via the suspend_mode procfs
805 * 0 : not suspended
806 * 1 : suspended
807 */
808 int user_suspend_mode;
809
810 /* Rx filtering rule
811 * Set via the rx_filter_num procfs
812 * 0: Unicast, 1: Broadcast, 2:Multicast IPv4, 3: Multicast IPv6
813 */
814 int rx_filter_num;
815
816 /* Rx filter rule enabled
817 * Set via the rx_filter_start & rx_filter_stop procfs
818 */
819 bool rx_filter_rule_started;
820
821 /* AP Auto channel Selection */
822#define SLSI_NO_OF_SCAN_CHANLS_FOR_AUTO_CHAN_MAX 14
823 int ap_auto_chan;
824
825 /*QoS capability for a non-AP Station*/
826 int qos_info;
827#ifdef CONFIG_SCSC_WLAN_WES_NCHO
828 /* NCHO OKC mode */
829 int okc_mode;
830
831 /*NCHO WES mode */
832 int wes_mode;
833
834 int roam_scan_mode;
835
836 /*WES mode roam scan channels*/
837 struct slsi_wes_mode_roam_scan_channels wes_roam_scan_list;
838#endif
839 struct slsi_802_11d_reg_domain domain_info;
840
841 int ap_disconnect_ind_timeout;
842
843 u8 host_state;
844
845 int rssi_boost_5g;
846 int rssi_boost_2g;
847};
848
849#define SLSI_DEVICE_STATE_ATTACHING 0
850#define SLSI_DEVICE_STATE_STOPPED 1
851#define SLSI_DEVICE_STATE_STARTING 2
852#define SLSI_DEVICE_STATE_STARTED 3
853#define SLSI_DEVICE_STATE_STOPPING 4
854
855#define SLSI_NET_INDEX_WLAN 1
856#define SLSI_NET_INDEX_P2P 2
857#define SLSI_NET_INDEX_P2PX_SWLAN 3
6189f2b5 858#define SLSI_NET_INDEX_NAN 4
ec470a07
TK
859
860/* States used during P2P operations */
861enum slsi_p2p_states {
862 P2P_IDLE_NO_VIF, /* Initial state - Unsync vif is not present */
863 P2P_IDLE_VIF_ACTIVE, /* Unsync vif is present but no P2P procedure in progress */
864 P2P_SCANNING, /* P2P SOCIAL channel (1,6,11) scan in progress. Not used for P2P full scan */
865 P2P_LISTENING, /* P2P Listen (ROC) in progress */
866 P2P_ACTION_FRAME_TX_RX, /* P2P Action frame Tx in progress or waiting for a peer action frame Rx (i.e. in response to the Tx frame) */
867 P2P_GROUP_FORMED_CLI, /* P2P Group Formed - CLI role */
868 P2P_GROUP_FORMED_GO, /* P2P Group Formed - GO role */
869 /* NOTE: In P2P_LISTENING state if frame transmission is requested to driver then a peer response is ideally NOT expected.
870 * This is an assumption based on the fact that FIND would be stopped prior to group formation/connection.
871 * If driver were to receive a peer frame in P2P_LISTENING state then it would most probably be a REQUEST frame and the supplicant would respond to it.
872 * Hence the driver should get only RESPONSE frames for transmission in P2P_LISTENING state.
873 */
874};
875
5fcd17b3
PK
876enum slsi_wlan_state {
877 WLAN_UNSYNC_NO_VIF = 0, /* Initial state - Unsync vif is not present */
878 WLAN_UNSYNC_VIF_ACTIVE, /* Unsync vif is activated but no wlan procedure in progress */
879 WLAN_UNSYNC_VIF_TX /* Unsync vif is activated and wlan procedure in progress */
ec470a07
TK
880};
881
882/* Wakelock timeouts */
883#define SLSI_WAKELOCK_TIME_MSEC_EAPOL (1000)
884
885struct slsi_chip_info_mib {
886 u16 chip_version;
887};
888
889struct slsi_plat_info_mib {
890 u16 plat_build;
891};
892
893/* P2P States in text format for debug purposes */
894static inline char *slsi_p2p_state_text(u8 state)
895{
896 switch (state) {
897 case P2P_IDLE_NO_VIF:
898 return "P2P_IDLE_NO_VIF";
899 case P2P_IDLE_VIF_ACTIVE:
900 return "P2P_IDLE_VIF_ACTIVE";
901 case P2P_SCANNING:
902 return "P2P_SCANNING";
903 case P2P_LISTENING:
904 return "P2P_LISTENING";
905 case P2P_ACTION_FRAME_TX_RX:
906 return "P2P_ACTION_FRAME_TX_RX";
907 case P2P_GROUP_FORMED_CLI:
908 return "P2P_GROUP_FORMED_CLI";
909 case P2P_GROUP_FORMED_GO:
910 return "P2P_GROUP_FORMED_GO";
911 default:
912 return "UNKNOWN";
913 }
914}
915
5fcd17b3
PK
916#define SLSI_WLAN_MAX_HCF_PLATFORM_LEN (128)
917
ec470a07
TK
918struct slsi_dev_mib_info {
919 char *mib_file_name;
920 unsigned int mib_hash;
921
922 /* Cached File MIB Configuration values from User Space */
923 u8 *mib_data;
924 u32 mib_len;
5fcd17b3 925 char platform[SLSI_WLAN_MAX_HCF_PLATFORM_LEN];
ec470a07
TK
926};
927
928#define SLSI_WLAN_MAX_MIB_FILE 2 /* Number of WLAN HCFs to load */
929
479ea86c
IP
930#ifdef CONFIG_SCSC_LOG_COLLECTION
931struct slsi_dev_mib_collect_file {
932 char file_name[32];
933 u16 len;
934 u8 *data;
935} __packed;
936
937struct slsi_dev_mib_collect {
938 bool enabled;
939 /* Serialize writers/readers */
940 spinlock_t in_collection;
941 char num_files;
942 /* +1 represents local_mib */
943 struct slsi_dev_mib_collect_file file[SLSI_WLAN_MAX_MIB_FILE + 1];
944};
945
946#endif
947
ec470a07
TK
948struct slsi_dev {
949 /* Devices */
950 struct device *dev;
951 struct wiphy *wiphy;
952
953 struct slsi_hip hip; /* HIP bookkeeping block */
954 struct slsi_hip4 hip4_inst; /* The handler to parse to HIP */
955
956 struct scsc_wifi_cm_if cm_if; /* cm_if bookkeeping block */
957 struct scsc_mx *maxwell_core;
958 struct scsc_service_client mx_wlan_client;
959 struct scsc_service *service;
960 struct slsi_chip_info_mib chip_info_mib;
961 struct slsi_plat_info_mib plat_info_mib;
b47322da 962 u16 reg_dom_version;
ec470a07
TK
963
964#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
965 struct slsi_mutex netdev_add_remove_mutex;
966#else
967 /* a std mutex */
968 struct mutex netdev_add_remove_mutex;
969#endif
85aa0fce
Y
970 /* mutex to protect dynamic netdev removal */
971 struct mutex netdev_remove_mutex;
ec470a07
TK
972 int netdev_up_count;
973 struct net_device __rcu *netdev[CONFIG_SCSC_WLAN_MAX_INTERFACES + 1]; /* 0 is reserved */
d7f52c77 974 struct net_device __rcu *netdev_ap;
ec470a07
TK
975 u8 netdev_addresses[CONFIG_SCSC_WLAN_MAX_INTERFACES + 1][ETH_ALEN]; /* 0 is reserved */
976
977 int device_state;
978
979 /* BoT */
980 atomic_t in_pause_state;
981
982 /* Locking used to control Starting and stopping the chip */
983#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
984 struct slsi_mutex start_stop_mutex;
985#else
986 /* a std mutex */
987 struct mutex start_stop_mutex;
988#endif
989 /* UDI Logging */
990 struct slsi_log_clients log_clients;
991 void *uf_cdev;
992
993 /* ProcFS */
994 int procfs_instance;
995 struct proc_dir_entry *procfs_dir;
996
997 /* Configuration */
998 u8 hw_addr[ETH_ALEN];
999 struct slsi_dev_mib_info mib[SLSI_WLAN_MAX_MIB_FILE];
1000 struct slsi_dev_mib_info local_mib;
479ea86c
IP
1001#ifdef CONFIG_SCSC_LOG_COLLECTION
1002 struct slsi_dev_mib_collect collect_mib;
1003#endif
ec470a07
TK
1004 char *maddr_file_name;
1005 bool *term_udi_users; /* Try to terminate UDI users during unload */
1006 int *sig_wait_cfm_timeout;
1007
1008 struct slsi_wake_lock wlan_wl;
1009 struct slsi_wake_lock wlan_wl_mlme;
1010 struct slsi_wake_lock wlan_wl_ma;
5fcd17b3 1011#if !defined SLSI_TEST_DEV && defined CONFIG_ANDROID
ec470a07
TK
1012 struct wake_lock wlan_wl_roam;
1013#endif
1014 struct slsi_sig_send sig_wait;
1015 struct slsi_skb_work rx_dbg_sap;
1016 atomic_t tx_host_tag[SLSI_LLS_AC_MAX];
1017#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
1018 struct slsi_mutex device_config_mutex;
1019#else
1020 /* a std mutex */
1021 struct mutex device_config_mutex;
1022#endif
1023 struct slsi_dev_config device_config;
1024
1025 struct notifier_block inetaddr_notifier;
1026#ifndef CONFIG_SCSC_WLAN_BLOCK_IPV6
1027 struct notifier_block inet6addr_notifier;
1028#endif
1029
1030 struct workqueue_struct *device_wq; /* Driver Workqueue */
1031 enum slsi_p2p_states p2p_state; /* Store current P2P operation */
1032
5fcd17b3 1033 enum slsi_wlan_state wlan_unsync_vif_state; /* Store current sate of unsync wlan vif */
ec470a07
TK
1034
1035 int current_tspec_id;
1036 int tspec_error_code;
1037 u8 p2p_group_exp_frame; /* Next expected Public action frame subtype from peer */
1038 bool initial_scan;
1039
1040#ifdef CONFIG_SCSC_WLAN_GSCAN_ENABLE
1041 struct slsi_gscan *gscan;
1042 struct slsi_gscan_result *gscan_hash_table[SLSI_GSCAN_HASH_TABLE_SIZE];
1043 int num_gscan_results;
1044 int buffer_threshold;
1045 int buffer_consumed;
1046 struct slsi_bucket bucket[SLSI_GSCAN_MAX_BUCKETS];
1047 struct list_head hotlist_results;
1048 bool epno_active;
1049#endif
5fcd17b3
PK
1050#ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION
1051 u8 scan_mac_addr[6];
1052 bool scan_addr_set;
ec470a07
TK
1053#endif
1054#ifdef CONFIG_SCSC_WLAN_HIP4_PROFILING
1055 int minor_prof;
1056#endif
1057 struct slsi_ba_session_rx rx_ba_buffer_pool[SLSI_MAX_RX_BA_SESSIONS];
1058 struct slsi_spinlock rx_ba_buffer_pool_lock;
1059 bool fail_reported;
1060 bool p2p_certif; /* Set to true to idenitfy p2p_certification testing is going on*/
1061 bool mlme_blocked; /* When true do not send mlme signals to FW */
1062 atomic_t debug_inds;
1063 int recovery_next_state;
1064 struct completion recovery_remove_completion;
1065 struct completion recovery_stop_completion;
1066 struct completion recovery_completed;
1067 int recovery_status;
1068 struct slsi_ssid_map ssid_map[SLSI_SCAN_SSID_MAP_MAX];
1069 bool band_5g_supported;
1070 int supported_2g_channels[14];
1071 int supported_5g_channels[25];
1072 int enabled_channel_count;
1073 bool fw_ht_enabled;
1074 u8 fw_ht_cap[4]; /* HT capabilities is 21 bytes but host is never intersted in last 17 bytes*/
1075 bool fw_vht_enabled;
1076 u8 fw_vht_cap[4];
1077#ifdef CONFIG_SCSC_WLAN_WIFI_SHARING
1078 u8 wifi_sharing_5ghz_channel[8];
1079 int valid_5g_freq[25];
1080 int wifi_sharing_5g_restricted_channels[25];
1081 int num_5g_restricted_channels;
1082#endif
1083 bool fw_2g_40mhz_enabled;
6189f2b5 1084 bool nan_enabled;
ec470a07
TK
1085 u16 assoc_result_code; /* Status of latest association in STA mode */
1086 bool allow_switch_40_mhz; /* Used in AP cert to disable HT40 when not configured */
1087 bool allow_switch_80_mhz; /* Used in AP cert to disable VHT when not configured */
1088#ifdef CONFIG_SCSC_WLAN_AP_INFO_FILE
7e30b534 1089 /* Parameters in '/data/vendor/conn/.softap.info' */
ec470a07
TK
1090 bool dualband_concurrency;
1091 u32 softap_max_client;
1092#endif
f985c5e0 1093 u32 fw_dwell_time;
ec470a07
TK
1094 int lls_num_radio;
1095
ec470a07
TK
1096#ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
1097 struct slsi_mutex logger_mutex;
1098#else
1099 /* a std mutex */
1100 struct mutex logger_mutex;
ec470a07
TK
1101#endif
1102 struct slsi_traffic_mon_clients traffic_mon_clients;
5fcd17b3
PK
1103 /*Store vif index corresponding to rtt id for FTM*/
1104 u16 rtt_vif[8];
ccc5c12c 1105 bool acs_channel_switched;
85aa0fce 1106 int recovery_timeout; /* ms autorecovery completion timeout */
ec470a07
TK
1107};
1108
1109/* Compact representation of channels a ESS has been seen on
1110 * This is sized correctly for the Channels we currently support,
1111 * 2.4Ghz Channels 1 - 14
1112 * 5 Ghz Channels Uni1, Uni2 and Uni3
1113 */
1114struct slsi_roaming_network_map_entry {
1115 struct list_head list;
1116 unsigned long last_seen_jiffies; /* Timestamp of the last time we saw this ESS */
1117 struct cfg80211_ssid ssid; /* SSID of the ESS */
1118 u8 initial_bssid[ETH_ALEN]; /* Bssid of the first ap seen in this ESS */
1119 bool only_one_ap_seen; /* Has more than one AP for this ESS been seen */
1120 u16 channels_24_ghz; /* 2.4 Ghz Channels Bit Map */
1121 /* 5 Ghz Channels Bit Map
1122 * channels_5_ghz & 0x000000FF = 4 Uni1 Channels
1123 * channels_5_ghz & 0x00FFFF00 = 15 Uni2 Channels
1124 * channels_5_ghz & 0xFF000000 = 5 Uni3 Channels
1125 */
1126 u32 channels_5_ghz;
1127};
1128
1129#define LLC_SNAP_HDR_LEN 8
1130struct llc_snap_hdr {
1131 u8 llc_dsap;
1132 u8 llc_ssap;
1133 u8 llc_ctrl;
1134 u8 snap_oui[3];
1135 u16 snap_type;
1136} __packed;
1137
5fcd17b3 1138void slsi_rx_data_deliver_skb(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb);
ec470a07
TK
1139void slsi_rx_dbg_sap_work(struct work_struct *work);
1140void slsi_rx_netdev_data_work(struct work_struct *work);
1141void slsi_rx_netdev_mlme_work(struct work_struct *work);
1142int slsi_rx_enqueue_netdev_mlme(struct slsi_dev *sdev, struct sk_buff *skb, u16 vif);
1143void slsi_rx_scan_pass_to_cfg80211(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb);
1144void slsi_rx_buffered_frames(struct slsi_dev *sdev, struct net_device *dev, struct slsi_peer *peer);
1145int slsi_rx_blocking_signals(struct slsi_dev *sdev, struct sk_buff *skb);
1146void slsi_scan_complete(struct slsi_dev *sdev, struct net_device *dev, u16 scan_id, bool aborted);
1147
1148void slsi_tx_pause_queues(struct slsi_dev *sdev);
1149void slsi_tx_unpause_queues(struct slsi_dev *sdev);
1150int slsi_tx_control(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb);
1151int slsi_tx_data(struct slsi_dev *sdev, struct net_device *dev, struct sk_buff *skb);
1152int slsi_tx_data_lower(struct slsi_dev *sdev, struct sk_buff *skb);
1153bool slsi_is_test_mode_enabled(void);
1154bool slsi_is_rf_test_mode_enabled(void);
1155int slsi_check_rf_test_mode(void);
1156void slsi_regd_deinit(struct slsi_dev *sdev);
1157void slsi_init_netdev_mac_addr(struct slsi_dev *sdev);
1158bool slsi_dev_lls_supported(void);
1159bool slsi_dev_gscan_supported(void);
1160bool slsi_dev_epno_supported(void);
1161bool slsi_dev_vo_vi_block_ack(void);
1162int slsi_dev_get_scan_result_count(void);
1163bool slsi_dev_llslogs_supported(void);
6189f2b5 1164int slsi_dev_nan_supported(struct slsi_dev *sdev);
0db27ed8 1165void slsi_regd_init(struct slsi_dev *sdev);
5fcd17b3 1166bool slsi_dev_rtt_supported(void);
ec470a07
TK
1167
1168static inline u16 slsi_tx_host_tag(struct slsi_dev *sdev, enum slsi_traffic_q tq)
1169{
1170 /* host_tag:
1171 * bit 0,1 = trafficqueue identifier
1172 * bit 2-15 = incremental number
1173 * So increment by 4 to get bit 2-15 a incremental sequence
1174 */
1175 return (u16)atomic_add_return(4, &sdev->tx_host_tag[tq]);
1176}
1177
1178static inline u16 slsi_tx_mgmt_host_tag(struct slsi_dev *sdev)
1179{
1180 /* Doesn't matter which traffic queue host tag is selected.*/
1181 return slsi_tx_host_tag(sdev, 0);
1182}
1183
1184static inline struct net_device *slsi_get_netdev_rcu(struct slsi_dev *sdev, u16 ifnum)
1185{
1186 WARN_ON(!rcu_read_lock_held());
1187 if (ifnum > CONFIG_SCSC_WLAN_MAX_INTERFACES) {
1188 /* WARN(1, "ifnum:%d", ifnum); WARN() is used like this to avoid Coverity Error */
1189 return NULL;
1190 }
1191 return rcu_dereference(sdev->netdev[ifnum]);
1192}
1193
1194static inline struct net_device *slsi_get_netdev_locked(struct slsi_dev *sdev, u16 ifnum)
1195{
1196 WARN_ON(!SLSI_MUTEX_IS_LOCKED(sdev->netdev_add_remove_mutex));
1197 if (ifnum > CONFIG_SCSC_WLAN_MAX_INTERFACES) {
1198 WARN(1, "ifnum:%d", ifnum); /* WARN() is used like this to avoid Coverity Error */
1199 return NULL;
1200 }
1201 return sdev->netdev[ifnum];
1202}
1203
1204static inline struct net_device *slsi_get_netdev(struct slsi_dev *sdev, u16 ifnum)
1205{
1206 struct net_device *dev;
1207
1208 SLSI_MUTEX_LOCK(sdev->netdev_add_remove_mutex);
1209 dev = slsi_get_netdev_locked(sdev, ifnum);
1210 SLSI_MUTEX_UNLOCK(sdev->netdev_add_remove_mutex);
1211
1212 return dev;
1213}
1214
1215static inline int slsi_get_supported_mode(const u8 *peer_ie)
1216{
1217 const u8 *peer_ie_data;
1218 u8 peer_ie_len;
1219 int i;
1220 int supported_rate;
1221
1222 peer_ie_len = peer_ie[1];
1223 peer_ie_data = &peer_ie[2];
1224 for (i = 0; i < peer_ie_len; i++) {
1225 supported_rate = ((peer_ie_data[i] & 0x7F) / 2);
1226 if (supported_rate > 11)
1227 return SLSI_80211_MODE_11G;
1228 }
1229 return SLSI_80211_MODE_11B;
1230}
1231
d7f52c77
Y
1232/* Names of full mode HCF files */
1233extern char *slsi_mib_file;
1234extern char *slsi_mib_file2;
1235
ec470a07 1236#endif