/** @file mlan2040misc.h * * @brief This file contains command definitions for application * * * Copyright 2014-2020 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 * (the License). You may use, redistribute and/or modify the File in * accordance with the terms and conditions of the License, a copy of which * is available by writing to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE * ARE EXPRESSLY DISCLAIMED. The License provides additional details about * this warranty disclaimer. * */ /************************************************************************ Change log: 06/24/2009: initial version ************************************************************************/ #ifndef _COEX_MISC_H_ #define _COEX_MISC_H_ /** MLAN MAC Address Length */ #define MLAN_MAC_ADDR_LENGTH (6) /** Size of command buffer */ #define MRVDRV_SIZE_OF_CMD_BUFFER (3 * 1024) /** Command RET code, MSB is set to 1 */ #define HostCmd_RET_BIT 0x8000 /** General purpose action : Get */ #define HostCmd_ACT_GEN_GET 0x0000 /** General purpose action : Set */ #define HostCmd_ACT_GEN_SET 0x0001 /** TLV Id for 2040Coex IE */ #define TLV_ID_2040COEX 0x48 /** TLV Id for 2040BSS intolarent channel report IE */ #define TLV_ID_2040BSS_INTOL_CHAN_REPORT 0x49 /** Host-command for 2040coex command */ #define HostCmd_CMD_11N_2040COEX 0x00e9 /** Maximum scan response buffer size */ #define SCAN_RESP_BUF_SIZE 2000 /** Maximum length of SSID */ #define MRVDRV_MAX_SSID_LENGTH 32 /** Length of ethernet address */ #ifndef ETH_ALEN #define ETH_ALEN 6 #endif /** Maximum length of SSID list */ #define MRVDRV_MAX_SSID_LIST_LENGTH 10 /** Default scan interval in second*/ #define DEFAULT_SCAN_INTERVAL 300 /** BIT value */ #define MBIT(x) (((t_u32)1) << (x)) /** Check intolerent bit set */ #define IS_INTOL_BIT_SET(cap_info) (cap_info & MBIT(14)) /** Check OBSS non-HT STAs present bit set */ #define IS_NON_HT_STA_PRESENT(ht_info) (ht_info.field3 & MBIT(4)) /** IEEE Type definitions */ typedef enum _IEEEtypes_ElementId_e { SSID = 0, SUPPORTED_RATES = 1, FH_PARAM_SET = 2, DS_PARAM_SET = 3, CF_PARAM_SET = 4, IBSS_PARAM_SET = 6, HT_CAPABILITY = 45, HT_OPERATION = 61, BSSCO_2040 = 72, OVERLAPBSSSCANPARAM = 74, EXT_CAPABILITY = 127, ERP_INFO = 42, EXTENDED_SUPPORTED_RATES = 50, VENDOR_SPECIFIC_221 = 221, WMM_IE = VENDOR_SPECIFIC_221, RSN_IE = 48, } __attribute__ ((packed)) IEEEtypes_ElementId_e; /** HT Capabilities Data */ typedef struct _HTCap_t { /** HT Capabilities Info field */ t_u16 ht_cap_info; /** A-MPDU Parameters field */ t_u8 ampdu_param; /** Supported MCS Set field */ t_u8 supported_mcs_set[16]; /** HT Extended Capabilities field */ t_u16 ht_ext_cap; /** Transmit Beamforming Capabilities field */ t_u32 tx_bf_cap; /** Antenna Selection Capability field */ t_u8 asel; /** Reserved set to 0 */ t_u16 reserved; } __attribute__ ((packed)) HTCap_t, *pHTCap_t; /** HT Information Data */ typedef struct _HTInfo_t { /** Primary channel */ t_u8 pri_chan; /** Field 2 */ t_u8 field2; /** Field 3 */ t_u16 field3; /** Field 4 */ t_u16 field4; /** Bitmap indicating MCSs supported by all HT STAs in the BSS */ t_u8 basic_mcs_set[16]; /** Reserved set to 0 */ t_u16 reserved; } __attribute__ ((packed)) HTInfo_t, *pHTInfo_t; /** 20/40 BSS Coexistence Data */ typedef struct _BSSCo2040_t { /** 20/40 BSS Coexistence value */ t_u8 bss_co_2040_value; /** Reserve field */ t_u8 reserved[3]; } __attribute__ ((packed)) BSSCo2040_t, *pBSSCo2040_t; /** Extended Capabilities Data */ typedef struct _ExtCap_t { /** Extended Capabilities value */ t_u8 ext_cap_value; /** Reserved field */ t_u8 reserved[3]; } __attribute__ ((packed)) ExtCap_t, *pExtCap_t; /** Overlapping BSS Scan Parameters Data */ typedef struct _OverlapBSSScanParam_t { /** OBSS Scan Passive Dwell */ t_u16 obss_scan_passive_dwell; /** OBSS Scan Active Dwell */ t_u16 obss_scan_active_dwell; /** BSS Channel Width Trigger Scan Interval */ t_u16 bss_chan_width_trigger_scan_int; /** OBSS Scan Passive Total Per Channel */ t_u16 obss_scan_passive_total; /** OBSS Scan Active Total Per Channel */ t_u16 obss_scan_active_total; /** BSS Width Channel Transition Delay Factor */ t_u16 bss_width_chan_trans_delay; /** OBSS Scan Activity Threshold */ t_u16 obss_scan_active_threshold; } __attribute__ ((packed)) OBSSScanParam_t, *pOBSSScanParam_t; /** IEEEtypes_CapInfo_t structure*/ typedef struct _IEEEtypes_CapInfo_t { /** Capability Bit Map : ESS */ t_u8 ess:1; /** Capability Bit Map : IBSS */ t_u8 ibss:1; /** Capability Bit Map : CF pollable */ t_u8 cf_pollable:1; /** Capability Bit Map : CF poll request */ t_u8 cf_poll_rqst:1; /** Capability Bit Map : privacy */ t_u8 privacy:1; /** Capability Bit Map : Short preamble */ t_u8 short_preamble:1; /** Capability Bit Map : PBCC */ t_u8 pbcc:1; /** Capability Bit Map : Channel agility */ t_u8 chan_agility:1; /** Capability Bit Map : Spectrum management */ t_u8 spectrum_mgmt:1; /** Capability Bit Map : Reserved */ t_u8 rsrvd3:1; /** Capability Bit Map : Short slot time */ t_u8 short_slot_time:1; /** Capability Bit Map : APSD */ t_u8 apsd:1; /** Capability Bit Map : Reserved */ t_u8 rsvrd2:1; /** Capability Bit Map : DSS OFDM */ t_u8 dsss_ofdm:1; /** Capability Bit Map : Reserved */ t_u8 rsrvd1:2; } __attribute__ ((packed)) IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t; typedef struct { t_u8 chan_number; /**< Channel Number to scan */ t_u8 radio_type; /**< Radio type: 'B/G' Band = 0, 'A' Band = 1 */ t_u8 scan_type; /**< Scan type: Active = 1, Passive = 2 */ t_u8 reserved; /**< Reserved */ t_u32 scan_time; /**< Scan duration in milliseconds; if 0 default used */ } __attribute__ ((packed)) wlan_ioctl_user_scan_chan; typedef struct { char ssid[MRVDRV_MAX_SSID_LENGTH + 1]; /**< SSID */ t_u8 max_len; /**< Maximum length of SSID */ } __attribute__ ((packed)) wlan_ioctl_user_scan_ssid; typedef struct { /** Flag set to keep the previous scan table intact */ t_u8 keep_previous_scan; /* Do not erase the existing scan results */ /** BSS mode to be sent in the firmware command */ t_u8 bss_mode; /** Configure the number of probe requests for active chan scans */ t_u8 num_probes; /** Reserved */ t_u8 reserved; /** BSSID filter sent in the firmware command to limit the results */ t_u8 specific_bssid[ETH_ALEN]; /** SSID filter list used in the to limit the scan results */ wlan_ioctl_user_scan_ssid ssid_list[MRVDRV_MAX_SSID_LIST_LENGTH]; /** Variable number (fixed maximum) of channels to scan up */ wlan_ioctl_user_scan_chan chan_list[WLAN_IOCTL_USER_SCAN_CHAN_MAX]; } __attribute__ ((packed)) wlan_ioctl_user_scan_cfg; /** IEEE IE header */ typedef struct _IEEEtypes_Header_t { /** Element ID */ t_u8 element_id; /** Length */ t_u8 len; } __attribute__ ((packed)) IEEEtypes_Header_t, *pIEEEtypes_Header_t; /** HT Capabilities IE */ typedef struct _IEEEtypes_HTCap_t { /** Generic IE header */ IEEEtypes_Header_t ieee_hdr; /** HTCap struct */ HTCap_t ht_cap; } __attribute__ ((packed)) IEEEtypes_HTCap_t, *pIEEEtypes_HTCap_t; /** HT Information IE */ typedef struct _IEEEtypes_HTInfo_t { /** Generic IE header */ IEEEtypes_Header_t ieee_hdr; /** HTInfo struct */ HTInfo_t ht_info; } __attribute__ ((packed)) IEEEtypes_HTInfo_t, *pIEEEtypes_HTInfo_t; /** 20/40 BSS Coexistence IE */ typedef struct _IEEEtypes_2040BSSCo_t { /** Generic IE header */ IEEEtypes_Header_t ieee_hdr; /** BSSCo2040_t struct */ BSSCo2040_t bss_co_2040; } __attribute__ ((packed)) IEEEtypes_2040BSSCo_t, *pIEEEtypes_2040BSSCo_t; /** Extended Capabilities IE */ typedef struct _IEEEtypes_ExtCap_t { /** Generic IE header */ IEEEtypes_Header_t ieee_hdr; /** ExtCap_t struct */ ExtCap_t ext_cap; } __attribute__ ((packed)) IEEEtypes_ExtCap_t, *pIEEEtypes_ExtCap_t; /** Overlapping BSS Scan Parameters IE */ typedef struct _IEEEtypes_OverlapBSSScanParam_t { /** Generic IE header */ IEEEtypes_Header_t ieee_hdr; /** OBSSScanParam_t struct */ OBSSScanParam_t obss_scan_param; } __attribute__ ((packed)) IEEEtypes_OverlapBSSScanParam_t, *pIEEEtypes_OverlapBSSScanParam_t; typedef struct _wlan_get_scan_table_fixed { /** BSSID of this network */ t_u8 bssid[MLAN_MAC_ADDR_LENGTH]; /** Channel this beacon/probe response was detected */ t_u8 channel; /** RSSI for the received packet */ t_u8 rssi; /** TSF value from the firmware at packet reception */ t_u64 network_tsf; } wlan_get_scan_table_fixed; /** * Structure passed in the wlan_ioctl_get_scan_table_info for each * BSS returned in the WLAN_GET_SCAN_RESP IOCTL */ typedef struct _wlan_ioctl_get_scan_table_entry { /** * Fixed field length included in the response. * * Length value is included so future fixed fields can be added to the * response without breaking backwards compatibility. Use the length * to find the offset for the bssInfoLength field, not a sizeof() calc. */ t_u32 fixed_field_length; /** * Length of the BSS Information (probe resp or beacon) that * follows starting at bssInfoBuffer */ t_u32 bss_info_length; /** * Always present, fixed length data fields for the BSS */ wlan_get_scan_table_fixed fixed_fields; /* * Probe response or beacon scanned for the BSS. * * Field layout: * - TSF 8 octets * - Beacon Interval 2 octets * - Capability Info 2 octets * * - IEEE Infomation Elements; variable number & length per 802.11 spec */ /* t_u8 bss_info_buffer[1]; */ } wlan_ioctl_get_scan_table_entry; /** * Sructure to retrieve the scan table */ typedef struct { /** * - Zero based scan entry to start retrieval in command request * - Number of scans entries returned in command response */ t_u32 scan_number; /** * Buffer marker for multiple wlan_ioctl_get_scan_table_entry structures. * Each struct is padded to the nearest 32 bit boundary. */ t_u8 scan_table_entry_buf[1]; } wlan_ioctl_get_scan_table_info; /* Define general hostcmd data structure */ /** HostCmd_DS_GEN */ typedef struct _HostCmd_DS_GEN { /** Command */ t_u16 command; /** Size */ t_u16 size; /** Sequence number */ t_u16 seq_num; /** Result */ t_u16 result; } __attribute__ ((packed)) HostCmd_DS_GEN; /** Size of HostCmd_DS_GEN */ #define S_DS_GEN sizeof(HostCmd_DS_GEN) /** TLV related data structures*/ /** MrvlIEtypesHeader_t */ typedef struct _MrvlIEtypesHeader { /** Header type */ t_u16 type; /** Header length */ t_u16 len; } __attribute__ ((packed)) MrvlIEtypesHeader_t; /** _MrvlIETypes_2040BssIntolerantChannelReport_t */ typedef struct _MrvlIETypes_2040BssIntolerantChannelReport_t { /** Header */ IEEEtypes_Header_t header; /** regulatory class */ t_u8 reg_class; /** channel numbers for legacy AP */ t_u8 chan_num[1]; } __attribute__ ((packed)) MrvlIETypes_2040BssIntolerantChannelReport_t; /** MrvlIETypes_2040COEX_t */ typedef struct _MrvlIETypes_2040COEX_t { /** Header */ IEEEtypes_Header_t header; /** 2040 coex element */ t_u8 coex_elem; } __attribute__ ((packed)) MrvlIETypes_2040COEX_t; typedef struct _HostCmd_DS_CMD_11N_2040COEX { /** 2040 coex element */ MrvlIETypes_2040COEX_t coex; /** 2040 BSS intolerant channel report*/ MrvlIETypes_2040BssIntolerantChannelReport_t chan_intol_report; } __attribute__ ((packed)) HostCmd_DS_CMD_11N_2040COEX; /** Maximum number of channel per regulatory class */ #define MAX_CHAN 20 typedef struct _class_chan_t { /** Regulatory class */ t_u8 reg_class; /** Channel numbers */ t_u8 channels[MAX_CHAN]; /** Total number of channels */ t_u8 total_chan; } class_chan_t; typedef struct _region_class_chan_t { /** Regulatory domain */ int reg_domain; /** Channel numbers */ class_chan_t *class_chan_list; /** Number of class channel table entry */ int num_class_chan_entry; } region_class_chan_t; int process_host_cmd_resp(char *cmd_name, t_u8 *buf); void prepare_coex_cmd_buff(t_u8 *buf, t_u8 *chan_list, t_u8 num_of_chan, t_u8 reg_class, t_u8 is_intol_ap_present); int invoke_coex_command(void); #endif /* _COEX_MISC_H_ */