MLK-24995 net: wireless: nxp: mxm_wifiex: upgrade to mxm5x16207 release
Upgrade to mxm5x16207 verison: - Fixed WPA3 SAE pre-cert requirement where there is no assoc request from DUT, if EX-AP sends the Auth confirm frame immediately after Auth commit frame. Reviewed-by: yang.tian <yang.tian@nxp.com> Signed-off-by: Fugang Duan <fugang.duan@nxp.com>zero-colors
parent
0cd0008697
commit
56bffa9cd6
|
@ -58,6 +58,7 @@ static region_code_mapping_t region_code_mapping[] = {
|
|||
{"CN ", 0x50}, /* China */
|
||||
{"JP ", 0xFE}, /* Japan */
|
||||
{"JP ", 0xFF}, /* Japan special */
|
||||
{"NE ", 0x30}, /* New Zeland */
|
||||
};
|
||||
|
||||
/** Universal region code */
|
||||
|
|
|
@ -107,6 +107,14 @@ static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_middle_band = {52,
|
|||
static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_mid_upper_band = {
|
||||
100, 11};
|
||||
|
||||
/** U-NII sub-band config : Start Channel = 100, NumChans = 5 */
|
||||
static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_mid_upper_band_0 = {
|
||||
100, 5};
|
||||
|
||||
/** U-NII sub-band config : Start Channel = 132, NumChans = 3 */
|
||||
static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_mid_upper_band_1 = {
|
||||
132, 3};
|
||||
|
||||
/** U-NII sub-band config : Start Channel = 149, NumChans = 5 */
|
||||
static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_upper_band = {149,
|
||||
5};
|
||||
|
@ -409,6 +417,23 @@ wlan_11h_set_supp_channels_ie(mlan_private *priv, t_u8 band,
|
|||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_upper_band;
|
||||
break;
|
||||
case 0x7:
|
||||
/* 36-48 */
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_lower_band;
|
||||
/* 52-64 */
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_middle_band;
|
||||
/* 100-116 */
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_mid_upper_band_0;
|
||||
/* 132-140 */
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_mid_upper_band_1;
|
||||
/* 149-165 */
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_upper_band;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -96,6 +96,8 @@ static country_code_mapping_t country_code_mapping[] = {
|
|||
{"RU", 0x30, 0x0f}, /* Russia */
|
||||
{"IN", 0x10, 0x06}, /* India */
|
||||
{"MY", 0x30, 0x06}, /* Malaysia */
|
||||
{"NZ", 0x30, 0x30}, /* New Zeland */
|
||||
{"MX", 0x10, 0x07}, /* Mexico */
|
||||
};
|
||||
|
||||
/** Country code for ETSI */
|
||||
|
@ -103,7 +105,7 @@ static t_u8 eu_country_code_table[][COUNTRY_CODE_LEN] = {
|
|||
"AL", "AD", "AT", "AU", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK",
|
||||
"EE", "FI", "FR", "MK", "DE", "GR", "HU", "IS", "IE", "IT", "KR", "LV",
|
||||
"LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "NO", "PL", "RO", "RU",
|
||||
"SM", "RS", "SI", "SK", "ES", "SE", "CH", "TR", "UA", "UK", "GB"};
|
||||
"SM", "RS", "SI", "SK", "ES", "SE", "CH", "TR", "UA", "UK", "GB", "NZ"};
|
||||
|
||||
/**
|
||||
* The structure for Channel-Frequency-Power table
|
||||
|
@ -423,7 +425,8 @@ static chan_freq_power_t channel_freq_power_JPN_A[] = {
|
|||
{128, 5640, WLAN_TX_PWR_JP_A_DEFAULT, MTRUE},
|
||||
{132, 5660, WLAN_TX_PWR_JP_A_DEFAULT, MTRUE},
|
||||
{136, 5680, WLAN_TX_PWR_JP_A_DEFAULT, MTRUE},
|
||||
{140, 5700, WLAN_TX_PWR_JP_A_DEFAULT, MTRUE}};
|
||||
{140, 5700, WLAN_TX_PWR_JP_A_DEFAULT, MTRUE},
|
||||
{144, 5720, WLAN_TX_PWR_JP_A_DEFAULT, MTRUE}};
|
||||
|
||||
/** Band: 'A', Region: China */
|
||||
static chan_freq_power_t channel_freq_power_CN_A[] = {
|
||||
|
@ -498,6 +501,30 @@ static chan_freq_power_t channel_freq_power_RU_A[] = {
|
|||
{161, 5805, WLAN_TX_PWR_DEFAULT, MFALSE},
|
||||
};
|
||||
|
||||
/** Band: 'A', Region: Mexico */
|
||||
static chan_freq_power_t channel_freq_power_MX_A[] = {
|
||||
{36, 5180, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{40, 5200, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{44, 5220, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{48, 5240, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{52, 5260, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{56, 5280, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{60, 5300, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{64, 5320, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{100, 5500, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{104, 5520, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{108, 5540, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{112, 5560, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{116, 5580, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{132, 5660, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{136, 5680, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{140, 5700, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE},
|
||||
{149, 5745, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{153, 5765, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{157, 5785, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{161, 5805, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE},
|
||||
{165, 5825, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE}};
|
||||
|
||||
/** Band: 'A', Code: 1, Low band (5150-5250 MHz) channels */
|
||||
static chan_freq_power_t channel_freq_power_low_band[] = {
|
||||
{36, 5180, WLAN_TX_PWR_DEFAULT, MFALSE},
|
||||
|
@ -594,6 +621,12 @@ static cfp_table_t cfp_table_A[] = {
|
|||
*/
|
||||
channel_freq_power_low_middle_high_band,
|
||||
NELEMENTS(channel_freq_power_low_middle_high_band)},
|
||||
{
|
||||
0x07, /* Mexico */
|
||||
channel_freq_power_MX_A,
|
||||
NELEMENTS(channel_freq_power_MX_A),
|
||||
},
|
||||
|
||||
{
|
||||
0x09, /* SPAIN/Austria/Brazil */
|
||||
channel_freq_power_SPN2_A,
|
||||
|
@ -3429,6 +3462,8 @@ mlan_status wlan_get_cfpinfo(pmlan_adapter pmadapter,
|
|||
t_u32 cfp_no_bg = 0;
|
||||
chan_freq_power_t *cfp_a = MNULL;
|
||||
t_u32 cfp_no_a = 0;
|
||||
t_u8 cfp_code_a = pmadapter->region_code;
|
||||
t_u8 cfp_code_bg = pmadapter->region_code;
|
||||
t_u32 len = 0, size = 0;
|
||||
t_u8 *req_buf, *tmp;
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
|
@ -3446,13 +3481,17 @@ mlan_status wlan_get_cfpinfo(pmlan_adapter pmadapter,
|
|||
size = sizeof(pmadapter->country_code) + sizeof(pmadapter->region_code);
|
||||
/* Add size to store region, country and environment codes */
|
||||
size += sizeof(t_u32);
|
||||
if (pmadapter->cfp_code_bg)
|
||||
cfp_code_bg = pmadapter->cfp_code_bg;
|
||||
|
||||
/* Get cfp table and its size corresponding to the region code */
|
||||
cfp_bg = wlan_get_region_cfp_table(pmadapter, pmadapter->region_code,
|
||||
cfp_bg = wlan_get_region_cfp_table(pmadapter, cfp_code_bg,
|
||||
BAND_G | BAND_B, &cfp_no_bg);
|
||||
size += cfp_no_bg * sizeof(chan_freq_power_t);
|
||||
cfp_a = wlan_get_region_cfp_table(pmadapter, pmadapter->region_code,
|
||||
BAND_A, &cfp_no_a);
|
||||
if (pmadapter->cfp_code_a)
|
||||
cfp_code_a = pmadapter->cfp_code_a;
|
||||
cfp_a = wlan_get_region_cfp_table(pmadapter, cfp_code_a, BAND_A,
|
||||
&cfp_no_a);
|
||||
size += cfp_no_a * sizeof(chan_freq_power_t);
|
||||
if (pmadapter->otp_region)
|
||||
size += sizeof(pmadapter->otp_region->environment);
|
||||
|
|
|
@ -934,6 +934,8 @@ static t_u16 wlan_get_cmd_timeout(t_u16 cmd_id)
|
|||
case HostCmd_CMD_802_11_SCAN_EXT:
|
||||
timeout = MRVDRV_TIMER_10S * 2;
|
||||
break;
|
||||
case HostCmd_CMD_FUNC_INIT:
|
||||
case HostCmd_CMD_FUNC_SHUTDOWN:
|
||||
case HostCmd_CMD_802_11_ASSOCIATE:
|
||||
case HostCmd_CMD_802_11_DEAUTHENTICATE:
|
||||
case HostCmd_CMD_802_11_DISASSOCIATE:
|
||||
|
@ -8217,3 +8219,60 @@ mlan_status wlan_ret_get_chan_trpc_config(pmlan_private pmpriv,
|
|||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of RANGE_EXT
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||
* @param cmd_action the action: GET or SET
|
||||
* @param pdata_buf A pointer to data buffer
|
||||
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
|
||||
*/
|
||||
mlan_status wlan_cmd_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf)
|
||||
{
|
||||
HostCmd_DS_RANGE_EXT *range_ext = &cmd->params.range_ext;
|
||||
t_u8 mode = *(t_u8 *)pdata_buf;
|
||||
|
||||
ENTER();
|
||||
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_RANGE_EXT);
|
||||
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_RANGE_EXT) + S_DS_GEN);
|
||||
range_ext->action = wlan_cpu_to_le16(cmd_action);
|
||||
|
||||
if (cmd_action == HostCmd_ACT_GEN_SET)
|
||||
range_ext->mode = mode;
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of RANGE_EXT
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||
* @param pioctl_buf A pointer to command buffer
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
mlan_ds_misc_cfg *misc_cfg = MNULL;
|
||||
HostCmd_DS_RANGE_EXT *range_ext = &resp->params.range_ext;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_buf &&
|
||||
(wlan_le16_to_cpu(range_ext->action) == HostCmd_ACT_GEN_GET)) {
|
||||
misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
misc_cfg->param.range_ext_mode = range_ext->mode;
|
||||
PRINTM(MCMND, "Get range ext mode %d\n",
|
||||
misc_cfg->param.range_ext_mode);
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#define _MLAN_DECL_H_
|
||||
|
||||
/** MLAN release version */
|
||||
#define MLAN_RELEASE_VERSION "203"
|
||||
#define MLAN_RELEASE_VERSION "207"
|
||||
|
||||
/** Re-define generic data types for MLAN/MOAL */
|
||||
/** Signed char (1-byte) */
|
||||
|
|
|
@ -1590,6 +1590,8 @@ typedef MLAN_PACK_START struct _power_table_attr {
|
|||
#define HostCmd_CMD_11AX_CFG 0x0266
|
||||
/** Host Command ID: 11AX command */
|
||||
#define HostCmd_CMD_11AX_CMD 0x026d
|
||||
/** Host Command ID: Range ext command */
|
||||
#define HostCmd_CMD_RANGE_EXT 0x0274
|
||||
/** Host Command ID: TWT cfg command */
|
||||
#define HostCmd_CMD_TWT_CFG 0x0270
|
||||
|
||||
|
@ -4612,6 +4614,14 @@ typedef MLAN_PACK_START struct _HostCmd_DS_11AX_CMD_CFG {
|
|||
t_u8 val[];
|
||||
} MLAN_PACK_END HostCmd_DS_11AX_CMD_CFG;
|
||||
|
||||
/** HostCmd_DS_RANGE_EXT */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_RANGE_EXT {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
/** Range ext mode */
|
||||
t_u8 mode;
|
||||
} MLAN_PACK_END HostCmd_DS_RANGE_EXT;
|
||||
|
||||
/** Type definition of hostcmd_twt_setup */
|
||||
typedef struct MLAN_PACK_START _hostcmd_twt_setup {
|
||||
/** Implicit, 0: TWT session is explicit, 1: Session is implicit */
|
||||
|
@ -7297,6 +7307,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
|
|||
HostCmd_DS_11AX_CFG axcfg;
|
||||
/** HostCmd_DS_11AX_CMD_CFG */
|
||||
HostCmd_DS_11AX_CMD_CFG axcmd;
|
||||
HostCmd_DS_RANGE_EXT range_ext;
|
||||
/** HostCmd_DS_TWT_CFG */
|
||||
HostCmd_DS_TWT_CFG twtcfg;
|
||||
|
||||
|
|
|
@ -329,6 +329,7 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_ARB_CONFIG = 0x00200078,
|
||||
MLAN_OID_MISC_BEACON_STUCK = 0x00200079,
|
||||
MLAN_OID_MISC_CFP_TABLE = 0x0020007A,
|
||||
MLAN_OID_MISC_RANGE_EXT = 0x0020007B,
|
||||
};
|
||||
|
||||
/** Sub command size */
|
||||
|
@ -696,8 +697,6 @@ typedef struct _mlan_ssid_bssid {
|
|||
t_u32 channel_flags;
|
||||
/** host mlme flag*/
|
||||
t_u8 host_mlme;
|
||||
/* Use management frame protection (IEEE 802.11w) in this association*/
|
||||
t_u8 use_mfp;
|
||||
/** assoicate resp frame/ie from firmware */
|
||||
mlan_ds_misc_assoc_rsp assoc_rsp;
|
||||
} mlan_ssid_bssid, *pmlan_ssid_bssid;
|
||||
|
@ -5089,6 +5088,7 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
struct mfg_cmd_tx_frame2 mfg_tx_frame2;
|
||||
mlan_ds_misc_arb_cfg arb_cfg;
|
||||
mlan_ds_misc_cfp_tbl cfp;
|
||||
t_u8 range_ext_mode;
|
||||
} param;
|
||||
} mlan_ds_misc_cfg, *pmlan_ds_misc_cfg;
|
||||
|
||||
|
|
|
@ -547,9 +547,76 @@ static int wlan_cmd_append_osen_ie(mlan_private *priv, t_u8 **ppbuffer)
|
|||
return retlen;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function get the rsn_cap from RSN ie buffer.
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
*
|
||||
* @param data A pointer to rsn_ie data after IE header
|
||||
* @param return rsn_cap
|
||||
*/
|
||||
t_u16 wlan_get_rsn_cap(t_u8 *data)
|
||||
{
|
||||
t_u16 rsn_cap = 0;
|
||||
t_u16 *ptr;
|
||||
t_u16 pairwise_cipher_count = 0;
|
||||
t_u16 akm_suite_count = 0;
|
||||
/* rsn_cap = data + 2 bytes version + 4 bytes
|
||||
* group_cipher_suite + 2 bytes pairwise_cipher_count +
|
||||
* pairwise_cipher_count * PAIRWISE_CIPHER_SUITE_LEN + 2 bytes
|
||||
* akm_suite_count + akm_suite_count * AKM_SUITE_LEN
|
||||
*/
|
||||
ptr = (t_u16 *)(data + sizeof(t_u16) + 4 * sizeof(t_u8));
|
||||
pairwise_cipher_count = wlan_le16_to_cpu(*ptr);
|
||||
ptr = (t_u16 *)(data + sizeof(t_u16) + 4 * sizeof(t_u8) +
|
||||
sizeof(t_u16) +
|
||||
pairwise_cipher_count * PAIRWISE_CIPHER_SUITE_LEN);
|
||||
akm_suite_count = wlan_le16_to_cpu(*ptr);
|
||||
ptr = (t_u16 *)(data + sizeof(t_u16) + 4 * sizeof(t_u8) +
|
||||
sizeof(t_u16) +
|
||||
pairwise_cipher_count * PAIRWISE_CIPHER_SUITE_LEN +
|
||||
sizeof(t_u16) + akm_suite_count * AKM_SUITE_LEN);
|
||||
rsn_cap = wlan_le16_to_cpu(*ptr);
|
||||
PRINTM(MCMND, "rsn_cap=0x%x\n", rsn_cap);
|
||||
return rsn_cap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function check if we should enable 11w
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
*
|
||||
* @param BSSDescriptor_t A pointer to BSSDescriptor_t data structure
|
||||
* @param return MTRUE/MFALSE
|
||||
*/
|
||||
t_u8 wlan_use_mfp(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc)
|
||||
{
|
||||
t_u16 ap_rsn_cap = 0;
|
||||
t_u16 sta_rsn_cap = 0;
|
||||
t_u8 ap_mfpc, ap_mfpr;
|
||||
t_u8 sta_mfpc, sta_mfpr;
|
||||
|
||||
if (pmpriv->wpa_ie[0] != RSN_IE)
|
||||
return 0;
|
||||
sta_rsn_cap = wlan_get_rsn_cap(pmpriv->wpa_ie + 2);
|
||||
if (!pbss_desc->prsn_ie)
|
||||
return 0;
|
||||
ap_rsn_cap = wlan_get_rsn_cap(pbss_desc->prsn_ie->data);
|
||||
ap_mfpc = ((ap_rsn_cap & (0x1 << MFPC_BIT)) == (0x1 << MFPC_BIT));
|
||||
ap_mfpr = ((ap_rsn_cap & (0x1 << MFPR_BIT)) == (0x1 << MFPR_BIT));
|
||||
sta_mfpc = ((sta_rsn_cap & (0x1 << MFPC_BIT)) == (0x1 << MFPC_BIT));
|
||||
sta_mfpr = ((sta_rsn_cap & (0x1 << MFPR_BIT)) == (0x1 << MFPR_BIT));
|
||||
if (!ap_mfpc && !ap_mfpr)
|
||||
return MFALSE;
|
||||
if (!sta_mfpc && !sta_mfpr)
|
||||
return MFALSE;
|
||||
return MTRUE;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
Global Functions
|
||||
********************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function updates RSN IE in the association request.
|
||||
*
|
||||
|
@ -978,6 +1045,12 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
|
|||
psecurity_cfg_ie = (MrvlIEtypes_SecurityCfg_t *)pos;
|
||||
psecurity_cfg_ie->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_SECURITY_CFG);
|
||||
|
||||
pmpriv->curr_bss_params.use_mfp =
|
||||
wlan_use_mfp(pmpriv, pbss_desc);
|
||||
PRINTM(MCMND, "use_mfp=%d\n",
|
||||
pmpriv->curr_bss_params.use_mfp);
|
||||
|
||||
if (!pmpriv->curr_bss_params.use_mfp)
|
||||
psecurity_cfg_ie->use_mfp = MFALSE;
|
||||
else
|
||||
|
@ -985,8 +1058,6 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
|
|||
psecurity_cfg_ie->header.len = sizeof(t_u8);
|
||||
pos += sizeof(psecurity_cfg_ie->header) +
|
||||
psecurity_cfg_ie->header.len;
|
||||
PRINTM(MCMND, "use_mfp=%d\n",
|
||||
pmpriv->curr_bss_params.use_mfp);
|
||||
}
|
||||
#ifdef DRV_EMBEDDED_SUPPLICANT
|
||||
else if (supplicantIsEnabled(pmpriv->psapriv)) {
|
||||
|
|
|
@ -3348,6 +3348,8 @@ mlan_status wlan_ret_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
mlan_ioctl_req *pioctl_buf);
|
||||
mlan_status wlan_misc_ioctl_rf_test_cfg(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
mlan_status wlan_misc_ioctl_range_ext(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
mlan_status wlan_misc_ioctl_arb_cfg(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
/* CFP related functions */
|
||||
|
@ -3762,6 +3764,11 @@ mlan_status wlan_ret_set_get_low_power_mode_cfg(pmlan_private pmpriv,
|
|||
HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
|
||||
mlan_status wlan_cmd_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf);
|
||||
mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
|
||||
/**
|
||||
* @brief RA based queueing
|
||||
*
|
||||
|
|
|
@ -5800,3 +5800,35 @@ done:
|
|||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Range ext mode config
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_PENDING --success, otherwise fail
|
||||
*/
|
||||
mlan_status wlan_misc_ioctl_range_ext(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_ds_misc_cfg *pmisc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_req->action == MLAN_ACT_SET)
|
||||
cmd_action = HostCmd_ACT_GEN_SET;
|
||||
else
|
||||
cmd_action = HostCmd_ACT_GEN_GET;
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_RANGE_EXT, cmd_action, 0,
|
||||
(t_void *)pioctl_req,
|
||||
&(pmisc->param.range_ext_mode));
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1941,22 +1941,30 @@ mlan_status wlan_sdio_interrupt(t_u16 msg_id, pmlan_adapter pmadapter)
|
|||
pmlan_callbacks pcb = &pmadapter->callbacks;
|
||||
mlan_buffer mbuf;
|
||||
t_u32 sdio_ireg = 0;
|
||||
t_u8 offset = 0;
|
||||
t_u8 max_mp_regs = pmadapter->pcard_sd->reg->max_mp_regs;
|
||||
t_u8 host_int_status_reg =
|
||||
pmadapter->pcard_sd->reg->host_int_status_reg;
|
||||
|
||||
ENTER();
|
||||
|
||||
memset(pmadapter, &mbuf, 0, sizeof(mlan_buffer));
|
||||
mbuf.pbuf = pmadapter->pcard_sd->mp_regs;
|
||||
mbuf.data_len = max_mp_regs;
|
||||
while (max_mp_regs) {
|
||||
memset(pmadapter, &mbuf, 0, sizeof(mlan_buffer));
|
||||
mbuf.pbuf = pmadapter->pcard_sd->mp_regs + offset;
|
||||
mbuf.data_len = MIN(max_mp_regs, MLAN_SDIO_BLOCK_SIZE);
|
||||
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
pcb->moal_read_data_sync(pmadapter->pmoal_handle, &mbuf,
|
||||
REG_PORT | MLAN_SDIO_BYTE_MODE_MASK, 0)) {
|
||||
PRINTM(MERROR, "moal_read_data_sync: read registers failed\n");
|
||||
pmadapter->dbg.num_int_read_failure++;
|
||||
goto done;
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
pcb->moal_read_data_sync(pmadapter->pmoal_handle, &mbuf,
|
||||
(REG_PORT + offset) |
|
||||
MLAN_SDIO_BYTE_MODE_MASK,
|
||||
0)) {
|
||||
PRINTM(MERROR,
|
||||
"moal_read_data_sync: read registers failed\n");
|
||||
pmadapter->dbg.num_int_read_failure++;
|
||||
goto done;
|
||||
}
|
||||
offset += mbuf.data_len;
|
||||
max_mp_regs -= mbuf.data_len;
|
||||
}
|
||||
|
||||
DBG_HEXDUMP(MIF_D, "SDIO MP Registers", pmadapter->pcard_sd->mp_regs,
|
||||
|
|
|
@ -2811,6 +2811,10 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
case HostCmd_CMD_11AX_CMD:
|
||||
ret = wlan_cmd_11ax_cmd(pmpriv, cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_RANGE_EXT:
|
||||
ret = wlan_cmd_range_ext(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_TWT_CFG:
|
||||
ret = wlan_cmd_twt_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
|
|
|
@ -2675,6 +2675,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
case HostCmd_CMD_11AX_CMD:
|
||||
ret = wlan_ret_11ax_cmd(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_RANGE_EXT:
|
||||
ret = wlan_ret_range_ext(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_TWT_CFG:
|
||||
break;
|
||||
case HostCmd_CMD_RX_ABORT_CFG:
|
||||
|
|
|
@ -25,7 +25,6 @@ Change log:
|
|||
10/13/2008: initial version
|
||||
********************************************************/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include "mlan.h"
|
||||
#include "mlan_join.h"
|
||||
#include "mlan_util.h"
|
||||
|
@ -982,7 +981,7 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
|
|||
pevent->bss_index = pmpriv->bss_index;
|
||||
pevent->event_id = MLAN_EVENT_ID_SSU_DUMP_FILE;
|
||||
pevent->event_len = MLAN_SSU_BUF_SIZE;
|
||||
*(t_u64 *)pevent->event_buf = (uintptr_t)pmadapter->ssu_buf->pbuf +
|
||||
*(t_u64 *)pevent->event_buf = (t_u64)pmadapter->ssu_buf->pbuf +
|
||||
pmadapter->ssu_buf->data_offset;
|
||||
wlan_recv_event(pmpriv, pevent->event_id, pevent);
|
||||
wlan_free_ssu_pcie_buf(pmadapter);
|
||||
|
|
|
@ -1059,8 +1059,6 @@ static mlan_status wlan_bss_ioctl_start(pmlan_adapter pmadapter,
|
|||
"SSID found in scan list ... associating...\n");
|
||||
pmpriv->curr_bss_params.host_mlme =
|
||||
bss->param.ssid_bssid.host_mlme;
|
||||
pmpriv->curr_bss_params.use_mfp =
|
||||
bss->param.ssid_bssid.use_mfp;
|
||||
/* Clear any past association response stored for
|
||||
* application retrieval */
|
||||
pmpriv->assoc_rsp_size = 0;
|
||||
|
@ -5169,6 +5167,8 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
|
|||
case MLAN_OID_MISC_ARB_CONFIG:
|
||||
status = wlan_misc_ioctl_arb_cfg(pmadapter, pioctl_req);
|
||||
break;
|
||||
status = wlan_misc_ioctl_range_ext(pmadapter, pioctl_req);
|
||||
break;
|
||||
default:
|
||||
if (pioctl_req)
|
||||
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
|
||||
|
|
|
@ -4555,6 +4555,10 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
case HostCmd_CMD_11AX_CMD:
|
||||
ret = wlan_cmd_11ax_cmd(pmpriv, cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_RANGE_EXT:
|
||||
ret = wlan_cmd_range_ext(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_RX_ABORT_CFG:
|
||||
ret = wlan_cmd_rxabortcfg(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
|
@ -4925,6 +4929,9 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
case HostCmd_CMD_11AX_CMD:
|
||||
ret = wlan_ret_11ax_cmd(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_RANGE_EXT:
|
||||
ret = wlan_ret_range_ext(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_RX_ABORT_CFG:
|
||||
ret = wlan_ret_rxabortcfg(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
|
|
|
@ -2100,6 +2100,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
status = wlan_get_rgchnpwr_cfg(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_CFP_TABLE)
|
||||
status = wlan_get_cfp_table(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_RANGE_EXT)
|
||||
status = wlan_misc_ioctl_range_ext(pmadapter,
|
||||
pioctl_req);
|
||||
break;
|
||||
case MLAN_IOCTL_POWER_CFG:
|
||||
power = (mlan_ds_power_cfg *)pioctl_req->pbuf;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#define _MLAN_DECL_H_
|
||||
|
||||
/** MLAN release version */
|
||||
#define MLAN_RELEASE_VERSION "203"
|
||||
#define MLAN_RELEASE_VERSION "207"
|
||||
|
||||
/** Re-define generic data types for MLAN/MOAL */
|
||||
/** Signed char (1-byte) */
|
||||
|
|
|
@ -329,6 +329,7 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_ARB_CONFIG = 0x00200078,
|
||||
MLAN_OID_MISC_BEACON_STUCK = 0x00200079,
|
||||
MLAN_OID_MISC_CFP_TABLE = 0x0020007A,
|
||||
MLAN_OID_MISC_RANGE_EXT = 0x0020007B,
|
||||
};
|
||||
|
||||
/** Sub command size */
|
||||
|
@ -696,8 +697,6 @@ typedef struct _mlan_ssid_bssid {
|
|||
t_u32 channel_flags;
|
||||
/** host mlme flag*/
|
||||
t_u8 host_mlme;
|
||||
/* Use management frame protection (IEEE 802.11w) in this association*/
|
||||
t_u8 use_mfp;
|
||||
/** assoicate resp frame/ie from firmware */
|
||||
mlan_ds_misc_assoc_rsp assoc_rsp;
|
||||
} mlan_ssid_bssid, *pmlan_ssid_bssid;
|
||||
|
@ -5089,6 +5088,7 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
struct mfg_cmd_tx_frame2 mfg_tx_frame2;
|
||||
mlan_ds_misc_arb_cfg arb_cfg;
|
||||
mlan_ds_misc_cfp_tbl cfp;
|
||||
t_u8 range_ext_mode;
|
||||
} param;
|
||||
} mlan_ds_misc_cfg, *pmlan_ds_misc_cfg;
|
||||
|
||||
|
|
|
@ -143,10 +143,10 @@ static const struct nla_policy
|
|||
woal_fw_roaming_policy[MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_MAX + 1] = {
|
||||
[MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONTROL] = {.type = NLA_U32},
|
||||
[MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_BSSID] = {
|
||||
.type = NLA_MIN_LEN,
|
||||
.type = NLA_BINARY,
|
||||
.len = sizeof(int)},
|
||||
[MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_SSID] = {
|
||||
.type = NLA_MIN_LEN,
|
||||
.type = NLA_BINARY,
|
||||
.len = sizeof(int)},
|
||||
};
|
||||
// clang-format on
|
||||
|
@ -155,8 +155,7 @@ static const struct nla_policy
|
|||
woal_keep_alive_policy[MKEEP_ALIVE_ATTRIBUTE_MAX + 1] = {
|
||||
[MKEEP_ALIVE_ATTRIBUTE_ID] = {.type = NLA_U8},
|
||||
[MKEEP_ALIVE_ATTRIBUTE_ETHER_TYPE] = {.type = NLA_U16},
|
||||
[MKEEP_ALIVE_ATTRIBUTE_IP_PKT] = {.type = NLA_MIN_LEN,
|
||||
.len = 1},
|
||||
[MKEEP_ALIVE_ATTRIBUTE_IP_PKT] = {.type = NLA_BINARY, .len = 1},
|
||||
[MKEEP_ALIVE_ATTRIBUTE_IP_PKT_LEN] = {.type = NLA_U16},
|
||||
[MKEEP_ALIVE_ATTRIBUTE_SRC_MAC_ADDR] = {.type = NLA_STRING,
|
||||
.len = ETH_ALEN},
|
||||
|
|
|
@ -558,6 +558,88 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set/get range ext mode
|
||||
*
|
||||
*
|
||||
* @param priv Pointer to the mlan_private driver data struct
|
||||
* @param respbuf A pointer to response buffer
|
||||
* @param len length used
|
||||
* @param respbuflen Available length of response buffer
|
||||
*
|
||||
* @return Number of bytes written if successful else negative value
|
||||
*/
|
||||
static int woal_setget_priv_range_ext(moal_private *priv, t_u8 *respbuf,
|
||||
t_u32 respbuflen)
|
||||
{
|
||||
mlan_ioctl_req *req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
int ret = 0;
|
||||
int data[1];
|
||||
int header_len = 0, user_data_len = 0;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!respbuf) {
|
||||
PRINTM(MERROR, "response buffer is not available!\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_RANGE_EXT);
|
||||
user_data_len = strlen(respbuf) - header_len;
|
||||
|
||||
/* Allocate an IOCTL request buffer */
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
/* Fill request buffer */
|
||||
misc = (mlan_ds_misc_cfg *)req->pbuf;
|
||||
misc->sub_command = MLAN_OID_MISC_RANGE_EXT;
|
||||
req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
if (strlen(respbuf) == header_len) {
|
||||
/* GET operation */
|
||||
user_data_len = 0;
|
||||
req->action = MLAN_ACT_GET;
|
||||
} else {
|
||||
/* SET operation */
|
||||
parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data),
|
||||
&user_data_len);
|
||||
if (user_data_len != 1) {
|
||||
PRINTM(MERROR, "Invalid Parameter\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
if (data[0] < 0 || data[0] > 2) {
|
||||
PRINTM(MERROR,
|
||||
"Invalid Parameter: range_ext mode 0-2\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
misc->param.range_ext_mode = (t_u8)data[0];
|
||||
req->action = MLAN_ACT_SET;
|
||||
}
|
||||
/* Send IOCTL request to MLAN */
|
||||
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
data[0] = misc->param.range_ext_mode;
|
||||
moal_memcpy_ext(priv->phandle, respbuf, (t_u32 *)data, sizeof(data),
|
||||
respbuflen);
|
||||
ret = sizeof(data);
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Custom IE setting
|
||||
*
|
||||
|
@ -10411,6 +10493,418 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief determine the center frquency center index for bandwidth
|
||||
* of 80 MHz and 160 MHz
|
||||
*
|
||||
** @param priv Pointer to moal_private structure
|
||||
* @param band band
|
||||
* @param pri_chan primary channel
|
||||
* @param chan_bw channel bandwidth
|
||||
*
|
||||
* @return channel center frequency center, if found; O, otherwise
|
||||
*/
|
||||
|
||||
t_u8 woal_get_center_freq_idx(moal_private *priv, t_u8 band, t_u32 pri_chan,
|
||||
t_u8 chan_bw)
|
||||
{
|
||||
t_u8 center_freq_idx = 0;
|
||||
|
||||
if (band & BAND_AAC) {
|
||||
switch (pri_chan) {
|
||||
case 36:
|
||||
case 40:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 38;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 44:
|
||||
case 48:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 46;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 42;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 52:
|
||||
case 56:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 54;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 60:
|
||||
case 64:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 62;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 58;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_160MHZ) {
|
||||
center_freq_idx = 50;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 68:
|
||||
case 72:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 70;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 76:
|
||||
case 80:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 78;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 74;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 84:
|
||||
case 88:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 86;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 92:
|
||||
case 96:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 94;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 90;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 100:
|
||||
case 104:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 102;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 108:
|
||||
case 112:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 110;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 106;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 116:
|
||||
case 120:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 118;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 124:
|
||||
case 128:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 126;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 122;
|
||||
} else if (chan_bw == CHANNEL_BW_160MHZ) {
|
||||
center_freq_idx = 114;
|
||||
}
|
||||
break;
|
||||
case 132:
|
||||
case 136:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 134;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 140:
|
||||
case 144:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 126;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 138;
|
||||
}
|
||||
break;
|
||||
case 149:
|
||||
case 153:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 151;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 157:
|
||||
case 161:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 159;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 155;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 165:
|
||||
case 169:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 167;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 173:
|
||||
case 177:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 175;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 171;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 184:
|
||||
case 188:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 186;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 192:
|
||||
case 196:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 194;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 190;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
default: /* error. go to the default */
|
||||
center_freq_idx = 42;
|
||||
}
|
||||
}
|
||||
return center_freq_idx;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief determine the center frquency center index for bandwidth
|
||||
* of 80 MHz and 160 MHz
|
||||
*
|
||||
** @param priv Pointer to moal_private structure
|
||||
* @param block_tx 0-no need block traffic 1- need block traffic
|
||||
* @param oper_class oper_class
|
||||
* @param channel channel
|
||||
* @param switch count how many csa/ecsa beacon will send out
|
||||
* @param band_width 1-40Mhz above, 3-40Mhz below, 4-80Mhz, 5-160Mhz
|
||||
* @param ecsa MTRUE/MFALSE;
|
||||
*
|
||||
* @return channel center frequency center, if found; O, otherwise
|
||||
*/
|
||||
|
||||
static int woal_channel_switch(moal_private *priv, t_u8 block_tx,
|
||||
t_u8 oper_class, t_u8 channel, t_u8 switch_count,
|
||||
t_u8 band_width, t_u8 ecsa)
|
||||
{
|
||||
IEEEtypes_ExtChanSwitchAnn_t *ext_chan_switch = NULL;
|
||||
IEEEtypes_ChanSwitchAnn_t *chan_switch = NULL;
|
||||
custom_ie *pcust_chansw_ie = NULL;
|
||||
t_u8 center_freq_idx = 0;
|
||||
IEEEtypes_Header_t *pChanSwWrap_ie = NULL;
|
||||
IEEEtypes_WideBWChanSwitch_t *pbwchansw_ie = NULL;
|
||||
IEEEtypes_VhtTpcEnvelope_t *pvhttpcEnv_ie = NULL;
|
||||
mlan_ioctl_req *ioctl_req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
t_u8 bw;
|
||||
t_u8 new_oper_class = oper_class;
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (ioctl_req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
|
||||
misc->sub_command = MLAN_OID_MISC_CUSTOM_IE;
|
||||
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
ioctl_req->action = MLAN_ACT_SET;
|
||||
misc->param.cust_ie.type = TLV_TYPE_MGMT_IE;
|
||||
misc->param.cust_ie.len = (sizeof(custom_ie) - MAX_IE_SIZE);
|
||||
|
||||
pcust_chansw_ie = (custom_ie *)&misc->param.cust_ie.ie_data_list[0];
|
||||
pcust_chansw_ie->ie_index = 0xffff; /*Auto index */
|
||||
pcust_chansw_ie->ie_length = sizeof(IEEEtypes_ChanSwitchAnn_t);
|
||||
pcust_chansw_ie->mgmt_subtype_mask =
|
||||
MGMT_MASK_BEACON | MGMT_MASK_PROBE_RESP; /*Add IE for
|
||||
BEACON/probe resp*/
|
||||
chan_switch = (IEEEtypes_ChanSwitchAnn_t *)pcust_chansw_ie->ie_buffer;
|
||||
chan_switch->element_id = CHANNEL_SWITCH_ANN;
|
||||
chan_switch->len = 3;
|
||||
chan_switch->chan_switch_mode = block_tx;
|
||||
chan_switch->new_channel_num = channel;
|
||||
chan_switch->chan_switch_count = switch_count;
|
||||
DBG_HEXDUMP(MCMD_D, "CSA IE", (t_u8 *)pcust_chansw_ie->ie_buffer,
|
||||
pcust_chansw_ie->ie_length);
|
||||
switch (band_width) {
|
||||
case CHANNEL_BW_40MHZ_ABOVE:
|
||||
case CHANNEL_BW_40MHZ_BELOW:
|
||||
bw = 40;
|
||||
break;
|
||||
case CHANNEL_BW_80MHZ:
|
||||
bw = 80;
|
||||
break;
|
||||
case CHANNEL_BW_160MHZ:
|
||||
bw = 160;
|
||||
break;
|
||||
default:
|
||||
bw = 20;
|
||||
break;
|
||||
}
|
||||
if (!new_oper_class && ecsa)
|
||||
woal_priv_get_nonglobal_operclass_by_bw_channel(
|
||||
priv, bw, channel, &new_oper_class);
|
||||
if (new_oper_class) {
|
||||
pcust_chansw_ie->ie_length +=
|
||||
sizeof(IEEEtypes_ExtChanSwitchAnn_t);
|
||||
ext_chan_switch =
|
||||
(IEEEtypes_ExtChanSwitchAnn_t
|
||||
*)(pcust_chansw_ie->ie_buffer +
|
||||
sizeof(IEEEtypes_ChanSwitchAnn_t));
|
||||
ext_chan_switch->element_id = EXTEND_CHANNEL_SWITCH_ANN;
|
||||
ext_chan_switch->len = 4;
|
||||
ext_chan_switch->chan_switch_mode = block_tx;
|
||||
ext_chan_switch->new_oper_class = new_oper_class;
|
||||
ext_chan_switch->new_channel_num = channel;
|
||||
ext_chan_switch->chan_switch_count = switch_count;
|
||||
DBG_HEXDUMP(MCMD_D, "ECSA IE",
|
||||
(t_u8 *)(pcust_chansw_ie->ie_buffer +
|
||||
sizeof(IEEEtypes_ChanSwitchAnn_t)),
|
||||
pcust_chansw_ie->ie_length -
|
||||
sizeof(IEEEtypes_ChanSwitchAnn_t));
|
||||
}
|
||||
/* bandwidth 40/80/160 should set channel switch wrapper ie for 11ac 5G
|
||||
* channel*/
|
||||
if (band_width && channel > 14) {
|
||||
pChanSwWrap_ie =
|
||||
(IEEEtypes_Header_t *)(pcust_chansw_ie->ie_buffer +
|
||||
pcust_chansw_ie->ie_length);
|
||||
pChanSwWrap_ie->element_id = EXT_POWER_CONSTR;
|
||||
pChanSwWrap_ie->len = sizeof(IEEEtypes_WideBWChanSwitch_t);
|
||||
|
||||
pbwchansw_ie = (IEEEtypes_WideBWChanSwitch_t
|
||||
*)((t_u8 *)pChanSwWrap_ie +
|
||||
sizeof(IEEEtypes_Header_t));
|
||||
pbwchansw_ie->ieee_hdr.element_id = BW_CHANNEL_SWITCH;
|
||||
pbwchansw_ie->ieee_hdr.len =
|
||||
sizeof(IEEEtypes_WideBWChanSwitch_t) -
|
||||
sizeof(IEEEtypes_Header_t);
|
||||
|
||||
center_freq_idx = woal_get_center_freq_idx(priv, BAND_AAC,
|
||||
channel, band_width);
|
||||
if (band_width == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
band_width == CHANNEL_BW_40MHZ_BELOW) {
|
||||
pbwchansw_ie->new_channel_width = 0;
|
||||
pbwchansw_ie->new_channel_center_freq0 =
|
||||
center_freq_idx;
|
||||
} else if (band_width == CHANNEL_BW_80MHZ) {
|
||||
pbwchansw_ie->new_channel_width = 1;
|
||||
pbwchansw_ie->new_channel_center_freq0 =
|
||||
center_freq_idx - 4;
|
||||
pbwchansw_ie->new_channel_center_freq1 =
|
||||
center_freq_idx + 4;
|
||||
} else if (band_width == CHANNEL_BW_160MHZ) {
|
||||
pbwchansw_ie->new_channel_width = 2;
|
||||
pbwchansw_ie->new_channel_center_freq0 =
|
||||
center_freq_idx - 8;
|
||||
pbwchansw_ie->new_channel_center_freq1 =
|
||||
center_freq_idx + 8;
|
||||
} else
|
||||
PRINTM(MERROR,
|
||||
"Invalid bandwidth.Support value 1/3/4/5 for 40+/40-/80/160MHZ\n");
|
||||
|
||||
/*prepare the VHT Transmit Power Envelope IE*/
|
||||
pvhttpcEnv_ie =
|
||||
(IEEEtypes_VhtTpcEnvelope_t
|
||||
*)((t_u8 *)pChanSwWrap_ie +
|
||||
sizeof(IEEEtypes_Header_t) +
|
||||
sizeof(IEEEtypes_WideBWChanSwitch_t));
|
||||
pvhttpcEnv_ie->ieee_hdr.element_id = VHT_TX_POWER_ENV;
|
||||
pvhttpcEnv_ie->ieee_hdr.len =
|
||||
sizeof(IEEEtypes_VhtTpcEnvelope_t) -
|
||||
sizeof(IEEEtypes_Header_t);
|
||||
/* Local Max TX Power Count= 3,
|
||||
* Local TX Power Unit Inter=EIP(0) */
|
||||
pvhttpcEnv_ie->tpc_info = 3;
|
||||
pvhttpcEnv_ie->local_max_tp_20mhz = 0xff;
|
||||
pvhttpcEnv_ie->local_max_tp_40mhz = 0xff;
|
||||
pvhttpcEnv_ie->local_max_tp_80mhz = 0xff;
|
||||
pChanSwWrap_ie->len += sizeof(IEEEtypes_VhtTpcEnvelope_t);
|
||||
pcust_chansw_ie->ie_length +=
|
||||
pChanSwWrap_ie->len + sizeof(IEEEtypes_Header_t);
|
||||
DBG_HEXDUMP(MCMD_D, "Channel switch wrapper IE",
|
||||
(t_u8 *)pChanSwWrap_ie,
|
||||
pChanSwWrap_ie->len + sizeof(IEEEtypes_Header_t));
|
||||
}
|
||||
if (block_tx) {
|
||||
if (netif_carrier_ok(priv->netdev))
|
||||
netif_carrier_off(priv->netdev);
|
||||
woal_stop_queue(priv->netdev);
|
||||
priv->uap_tx_blocked = MTRUE;
|
||||
}
|
||||
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
PRINTM(MERROR, "Failed to set ECSA IE\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
priv->phandle->chsw_wait_q_woken = MFALSE;
|
||||
/* wait for channel switch to complete */
|
||||
wait_event_interruptible_timeout(
|
||||
priv->phandle->chsw_wait_q, priv->phandle->chsw_wait_q_woken,
|
||||
(u32)HZ * (switch_count + 2) * 110 / 1000);
|
||||
|
||||
pcust_chansw_ie->ie_index = 0xffff; /*Auto index */
|
||||
pcust_chansw_ie->mgmt_subtype_mask = 0;
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
PRINTM(MERROR, "Failed to clear ECSA IE\n");
|
||||
}
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(ioctl_req);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set/Get CFP table codes
|
||||
*
|
||||
|
@ -13006,223 +13500,6 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief determine the center frquency center index for bandwidth
|
||||
* of 80 MHz and 160 MHz
|
||||
*
|
||||
** @param priv Pointer to moal_private structure
|
||||
* @param band band
|
||||
* @param pri_chan primary channel
|
||||
* @param chan_bw channel bandwidth
|
||||
*
|
||||
* @return channel center frequency center, if found; O, otherwise
|
||||
*/
|
||||
|
||||
t_u8 woal_get_center_freq_idx(moal_private *priv, t_u8 band, t_u32 pri_chan,
|
||||
t_u8 chan_bw)
|
||||
{
|
||||
t_u8 center_freq_idx = 0;
|
||||
|
||||
if (band & BAND_AAC) {
|
||||
switch (pri_chan) {
|
||||
case 36:
|
||||
case 40:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 38;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 44:
|
||||
case 48:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 46;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 42;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 52:
|
||||
case 56:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 54;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 60:
|
||||
case 64:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 62;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 58;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_160MHZ) {
|
||||
center_freq_idx = 50;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 68:
|
||||
case 72:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 70;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 76:
|
||||
case 80:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 78;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 74;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 84:
|
||||
case 88:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 86;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 92:
|
||||
case 96:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 94;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 90;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 100:
|
||||
case 104:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 102;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 108:
|
||||
case 112:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 110;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 106;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 116:
|
||||
case 120:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 118;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 124:
|
||||
case 128:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 126;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 122;
|
||||
} else if (chan_bw == CHANNEL_BW_160MHZ) {
|
||||
center_freq_idx = 114;
|
||||
}
|
||||
break;
|
||||
case 132:
|
||||
case 136:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 134;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 140:
|
||||
case 144:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 126;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 138;
|
||||
}
|
||||
break;
|
||||
case 149:
|
||||
case 153:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 151;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 157:
|
||||
case 161:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 159;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 155;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 165:
|
||||
case 169:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 167;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 173:
|
||||
case 177:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 175;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 171;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 184:
|
||||
case 188:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 186;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case 192:
|
||||
case 196:
|
||||
if (chan_bw == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
chan_bw == CHANNEL_BW_40MHZ_BELOW) {
|
||||
center_freq_idx = 194;
|
||||
break;
|
||||
} else if (chan_bw == CHANNEL_BW_80MHZ) {
|
||||
center_freq_idx = 190;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
default: /* error. go to the default */
|
||||
center_freq_idx = 42;
|
||||
}
|
||||
}
|
||||
return center_freq_idx;
|
||||
}
|
||||
|
||||
/**
|
||||
** @brief Set extended channel switch ie
|
||||
**
|
||||
|
@ -13238,17 +13515,6 @@ static int woal_priv_extend_channel_switch(moal_private *priv, t_u8 *respbuf,
|
|||
int ret = 0;
|
||||
int user_data_len = 0;
|
||||
int data[5] = {0};
|
||||
IEEEtypes_ExtChanSwitchAnn_t *ext_chan_switch = NULL;
|
||||
IEEEtypes_ChanSwitchAnn_t *chan_switch = NULL;
|
||||
custom_ie *pcust_chansw_ie = NULL;
|
||||
t_u8 center_freq_idx = 0;
|
||||
IEEEtypes_Header_t *pChanSwWrap_ie = NULL;
|
||||
IEEEtypes_WideBWChanSwitch_t *pbwchansw_ie = NULL;
|
||||
IEEEtypes_VhtTpcEnvelope_t *pvhttpcEnv_ie = NULL;
|
||||
mlan_ioctl_req *ioctl_req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!priv || !priv->phandle || (priv->bss_role != MLAN_BSS_ROLE_UAP) ||
|
||||
|
@ -13272,154 +13538,17 @@ static int woal_priv_extend_channel_switch(moal_private *priv, t_u8 *respbuf,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (ioctl_req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
|
||||
misc->sub_command = MLAN_OID_MISC_CUSTOM_IE;
|
||||
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
ioctl_req->action = MLAN_ACT_SET;
|
||||
misc->param.cust_ie.type = TLV_TYPE_MGMT_IE;
|
||||
misc->param.cust_ie.len = (sizeof(custom_ie) - MAX_IE_SIZE);
|
||||
|
||||
pcust_chansw_ie = (custom_ie *)&misc->param.cust_ie.ie_data_list[0];
|
||||
pcust_chansw_ie->ie_index = 0xffff; /*Auto index */
|
||||
pcust_chansw_ie->ie_length = sizeof(IEEEtypes_ChanSwitchAnn_t);
|
||||
pcust_chansw_ie->mgmt_subtype_mask =
|
||||
MGMT_MASK_BEACON | MGMT_MASK_PROBE_RESP; /*Add IE for
|
||||
BEACON/probe resp*/
|
||||
|
||||
chan_switch = (IEEEtypes_ChanSwitchAnn_t *)pcust_chansw_ie->ie_buffer;
|
||||
chan_switch->element_id = CHANNEL_SWITCH_ANN;
|
||||
chan_switch->len = 3;
|
||||
chan_switch->chan_switch_mode = data[0];
|
||||
chan_switch->new_channel_num = data[2];
|
||||
chan_switch->chan_switch_count = data[3];
|
||||
DBG_HEXDUMP(MCMD_D, "CSA IE", (t_u8 *)pcust_chansw_ie->ie_buffer,
|
||||
pcust_chansw_ie->ie_length);
|
||||
|
||||
if (data[1] != 0) {
|
||||
pcust_chansw_ie->ie_length +=
|
||||
sizeof(IEEEtypes_ExtChanSwitchAnn_t);
|
||||
ext_chan_switch =
|
||||
(IEEEtypes_ExtChanSwitchAnn_t
|
||||
*)(pcust_chansw_ie->ie_buffer +
|
||||
sizeof(IEEEtypes_ChanSwitchAnn_t));
|
||||
ext_chan_switch->element_id = EXTEND_CHANNEL_SWITCH_ANN;
|
||||
ext_chan_switch->len = 4;
|
||||
ext_chan_switch->chan_switch_mode = data[0];
|
||||
ext_chan_switch->new_oper_class = data[1];
|
||||
ext_chan_switch->new_channel_num = data[2];
|
||||
ext_chan_switch->chan_switch_count = data[3];
|
||||
if (data[1]) {
|
||||
if (woal_check_valid_channel_operclass(priv, data[2],
|
||||
data[1])) {
|
||||
PRINTM(MERROR, "Wrong channel switch parameters!\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
DBG_HEXDUMP(MCMD_D, "ECSA IE",
|
||||
(t_u8 *)(pcust_chansw_ie->ie_buffer +
|
||||
sizeof(IEEEtypes_ChanSwitchAnn_t)),
|
||||
pcust_chansw_ie->ie_length -
|
||||
sizeof(IEEEtypes_ChanSwitchAnn_t));
|
||||
}
|
||||
/* bandwidth 40/80/160 should set channel switch wrapper ie for 11ac 5G
|
||||
* channel*/
|
||||
if (data[4] && data[2] > 14) {
|
||||
pChanSwWrap_ie =
|
||||
(IEEEtypes_Header_t *)(pcust_chansw_ie->ie_buffer +
|
||||
pcust_chansw_ie->ie_length);
|
||||
pChanSwWrap_ie->element_id = EXT_POWER_CONSTR;
|
||||
pChanSwWrap_ie->len = sizeof(IEEEtypes_WideBWChanSwitch_t);
|
||||
|
||||
pbwchansw_ie = (IEEEtypes_WideBWChanSwitch_t
|
||||
*)((t_u8 *)pChanSwWrap_ie +
|
||||
sizeof(IEEEtypes_Header_t));
|
||||
pbwchansw_ie->ieee_hdr.element_id = BW_CHANNEL_SWITCH;
|
||||
pbwchansw_ie->ieee_hdr.len =
|
||||
sizeof(IEEEtypes_WideBWChanSwitch_t) -
|
||||
sizeof(IEEEtypes_Header_t);
|
||||
|
||||
center_freq_idx = woal_get_center_freq_idx(priv, BAND_AAC,
|
||||
data[2], data[4]);
|
||||
if (data[4] == CHANNEL_BW_40MHZ_ABOVE ||
|
||||
data[4] == CHANNEL_BW_40MHZ_BELOW) {
|
||||
pbwchansw_ie->new_channel_width = 0;
|
||||
pbwchansw_ie->new_channel_center_freq0 =
|
||||
center_freq_idx;
|
||||
} else if (data[4] == CHANNEL_BW_80MHZ) {
|
||||
pbwchansw_ie->new_channel_width = 1;
|
||||
pbwchansw_ie->new_channel_center_freq0 =
|
||||
center_freq_idx - 4;
|
||||
pbwchansw_ie->new_channel_center_freq1 =
|
||||
center_freq_idx + 4;
|
||||
} else if (data[4] == CHANNEL_BW_160MHZ) {
|
||||
pbwchansw_ie->new_channel_width = 2;
|
||||
pbwchansw_ie->new_channel_center_freq0 =
|
||||
center_freq_idx - 8;
|
||||
pbwchansw_ie->new_channel_center_freq1 =
|
||||
center_freq_idx + 8;
|
||||
} else
|
||||
PRINTM(MERROR,
|
||||
"Invalid bandwidth.Support value 1/3/4/5 for 40+/40-/80/160MHZ\n");
|
||||
|
||||
/*prepare the VHT Transmit Power Envelope IE*/
|
||||
pvhttpcEnv_ie =
|
||||
(IEEEtypes_VhtTpcEnvelope_t
|
||||
*)((t_u8 *)pChanSwWrap_ie +
|
||||
sizeof(IEEEtypes_Header_t) +
|
||||
sizeof(IEEEtypes_WideBWChanSwitch_t));
|
||||
pvhttpcEnv_ie->ieee_hdr.element_id = VHT_TX_POWER_ENV;
|
||||
pvhttpcEnv_ie->ieee_hdr.len =
|
||||
sizeof(IEEEtypes_VhtTpcEnvelope_t) -
|
||||
sizeof(IEEEtypes_Header_t);
|
||||
/* Local Max TX Power Count= 3,
|
||||
* Local TX Power Unit Inter=EIP(0) */
|
||||
pvhttpcEnv_ie->tpc_info = 3;
|
||||
pvhttpcEnv_ie->local_max_tp_20mhz = 0xff;
|
||||
pvhttpcEnv_ie->local_max_tp_40mhz = 0xff;
|
||||
pvhttpcEnv_ie->local_max_tp_80mhz = 0xff;
|
||||
pChanSwWrap_ie->len += sizeof(IEEEtypes_VhtTpcEnvelope_t);
|
||||
pcust_chansw_ie->ie_length +=
|
||||
pChanSwWrap_ie->len + sizeof(IEEEtypes_Header_t);
|
||||
DBG_HEXDUMP(MCMD_D, "Channel switch wrapper IE",
|
||||
(t_u8 *)pChanSwWrap_ie,
|
||||
pChanSwWrap_ie->len + sizeof(IEEEtypes_Header_t));
|
||||
}
|
||||
|
||||
if (data[0]) {
|
||||
if (netif_carrier_ok(priv->netdev))
|
||||
netif_carrier_off(priv->netdev);
|
||||
woal_stop_queue(priv->netdev);
|
||||
priv->uap_tx_blocked = MTRUE;
|
||||
}
|
||||
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
PRINTM(MERROR, "Failed to set ECSA IE\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
priv->phandle->chsw_wait_q_woken = MFALSE;
|
||||
/* wait for channel switch to complete */
|
||||
wait_event_interruptible_timeout(priv->phandle->chsw_wait_q,
|
||||
priv->phandle->chsw_wait_q_woken,
|
||||
(u32)HZ * (data[3] + 2) * 110 / 1000);
|
||||
|
||||
pcust_chansw_ie->ie_index = 0xffff; /*Auto index */
|
||||
pcust_chansw_ie->mgmt_subtype_mask = 0;
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
PRINTM(MERROR, "Failed to clear ECSA IE\n");
|
||||
}
|
||||
woal_channel_switch(priv, data[0], data[1], data[2], data[3], data[4],
|
||||
MFALSE);
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(ioctl_req);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
@ -14727,6 +14856,11 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
MOAL_IOCTL_WAIT);
|
||||
len += strlen(CMD_NXP) + strlen(PRIV_CMD_11AXCMDCFG);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_RANGE_EXT,
|
||||
strlen(PRIV_CMD_RANGE_EXT)) == 0) {
|
||||
len = woal_setget_priv_range_ext(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_HTTXCFG,
|
||||
strlen(PRIV_CMD_HTTXCFG)) == 0) {
|
||||
/* Set/Get HT Tx configuration */
|
||||
|
|
|
@ -346,6 +346,8 @@ typedef struct _ssu_params_cfg {
|
|||
#define PRIV_CMD_11AXCFG "11axcfg"
|
||||
/** Private command: 11AX Cmd */
|
||||
#define PRIV_CMD_11AXCMDCFG "11axcmd"
|
||||
/** Private command: Range ext Cmd */
|
||||
#define PRIV_CMD_RANGE_EXT "range_ext"
|
||||
/** Private command: TWT Setup Cfg */
|
||||
#define PRIV_CMD_TWT_SETUP "twt_setup"
|
||||
/** Private command: TWT Teardown Cfg */
|
||||
|
|
|
@ -88,6 +88,8 @@ static region_code_mapping_t region_code_mapping[] = {
|
|||
{"RU", 0x0f}, /* Russia */
|
||||
{"IN", 0x06}, /* India */
|
||||
{"MY", 0x06}, /* Malaysia */
|
||||
{"MX", 0x07}, /* Mexico */
|
||||
{"NE", 0x30}, /* New Zeland */
|
||||
};
|
||||
|
||||
/** EEPROM Region code mapping table */
|
||||
|
@ -107,7 +109,7 @@ static t_u8 eu_country_code_table[][COUNTRY_CODE_LEN] = {
|
|||
"AL", "AD", "AT", "AU", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK",
|
||||
"EE", "FI", "FR", "MK", "DE", "GR", "HU", "IS", "IE", "IT", "KR", "LV",
|
||||
"LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "NO", "PL", "RO", "RU",
|
||||
"SM", "RS", "SI", "SK", "ES", "SE", "CH", "TR", "UA", "UK", "GB"};
|
||||
"SM", "RS", "SI", "SK", "ES", "SE", "CH", "TR", "UA", "UK", "GB", "NE"};
|
||||
|
||||
/********************************************************
|
||||
Global Variables
|
||||
|
|
|
@ -1319,6 +1319,8 @@ struct _moal_private {
|
|||
t_u8 host_mlme;
|
||||
/** flag for auth */
|
||||
t_u8 auth_flag;
|
||||
/** flag for auth algorithm */
|
||||
t_u16 auth_alg;
|
||||
#endif
|
||||
#ifdef CONFIG_PROC_FS
|
||||
/** Proc entry */
|
||||
|
|
|
@ -40,9 +40,11 @@ Change log:
|
|||
********************************************************/
|
||||
#define DRV_NAME "NXP mdriver PCIe"
|
||||
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
|
||||
static struct pm_qos_request woal_pcie_pm_qos_req;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* PCIE resume handler */
|
||||
static int woal_pcie_resume(struct pci_dev *pdev);
|
||||
|
@ -1344,16 +1346,20 @@ mlan_status woal_pcie_bus_register(void)
|
|||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
ENTER();
|
||||
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
|
||||
pm_qos_add_request(&woal_pcie_pm_qos_req, PM_QOS_CPU_DMA_LATENCY, 0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
request_bus_freq(BUS_FREQ_HIGH);
|
||||
/* API registers the NXP PCIE driver */
|
||||
if (pci_register_driver(&wlan_pcie)) {
|
||||
PRINTM(MFATAL, "PCIE Driver Registration Failed \n");
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
|
||||
pm_qos_remove_request(&woal_pcie_pm_qos_req);
|
||||
#endif
|
||||
#endif
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
@ -1374,8 +1380,10 @@ void woal_pcie_bus_unregister(void)
|
|||
release_bus_freq(BUS_FREQ_HIGH);
|
||||
/* PCIE Driver Unregistration */
|
||||
pci_unregister_driver(&wlan_pcie);
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
|
||||
pm_qos_remove_request(&woal_pcie_pm_qos_req);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
LEAVE();
|
||||
|
@ -1480,7 +1488,7 @@ int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
|
|||
drv_ptr +=
|
||||
sprintf(drv_ptr, "reg:0x%x value=0x%x\n", reg, value);
|
||||
|
||||
mdelay(100);
|
||||
msleep(100);
|
||||
}
|
||||
drv_ptr +=
|
||||
sprintf(drv_ptr,
|
||||
|
@ -1619,7 +1627,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
|
|||
woal_pcie_read_reg(phandle, reg, &value);
|
||||
PRINTM(MERROR, "reg:0x%x value=0x%x\n", reg, value);
|
||||
|
||||
mdelay(100);
|
||||
msleep(100);
|
||||
}
|
||||
PRINTM(MMSG, "Interface registers dump from offset 0x%x to 0x%x\n",
|
||||
dump_start_reg, dump_end_reg);
|
||||
|
@ -1824,7 +1832,11 @@ rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag)
|
|||
return RDWR_STATUS_FAILURE;
|
||||
}
|
||||
}
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
|
||||
usleep_range(99, 100);
|
||||
#else
|
||||
udelay(100);
|
||||
#endif
|
||||
}
|
||||
if (ctrl_data == debug_host_ready) {
|
||||
PRINTM(MERROR, "Fail to pull ctrl_data\n");
|
||||
|
|
|
@ -1655,6 +1655,7 @@ mlan_status moal_recv_event(t_void *pmoal_handle, pmlan_event pmevent)
|
|||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
priv->auth_flag = 0;
|
||||
priv->host_mlme = MFALSE;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef STA_WEXT
|
||||
|
@ -2413,6 +2414,7 @@ mlan_status moal_recv_event(t_void *pmoal_handle, pmlan_event pmevent)
|
|||
(priv->auth_flag & HOST_MLME_AUTH_PENDING)) {
|
||||
priv->auth_flag = 0;
|
||||
priv->host_mlme = MFALSE;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
}
|
||||
priv->phandle->remain_on_channel = MFALSE;
|
||||
if (priv->phandle->cookie &&
|
||||
|
@ -2624,30 +2626,35 @@ mlan_status moal_recv_event(t_void *pmoal_handle, pmlan_event pmevent)
|
|||
((struct ieee80211_mgmt *)
|
||||
pkt)
|
||||
->frame_control)) {
|
||||
PRINTM(MEVENT,
|
||||
"HostMlme %s: Received auth frame type = 0x%x\n",
|
||||
priv->netdev->name,
|
||||
priv->auth_alg);
|
||||
|
||||
if (priv->auth_flag &
|
||||
HOST_MLME_AUTH_PENDING) {
|
||||
PRINTM(MEVENT,
|
||||
"HostMlme %s: Receive auth\n",
|
||||
priv->netdev
|
||||
->name);
|
||||
priv->auth_flag &=
|
||||
~HOST_MLME_AUTH_PENDING;
|
||||
priv->auth_flag |=
|
||||
HOST_MLME_AUTH_DONE;
|
||||
priv->phandle
|
||||
->host_mlme_priv =
|
||||
priv;
|
||||
queue_work(
|
||||
if (priv->auth_alg !=
|
||||
WLAN_AUTH_SAE) {
|
||||
priv->auth_flag &=
|
||||
~HOST_MLME_AUTH_PENDING;
|
||||
priv->auth_flag |=
|
||||
HOST_MLME_AUTH_DONE;
|
||||
priv->phandle
|
||||
->evt_workqueue,
|
||||
&priv->phandle
|
||||
->host_mlme_work);
|
||||
->host_mlme_priv =
|
||||
priv;
|
||||
queue_work(
|
||||
priv->phandle
|
||||
->evt_workqueue,
|
||||
&priv->phandle
|
||||
->host_mlme_work);
|
||||
}
|
||||
} else {
|
||||
PRINTM(MERROR,
|
||||
"HostMlme %s: Drop auth pkt,auth_flag=0x%x\n",
|
||||
"HostMlme %s: Drop auth frame, auth_flag=0x%x auth_alg=0x%x\n",
|
||||
priv->netdev
|
||||
->name,
|
||||
priv->auth_flag);
|
||||
priv->auth_flag,
|
||||
priv->auth_alg);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
|
@ -2665,6 +2672,7 @@ mlan_status moal_recv_event(t_void *pmoal_handle, pmlan_event pmevent)
|
|||
MFALSE);
|
||||
priv->host_mlme = MFALSE;
|
||||
priv->auth_flag = 0;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
if (!priv->wdev->current_bss) {
|
||||
PRINTM(MEVENT,
|
||||
"HostMlme: Drop deauth/disassociate, we already disconnected\n");
|
||||
|
|
|
@ -1867,11 +1867,13 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
}
|
||||
kfree(ssid_bssid);
|
||||
|
||||
if (priv->auth_flag & HOST_MLME_AUTH_PENDING) {
|
||||
if ((priv->auth_alg != WLAN_AUTH_SAE) &&
|
||||
(priv->auth_flag & HOST_MLME_AUTH_PENDING)) {
|
||||
PRINTM(MERROR, "pending auth on going\n");
|
||||
LEAVE();
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/** cancel pending scan */
|
||||
woal_cancel_scan(priv, MOAL_IOCTL_WAIT);
|
||||
|
||||
|
@ -1903,9 +1905,11 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
#endif
|
||||
|
||||
/*enable auth register frame*/
|
||||
woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MTRUE);
|
||||
woal_mgmt_frame_register(priv, IEEE80211_STYPE_DEAUTH, MTRUE);
|
||||
woal_mgmt_frame_register(priv, IEEE80211_STYPE_DISASSOC, MTRUE);
|
||||
if (priv->auth_flag == 0) {
|
||||
woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MTRUE);
|
||||
woal_mgmt_frame_register(priv, IEEE80211_STYPE_DEAUTH, MTRUE);
|
||||
woal_mgmt_frame_register(priv, IEEE80211_STYPE_DISASSOC, MTRUE);
|
||||
}
|
||||
|
||||
#define HEADER_SIZE 8
|
||||
// frmctl + durationid + addr1 + addr2 + addr3 + seqctl + addr4
|
||||
|
@ -1988,23 +1992,25 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
}
|
||||
|
||||
#define AUTH_TX_DEFAULT_WAIT_TIME 1200
|
||||
if (woal_cfg80211_remain_on_channel_cfg(
|
||||
priv, MOAL_IOCTL_WAIT, MFALSE, (t_u8 *)&status,
|
||||
req->bss->channel, 0, AUTH_TX_DEFAULT_WAIT_TIME)) {
|
||||
PRINTM(MERROR, "Fail to configure remain on channel\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
if (status == MLAN_STATUS_SUCCESS) {
|
||||
priv->phandle->remain_on_channel = MTRUE;
|
||||
moal_memcpy_ext(priv->phandle, &(priv->phandle->chan),
|
||||
req->bss->channel,
|
||||
sizeof(struct ieee80211_channel),
|
||||
sizeof(priv->phandle->chan));
|
||||
} else {
|
||||
PRINTM(MERROR,
|
||||
"HostMlme %s: Set remain on Channel: with status=%d\n",
|
||||
dev->name, status);
|
||||
if (priv->auth_flag == 0) {
|
||||
if (woal_cfg80211_remain_on_channel_cfg(
|
||||
priv, MOAL_IOCTL_WAIT, MFALSE, (t_u8 *)&status,
|
||||
req->bss->channel, 0, AUTH_TX_DEFAULT_WAIT_TIME)) {
|
||||
PRINTM(MERROR, "Fail to configure remain on channel\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
if (status == MLAN_STATUS_SUCCESS) {
|
||||
priv->phandle->remain_on_channel = MTRUE;
|
||||
moal_memcpy_ext(priv->phandle, &(priv->phandle->chan),
|
||||
req->bss->channel,
|
||||
sizeof(struct ieee80211_channel),
|
||||
sizeof(priv->phandle->chan));
|
||||
} else {
|
||||
PRINTM(MERROR,
|
||||
"HostMlme %s: Set remain on Channel: with status=%d\n",
|
||||
dev->name, status);
|
||||
}
|
||||
}
|
||||
|
||||
pmbuf->data_offset = MLAN_MIN_DATA_HEADER_LEN;
|
||||
|
@ -2092,6 +2098,8 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
|
||||
priv->host_mlme = MTRUE;
|
||||
priv->auth_flag = HOST_MLME_AUTH_PENDING;
|
||||
priv->auth_alg = cpu_to_le16(auth_alg);
|
||||
|
||||
PRINTM(MCMND, "wlan: HostMlme %s send auth to bssid " MACSTR "\n",
|
||||
dev->name, MAC2STR(req->bss->bssid));
|
||||
DBG_HEXDUMP(MDAT_D, "Auth:", pmbuf->pbuf + pmbuf->data_offset,
|
||||
|
@ -2111,6 +2119,9 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
case MLAN_STATUS_FAILURE:
|
||||
default:
|
||||
woal_free_mlan_buffer(priv->phandle, pmbuf);
|
||||
priv->host_mlme = MFALSE;
|
||||
priv->auth_flag = 0;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
@ -2321,9 +2332,30 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
|
|||
const u8 *ssid_ie;
|
||||
int wpa_enabled = 0, group_enc_mode = 0, pairwise_enc_mode = 0;
|
||||
mlan_bss_info bss_info;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (priv->auth_alg == WLAN_AUTH_SAE) {
|
||||
priv->auth_flag = HOST_MLME_AUTH_DONE;
|
||||
|
||||
woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MFALSE);
|
||||
PRINTM(MINFO, "wlan: HostMlme %s auth exchange successful\n",
|
||||
priv->netdev->name);
|
||||
|
||||
if (priv->phandle->remain_on_channel) {
|
||||
if (woal_cfg80211_remain_on_channel_cfg(
|
||||
priv, MOAL_IOCTL_WAIT, MTRUE,
|
||||
(t_u8 *)&status, NULL, 0, 0)) {
|
||||
PRINTM(MERROR,
|
||||
"Failed to cancel remain on channel\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
priv->phandle->remain_on_channel = MFALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (priv->auth_flag && !(priv->auth_flag & HOST_MLME_AUTH_DONE)) {
|
||||
LEAVE();
|
||||
return -EBUSY;
|
||||
|
@ -2331,6 +2363,7 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
|
|||
|
||||
priv->cfg_connect = MTRUE;
|
||||
priv->assoc_status = 0;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
|
||||
memset(&ssid_bssid, 0, sizeof(mlan_ssid_bssid));
|
||||
ssid_ie = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
|
||||
|
@ -2414,7 +2447,6 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
|
|||
goto done;
|
||||
}
|
||||
ssid_bssid.host_mlme = priv->host_mlme;
|
||||
ssid_bssid.use_mfp = req->use_mfp;
|
||||
|
||||
if (req->bss->channel) {
|
||||
ssid_bssid.channel_flags = req->bss->channel->flags;
|
||||
|
@ -2860,10 +2892,6 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
|
|||
ssid_bssid.channel_flags |= CHAN_FLAGS_MAX;
|
||||
PRINTM(MCMND, "channel flags=0x%x\n", channel->flags);
|
||||
}
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
if (conn_param)
|
||||
ssid_bssid.use_mfp = conn_param->mfp;
|
||||
#endif
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_bss_start(priv, MOAL_IOCTL_WAIT_TIMEOUT, &ssid_bssid)) {
|
||||
ret = -EFAULT;
|
||||
|
@ -4875,6 +4903,7 @@ static int woal_cfg80211_deauthenticate(struct wiphy *wiphy,
|
|||
if (priv->host_mlme) {
|
||||
priv->host_mlme = MFALSE;
|
||||
priv->auth_flag = 0;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
/*send deauth packet to notify disconnection to wpa_supplicant
|
||||
*/
|
||||
woal_deauth_event(priv, req->reason_code);
|
||||
|
@ -4913,6 +4942,7 @@ static int woal_cfg80211_disassociate(struct wiphy *wiphy,
|
|||
if (priv->host_mlme) {
|
||||
priv->host_mlme = MFALSE;
|
||||
priv->auth_flag = 0;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
/*send deauth packet to notify disconnection to wpa_supplicant
|
||||
*/
|
||||
woal_deauth_event(priv, req->reason_code);
|
||||
|
|
Loading…
Reference in New Issue