From cde9070d9970eef1f7ec2360586c802a16230ad8 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 10 May 2024 07:43:50 +0000 Subject: [PATCH] rtl88x2CE_WiFi_linux driver --- kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_pno.h | 183 +++++++++++++++++++++++++-------------------- 1 files changed, 103 insertions(+), 80 deletions(-) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_pno.h b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_pno.h index ebaa400..64f0f24 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_pno.h +++ b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_pno.h @@ -1,16 +1,17 @@ -/* SPDX-License-Identifier: GPL-2.0 */ /* * Header file of Broadcom Dongle Host Driver (DHD) * Prefered Network Offload code and Wi-Fi Location Service(WLS) code. * - * Copyright (C) 1999-2019, Broadcom Corporation - * + * Portions of this code are copyright (c) 2022 Cypress Semiconductor Corporation + * + * Copyright (C) 1999-2017, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -18,7 +19,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -26,20 +27,22 @@ * * <<Broadcom-WL-IPTag/Open:>> * - * $Id: dhd_pno.h 423669 2013-09-18 13:01:55Z $ + * $Id: dhd_pno.h 805174 2019-02-15 17:26:01Z $ */ #ifndef __DHD_PNO_H__ #define __DHD_PNO_H__ -#if defined(PNO_SUPPORT) +#if defined(OEM_ANDROID) && defined(PNO_SUPPORT) #define PNO_TLV_PREFIX 'S' #define PNO_TLV_VERSION '1' #define PNO_TLV_SUBTYPE_LEGACY_PNO '2' #define PNO_TLV_RESERVED '0' + #define PNO_BATCHING_SET "SET" #define PNO_BATCHING_GET "GET" #define PNO_BATCHING_STOP "STOP" + #define PNO_PARAMS_DELIMETER " " #define PNO_PARAM_CHANNEL_DELIMETER "," #define PNO_PARAM_VALUE_DELLIMETER '=' @@ -64,8 +67,28 @@ #define AP_END_MARKER "====\n" #define PNO_RSSI_MARGIN_DBM 30 -#ifdef GSCAN_SUPPORT +#define CSCAN_COMMAND "CSCAN " +#define CSCAN_TLV_PREFIX 'S' +#define CSCAN_TLV_VERSION 1 +#define CSCAN_TLV_SUBVERSION 0 +#define CSCAN_TLV_TYPE_SSID_IE 'S' +#define CSCAN_TLV_TYPE_CHANNEL_IE 'C' +#define CSCAN_TLV_TYPE_NPROBE_IE 'N' +#define CSCAN_TLV_TYPE_ACTIVE_IE 'A' +#define CSCAN_TLV_TYPE_PASSIVE_IE 'P' +#define CSCAN_TLV_TYPE_HOME_IE 'H' +#define CSCAN_TLV_TYPE_STYPE_IE 'T' +#define WL_SCAN_PARAMS_SSID_MAX 10 +#define GET_SSID "SSID=" +#define GET_CHANNEL "CH=" +#define GET_NPROBE "NPROBE=" +#define GET_ACTIVE_ASSOC_DWELL "ACTIVE=" +#define GET_PASSIVE_ASSOC_DWELL "PASSIVE=" +#define GET_HOME_DWELL "HOME=" +#define GET_SCAN_TYPE "TYPE=" + +#if defined(GSCAN_SUPPORT) || defined(DHD_GET_VALID_CHANNELS) #define GSCAN_MAX_CH_BUCKETS 8 #define GSCAN_MAX_CHANNELS_IN_BUCKET 32 #define GSCAN_MAX_AP_CACHE_PER_SCAN 32 @@ -88,6 +111,7 @@ #define DHD_EPNO_A_BAND_TRIG (1 << 1) #define DHD_EPNO_BG_BAND_TRIG (1 << 2) #define DHD_EPNO_STRICT_MATCH (1 << 3) +#define DHD_EPNO_SAME_NETWORK (1 << 4) #define DHD_PNO_USE_SSID (DHD_EPNO_HIDDEN_SSID | DHD_EPNO_STRICT_MATCH) /* Do not change GSCAN_BATCH_RETRIEVAL_COMPLETE */ @@ -97,10 +121,11 @@ #define GSCAN_LOST_AP_WINDOW_DEFAULT 4 #define GSCAN_MIN_BSSID_TIMEOUT 90 #define GSCAN_BATCH_GET_MAX_WAIT 500 -#define CHANNEL_BUCKET_EMPTY_INDEX 0xFF +#define CHANNEL_BUCKET_EMPTY_INDEX 0xFFFF #define GSCAN_RETRY_THRESHOLD 3 -#define MAX_EPNO_SSID_NUM 32 -#endif /* GSCAN_SUPPORT */ + +#define MAX_EPNO_SSID_NUM 64 +#endif /* GSCAN_SUPPORT || DHD_GET_VALID_CHANNELS */ enum scan_status { /* SCAN ABORT by other scan */ @@ -127,9 +152,7 @@ /* GSCAN includes hotlist scan and they do not run * independent of each other */ -#ifdef GSCAN_SUPPORT INDEX_OF_GSCAN_PARAMS = INDEX_OF_HOTLIST_PARAMS, -#endif /* GSCAN_SUPPORT */ INDEX_MODE_MAX }; enum dhd_pno_status { @@ -143,7 +166,7 @@ char subtype; char reserved; } cmd_tlv_t; -#ifdef GSCAN_SUPPORT +#if defined(GSCAN_SUPPORT) || defined(DHD_GET_VALID_CHANNELS) typedef enum { WIFI_BAND_UNSPECIFIED, WIFI_BAND_BG = 1, /* 2.4 GHz */ @@ -167,9 +190,10 @@ DHD_PNO_GET_CAPABILITIES, DHD_PNO_GET_BATCH_RESULTS, DHD_PNO_GET_CHANNEL_LIST, - DHD_PNO_GET_EPNO_SSID_ELEM, + DHD_PNO_GET_NEW_EPNO_SSID_ELEM, DHD_PNO_EPNO_CFG_ID, - DHD_PNO_GET_AUTOJOIN_CAPABILITIES + DHD_PNO_GET_AUTOJOIN_CAPABILITIES, + DHD_PNO_EPNO_PARAMS_ID } dhd_pno_gscan_cmd_cfg_t; typedef enum dhd_pno_mode { @@ -193,21 +217,26 @@ /* Wi-Fi Android Hotlist SCAN Mode */ DHD_PNO_HOTLIST_MODE = (1 << (2)) } dhd_pno_mode_t; -#endif /* GSCAN_SUPPORT */ -struct dhd_pno_ssid { +#endif /* GSCAN_SUPPORT || DHD_GET_VALID_CHANNELS */ + +typedef struct dhd_pno_ssid { bool hidden; int8 rssi_thresh; uint8 dummy; uint16 SSID_len; + uint32 flags; + int32 wpa_auth; uchar SSID[DOT11_MAX_SSID_LEN]; struct list_head list; -}; +} dhd_pno_ssid_t; + struct dhd_pno_bssid { struct ether_addr macaddr; /* Bit4: suppress_lost, Bit3: suppress_found */ uint16 flags; struct list_head list; }; + typedef struct dhd_pno_bestnet_entry { struct ether_addr BSSID; uint8 SSID_len; @@ -278,7 +307,7 @@ uint16 nbssid; struct list_head bssid_list; }; -#ifdef GSCAN_SUPPORT +#if defined(GSCAN_SUPPORT) || defined(DHD_GET_VALID_CHANNELS) #define DHD_PNO_REPORT_NO_BATCH (1 << 2) typedef struct dhd_pno_gscan_channel_bucket { @@ -294,7 +323,6 @@ uint16 bucket_max_multiple; uint16 chan_list[GSCAN_MAX_CHANNELS_IN_BUCKET]; } dhd_pno_gscan_channel_bucket_t; - #define DHD_PNO_AUTH_CODE_OPEN 1 /* Open */ #define DHD_PNO_AUTH_CODE_PSK 2 /* WPA_PSK or WPA2PSK */ @@ -328,18 +356,24 @@ } dhd_pno_swc_evt_param_t; typedef struct wifi_gscan_result { - uint64 ts; /* Time of discovery */ - char ssid[DOT11_MAX_SSID_LEN+1]; /* null terminated */ - struct ether_addr macaddr; /* BSSID */ - uint32 channel; /* channel frequency in MHz */ - int32 rssi; /* in db */ - uint64 rtt; /* in nanoseconds */ - uint64 rtt_sd; /* standard deviation in rtt */ - uint16 beacon_period; /* units are Kusec */ - uint16 capability; /* Capability information */ - uint32 ie_length; /* byte length of Information Elements */ - char ie_data[1]; /* IE data to follow */ + uint64 ts; /* Time of discovery */ + char ssid[DOT11_MAX_SSID_LEN+1]; /* null terminated */ + struct ether_addr macaddr; /* BSSID */ + uint32 channel; /* channel frequency in MHz */ + int32 rssi; /* in db */ + uint64 rtt; /* in nanoseconds */ + uint64 rtt_sd; /* standard deviation in rtt */ + uint16 beacon_period; /* units are Kusec */ + uint16 capability; /* Capability information */ + uint32 pad; } wifi_gscan_result_t; + +typedef struct wifi_gscan_full_result { + wifi_gscan_result_t fixed; + uint32 scan_ch_bucket; + uint32 ie_length; /* byte length of Information Elements */ + char ie_data[1]; /* IE data to follow */ +} wifi_gscan_full_result_t; typedef struct gscan_results_cache { struct gscan_results_cache *next; @@ -347,6 +381,7 @@ uint8 flag; uint8 tot_count; uint8 tot_consumed; + uint32 scan_ch_bucket; wifi_gscan_result_t results[1]; } gscan_results_cache_t; @@ -356,12 +391,20 @@ int max_ap_cache_per_scan; int max_rssi_sample_size; int max_scan_reporting_threshold; - int max_hotlist_aps; + int max_hotlist_bssids; + int max_hotlist_ssids; int max_significant_wifi_change_aps; + int max_bssid_history_entries; int max_epno_ssid_crc32; int max_epno_hidden_ssid; int max_white_list_ssid; } dhd_pno_gscan_capabilities_t; + +typedef struct dhd_epno_ssid_cfg { + wl_ssid_ext_params_t params; + uint32 num_epno_ssid; + struct list_head epno_ssid_list; +} dhd_epno_ssid_cfg_t; struct dhd_pno_gscan_params { int32 scan_fr; @@ -378,21 +421,14 @@ uint16 max_ch_bucket_freq; gscan_results_cache_t *gscan_batch_cache; gscan_results_cache_t *gscan_hotlist_found; - gscan_results_cache_t *gscan_hotlist_lost; + gscan_results_cache_t*gscan_hotlist_lost; uint16 nbssid_significant_change; uint16 nbssid_hotlist; - uint16 num_epno_ssid; - uint8 num_visible_epno_ssid; - /* To keep track of visble ssid index - * across multiple FW configs i.e. config - * w/o clear in between - */ - uint8 ssid_ext_last_used_index; struct dhd_pno_swc_evt_param param_significant; struct dhd_pno_gscan_channel_bucket channel_bucket[GSCAN_MAX_CH_BUCKETS]; struct list_head hotlist_bssid_list; struct list_head significant_bssid_list; - struct list_head epno_ssid_list; + dhd_epno_ssid_cfg_t epno_cfg; uint32 scan_id; }; @@ -419,35 +455,17 @@ struct bssid_t bssid[1]; /* n bssids to follow */ } gscan_hotlist_scan_params_t; -/* SWC (Significant WiFi Change) params */ -typedef struct gscan_swc_params { - /* Rssi averaging window size */ - uint8 rssi_window; - /* Number of scans that the AP has to be absent before - * being declared LOST - */ - uint8 lost_ap_window; - /* if x Aps have a significant change generate an event. */ - uint8 swc_threshold; - uint8 nbssid; - wl_pfn_significant_bssid_t bssid_elem_list[1]; -} gscan_swc_params_t; +#endif /* GSCAN_SUPPORT || DHD_GET_VALID_CHANNELS */ -typedef struct dhd_pno_significant_bssid { - struct ether_addr BSSID; - int8 rssi_low_threshold; - int8 rssi_high_threshold; - struct list_head list; -} dhd_pno_significant_bssid_t; -#endif /* GSCAN_SUPPORT */ typedef union dhd_pno_params { struct dhd_pno_legacy_params params_legacy; struct dhd_pno_batch_params params_batch; struct dhd_pno_hotlist_params params_hotlist; -#ifdef GSCAN_SUPPORT +#if defined(GSCAN_SUPPORT) || defined(DHD_GET_VALID_CHANNELS) struct dhd_pno_gscan_params params_gscan; -#endif /* GSCAN_SUPPORT */ +#endif /* GSCAN_SUPPORT || DHD_GET_VALID_CHANNELS */ } dhd_pno_params_t; + typedef struct dhd_pno_status_info { dhd_pub_t *dhd; struct work_struct work; @@ -488,29 +506,31 @@ dhd_dev_pno_set_for_hotlist(struct net_device *dev, wl_pfn_bssid_t *p_pfn_bssid, struct dhd_pno_hotlist_params *hotlist_params); extern bool dhd_dev_is_legacy_pno_enabled(struct net_device *dev); -#ifdef GSCAN_SUPPORT -extern int -dhd_dev_pno_set_cfg_gscan(struct net_device *dev, dhd_pno_gscan_cmd_cfg_t type, - void *buf, uint8 flush); +#if defined(GSCAN_SUPPORT) || defined(DHD_GET_VALID_CHANNELS) extern void * dhd_dev_pno_get_gscan(struct net_device *dev, dhd_pno_gscan_cmd_cfg_t type, void *info, uint32 *len); +#endif /* GSCAN_SUPPORT || DHD_GET_VALID_CHANNELS */ +#ifdef GSCAN_SUPPORT +extern int +dhd_dev_pno_set_cfg_gscan(struct net_device *dev, dhd_pno_gscan_cmd_cfg_t type, + void *buf, bool flush); int dhd_dev_pno_lock_access_batch_results(struct net_device *dev); void dhd_dev_pno_unlock_access_batch_results(struct net_device *dev); extern int dhd_dev_pno_run_gscan(struct net_device *dev, bool run, bool flush); extern int dhd_dev_pno_enable_full_scan_result(struct net_device *dev, bool real_time); -extern void * dhd_dev_swc_scan_event(struct net_device *dev, const void *data, - int *send_evt_bytes); int dhd_retreive_batch_scan_results(dhd_pub_t *dhd); extern void * dhd_dev_hotlist_scan_event(struct net_device *dev, - const void *data, int *send_evt_bytes, hotlist_type_t type); + const void *data, int *send_evt_bytes, hotlist_type_t type, u32 *buf_len); void * dhd_dev_process_full_gscan_result(struct net_device *dev, const void *data, uint32 len, int *send_evt_bytes); extern int dhd_dev_gscan_batch_cache_cleanup(struct net_device *dev); extern void dhd_dev_gscan_hotlist_cache_cleanup(struct net_device *dev, hotlist_type_t type); extern int dhd_dev_wait_batch_results_complete(struct net_device *dev); extern void * dhd_dev_process_epno_result(struct net_device *dev, - const void *data, uint32 event, int *send_evt_bytes); + const void *data, uint32 event, int *send_evt_bytes); +extern int dhd_dev_set_epno(struct net_device *dev); +extern int dhd_dev_flush_fw_epno(struct net_device *dev); #endif /* GSCAN_SUPPORT */ /* dhd pno fuctions */ extern int dhd_pno_stop_for_ssid(dhd_pub_t *dhd); @@ -521,7 +541,6 @@ extern int dhd_pno_set_for_batch(dhd_pub_t *dhd, struct dhd_pno_batch_params *batch_params); extern int dhd_pno_get_for_batch(dhd_pub_t *dhd, char *buf, int bufsize, int reason); - extern int dhd_pno_stop_for_batch(dhd_pub_t *dhd); @@ -534,22 +553,22 @@ extern int dhd_pno_init(dhd_pub_t *dhd); extern int dhd_pno_deinit(dhd_pub_t *dhd); extern bool dhd_is_pno_supported(dhd_pub_t *dhd); -extern int dhd_pno_set_mac_oui(dhd_pub_t *dhd, uint8 *oui); extern bool dhd_is_legacy_pno_enabled(dhd_pub_t *dhd); -#ifdef GSCAN_SUPPORT -extern int dhd_pno_set_cfg_gscan(dhd_pub_t *dhd, dhd_pno_gscan_cmd_cfg_t type, - void *buf, uint8 flush); +#if defined(GSCAN_SUPPORT) || defined(DHD_GET_VALID_CHANNELS) extern void * dhd_pno_get_gscan(dhd_pub_t *dhd, dhd_pno_gscan_cmd_cfg_t type, void *info, uint32 *len); +#endif /* GSCAN_SUPPORT || DHD_GET_VALID_CHANNELS */ +#ifdef GSCAN_SUPPORT +extern int dhd_pno_set_cfg_gscan(dhd_pub_t *dhd, dhd_pno_gscan_cmd_cfg_t type, + void *buf, bool flush); extern int dhd_pno_lock_batch_results(dhd_pub_t *dhd); extern void dhd_pno_unlock_batch_results(dhd_pub_t *dhd); extern int dhd_pno_initiate_gscan_request(dhd_pub_t *dhd, bool run, bool flush); extern int dhd_pno_enable_full_scan_result(dhd_pub_t *dhd, bool real_time_flag); extern int dhd_pno_cfg_gscan(dhd_pub_t *dhd, dhd_pno_gscan_cmd_cfg_t type, void *buf); extern int dhd_dev_retrieve_batch_scan(struct net_device *dev); -extern void *dhd_handle_swc_evt(dhd_pub_t *dhd, const void *event_data, int *send_evt_bytes); extern void *dhd_handle_hotlist_scan_evt(dhd_pub_t *dhd, const void *event_data, - int *send_evt_bytes, hotlist_type_t type); + int *send_evt_bytes, hotlist_type_t type, u32 *buf_len); extern void *dhd_process_full_gscan_result(dhd_pub_t *dhd, const void *event_data, uint32 len, int *send_evt_bytes); extern int dhd_gscan_batch_cache_cleanup(dhd_pub_t *dhd); @@ -557,7 +576,11 @@ extern int dhd_wait_batch_results_complete(dhd_pub_t *dhd); extern void * dhd_pno_process_epno_result(dhd_pub_t *dhd, const void *data, uint32 event, int *size); +extern void dhd_pno_translate_epno_fw_flags(uint32 *flags); +extern int dhd_pno_set_epno(dhd_pub_t *dhd); +extern int dhd_pno_flush_fw_epno(dhd_pub_t *dhd); +extern void dhd_pno_set_epno_auth_flag(uint32 *wpa_auth); #endif /* GSCAN_SUPPORT */ -#endif +#endif /* #if defined(OEM_ANDROID) && defined(PNO_SUPPORT) */ #endif /* __DHD_PNO_H__ */ -- Gitblit v1.6.2