/* SPDX-License-Identifier: GPL-2.0 */
|
|
/******************************************************************************
|
*
|
* Copyright (C) 2020 SeekWave Technology Co.,Ltd.
|
*
|
* This program is free software; you can redistribute it and/or modify
|
* it under the terms of version 2 of the GNU General Public License as
|
* published by the Free Software Foundation;
|
*
|
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU General Public License for more details.
|
*
|
******************************************************************************/
|
|
#ifndef __SKW_CFG80211_H__
|
#define __SKW_CFG80211_H__
|
|
#include <linux/ieee80211.h>
|
#include "skw_msg.h"
|
#include "skw_iface.h"
|
|
#define SKW_AUTH_TIMEOUT msecs_to_jiffies(4800)
|
#define SKW_ASSOC_TIMEOUT msecs_to_jiffies(4800)
|
#define SKW_STEP_TIMEOUT msecs_to_jiffies(300)
|
#define SKW_MAX_AUTH_RETRY_NUM 3
|
#define SKW_MAX_ASSOC_RETRY_NUM 5
|
#define SKW_MAX_REAUTH_REDO_NUM 3
|
|
#define SKW_MAX_SCAN_SSID 4
|
#define SKW_SCAN_TIMEOUT 8000
|
#define SKW_CQM_SCAN_TIMEOUT 4
|
#define SKW_MAX_STA_AUTH_ASSOC_RETRY 3
|
#define SKW_EXTENDED_CAPA_LEN 11
|
|
/* hostap mac acl mode */
|
#define SKW_MAX_ACL_ENTRIES 16
|
|
#define SKW_WOW_DISCONNECT BIT(0)
|
#define SKW_WOW_MAGIC_PKT BIT(1)
|
#define SKW_WOW_GTK_REKEY_FAIL BIT(2)
|
#define SKW_WOW_EAP_IDENTITY_REQ BIT(3)
|
#define SKW_WOW_FOUR_WAY_HANDSHAKE BIT(4)
|
#define SKW_WOW_RFKILL_RELEASE BIT(5)
|
#define SKW_WOW_BLACKLIST_FILTER BIT(31)
|
#define SKW_WOW_ANY_PKT 0xff
|
|
enum SKW_IP_VERSION {
|
SKW_IP_IPV4 = 0,
|
SKW_IP_IPV6,
|
};
|
|
struct skw_bss_priv {
|
u8 bssid_index;
|
u8 max_bssid_indicator;
|
u16 resv;
|
};
|
|
struct skw_suspend_t {
|
u8 wow_enable;
|
u8 reserved;
|
/* reference SKW_WOW_*,
|
* set wow_flags to 0 if wakeup any
|
*/
|
u16 wow_flags;
|
};
|
|
#define SKW_SUITE(oui, id) (((oui) << 8) | (id))
|
#define SKW_CIPHER_SUITE_WEP40 SKW_SUITE(0x000FAC, 1)
|
#define SKW_CIPHER_SUITE_TKIP SKW_SUITE(0x000FAC, 2)
|
#define SKW_CIPHER_SUITE_CCMP SKW_SUITE(0x000FAC, 4)
|
#define SKW_CIPHER_SUITE_WEP104 SKW_SUITE(0x000FAC, 5)
|
#define SKW_CIPHER_SUITE_AES_CMAC SKW_SUITE(0x000FAC, 6)
|
#define SKW_CIPHER_SUITE_GCMP SKW_SUITE(0x000FAC, 8)
|
#define SKW_CIPHER_SUITE_GCMP_256 SKW_SUITE(0x000FAC, 9)
|
#define SKW_CIPHER_SUITE_CCMP_256 SKW_SUITE(0x000FAC, 10)
|
#define SKW_CIPHER_SUITE_BIP_GMAC_128 SKW_SUITE(0x000FAC, 11)
|
#define SKW_CIPHER_SUITE_BIP_GMAC_256 SKW_SUITE(0x000FAC, 12)
|
#define SKW_CIPHER_SUITE_BIP_CMAC_256 SKW_SUITE(0x000FAC, 13)
|
|
#define SKW_CIPHER_SUITE_SMS4 SKW_SUITE(0x001472, 1)
|
|
enum SKW_CIPHER_TYPE {
|
SKW_CIPHER_TYPE_INVALID = 0,
|
SKW_CIPHER_TYPE_WEP40 = 1,
|
SKW_CIPHER_TYPE_WEP104 = 2,
|
SKW_CIPHER_TYPE_TKIP = 3,
|
SKW_CIPHER_TYPE_SMS4 = 4,
|
SKW_CIPHER_TYPE_CCMP = 8,
|
SKW_CIPHER_TYPE_CCMP_256 = 9,
|
SKW_CIPHER_TYPE_GCMP = 10,
|
SKW_CIPHER_TYPE_GCMP_256 = 11,
|
SKW_CIPHER_TYPE_AES_CMAC = 12, /* BIP_CMAC_128 */
|
SKW_CIPHER_TYPE_BIP_CMAC_256 = 13,
|
SKW_CIPHER_TYPE_BIP_GMAC_128 = 14,
|
SKW_CIPHER_TYPE_BIP_GMAC_256 = 15,
|
};
|
|
enum SKW_MIB_ID {
|
SKW_MIB_RTS_THRESHOLD = 1,
|
SKW_MIB_FRAG_THRESHOLD = 2,
|
SKW_MIB_COVERAGE_CLASS = 3,
|
SKW_MIB_RETRY_SHORT = 4,
|
SKW_MIB_RETRY_LONG = 5,
|
SKW_MIB_DYN_ACK = 6,
|
SKW_MIB_TXQ_LIMIT = 7,
|
SKW_MIB_TXQ_MEMORY_LIMIT = 8,
|
SKW_MIB_TXQ_QUANTUM = 9,
|
SKW_MIB_DOT11_OMI = 10,
|
SKW_MIB_DOT11_MODE_B = 11,
|
SKW_MIB_DOT11_MODE_G = 12,
|
SKW_MIB_DOT11_MODE_A = 13,
|
SKW_MIB_DOT11_MODE_HT = 14,
|
SKW_MIB_DOT11_MODE_VHT = 15,
|
SKW_MIB_DOT11_MODE_HE = 16,
|
SKW_MIB_DOT11_CBW_20M = 17,
|
SKW_MIB_DOT11_CBW_40M_ABOVE = 18,
|
SKW_MIB_DOT11_CBW_40M_BELOW = 19,
|
SKW_MIB_DOT11_CBW_80M = 20,
|
SKW_MIB_DOT11_CBW_160M = 21,
|
SKW_MIB_DOT11_CBW_80P80M = 22,
|
SKW_MIB_SET_BAND_2G = 23,
|
SKW_MIB_SET_BAND_5G = 24,
|
|
SKW_MIB_SET_11K_TLV_ID = 30,
|
SKW_MIB_SET_11V_TLV_ID = 31,
|
SKW_MIB_SET_11R_TLV_ID = 32,
|
SKW_MIB_SET_ONCE_NOA_ENABLE = 33,
|
SKW_MIB_SET_NOA_RATIO_TYPE = 34,
|
SKW_MIB_SET_LINK_LOSS_THOLD = 35,
|
|
SKW_MIB_SET_AGEOUT_THOLD = 39,
|
SKW_MIB_SET_TXOP_LIMIT = 40,
|
SKW_MIB_SET_MAX_PPDU_DUR = 41,
|
SKW_MIB_SET_REPORT_CQM_RSSI_LOW_INT = 42,
|
SKW_MIB_SET_EDCA_PARAM = 43,
|
SKW_MIB_SET_CCA_THRE_NOWIFI = 44,
|
SKW_MIB_SET_CCA_THRE_11B = 45,
|
SKW_MIB_SET_CCA_THRE_OFDM = 46,
|
SKW_MIB_SET_FORCE_RTS_RATE = 47,
|
SKW_MIB_SET_FORCE_RX_RSP_RATE = 48,
|
SKW_MIB_SET_SCAN_TIME = 49,
|
SKW_MIB_SET_TCP_DISCONN_WAKEUP_HOST = 50,
|
SKW_MIB_SET_TX_LIFETIME = 51,
|
SKW_MIB_SET_TX_RETRY_CNT = 52,
|
SKW_MIB_SET_TX_RTS_THRD = 53,
|
SKW_MIB_SET_AP_NEW_CHAN = 54,
|
SKW_MIB_SET_TX_RETRY_LIMIT_EN = 55,
|
SKW_MIB_SET_PARTIAL_TWT_SCHED = 56,
|
SKW_MIB_SET_THM_THRD = 57,
|
|
SKW_MIB_SET_NORMAL_SCAN_WITH_ACS = 59,
|
SKW_MIB_SET_FORCE_RX_SPECIAL_80211FRAME = 60,
|
SKW_MIB_SET_FORCE_RX_UPDATE_NAV = 61,
|
SKW_MIB_SET_SCAN_SEND_PROBE_REQ_CNT = 62,
|
|
SKW_MIB_SET_APGO_TIMMAP = 70,
|
SKW_MIB_SET_DBDC_DISABLE = 71,
|
|
SKW_MIB_SET_RATE_CTRL_MIN_RATE = 80,
|
SKW_MIB_SET_RATE_CTRL_RATE_CHANGE_PARAM = 81,
|
SKW_MIB_SET_RATE_CTRL_SPECIAL_FRM_RATE = 82,
|
|
SKW_MIB_SET_HDK_TEST = 131,
|
|
SKW_MIB_SET_ASSIGN_ADDRESS_VAL = 150,
|
SKW_MIB_SET_WAKEUP_HOST_ENABLE = 151,
|
SKW_MIB_SET_WDS_ENABLE = 152,
|
SKW_MIB_SET_SUSPEND_MODE = 153,
|
|
SKW_MIB_W_INFO = 200,
|
SKW_MIB_MAC_NSS_INFO = 201,
|
SKW_MIB_GET_HW_TX_INFO_E = 202,
|
SKW_MIB_GET_INST_INFO_E = 203,
|
SKW_MIB_GET_PEER_INFO_E = 204,
|
SKW_MIB_GET_HW_RX_INFO_E = 205,
|
SKW_MIB_GET_INST_TSF_E = 206,
|
|
SKW_MIB_GET_ASSIGN_ADDR_VAL_E = 250,
|
|
SKW_MIB_LAST
|
};
|
|
enum SKW_MONITOR_MODE {
|
SKW_MONITOR_CLOSE,
|
SKW_MONITOR_COMMON,
|
SKW_MONITOR_MAC_CAP,
|
SKW_MONITOR_PHY_CAP,
|
SKW_MONITOR_MAX,
|
};
|
|
#define SKW_BW_2GHZ_20M BIT(0)
|
#define SKW_BW_2GHZ_40M BIT(1)
|
#define SKW_BW_5GHZ_20M BIT(2)
|
#define SKW_BW_5GHZ_40M BIT(3)
|
#define SKW_BW_5GHZ_80M BIT(4)
|
#define SKW_BW_5GHZ_160M BIT(5)
|
#define SKW_BW_5GHZ_8080M BIT(6)
|
|
enum SKW_CMD_DISCONNECT_TYPE_E {
|
SKW_DISCONNECT_ONLY = 0,
|
SKW_DISCONNECT_SEND_DISASSOC = 1,
|
SKW_DISCONNECT_SEND_DEAUTH = 2,
|
};
|
|
struct skw_once_noa_enable_mib {
|
u8 en;
|
u8 go_pre_time;
|
u8 go_abs_time;
|
} __packed;
|
|
struct skw_noa_ratio_mib {
|
u8 valid;
|
u8 ratio_lv;
|
} __packed;
|
|
#define SKW_SCAN_FLAG_RND_MAC BIT(0)
|
#define SKW_SCAN_FLAG_ACS BIT(1)
|
#define SKW_SCAN_FLAG_PASSIVE BIT(7)
|
|
struct skw_scan_chan_info {
|
u8 chan_num;
|
u8 band;
|
u8 scan_flags;
|
} __packed;
|
|
struct skw_scan_param {
|
u16 flags; /* reference SKW_SCAN_FLAG_ */
|
u8 rand_mac[6];
|
u32 nr_chan;
|
u32 chan_offset;
|
u32 n_ssid;
|
u32 ssid_offset;
|
u32 ie_len;
|
u32 ie_offset;
|
u8 ie[];
|
} __packed;
|
|
struct skw_sched_match_sets {
|
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
u16 ssid_len;
|
u8 bssid[ETH_ALEN];
|
s32 rssi_thold;
|
} __packed;
|
|
struct skw_sched_scan_param {
|
u32 req_id;
|
u32 flags;
|
s32 min_rssi_thold;
|
u32 delay;
|
u8 mac_addr[ETH_ALEN];
|
u8 mac_addr_mask[ETH_ALEN];
|
u8 relative_rssi_set;
|
s8 relative_rssi;
|
u8 scan_width;
|
|
u8 n_ssids;
|
u32 n_ssids_len;
|
u32 n_ssid_offset;
|
|
u32 ie_len;
|
u32 ie_offset;
|
|
u8 n_channels;
|
u32 channels_len;
|
u32 channels_offset;
|
|
u8 n_match_sets;
|
u32 match_sets_len;
|
u32 match_sets_offset;
|
|
u8 n_scan_plans;
|
u32 scan_plans_len;
|
u32 scan_plans_offset;
|
u8 data[0];
|
} __packed;
|
|
struct skw_center_chn {
|
u8 bw;
|
u8 band;
|
u16 center_chn1;
|
u16 center_chn2;
|
};
|
|
struct skw_he_cap_elem {
|
u8 mac_cap_info[6];
|
u8 phy_cap_info[11];
|
u16 rx_mcs_map;
|
u16 tx_mcs_map;
|
u32 ppe;
|
} __packed;
|
|
struct skw_he_oper_param {
|
u16 default_pe_dur:3;
|
u16 twt_req:1;
|
u16 txop_dur_rts_thr:10;
|
u16 vht_opt_info_pre:1;
|
u16 co_hosted_bss:1;
|
u8 er_su_disable:1;
|
u8 opt_info_6g_pre:1;
|
u8 reserved:6;
|
} __packed;
|
|
struct skw_he_oper_elem {
|
struct skw_he_oper_param he_param;
|
u8 bss_color:6;
|
u8 partial_bss_color:1;
|
u8 bss_color_disabled:1;
|
u8 basic_mcs_nss[2];
|
//u8 vht_opt_info[3];
|
//u8 max_cohosted_bssid_ind[1];
|
//u8 opt_info_6g[5];
|
} __packed;
|
|
struct skw_join_param {
|
u8 chan_num;
|
u8 center_chn1;
|
u8 center_chn2;
|
u8 bandwidth;
|
u8 band;
|
u16 beacon_interval;
|
u16 capability;
|
u8 bssid_index;
|
u8 max_bssid_indicator;
|
u8 bssid[6];
|
u16 roaming:1;
|
u16 reserved:15;
|
u16 bss_ie_offset;
|
u32 bss_ie_len;
|
u8 bss_ie[];
|
} __packed;
|
|
struct skw_join_resp {
|
u8 peer_idx;
|
u8 lmac_id;
|
u8 inst;
|
u8 multicast_idx;
|
} __packed;
|
|
struct skw_auth_param {
|
u16 auth_algorithm;
|
u16 key_data_offset;
|
u16 key_data_len;
|
u16 auth_data_offset;
|
u16 auth_data_len;
|
u16 auth_ie_offset;
|
u16 auth_ie_len;
|
u8 data[];
|
} __packed;
|
|
struct skw_assoc_req_param {
|
struct ieee80211_ht_cap ht_capa;
|
struct ieee80211_vht_cap vht_capa;
|
u8 bssid[6];
|
u8 pre_bssid[6];
|
u16 req_ie_offset;
|
u16 req_ie_len;
|
u8 req_ie[];
|
} __packed;
|
|
struct skw_disconnect_param {
|
u8 type;
|
u8 local_state_change;
|
u16 reason_code;
|
u16 ie_offset;
|
u16 ie_len;
|
u8 ie[];
|
} __packed;
|
|
struct skw_ibss_params {
|
/*
|
* 0: join ibss
|
* 1: create ibss
|
*/
|
u8 type;
|
u8 chan;
|
u8 bw;
|
u8 center_chan1;
|
u8 center_chan2;
|
u8 band;
|
|
u8 ssid_len;
|
u8 ssid[32];
|
|
u8 bssid[ETH_ALEN];
|
u16 atim_win;
|
u16 beacon_int;
|
} __packed;
|
|
enum SKW_KEY_TYPE {
|
SKW_KEY_TYPE_PTK = 0,
|
SKW_KEY_TYPE_GTK = 1,
|
SKW_KEY_TYPE_IGTK = 2,
|
SKW_KEY_TYPE_BIGTK = 3,
|
};
|
|
struct skw_startap_param {
|
int beacon_int;
|
u8 dtim_period;
|
u8 flags; /* reference SKW_AP_FLAGS_* */
|
u8 chan;
|
u8 chan_width;
|
u8 center_chn1;
|
u8 center_chn2;
|
u8 band;
|
u8 ssid_len;
|
u8 ssid[32];
|
|
u16 beacon_head_offset;
|
u16 beacon_head_len;
|
u16 beacon_tail_offset;
|
u16 beacon_tail_len;
|
u16 beacon_ies_offset;
|
u16 beacon_ies_len;
|
|
u16 probe_rsp_ies_offset;
|
u16 probe_rsp_ies_len;
|
u16 assoc_rsp_ies_offset;
|
u16 assoc_rsp_ies_len;
|
u8 ies[0];
|
} __packed;
|
|
struct skw_startap_resp {
|
u8 lmac_id;
|
u8 inst_id;
|
u8 multicast_idx;
|
};
|
|
//TBD: put skw_beacon_param into skw_startp_param
|
struct skw_beacon_params {
|
u16 beacon_head_offset;
|
u16 beacon_head_len;
|
u16 beacon_tail_offset;
|
u16 beacon_tail_len;
|
u16 beacon_ies_offset;
|
u16 beacon_ies_len;
|
|
u16 probe_rsp_ies_offset;
|
u16 probe_rsp_ies_len;
|
u16 assoc_rsp_ies_offset;
|
u16 assoc_rsp_ies_len;
|
u16 probe_rsp_offset;
|
u16 probe_rsp_len;
|
u8 ies[0];
|
} __packed;
|
|
struct skw_del_sta_param {
|
u8 mac[6];
|
u16 reason_code;
|
u8 tx_frame;
|
} __packed;
|
|
enum skw_rate_info_bw {
|
SKW_RATE_INFO_BW_20,
|
SKW_RATE_INFO_BW_40,
|
SKW_RATE_INFO_BW_80,
|
SKW_RATE_INFO_BW_HE_RU = 15,
|
};
|
|
struct skw_rx_rate_desc {
|
u8 ppdu_mode;
|
u8 data_rate;
|
u8 nss;
|
u8 bw;
|
u8 gi_type;
|
u8 ru;
|
u8 dcm;
|
u8 msdu_filter;
|
u8 retry_frame;
|
u8 data_snr;
|
u16 data_rssi;
|
u16 resv1;
|
} __packed;
|
|
struct skw_get_sta_resp {
|
struct skw_rate tx_rate;
|
s8 signal;
|
u8 noise;
|
u8 tx_psr;
|
u32 tx_failed;
|
u16 filter_cnt[35];
|
u16 filter_drop_offload_cnt[35];
|
struct skw_rx_rate_desc rx_rate;
|
u8 tx_percent;
|
u8 rx_percent;
|
} __packed;
|
|
struct skw_roc_param {
|
u8 enable;
|
u8 channel_num;
|
u8 band;
|
u8 channel_type;
|
u32 duration;
|
u64 cookie;
|
} __packed;
|
|
struct skw_mgmt_tx_param {
|
u32 wait;
|
u64 cookie;
|
u8 channel;
|
u8 band;
|
u8 dont_wait_for_ack;
|
u16 mgmt_frame_len;
|
struct ieee80211_mgmt mgmt[0];
|
} __packed;
|
|
struct skw_mgmt_register_param {
|
u16 frame_type;
|
u8 reg;
|
u8 resv[5];
|
u64 timestamp;
|
} __packed;
|
|
struct skw_station_params {
|
u8 mac[ETH_ALEN];
|
u16 resv;
|
|
u64 timestamp;
|
};
|
|
#define SKW_CQM_DEFAUT_RSSI_THOLD (-70)
|
#define SKW_CQM_DEFAUT_RSSI_HYST (40)
|
|
struct skw_set_cqm_rssi_param {
|
s32 rssi_thold;
|
u8 rssi_hyst;
|
} __packed;
|
|
enum SKW_SCAN_TYPE {
|
SKW_SCAN_IDLE,
|
SKW_SCAN_NORMAL,
|
SKW_SCAN_SCHED,
|
SKW_SCAN_BG,
|
SKW_SCAN_AUTO,
|
SKW_SCAN_ROAM,
|
#ifdef RRM_SCAN_SUPPORT
|
SKW_SCAN_RRM,
|
#endif
|
};
|
|
enum SKW_CQM_STATUS {
|
CQM_STATUS_RSSI_LOW = 1,
|
CQM_STATUS_RSSI_HIGH = 2,
|
CQM_STATUS_BEACON_LOSS = 3,
|
CQM_STATUS_TDLS_LOSS = 4,
|
};
|
|
enum SKW_MPDU_DESC_GI {
|
DESC_GI_04 = 0,
|
DESC_GI_08 = 1,
|
DESC_GI_16 = 2,
|
DESC_GI_32 = 3,
|
};
|
|
/* define same as cp get station rate bw */
|
#define SKW_DESC_BW_USED_RU 15
|
|
/* define same as cp get station tx gi*/
|
enum SKW_HE_GI {
|
SKW_HE_GI_3_2 = 0,
|
SKW_HE_GI_1_6 = 1,
|
SKW_HE_GI_0_8 = 2,
|
};
|
|
/* define same as cp get station tx gi*/
|
enum SKW_HTVHT_GI {
|
SKW_HTVHT_GI_0_8 = 0,
|
SKW_HTVHT_GI_0_4 = 1,
|
};
|
|
struct skw_cqm_info {
|
u8 cqm_status;
|
s16 cqm_rssi;
|
u8 bssid[ETH_ALEN];
|
u8 chan;
|
u8 band;
|
} __packed;
|
|
struct skw_del_sta {
|
u8 reason_code;
|
u8 mac[ETH_ALEN];
|
} __packed;
|
|
struct skw_mic_failure {
|
u8 is_mcbc;
|
u8 key_id;
|
u8 lmac_id;
|
u8 mac[ETH_ALEN];
|
} __packed;
|
|
struct skw_tdls_oper {
|
u16 oper; /* reference enum nl80211_tdls_operation */
|
u8 peer_addr[ETH_ALEN];
|
};
|
|
struct skw_ts_info {
|
u8 tsid;
|
u8 up;
|
u8 peer[ETH_ALEN];
|
__le16 admitted_time;
|
} __packed;
|
|
struct skw_tdls_chan_switch {
|
u8 addr[6];
|
u8 chn_switch_enable; /* 0: disable, 1: enable */
|
u8 oper_class;
|
u8 chn;
|
u8 band; /* enum nl80211_band */
|
u8 chan_width; /* enum skw_chan_width */
|
};
|
|
struct skw_setip_param {
|
u8 ip_type;
|
union {
|
__be32 ipv4;
|
u8 ipv6[16];
|
};
|
} __packed;
|
|
#define SKW_CONN_FLAG_ASSOCED BIT(0)
|
#define SKW_CONN_FLAG_KEY_VALID BIT(1)
|
#define SKW_CONN_FLAG_USE_MFP BIT(2)
|
#define SKW_CONN_FLAG_AUTH_AUTO BIT(3)
|
#define SKW_CONN_FLAG_SAE_AUTH BIT(4)
|
|
struct skw_connect_param {
|
struct mutex lock;
|
|
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
u16 ssid_len;
|
u8 bssid[ETH_ALEN];
|
|
u8 key[32];
|
u8 key_len, key_idx;
|
|
u8 prev_bssid[ETH_ALEN];
|
|
enum SKW_STATES state;
|
enum nl80211_auth_type auth_type;
|
|
u32 flags; /* reference SKW_CONN_FLAG_ */
|
|
u8 *assoc_ie;
|
size_t assoc_ie_len;
|
|
struct ieee80211_ht_cap ht_capa, ht_capa_mask;
|
struct ieee80211_vht_cap vht_capa, vht_capa_mask;
|
|
struct ieee80211_channel *channel;
|
|
struct cfg80211_crypto_settings crypto;
|
};
|
|
enum SKW_BAND {
|
SKW_BAND_2GHZ,
|
SKW_BAND_5GHZ,
|
SKW_BAND_6GHZ,
|
SKW_BAND_60GHZ,
|
|
SKW_BAND_INVALD,
|
};
|
|
static inline enum SKW_BAND to_skw_band(enum nl80211_band band)
|
{
|
enum SKW_BAND new_band;
|
|
switch (band) {
|
case NL80211_BAND_2GHZ:
|
new_band = SKW_BAND_2GHZ;
|
break;
|
|
case NL80211_BAND_5GHZ:
|
new_band = SKW_BAND_5GHZ;
|
break;
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
|
case NL80211_BAND_6GHZ:
|
new_band = SKW_BAND_6GHZ;
|
break;
|
#endif
|
|
default:
|
new_band = SKW_BAND_INVALD;
|
break;
|
}
|
|
return new_band;
|
}
|
|
static inline enum nl80211_band to_nl80211_band(enum SKW_BAND skw_band)
|
{
|
enum nl80211_band band;
|
|
switch (skw_band) {
|
case SKW_BAND_2GHZ:
|
band = NL80211_BAND_2GHZ;
|
break;
|
|
case SKW_BAND_5GHZ:
|
band = NL80211_BAND_5GHZ;
|
break;
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
|
case SKW_BAND_6GHZ:
|
band = NL80211_BAND_6GHZ;
|
break;
|
#endif
|
|
default:
|
band = NUM_NL80211_BANDS;
|
}
|
|
return band;
|
}
|
|
static inline struct skw_bss_priv *skw_bss_priv(struct cfg80211_bss *bss)
|
{
|
return (struct skw_bss_priv *)bss->priv;
|
}
|
|
static inline void skw_join_resp_handler(struct skw_core *skw,
|
struct skw_iface *iface,
|
struct skw_join_resp *resp)
|
{
|
SKW_BUG_ON(skw_lmac_bind_iface(iface->skw, iface, resp->lmac_id));
|
iface->default_multicast = resp->multicast_idx;
|
}
|
|
static inline void skw_startap_resp_handler(struct skw_core *skw,
|
struct skw_iface *iface,
|
struct skw_startap_resp *resp)
|
{
|
SKW_BUG_ON(skw_lmac_bind_iface(iface->skw, iface, resp->lmac_id));
|
iface->default_multicast = resp->multicast_idx;
|
}
|
|
static inline u8 skw_desc_nss_to_nss_num(u8 cp_nss_idx)
|
{
|
/* convert cp nss index to nss number */
|
return cp_nss_idx + 1;
|
}
|
|
static inline enum SKW_HE_GI skw_desc_he_gi_to_skw_gi(enum SKW_MPDU_DESC_GI desc_gi)
|
{
|
enum SKW_HE_GI gi = 0;
|
|
/* convert cp desc gi to SKW_HE_GI */
|
switch (desc_gi) {
|
case DESC_GI_04:
|
case DESC_GI_08:
|
gi = SKW_HE_GI_0_8;
|
break;
|
case DESC_GI_16:
|
gi = SKW_HE_GI_1_6;
|
break;
|
case DESC_GI_32:
|
gi = SKW_HE_GI_3_2;
|
break;
|
default:
|
SKW_BUG_ON(1);
|
}
|
|
return gi;
|
}
|
|
static inline enum SKW_HTVHT_GI skw_desc_htvht_gi_to_skw_gi(enum SKW_MPDU_DESC_GI desc_gi)
|
{
|
enum SKW_HTVHT_GI gi = 0;
|
|
/* convert cp desc gi to SKW_HTVHT_GI */
|
switch (desc_gi) {
|
case DESC_GI_04:
|
gi = SKW_HTVHT_GI_0_4;
|
break;
|
case DESC_GI_08:
|
gi = SKW_HTVHT_GI_0_8;
|
break;
|
default:
|
SKW_BUG_ON(1);
|
}
|
|
return gi;
|
}
|
|
static inline u8 skw_desc_gi_to_skw_gi(enum SKW_MPDU_DESC_GI desc_gi,
|
enum SKW_RX_MPDU_DESC_PPDUMODE ppdu_mode)
|
{
|
u8 gi = 0;
|
|
switch (ppdu_mode) {
|
case SKW_PPDUMODE_HT_MIXED:
|
case SKW_PPDUMODE_VHT_SU:
|
case SKW_PPDUMODE_VHT_MU:
|
gi = skw_desc_htvht_gi_to_skw_gi(gi);
|
break;
|
|
case SKW_PPDUMODE_HE_SU:
|
case SKW_PPDUMODE_HE_TB:
|
case SKW_PPDUMODE_HE_ER_SU:
|
case SKW_PPDUMODE_HE_MU:
|
gi = skw_desc_he_gi_to_skw_gi(gi);
|
break;
|
|
default:
|
gi = desc_gi;
|
break;
|
};
|
|
return gi;
|
}
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)
|
static inline enum nl80211_he_gi skw_gi_to_nl80211_info_gi(enum SKW_HE_GI skw_gi)
|
{
|
enum nl80211_he_gi gi = 0;
|
|
/* cp tx get station gi to nl80211_he_gi */
|
switch (skw_gi) {
|
case SKW_HE_GI_3_2:
|
gi = NL80211_RATE_INFO_HE_GI_3_2;
|
break;
|
case SKW_HE_GI_1_6:
|
gi = NL80211_RATE_INFO_HE_GI_1_6;
|
break;
|
case SKW_HE_GI_0_8:
|
gi = NL80211_RATE_INFO_HE_GI_0_8;
|
break;
|
default:
|
SKW_BUG_ON(1);
|
}
|
|
return gi;
|
}
|
#endif
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)
|
#define __STA_INFO_FIELD(field) SKW_BIT_ULL(NL80211_STA_INFO_##field)
|
#else
|
#define __STA_INFO_FIELD(field) STATION_INFO_##field
|
#endif
|
|
#define SKW_COMPAT_SIGNAL __STA_INFO_FIELD(SIGNAL)
|
#define SKW_COMPAT_TX_PACKETS __STA_INFO_FIELD(TX_PACKETS)
|
#define SKW_COMPAT_TX_BYTES __STA_INFO_FIELD(TX_BYTES)
|
#define SKW_COMPAT_TX_BITRATE __STA_INFO_FIELD(TX_BITRATE)
|
#define SKW_COMPAT_TX_FAILED __STA_INFO_FIELD(TX_FAILED)
|
#define SKW_COMPAT_RX_PACKETS __STA_INFO_FIELD(RX_PACKETS)
|
#define SKW_COMPAT_RX_BYTES __STA_INFO_FIELD(RX_BYTES)
|
#define SKW_COMPAT_RX_BITRATE __STA_INFO_FIELD(RX_BITRATE)
|
|
int to_skw_bw(enum nl80211_chan_width bw);
|
struct wiphy *skw_alloc_wiphy(int priv_size);
|
int skw_setup_wiphy(struct wiphy *wiphy, struct skw_chip_info *chip);
|
|
int skw_mgmt_tx(struct wiphy *wiphy, struct skw_iface *iface,
|
struct ieee80211_channel *chan, u32 wait, u64 *cookie,
|
bool dont_wait_ack, const void *frame, int frame_len,
|
int total_frame_len, const struct ieee80211_mgmt *mgmt, bool switchover);
|
|
int skw_cmd_del_sta(struct wiphy *wiphy, struct net_device *dev,
|
const u8 *mac, u8 type, u16 reason, bool tx_frame);
|
|
int skw_del_station(struct wiphy *wiphy, struct net_device *dev,
|
const u8 *mac, u8 subtype, u16 reason);
|
int skw_change_station(struct wiphy *wiphy, struct net_device *dev,
|
const u8 *mac, struct station_parameters *params);
|
int skw_add_station(struct wiphy *wiphy, struct net_device *dev,
|
const u8 *mac, struct station_parameters *params);
|
void skw_scan_done(struct skw_core *skw, struct skw_iface *iface, bool abort);
|
|
void skw_set_state(struct skw_sm *sm, enum SKW_STATES state);
|
int skw_roam_connect(struct skw_iface *iface, const u8 *bssid, u8 chn,
|
enum nl80211_band band);
|
|
int skw_sta_leave(struct wiphy *wiphy, struct net_device *dev,
|
const u8 *bssid, u16 reason, bool tx_frame);
|
|
void skw_tx_mlme_mgmt(struct net_device *dev, u16 stype,
|
const u8 *bssid, const u8 *da, u16 reason);
|
|
int skw_connect_sae_auth(struct wiphy *wiphy, struct net_device *dev,
|
struct cfg80211_bss *bss);
|
int skw_connect_auth(struct wiphy *wiphy, struct net_device *dev,
|
struct skw_connect_param *conn, struct cfg80211_bss *bss);
|
int skw_connect_assoc(struct wiphy *wiphy, struct net_device *ndev,
|
struct skw_connect_param *conn);
|
void skw_connected(struct net_device *dev, struct skw_connect_param *conn,
|
const u8 *req_ie, int req_ie_len, const u8 *resp_ie,
|
int resp_ie_len, u16 status, gfp_t gfp);
|
void skw_disconnected(struct net_device *dev, u16 reason, const u8 *resp_ie,
|
int resp_ie_len, bool local_gen, gfp_t gfp);
|
int skw_cmd_unjoin(struct wiphy *wiphy, struct net_device *ndev,
|
const u8 *addr, u16 reason, bool tx_frame);
|
int skw_sap_set_mib(struct wiphy *wiphy, struct net_device *dev,
|
const u8 *ies, int ies_len);
|
int skw_wow_disable(struct wiphy *wiphy);
|
int skw_cmd_monitor(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, u8 mode);
|
int skw_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
|
int skw_resume(struct wiphy *wiphy);
|
#endif
|