1 /*****************************************************************************
3 * Copyright (c) 2012 - 2019 Samsung Electronics Co., Ltd. All rights reserved
5 ****************************************************************************/
7 #ifndef __SLSI_DEVICE_H__
8 #define __SLSI_DEVICE_H__
10 #include <linux/init.h>
11 #include <linux/device.h>
12 #include <linux/inetdevice.h>
13 #include <net/addrconf.h>
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>
24 #include <linux/completion.h>
25 #include <linux/workqueue.h>
26 #include <linux/time.h>
27 #include <linux/sched.h>
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>
36 #include <scsc/scsc_mx.h>
42 #include "log_clients.h"
44 #include "scsc_wifi_fcq.h"
45 #include "scsc_wifi_cm_if.h"
47 #include "nl80211_vendor.h"
48 #include "traffic_monitor.h"
50 #define FAPI_MAJOR_VERSION(v) (((v) >> 8) & 0xFF)
51 #define FAPI_MINOR_VERSION(v) ((v) & 0xFF)
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
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
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
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
75 #define SLSI_FW_API_RATE_SGI 0x0100
76 #define SLSI_FW_API_RATE_GF 0x0080
78 #define SLSI_HOSTSTATE_LCD_ACTIVE 0x0001
79 #define SLSI_HOSTSTATE_CELLULAR_ACTIVE 0x0002
80 #define SLSI_HOSTSTATE_SAR_ACTIVE 0x0004
81 #define SLSI_HOSTSTATE_GRIP_ACTIVE 0x0040
82 #define SLSI_HOSTSTATE_LOW_LATENCY_ACTIVE 0x0080
84 /* indices: 3= BW20->idx_0, BW40->idx_1, BW80->idx_2.
85 * 2= noSGI->idx_0, SGI->idx_1
88 * This table for single stream Nss=1and does not include 160MHz BW and 80+80MHz BW.
90 static const u16 slsi_rates_table
[3][2][10] = {
93 65, 130, 195, 260, 390, 520, 585, 650, 780, 0
96 72, 144, 217, 289, 433, 578, 650, 722, 867, 0
101 135, 270, 405, 540, 810, 1080, 1215, 1350, 1620, 1800
104 150, 300, 450, 600, 900, 1200, 1350, 1500, 1800, 2000
109 293, 585, 878, 1170, 1755, 2340, 2633, 2925, 3510, 3900
112 325, 650, 975, 1300, 1950, 2600, 2925, 3250, 3900, 4333
116 /* MSDU subframe Header */
118 unsigned char h_dest
[ETH_ALEN
]; /* destination eth addr */
119 unsigned char h_source
[ETH_ALEN
]; /* source ether addr */
120 __be16 len
; /* MSDU Subframe length */
121 unsigned char dsap
; /* DSAP field - SNAP 0xaa */
122 unsigned char ssap
; /* SSAP field - SNAP 0xaa */
123 unsigned char ui
; /* Control field: U, func UI - 0x03 */
124 unsigned char oui
[3]; /* Organization Code - 0x000000 */
125 __be16 type
; /* Type - 0x0800 (IPv4)*/
126 } __attribute__((packed
));
128 static inline void ethr_ii_to_subframe_msdu(struct sk_buff
*skb
)
131 struct msduhdr msduh
;
134 ether_addr_copy(msduh
.h_dest
, ehdr
->h_dest
);
135 ether_addr_copy(msduh
.h_source
, ehdr
->h_source
);
136 /* adjust packet length */
137 msduh
.len
= cpu_to_be16(skb
->len
- 6);
141 memset(msduh
.oui
, 0x0, 3);
142 msduh
.type
= ehdr
->h_proto
;
143 (void)skb_push(skb
, sizeof(struct msduhdr
) - sizeof(struct ethhdr
));
144 /* update SKB mac_header to point to start of MSDU header */
145 skb
->mac_header
-= (sizeof(struct msduhdr
) - sizeof(struct ethhdr
));
146 memcpy(skb
->data
, &msduh
, sizeof(struct msduhdr
));
149 #define SLSI_TX_PROCESS_ID_MIN (0xC001)
150 #define SLSI_TX_PROCESS_ID_MAX (0xCF00)
151 #define SLSI_TX_PROCESS_ID_UDI_MIN (0xCF01)
152 #define SLSI_TX_PROCESS_ID_UDI_MAX (0xCFFE)
154 /* There are no wakelocks in kernel/supplicant/hostapd.
155 * So keep the platform active for some time after receiving any data packet.
156 * This timeout value can be fine-tuned based on the test results.
158 #define SLSI_RX_WAKELOCK_TIME (200)
159 #define MAX_BA_BUFFER_SIZE 64
160 #define NUM_BA_SESSIONS_PER_PEER 8
161 #define MAX_CHANNEL_LIST 20
162 #define SLSI_MAX_RX_BA_SESSIONS (8)
163 #define SLSI_STA_ACTION_FRAME_BITMAP (SLSI_ACTION_FRAME_PUBLIC | SLSI_ACTION_FRAME_WMM | SLSI_ACTION_FRAME_WNM |\
164 SLSI_ACTION_FRAME_QOS | SLSI_ACTION_FRAME_PROTECTED_DUAL |\
165 SLSI_ACTION_FRAME_RADIO_MEASUREMENT)
167 /* Default value for MIB SLSI_PSID_UNIFI_DISCONNECT_TIMEOUT + 1 sec*/
168 #define SLSI_DEFAULT_AP_DISCONNECT_IND_TIMEOUT 3000
170 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
171 #define WLAN_EID_VHT_CAPABILITY 191
172 #define WLAN_EID_VHT_OPERATION 192
175 #define NUM_COUNTRY (300)
177 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
178 #define SLSI_MUTEX_INIT(slsi_mutex__) \
180 (slsi_mutex__).owner = NULL; \
181 mutex_init(&(slsi_mutex__).mutex); \
182 (slsi_mutex__).valid = true; \
185 #define SLSI_MUTEX_LOCK(slsi_mutex_to_lock) \
187 (slsi_mutex_to_lock).line_no_before = __LINE__; \
188 (slsi_mutex_to_lock).file_name_before = __FILE__; \
189 mutex_lock(&(slsi_mutex_to_lock).mutex); \
190 (slsi_mutex_to_lock).owner = current; \
191 (slsi_mutex_to_lock).line_no_after = __LINE__; \
192 (slsi_mutex_to_lock).file_name_after = __FILE__; \
193 (slsi_mutex_to_lock).function = __func__; \
196 #define SLSI_MUTEX_UNLOCK(slsi_mutex_to_unlock) \
198 (slsi_mutex_to_unlock).owner = NULL; \
199 mutex_unlock(&(slsi_mutex_to_unlock).mutex); \
201 #define SLSI_MUTEX_IS_LOCKED(slsi_mutex__) mutex_is_locked(&(slsi_mutex__).mutex)
206 const u8
*file_name_before
;
210 const u8
*file_name_after
;
212 struct task_struct
*owner
;
216 #define SLSI_MUTEX_INIT(mutex__) mutex_init(&(mutex__))
217 #define SLSI_MUTEX_LOCK(mutex_to_lock) mutex_lock(&(mutex_to_lock))
218 #define SLSI_MUTEX_UNLOCK(mutex_to_unlock) mutex_unlock(&(mutex_to_unlock))
219 #define SLSI_MUTEX_IS_LOCKED(mutex__) mutex_is_locked(&(mutex__))
222 #define OS_UNUSED_PARAMETER(x) ((void)(x))
224 #define SLSI_HOST_TAG_TRAFFIC_QUEUE(htag) (htag & 0x00000003)
226 /* For each mlme-req a mlme-cfm is expected to be received from the
227 * firmware. The host is not allowed to send another mlme-req until
228 * the mlme-cfm is received.
230 * However there are also instances where we need to wait for an mlme-ind
231 * following a mlme-req/cfm exchange. One example of this is the disconnect
233 * mlme-disconnect-req - host requests disconnection
234 * mlme-disconnect-cfm - firmware accepts disconnection request but hasn't
236 * mlme-disconnect-ind - firmware reports final result of disconnection
238 * Assuming that waiting for the mlme-ind following on from the mlme-req/cfm
241 struct slsi_sig_send
{
243 spinlock_t send_signal_lock
;
244 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
245 struct slsi_mutex mutex
;
250 struct completion completion
;
258 struct sk_buff
*mib_error
;
261 static inline void slsi_sig_send_init(struct slsi_sig_send
*sig_send
)
263 spin_lock_init(&sig_send
->send_signal_lock
);
264 sig_send
->req_id
= 0;
265 sig_send
->cfm_id
= 0;
266 sig_send
->process_id
= SLSI_TX_PROCESS_ID_MIN
;
267 SLSI_MUTEX_INIT(sig_send
->mutex
);
268 init_completion(&sig_send
->completion
);
271 struct slsi_ba_frame_desc
{
273 struct sk_buff
*signal
;
277 struct slsi_ba_session_rx
{
281 struct slsi_ba_frame_desc buffer
[MAX_BA_BUFFER_SIZE
];
286 u16 highest_received_sn
;
287 bool trigger_ba_after_ssn
;
290 /* Aging timer parameters */
292 struct timer_list ba_age_timer
;
293 struct slsi_spinlock ba_lock
;
294 struct net_device
*dev
;
297 #define SLSI_TID_MAX (16)
298 #define SLSI_AMPDU_F_INITIATED (0x0001)
299 #define SLSI_AMPDU_F_CREATED (0x0002)
300 #define SLSI_AMPDU_F_OPERATIONAL (0x0004)
302 #define SLSI_SCAN_HW_ID 0
303 #define SLSI_SCAN_SCHED_ID 1
304 #define SLSI_SCAN_MAX 3
306 #define SLSI_SCAN_SSID_MAP_MAX 10 /* Arbitrary value */
307 #define SLSI_SCAN_SSID_MAP_EXPIRY_AGE 2 /* If hidden bss not found these many scan cycles, remove map. Arbitrary value*/
308 #define SLSI_FW_SCAN_DONE_TIMEOUT_MSEC (15 * 1000)
310 struct slsi_scan_result
{
314 struct sk_buff
*probe_resp
;
315 struct sk_buff
*beacon
;
316 struct slsi_scan_result
*next
;
320 /* Per Interface Scan Data
321 * Access protected by: cfg80211_lock
324 /* When a Scan is running this not NULL. */
325 struct cfg80211_scan_request
*scan_req
;
326 struct slsi_acs_request
*acs_request
;
327 struct cfg80211_sched_scan_request
*sched_req
;
328 bool requeue_timeout_work
;
330 /* Indicates if the scan req is blocking. i.e, waiting until scan_done_ind received */
331 bool is_blocking_scan
;
333 struct slsi_scan_result
*scan_results
; /* head for scan_results list*/
336 struct slsi_ssid_map
{
344 #ifdef CONFIG_SCSC_WLAN_STA_ENHANCED_ARP_DETECT
345 struct slsi_enhanced_arp_counters
{
346 u16 arp_req_count_from_netdev
;
347 u16 arp_req_count_to_lower_mac
;
348 u16 arp_req_rx_count_by_lower_mac
;
349 u16 arp_req_count_tx_success
;
350 u16 arp_rsp_rx_count_by_lower_mac
;
351 u16 arp_rsp_rx_count_by_upper_mac
;
352 u16 arp_rsp_count_to_netdev
;
353 u16 arp_rsp_count_out_of_order_drop
;
355 bool is_duplicate_addr_detected
;
360 /* Flag MUST be set last when creating a record and immediately when removing.
361 * Otherwise another process could test the flag and start using the data.
364 u8 address
[ETH_ALEN
];
366 /* Presently connected_state is used only for AP/GO mode*/
369 /* Presently is_wps is used only in P2P GO mode */
374 struct scsc_wifi_fcq_data_qset data_qs
;
375 struct scsc_wifi_fcq_ctrl_q ctrl_q
;
378 bool pairwise_key_set
;
380 /* Needed for STA/AP VIF */
381 struct sk_buff
*assoc_ie
;
382 struct sk_buff_head buffered_frames
;
383 /* Needed for STA VIF */
384 struct sk_buff
*assoc_resp_ie
;
386 /* bitmask that keeps the status of acm bit for each AC
387 * bit 7 6 5 4 3 2 1 0
389 * vo vo vi vi be bk bk be
392 /* bitmask that keeps the status of tspec establishment for each priority
393 * bit 7 6 5 4 3 2 1 0
395 * p7 p6 p5 p4 p3 p2 p1 p0
397 u8 tspec_established
;
401 * Q: Can we obtain stats from the firmware?
402 * Yes - then this is NOT needed and we can just get from the firmware when requested.
403 * No - How much can we get from the PSCHED?
405 struct station_info sinfo
;
406 /* rate limit for peer sinfo mib reads */
407 struct ratelimit_state sinfo_mib_get_rs
;
408 struct slsi_ba_session_rx
*ba_session_rx
[NUM_BA_SESSIONS_PER_PEER
];
410 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
411 /* qos map configured at peer end*/
413 struct cfg80211_qos_map qos_map
;
417 /* Used to update vif type on vif deactivation indicating vif is no longer available */
418 #define SLSI_VIFTYPE_UNSPECIFIED 0xFFFF
420 struct slsi_vif_mgmt_tx
{
421 u64 cookie
; /* Cookie assigned by Host for the tx mgmt frame */
422 u16 host_tag
; /* Host tag for the tx mgmt frame */
423 const u8
*buf
; /* Buffer - Mgmt frame requested for tx */
424 size_t buf_len
; /* Buffer length */
425 u8 exp_frame
; /* Next expected Public action frame subtype from peer */
434 /* struct slsi_wmm_parameter_element
436 * eid - Vendor Specific
437 * len - Remaining Length of IE
438 * oui - Microsoft OUI
440 * oui_subtype - Param IE
446 struct slsi_wmm_parameter_element
{
455 struct slsi_wmm_ac ac
[4];
458 #define SLSI_MIN_FILTER_ID 0x80 /* Start of filter range reserved for host */
461 #define SLSI_AP_ALL_IPV6_PKTS_FILTER_ID 0x80
463 /* filter IDs for filters installed by driver */
464 #ifdef CONFIG_SCSC_WLAN_BLOCK_IPV6
466 enum slsi_filter_id
{
467 SLSI_ALL_ARP_FILTER_ID
= SLSI_MIN_FILTER_ID
, /* 0x80 */
468 SLSI_LOCAL_ARP_FILTER_ID
, /* 0x81 */
469 SLSI_ALL_BC_MC_FILTER_ID
, /* 0x82 */
470 SLSI_PROXY_ARP_FILTER_ID
, /* 0x83 */
471 SLSI_ALL_IPV6_PKTS_FILTER_ID
, /* 0x84 */
472 #ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
473 SLSI_NAT_IPSEC_FILTER_ID
, /* 0x85 */
475 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
476 SLSI_OPT_OUT_ALL_FILTER_ID
, /* 0x86 */
477 SLSI_OPT_IN_TCP4_FILTER_ID
, /* 0x87 */
478 SLSI_OPT_IN_TCP6_FILTER_ID
, /* 0x88 */
480 SLSI_OPT_OUT_ABNORMAL_MULTICAST_ID
, /* 0x89 */
481 SLSI_REGD_MC_FILTER_ID
, /* 0x8A */
486 enum slsi_filter_id
{
487 SLSI_ALL_ARP_FILTER_ID
= SLSI_MIN_FILTER_ID
, /* 0x80 */
488 SLSI_LOCAL_ARP_FILTER_ID
, /* 0x81 */
489 SLSI_ALL_BC_MC_FILTER_ID
, /* 0x82 */
490 SLSI_PROXY_ARP_FILTER_ID
, /* 0x83 */
491 SLSI_LOCAL_NS_FILTER_ID
, /* 0x84 */
492 SLSI_PROXY_ARP_NA_FILTER_ID
, /* 0x85 */
493 #ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
494 SLSI_NAT_IPSEC_FILTER_ID
, /* 0x86 */
496 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
497 SLSI_OPT_OUT_ALL_FILTER_ID
, /* 0x87 */
498 SLSI_OPT_IN_TCP4_FILTER_ID
, /* 0x88 */
499 SLSI_OPT_IN_TCP6_FILTER_ID
, /* 0x89 */
501 SLSI_OPT_OUT_ABNORMAL_MULTICAST_ID
, /* 0x8a */
502 SLSI_REGD_MC_FILTER_ID
, /* 0x8b */
507 #define SLSI_MAX_PKT_FILTERS 16
509 #ifndef CONFIG_SCSC_WLAN_DISABLE_NAT_KA
511 #define SLSI_MC_ADDR_ENTRY_MAX (SLSI_MIN_FILTER_ID + SLSI_MAX_PKT_FILTERS - SLSI_REGD_MC_FILTER_ID)
513 #define SLSI_MC_ADDR_ENTRY_MAX (SLSI_MIN_FILTER_ID + SLSI_MAX_PKT_FILTERS - SLSI_REGD_MC_FILTER_ID + 1)
516 /* Values for vif_status field
518 * Used to indicate the status of an activated VIF, to help resolve
519 * conflicting activities with indications from the firmware eg.
520 * cfg80211 triggers a disconnection before a STA completes its
521 * connection to an AP.
523 #define SLSI_VIF_STATUS_UNSPECIFIED 0
524 #define SLSI_VIF_STATUS_CONNECTING 1
525 #define SLSI_VIF_STATUS_CONNECTED 2
526 #define SLSI_VIF_STATUS_DISCONNECTING 3
528 /*From wifi_offload.h (N_AVAIL_ID=3)*/
529 #define SLSI_MAX_KEEPALIVE_ID 3
531 struct slsi_last_connected_bss
{
532 u8 address
[ETH_ALEN
];
536 int passpoint_version
;
549 struct slsi_vif_sta
{
550 /* Only valid when the VIF is activated */
555 u16 keepalive_host_tag
[SLSI_MAX_KEEPALIVE_ID
];
557 struct sk_buff
*roam_mlme_procedure_started_ind
;
559 /* This id is used to find out which response (connect resp/roamed resp/reassoc resp)
560 * is to be sent once M4 is transmitted successfully
563 bool gratuitous_arp_needed
;
565 /* regd multicast address*/
566 u8 regd_mc_addr_count
;
567 u8 regd_mc_addr
[SLSI_MC_ADDR_ENTRY_MAX
][ETH_ALEN
];
569 struct sk_buff
*mlme_scan_ind_skb
;
570 bool roam_in_progress
;
571 int tdls_peer_sta_records
;
573 struct cfg80211_bss
*sta_bss
;
574 u8
*assoc_req_add_info_elem
;
575 u8 assoc_req_add_info_elem_len
;
577 /* List of seen ESS and Freq associated with them */
578 struct list_head network_map
;
580 struct slsi_wmm_ac wmm_ac
[4];
581 bool nd_offload_enabled
;
582 unsigned long data_rate_mbps
;
583 unsigned long max_rate_mbps
;
585 /*This structure is used to store last disconnected bss info and valid even when vif is deactivated. */
586 struct slsi_last_connected_bss last_connected_bss
;
587 struct cfg80211_crypto_settings crypto
;
589 /* Variable to indicate if roamed_ind needs to be dropped in driver, to maintain roam synchronization. */
590 atomic_t drop_roamed_ind
;
591 u8
*vendor_disconnect_ies
;
592 int vendor_disconnect_ies_len
;
595 struct slsi_vif_unsync
{
596 struct delayed_work roc_expiry_work
; /* Work on ROC duration expiry */
597 struct delayed_work del_vif_work
; /* Work on unsync vif retention timeout */
598 struct delayed_work hs2_del_vif_work
; /* Work on HS2 unsync vif retention timeout */
599 struct delayed_work unset_channel_expiry_work
; /*unset channel after a timer */
600 u64 roc_cookie
; /* Cookie id for ROC */
601 u8
*probe_rsp_ies
; /* Probe response IEs to be configured in firmware */
602 size_t probe_rsp_ies_len
; /* Probe response IE length */
603 bool ies_changed
; /* To indicate if Probe Response IEs have changed from that previously stored */
604 bool listen_offload
; /* To indicate if Listen Offload is started */
605 bool slsi_p2p_continuous_fullscan
;
608 struct slsi_last_disconnected_sta
{
609 u8 address
[ETH_ALEN
];
610 u32 rx_retry_packets
;
611 u32 rx_bc_mc_packets
;
624 struct slsi_wmm_parameter_element wmm_ie
;
625 struct slsi_last_disconnected_sta last_disconnected_sta
;
631 size_t add_info_ies_len
;
632 bool p2p_gc_keys_set
; /* Used in GO mode to identify that a CLI has connected after WPA2 handshake */
633 bool privacy
; /* Used for port enabling based on the open/secured AP configuration */
635 int beacon_interval
; /* Beacon interval in AP/GO mode */
637 bool non_ht_bss_present
; /* Non HT BSS observed in HT20 OBSS scan */
638 struct scsc_wifi_fcq_data_qset group_data_qs
;
641 u8 ssid
[IEEE80211_MAX_SSID_LEN
];
645 #define SLSI_NAN_MAX_PUBLISH_ID 16
646 #define SLSI_NAN_MAX_SUBSCRIBE_ID 16
648 struct slsi_vif_nan
{
650 u32 subscribe_id_map
;
653 #define TCP_ACK_SUPPRESSION_RECORDS_MAX 16
654 #define TCP_ACK_SUPPRESSION_RECORD_UNUSED_TIMEOUT 10 /* in seconds */
656 #define TCP_ACK_SUPPRESSION_OPTIONS_OFFSET 20
657 #define TCP_ACK_SUPPRESSION_OPTION_EOL 0
658 #define TCP_ACK_SUPPRESSION_OPTION_NOP 1
659 #define TCP_ACK_SUPPRESSION_OPTION_MSS 2
660 #define TCP_ACK_SUPPRESSION_OPTION_WINDOW 3
661 #define TCP_ACK_SUPPRESSION_OPTION_SACK 5
663 #define SLSI_IS_VIF_CHANNEL_5G(ndev_vif) (((ndev_vif)->chan) ? ((ndev_vif)->chan->hw_value > 14) : 0)
665 struct slsi_tcp_ack_s
{
670 struct sk_buff_head list
;
671 u8 window_multiplier
;
674 u16 slow_start_count
;
678 struct timer_list timer
;
679 struct slsi_spinlock lock
;
684 /* TCP session throughput monitor */
687 ktime_t last_sample_time
;
690 #ifdef CONFIG_SCSC_WLAN_HIP4_PROFILING
696 struct slsi_tcp_ack_stats
{
713 u32 tack_searchrecord
;
718 struct slsi_dev
*sdev
;
719 struct wireless_dev wdev
;
720 atomic_t is_registered
; /* Has the net dev been registered */
721 bool is_available
; /* Has the net dev been opened AND is usable */
722 bool is_fw_test
; /* Is the device in use as a test device via UDI */
723 #ifdef CONFIG_SLSI_WLAN_STA_FWD_BEACON
724 bool is_wips_running
;
726 /* Structure can be accessed by cfg80211 ops, procfs/ioctls and as a result
727 * of receiving MLME indications e.g. MLME-CONNECT-IND that can affect the
728 * status of the interface eg. STA connect failure will delete the VIF.
730 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
731 struct slsi_mutex vif_mutex
;
734 struct mutex vif_mutex
;
736 struct slsi_sig_send sig_wait
;
738 struct slsi_skb_work rx_data
;
739 struct slsi_skb_work rx_mlme
;
741 enum nl80211_iftype iftype
;
742 enum nl80211_channel_type channel_type
;
743 struct ieee80211_channel
*chan
;
745 bool drv_in_p2p_procedure
;
746 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 9))
747 struct cfg80211_chan_def
*chandef
;
750 /* NOTE: The Address is a __be32
751 * It needs converting to pass to the FW
752 * But not for the Arp or trace %pI4
756 #ifndef CONFIG_SCSC_WLAN_BLOCK_IPV6
757 struct in6_addr ipv6address
;
758 struct slsi_spinlock ipv6addr_lock
;
760 struct net_device_stats stats
;
761 u32 rx_packets
[SLSI_LLS_AC_MAX
];
762 u32 tx_packets
[SLSI_LLS_AC_MAX
];
763 u32 tx_no_ack
[SLSI_LLS_AC_MAX
];
764 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
765 struct slsi_mutex scan_mutex
;
766 struct slsi_mutex scan_result_mutex
;
769 struct mutex scan_mutex
;
770 struct mutex scan_result_mutex
;
773 struct slsi_scan scan
[SLSI_SCAN_MAX
];
775 struct slsi_src_sink_params src_sink_params
;
779 bool activated
; /* VIF is created in firmware and ready to use */
781 struct slsi_spinlock peer_lock
;
782 int peer_sta_records
;
783 struct slsi_peer
*peer_sta_record
[SLSI_ADHOC_PEER_CONNECTIONS_MAX
];
785 /* Used to populate the cfg80211 station_info structure generation variable.
786 * This number should increase every time the list of stations changes
787 * i.e. when a station is added or removed, so that userspace can tell
788 * whether it got a consistent snapshot.
790 int cfg80211_sinfo_generation
;
792 /* Block Ack MPDU Re-order */
793 struct sk_buff_head ba_complete
;
796 u64 mgmt_tx_cookie
; /* Cookie id for mgmt tx */
797 struct slsi_vif_mgmt_tx mgmt_tx_data
;
798 struct delayed_work scan_timeout_work
; /* Work on scan timeout */
799 bool delete_probe_req_ies
; /* Delete probe request stored at probe_req_ies, if
800 * connected for WAP2 at mlme_del_vif or in all cases
804 size_t probe_req_ie_len
;
806 struct slsi_vif_unsync unsync
;
807 struct slsi_vif_sta sta
;
808 struct slsi_vif_ap ap
;
809 struct slsi_vif_nan nan
;
811 /* TCP ack suppression. */
812 struct slsi_tcp_ack_s
*last_tcp_ack
;
813 struct slsi_tcp_ack_s ack_suppression
[TCP_ACK_SUPPRESSION_RECORDS_MAX
];
814 struct slsi_tcp_ack_stats tcp_ack_stats
;
815 /* traffic monitor */
816 ktime_t last_timer_time
;
818 u32 num_bytes_tx_per_timer
;
819 u32 num_bytes_rx_per_timer
;
820 u32 num_bytes_tx_per_sec
;
821 u32 num_bytes_rx_per_sec
;
824 u32 throughput_tx_bps
;
825 u32 throughput_rx_bps
;
826 #ifdef CONFIG_SCSC_WLAN_STA_ENHANCED_ARP_DETECT
827 bool enhanced_arp_detect_enabled
;
828 struct slsi_enhanced_arp_counters enhanced_arp_stats
;
829 u8 target_ip_addr
[4];
830 int enhanced_arp_host_tag
[5];
832 struct cfg80211_ap_settings backup_settings
;
835 struct slsi_802_11d_reg_domain
{
837 struct ieee80211_regdomain
*regdomain
;
841 struct slsi_apf_capabilities
{
846 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
847 struct slsi_wes_mode_roam_scan_channels
{
849 u8 channels
[MAX_CHANNEL_LIST
];
853 struct slsi_dev_config
{
854 /* Supported Freq Band (Dynamic)
855 * Set via the freq_band procfs
857 #define SLSI_FREQ_BAND_AUTO 0
858 #define SLSI_FREQ_BAND_5GHZ 1
859 #define SLSI_FREQ_BAND_2GHZ 2
862 struct ieee80211_supported_band
*band_5G
;
863 struct ieee80211_supported_band
*band_2G
;
865 /* current user suspend mode
866 * Set via the suspend_mode procfs
870 int user_suspend_mode
;
873 * Set via the rx_filter_num procfs
874 * 0: Unicast, 1: Broadcast, 2:Multicast IPv4, 3: Multicast IPv6
878 /* Rx filter rule enabled
879 * Set via the rx_filter_start & rx_filter_stop procfs
881 bool rx_filter_rule_started
;
883 /* AP Auto channel Selection */
884 #define SLSI_NO_OF_SCAN_CHANLS_FOR_AUTO_CHAN_MAX 14
887 /*QoS capability for a non-AP Station*/
889 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
898 /*WES mode roam scan channels*/
899 struct slsi_wes_mode_roam_scan_channels wes_roam_scan_list
;
901 struct slsi_802_11d_reg_domain domain_info
;
903 int ap_disconnect_ind_timeout
;
909 bool disable_ch12_ch13
;
910 bool fw_enhanced_arp_detect_supported
;
911 bool fw_apf_supported
;
912 struct slsi_apf_capabilities apf_cap
;
915 #define SLSI_DEVICE_STATE_ATTACHING 0
916 #define SLSI_DEVICE_STATE_STOPPED 1
917 #define SLSI_DEVICE_STATE_STARTING 2
918 #define SLSI_DEVICE_STATE_STARTED 3
919 #define SLSI_DEVICE_STATE_STOPPING 4
921 #define SLSI_NET_INDEX_WLAN 1
922 #define SLSI_NET_INDEX_P2P 2
923 #define SLSI_NET_INDEX_P2PX_SWLAN 3
924 #define SLSI_NET_INDEX_NAN 4
926 /* States used during P2P operations */
927 enum slsi_p2p_states
{
928 P2P_IDLE_NO_VIF
, /* Initial state - Unsync vif is not present */
929 P2P_IDLE_VIF_ACTIVE
, /* Unsync vif is present but no P2P procedure in progress */
930 P2P_SCANNING
, /* P2P SOCIAL channel (1,6,11) scan in progress. Not used for P2P full scan */
931 P2P_LISTENING
, /* P2P Listen (ROC) in progress */
932 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) */
933 P2P_GROUP_FORMED_CLI
, /* P2P Group Formed - CLI role */
934 P2P_GROUP_FORMED_GO
, /* P2P Group Formed - GO role */
935 /* NOTE: In P2P_LISTENING state if frame transmission is requested to driver then a peer response is ideally NOT expected.
936 * This is an assumption based on the fact that FIND would be stopped prior to group formation/connection.
937 * 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.
938 * Hence the driver should get only RESPONSE frames for transmission in P2P_LISTENING state.
942 enum slsi_wlan_state
{
943 WLAN_UNSYNC_NO_VIF
= 0, /* Initial state - Unsync vif is not present */
944 WLAN_UNSYNC_VIF_ACTIVE
, /* Unsync vif is activated but no wlan procedure in progress */
945 WLAN_UNSYNC_VIF_TX
/* Unsync vif is activated and wlan procedure in progress */
948 /* Wakelock timeouts */
949 #define SLSI_WAKELOCK_TIME_MSEC_EAPOL (1000)
951 struct slsi_chip_info_mib
{
955 struct slsi_plat_info_mib
{
959 /* P2P States in text format for debug purposes */
960 static inline char *slsi_p2p_state_text(u8 state
)
963 case P2P_IDLE_NO_VIF
:
964 return "P2P_IDLE_NO_VIF";
965 case P2P_IDLE_VIF_ACTIVE
:
966 return "P2P_IDLE_VIF_ACTIVE";
968 return "P2P_SCANNING";
970 return "P2P_LISTENING";
971 case P2P_ACTION_FRAME_TX_RX
:
972 return "P2P_ACTION_FRAME_TX_RX";
973 case P2P_GROUP_FORMED_CLI
:
974 return "P2P_GROUP_FORMED_CLI";
975 case P2P_GROUP_FORMED_GO
:
976 return "P2P_GROUP_FORMED_GO";
982 #define SLSI_WLAN_MAX_HCF_PLATFORM_LEN (128)
984 struct slsi_dev_mib_info
{
986 unsigned int mib_hash
;
988 /* Cached File MIB Configuration values from User Space */
991 char platform
[SLSI_WLAN_MAX_HCF_PLATFORM_LEN
];
994 #define SLSI_WLAN_MAX_MIB_FILE 2 /* Number of WLAN HCFs to load */
996 #ifdef CONFIG_SCSC_LOG_COLLECTION
997 struct slsi_dev_mib_collect_file
{
1003 struct slsi_dev_mib_collect
{
1005 /* Serialize writers/readers */
1006 spinlock_t in_collection
;
1008 /* +1 represents local_mib */
1009 struct slsi_dev_mib_collect_file file
[SLSI_WLAN_MAX_MIB_FILE
+ 1];
1017 struct wiphy
*wiphy
;
1019 struct slsi_hip hip
; /* HIP bookkeeping block */
1020 struct slsi_hip4 hip4_inst
; /* The handler to parse to HIP */
1022 struct scsc_wifi_cm_if cm_if
; /* cm_if bookkeeping block */
1023 struct scsc_mx
*maxwell_core
;
1024 struct scsc_service_client mx_wlan_client
;
1025 struct scsc_service
*service
;
1026 struct slsi_chip_info_mib chip_info_mib
;
1027 struct slsi_plat_info_mib plat_info_mib
;
1028 u16 reg_dom_version
;
1030 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
1031 struct slsi_mutex netdev_add_remove_mutex
;
1034 struct mutex netdev_add_remove_mutex
;
1036 /* mutex to protect dynamic netdev removal */
1037 struct mutex netdev_remove_mutex
;
1038 int netdev_up_count
;
1039 struct net_device __rcu
*netdev
[CONFIG_SCSC_WLAN_MAX_INTERFACES
+ 1]; /* 0 is reserved */
1040 struct net_device __rcu
*netdev_ap
;
1041 u8 netdev_addresses
[CONFIG_SCSC_WLAN_MAX_INTERFACES
+ 1][ETH_ALEN
]; /* 0 is reserved */
1046 atomic_t in_pause_state
;
1047 #ifdef CONFIG_SCSC_WLAN_SILENT_RECOVERY
1048 struct work_struct recovery_work
; /* Work on failure_reset recovery*/
1050 /* Locking used to control Starting and stopping the chip */
1051 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
1052 struct slsi_mutex start_stop_mutex
;
1055 struct mutex start_stop_mutex
;
1058 struct slsi_log_clients log_clients
;
1062 int procfs_instance
;
1063 struct proc_dir_entry
*procfs_dir
;
1066 u8 hw_addr
[ETH_ALEN
];
1067 struct slsi_dev_mib_info mib
[SLSI_WLAN_MAX_MIB_FILE
];
1068 struct slsi_dev_mib_info local_mib
;
1069 #ifdef CONFIG_SCSC_LOG_COLLECTION
1070 struct slsi_dev_mib_collect collect_mib
;
1072 char *maddr_file_name
;
1073 bool *term_udi_users
; /* Try to terminate UDI users during unload */
1074 int *sig_wait_cfm_timeout
;
1076 struct slsi_wake_lock wlan_wl
;
1077 struct slsi_wake_lock wlan_wl_mlme
;
1078 struct slsi_wake_lock wlan_wl_ma
;
1079 #if !defined SLSI_TEST_DEV && defined CONFIG_ANDROID
1080 struct wake_lock wlan_wl_roam
;
1082 struct slsi_sig_send sig_wait
;
1083 struct slsi_skb_work rx_dbg_sap
;
1084 atomic_t tx_host_tag
[SLSI_LLS_AC_MAX
];
1085 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
1086 struct slsi_mutex device_config_mutex
;
1089 struct mutex device_config_mutex
;
1091 struct slsi_dev_config device_config
;
1093 struct notifier_block inetaddr_notifier
;
1094 #ifndef CONFIG_SCSC_WLAN_BLOCK_IPV6
1095 struct notifier_block inet6addr_notifier
;
1098 struct workqueue_struct
*device_wq
; /* Driver Workqueue */
1099 enum slsi_p2p_states p2p_state
; /* Store current P2P operation */
1101 enum slsi_wlan_state wlan_unsync_vif_state
; /* Store current sate of unsync wlan vif */
1103 int current_tspec_id
;
1104 int tspec_error_code
;
1105 u8 p2p_group_exp_frame
; /* Next expected Public action frame subtype from peer */
1108 #ifdef CONFIG_SCSC_WLAN_GSCAN_ENABLE
1109 struct slsi_gscan
*gscan
;
1110 struct slsi_gscan_result
*gscan_hash_table
[SLSI_GSCAN_HASH_TABLE_SIZE
];
1111 int num_gscan_results
;
1112 int buffer_threshold
;
1113 int buffer_consumed
;
1114 struct slsi_bucket bucket
[SLSI_GSCAN_MAX_BUCKETS
];
1115 struct list_head hotlist_results
;
1118 #ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION
1119 u8 scan_mac_addr
[6];
1122 #ifdef CONFIG_SCSC_WLAN_HIP4_PROFILING
1125 struct slsi_ba_session_rx rx_ba_buffer_pool
[SLSI_MAX_RX_BA_SESSIONS
];
1126 struct slsi_spinlock rx_ba_buffer_pool_lock
;
1128 bool p2p_certif
; /* Set to true to idenitfy p2p_certification testing is going on*/
1129 bool mlme_blocked
; /* When true do not send mlme signals to FW */
1130 atomic_t debug_inds
;
1131 int recovery_next_state
;
1132 struct completion recovery_remove_completion
;
1133 struct completion recovery_stop_completion
;
1134 struct completion recovery_completed
;
1135 int recovery_status
;
1136 struct slsi_ssid_map ssid_map
[SLSI_SCAN_SSID_MAP_MAX
];
1137 bool band_5g_supported
;
1138 int supported_2g_channels
[14];
1139 int supported_5g_channels
[25];
1140 int enabled_channel_count
;
1142 u8 fw_ht_cap
[4]; /* HT capabilities is 21 bytes but host is never intersted in last 17 bytes*/
1143 bool fw_vht_enabled
;
1145 #ifdef CONFIG_SCSC_WLAN_WIFI_SHARING
1146 u8 wifi_sharing_5ghz_channel
[8];
1147 int valid_5g_freq
[25];
1148 int wifi_sharing_5g_restricted_channels
[25];
1149 int num_5g_restricted_channels
;
1151 bool fw_SoftAp_2g_40mhz_enabled
;
1153 u16 assoc_result_code
; /* Status of latest association in STA mode */
1154 bool allow_switch_40_mhz
; /* Used in AP cert to disable HT40 when not configured */
1155 bool allow_switch_80_mhz
; /* Used in AP cert to disable VHT when not configured */
1156 #ifdef CONFIG_SCSC_WLAN_AP_INFO_FILE
1157 /* Parameters in '/data/vendor/conn/.softap.info' */
1158 bool dualband_concurrency
;
1159 u32 softap_max_client
;
1164 #ifdef CONFIG_SCSC_WLAN_MUTEX_DEBUG
1165 struct slsi_mutex logger_mutex
;
1168 struct mutex logger_mutex
;
1170 struct slsi_traffic_mon_clients traffic_mon_clients
;
1171 /*Store vif index corresponding to rtt id for FTM*/
1173 bool acs_channel_switched
;
1174 int recovery_timeout
; /* ms autorecovery completion timeout */
1175 #ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION
1176 bool fw_mac_randomization_enabled
;
1179 #ifdef CONFIG_SCSC_WLAN_ENHANCED_PKT_FILTER
1180 bool enhanced_pkt_filter_enabled
;
1182 #ifdef CONFIG_SCSC_WLAN_ABNORMAL_MULTICAST_PKT_FILTER
1183 bool abnormal_multicast_pkt_filter_enabled
;
1187 /* Compact representation of channels a ESS has been seen on
1188 * This is sized correctly for the Channels we currently support,
1189 * 2.4Ghz Channels 1 - 14
1190 * 5 Ghz Channels Uni1, Uni2 and Uni3
1192 struct slsi_roaming_network_map_entry
{
1193 struct list_head list
;
1194 unsigned long last_seen_jiffies
; /* Timestamp of the last time we saw this ESS */
1195 struct cfg80211_ssid ssid
; /* SSID of the ESS */
1196 u8 initial_bssid
[ETH_ALEN
]; /* Bssid of the first ap seen in this ESS */
1197 bool only_one_ap_seen
; /* Has more than one AP for this ESS been seen */
1198 u16 channels_24_ghz
; /* 2.4 Ghz Channels Bit Map */
1199 /* 5 Ghz Channels Bit Map
1200 * channels_5_ghz & 0x000000FF = 4 Uni1 Channels
1201 * channels_5_ghz & 0x00FFFF00 = 15 Uni2 Channels
1202 * channels_5_ghz & 0xFF000000 = 5 Uni3 Channels
1207 #define LLC_SNAP_HDR_LEN 8
1208 struct llc_snap_hdr
{
1216 void slsi_rx_data_deliver_skb(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
, bool from_ba_timer
);
1217 void slsi_rx_dbg_sap_work(struct work_struct
*work
);
1218 void slsi_rx_netdev_data_work(struct work_struct
*work
);
1219 void slsi_rx_netdev_mlme_work(struct work_struct
*work
);
1220 int slsi_rx_enqueue_netdev_mlme(struct slsi_dev
*sdev
, struct sk_buff
*skb
, u16 vif
);
1221 void slsi_rx_scan_pass_to_cfg80211(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
);
1222 void slsi_rx_buffered_frames(struct slsi_dev
*sdev
, struct net_device
*dev
, struct slsi_peer
*peer
);
1223 int slsi_rx_blocking_signals(struct slsi_dev
*sdev
, struct sk_buff
*skb
);
1224 void slsi_scan_complete(struct slsi_dev
*sdev
, struct net_device
*dev
, u16 scan_id
, bool aborted
);
1226 void slsi_tx_pause_queues(struct slsi_dev
*sdev
);
1227 void slsi_tx_unpause_queues(struct slsi_dev
*sdev
);
1228 int slsi_tx_control(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
);
1229 int slsi_tx_data(struct slsi_dev
*sdev
, struct net_device
*dev
, struct sk_buff
*skb
);
1230 int slsi_tx_data_lower(struct slsi_dev
*sdev
, struct sk_buff
*skb
);
1231 bool slsi_is_test_mode_enabled(void);
1232 bool slsi_is_rf_test_mode_enabled(void);
1233 int slsi_check_rf_test_mode(void);
1234 void slsi_regd_deinit(struct slsi_dev
*sdev
);
1235 void slsi_init_netdev_mac_addr(struct slsi_dev
*sdev
);
1236 bool slsi_dev_lls_supported(void);
1237 bool slsi_dev_gscan_supported(void);
1238 bool slsi_dev_epno_supported(void);
1239 bool slsi_dev_vo_vi_block_ack(void);
1240 int slsi_dev_get_scan_result_count(void);
1241 bool slsi_dev_llslogs_supported(void);
1242 int slsi_dev_nan_supported(struct slsi_dev
*sdev
);
1243 void slsi_regd_init(struct slsi_dev
*sdev
);
1244 bool slsi_dev_rtt_supported(void);
1247 #ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION
1248 bool slsi_dev_mac_randomisation_support(void);
1252 static inline u16
slsi_tx_host_tag(struct slsi_dev
*sdev
, enum slsi_traffic_q tq
)
1255 * bit 0,1 = trafficqueue identifier
1256 * bit 2-15 = incremental number
1257 * So increment by 4 to get bit 2-15 a incremental sequence
1259 return (u16
)atomic_add_return(4, &sdev
->tx_host_tag
[tq
]);
1262 static inline u16
slsi_tx_mgmt_host_tag(struct slsi_dev
*sdev
)
1264 /* Doesn't matter which traffic queue host tag is selected.*/
1265 return slsi_tx_host_tag(sdev
, 0);
1268 static inline struct net_device
*slsi_get_netdev_rcu(struct slsi_dev
*sdev
, u16 ifnum
)
1270 WARN_ON(!rcu_read_lock_held());
1271 if (ifnum
> CONFIG_SCSC_WLAN_MAX_INTERFACES
) {
1272 /* WARN(1, "ifnum:%d", ifnum); WARN() is used like this to avoid Coverity Error */
1275 return rcu_dereference(sdev
->netdev
[ifnum
]);
1278 static inline struct net_device
*slsi_get_netdev_locked(struct slsi_dev
*sdev
, u16 ifnum
)
1280 WARN_ON(!SLSI_MUTEX_IS_LOCKED(sdev
->netdev_add_remove_mutex
));
1281 if (ifnum
> CONFIG_SCSC_WLAN_MAX_INTERFACES
) {
1282 WARN(1, "ifnum:%d", ifnum
); /* WARN() is used like this to avoid Coverity Error */
1285 return sdev
->netdev
[ifnum
];
1288 static inline struct net_device
*slsi_get_netdev(struct slsi_dev
*sdev
, u16 ifnum
)
1290 struct net_device
*dev
;
1292 SLSI_MUTEX_LOCK(sdev
->netdev_add_remove_mutex
);
1293 dev
= slsi_get_netdev_locked(sdev
, ifnum
);
1294 SLSI_MUTEX_UNLOCK(sdev
->netdev_add_remove_mutex
);
1299 static inline int slsi_get_supported_mode(const u8
*peer_ie
)
1301 const u8
*peer_ie_data
;
1306 peer_ie_len
= peer_ie
[1];
1307 peer_ie_data
= &peer_ie
[2];
1308 for (i
= 0; i
< peer_ie_len
; i
++) {
1309 supported_rate
= ((peer_ie_data
[i
] & 0x7F) / 2);
1310 if (supported_rate
> 11)
1311 return SLSI_80211_MODE_11G
;
1313 return SLSI_80211_MODE_11B
;
1316 /* Names of full mode HCF files */
1317 extern char *slsi_mib_file
;
1318 extern char *slsi_mib_file2
;