mirror of
https://github.com/nxp-imx/mwifiex.git
synced 2024-11-14 02:55:34 +00:00
mxm_wifiex: update to mxm5x17344.p1 release
Driver Bug Fixes: ----------------- 1. WCSWREL-352: Fixed WiFi driver kernel panic with "use after free" print 2. WCSWREL-353: Fixed WiFi driver panic when switch AP to another AP 3. WCSWREL-337: merge the L5.18 build errors and warnings fix patches into next wifi release 4. WSW-16518: Fixed STA going to unresponsive state during basic UAPSD operation 5. WSW-19350: Observed "unexpected kernel BRK exception" in STA 2G VHT with BT HID traffic running simultaneously 6. WSW-19640: cannot enable the "20/40 BSS Coexistence Management" support Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
This commit is contained in:
parent
e5b29dea3a
commit
4310e0ca2f
55 changed files with 1705 additions and 484 deletions
|
@ -477,7 +477,6 @@ endif
|
|||
|
||||
|
||||
|
||||
|
||||
MOALOBJS = mlinux/moal_main.o \
|
||||
mlinux/moal_ioctl.o \
|
||||
mlinux/moal_shim.o \
|
||||
|
|
|
@ -434,6 +434,8 @@ SYNOPSIS
|
|||
mlanutl mlanX 11axcmd <subcmd> <value>
|
||||
mlanutl mlanX txratecfg [l] [m] [n] [o]
|
||||
mlanutl uapX txratecfg [l] [m] [n] [o]
|
||||
mlanutl mlanX txwatchdog [l]
|
||||
mlanutl uapX txwatchdog [l]
|
||||
mlanutl mlanX hssetpara condition [GPIO# [gap]] [ind_GPIO# [level]]
|
||||
mlanutl mlanX mefcfg <mef.conf>
|
||||
mlanutl mlanX cloud_keep_alive <keep_alive.conf> <start/stop/reset>
|
||||
|
|
|
@ -106,21 +106,8 @@ get_15_4_stats={
|
|||
BCAArbitrationTLVType:2=0x024F # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=1 # GET 15.4 Statistics
|
||||
Action:2=2 # GET 15.4 Statistics
|
||||
length:4=52 # Length of collected statistics
|
||||
stats:52=0 # Accumulated Statistics
|
||||
}
|
||||
}
|
||||
|
||||
get_bt_stats={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# BCA Arbitration TLV
|
||||
BCAArbitrationTLVType:2=0x024F # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=2 # GET BT Statistics
|
||||
length:4=28 # Length of collected statistics
|
||||
stats:28=0 # Accumulated Statistics
|
||||
}
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ SD8997 = {
|
|||
# drv_mode=7
|
||||
#}
|
||||
|
||||
#SD8978 = {
|
||||
#SDIW416 = {
|
||||
# cfg80211_wext=0xf
|
||||
# wfd_name=p2p
|
||||
# hw_name=SDIW416
|
||||
|
@ -84,10 +84,10 @@ SD8997 = {
|
|||
# drv_mode=7
|
||||
#}
|
||||
|
||||
#SD9177 = {
|
||||
#SDIW612 = {
|
||||
# cfg80211_wext=0xf
|
||||
# wfd_name=p2p
|
||||
# hw_name=SDNW611
|
||||
# hw_name=SDIW612
|
||||
# max_vir_bss=1
|
||||
# drv_mode=7
|
||||
#}
|
||||
|
|
|
@ -127,6 +127,8 @@ char mod_conv_a_2x2[6][35] = {
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#define MAX_CH_LOAD_DURATION 10
|
||||
|
||||
static int process_version(int argc, char *argv[]);
|
||||
static int process_verext(int argc, char *argv[]);
|
||||
static int process_hostcmd(int argc, char *argv[]);
|
||||
|
@ -155,6 +157,8 @@ static int process_hssetpara(int argc, char *argv[]);
|
|||
static int process_mefcfg(int argc, char *argv[]);
|
||||
static int process_cloud_keep_alive(int argc, char *argv[]);
|
||||
static int process_min_ba_threshold_cfg(int argc, char *argv[]);
|
||||
static int process_txwatchdog(int argc, char *argv[]);
|
||||
static int process_getuuid(int argc, char *argv[]);
|
||||
|
||||
struct command_node command_list[] = {
|
||||
{"version", process_version},
|
||||
|
@ -186,6 +190,8 @@ struct command_node command_list[] = {
|
|||
{"mefcfg", process_mefcfg},
|
||||
{"cloud_keep_alive", process_cloud_keep_alive},
|
||||
{"min_ba_threshold", process_min_ba_threshold_cfg},
|
||||
{"txwatchdog", process_txwatchdog},
|
||||
{"getuuid", process_getuuid},
|
||||
};
|
||||
|
||||
static char *usage[] = {
|
||||
|
@ -5180,6 +5186,130 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* * @brief Process txwatchdog check command
|
||||
* * @param argc number of arguments
|
||||
* * @param argv A pointer to arguments array
|
||||
* * @return MLAN_STATUS_SUCCESS--success, otherwise--fail
|
||||
* */
|
||||
static int process_txwatchdog(int argc, char *argv[])
|
||||
{
|
||||
t_u8 *buffer = NULL;
|
||||
struct eth_priv_cmd *cmd = NULL;
|
||||
struct ifreq ifr;
|
||||
|
||||
/* Initialize buffer */
|
||||
buffer = (t_u8 *)malloc(BUFFER_LENGTH);
|
||||
if (!buffer) {
|
||||
printf("ERR:Cannot allocate buffer for command!\n");
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
prepare_buffer(buffer, argv[2], (argc - 3), &argv[3]);
|
||||
|
||||
cmd = (struct eth_priv_cmd *)malloc(sizeof(struct eth_priv_cmd));
|
||||
if (!cmd) {
|
||||
printf("ERR:Cannot allocate buffer for command!\n");
|
||||
free(buffer);
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Fill up buffer */
|
||||
#ifdef USERSPACE_32BIT_OVER_KERNEL_64BIT
|
||||
memset(cmd, 0, sizeof(struct eth_priv_cmd));
|
||||
memcpy(&cmd->buf, &buffer, sizeof(buffer));
|
||||
#else
|
||||
cmd->buf = buffer;
|
||||
#endif
|
||||
cmd->used_len = 0;
|
||||
cmd->total_len = BUFFER_LENGTH;
|
||||
|
||||
/* Perform IOCTL */
|
||||
memset(&ifr, 0, sizeof(struct ifreq));
|
||||
strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, strlen(dev_name));
|
||||
ifr.ifr_ifru.ifru_data = (void *)cmd;
|
||||
|
||||
if (ioctl(sockfd, MLAN_ETH_PRIV, &ifr)) {
|
||||
perror("mlanutl");
|
||||
fprintf(stderr, "mlanutl: txwatchdog fail\n");
|
||||
if (cmd)
|
||||
free(cmd);
|
||||
if (buffer)
|
||||
free(buffer);
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Process Get result */
|
||||
if (argc == 3) {
|
||||
printf("txwatchdog check: %s\n",
|
||||
((*(t_u32 *)buffer == 0) ? "Disabled" : "Enabled"));
|
||||
}
|
||||
|
||||
if (buffer)
|
||||
free(buffer);
|
||||
if (cmd)
|
||||
free(cmd);
|
||||
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static int process_getuuid(int argc, char *argv[])
|
||||
{
|
||||
t_u8 *buffer = NULL;
|
||||
struct eth_priv_cmd *cmd = NULL;
|
||||
struct ifreq ifr;
|
||||
|
||||
/* Initialize buffer */
|
||||
buffer = (t_u8 *)malloc(BUFFER_LENGTH);
|
||||
if (!buffer) {
|
||||
printf("ERR:Cannot allocate buffer for command!\n");
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
prepare_buffer(buffer, argv[2], 0, NULL);
|
||||
|
||||
cmd = (struct eth_priv_cmd *)malloc(sizeof(struct eth_priv_cmd));
|
||||
if (!cmd) {
|
||||
printf("ERR:Cannot allocate buffer for command!\n");
|
||||
free(buffer);
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Fill up buffer */
|
||||
#ifdef USERSPACE_32BIT_OVER_KERNEL_64BIT
|
||||
memset(cmd, 0, sizeof(struct eth_priv_cmd));
|
||||
memcpy(&cmd->buf, &buffer, sizeof(buffer));
|
||||
#else
|
||||
cmd->buf = buffer;
|
||||
#endif
|
||||
cmd->used_len = 0;
|
||||
cmd->total_len = BUFFER_LENGTH;
|
||||
|
||||
/* Perform IOCTL */
|
||||
memset(&ifr, 0, sizeof(struct ifreq));
|
||||
strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, strlen(dev_name));
|
||||
ifr.ifr_ifru.ifru_data = (void *)cmd;
|
||||
|
||||
if (ioctl(sockfd, MLAN_ETH_PRIV, &ifr)) {
|
||||
perror("mlanutl");
|
||||
fprintf(stderr, "mlanutl: version fail\n");
|
||||
if (cmd)
|
||||
free(cmd);
|
||||
if (buffer)
|
||||
free(buffer);
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
printf("uuid: %s\n", buffer);
|
||||
|
||||
if (buffer)
|
||||
free(buffer);
|
||||
if (cmd)
|
||||
free(cmd);
|
||||
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
Global Functions
|
||||
********************************************************/
|
||||
|
|
|
@ -148,13 +148,13 @@ enum _mlan_act_ioctl {
|
|||
#define ETH_ALEN 6
|
||||
#endif
|
||||
|
||||
/** Action field value : get */
|
||||
/** Action field value: get */
|
||||
#define ACTION_GET 0
|
||||
/** Action field value : set */
|
||||
/** Action field value: set */
|
||||
#define ACTION_SET 1
|
||||
/** Action field value: add */
|
||||
/** Action field value: add */
|
||||
#define ACTION_ADD 2
|
||||
/** Action field value: remove */
|
||||
/** Action field value: remove */
|
||||
#define ACTION_REMOVE 3
|
||||
|
||||
/** Maximum number of TID */
|
||||
|
@ -570,8 +570,8 @@ typedef struct MrvlIEtypes_Data_t {
|
|||
/** channel band */
|
||||
enum { BAND_2GHZ = 0,
|
||||
BAND_5GHZ = 1,
|
||||
BAND_4GHZ = 2,
|
||||
BAND_6GHZ = 3,
|
||||
BAND_6GHZ = 2,
|
||||
BAND_4GHZ = 3,
|
||||
};
|
||||
|
||||
/** channel offset */
|
||||
|
|
|
@ -55,7 +55,8 @@ Change log:
|
|||
/*Command arguments index*/
|
||||
#define NXP_ADDR "530 Holgerway SanJose"
|
||||
|
||||
#define PROTO_DOT11AZ 1
|
||||
#define PROTO_DOT11AZ_NTB 1
|
||||
#define PROTO_DOT11AZ_TB 2
|
||||
#define PROTO_DOT11MC 0
|
||||
|
||||
#define FTM_SUBCMD_INDEX 3
|
||||
|
@ -99,7 +100,7 @@ static int process_subcommand(int argc, char *argv[]);
|
|||
static int process_ftm_session_cfg(int argc, char *argv[], void *param);
|
||||
static int process_ftm_session_ctrl(int argc, char *argv[], void *param);
|
||||
|
||||
static int process_dot11az_ntb_cfg(int argc, char *argv[], void *param);
|
||||
static int process_dot11az_ranging_cfg(int argc, char *argv[], void *param);
|
||||
static int process_dot11mc_ftm_cfg(int argc, char *argv[], void *param);
|
||||
static int process_ftm_start(int argc, char *argv[], void *param);
|
||||
static int process_ftm_stop(int argc, char *argv[], void *param);
|
||||
|
@ -131,13 +132,14 @@ static char *mlanwls_help[] = {
|
|||
|
||||
static char *ftm_session_cfg_help[] = {
|
||||
"Usage: ",
|
||||
" mlanutl mlan0 ftm session_cfg [<config_file>] ",
|
||||
" mlanutl mlan0 ftm session_cfg [<ftm_protocol> <config_file>] ",
|
||||
" where,",
|
||||
" <ftm_protocol> : 0:Dot11mc, 1:Dot11az_ntb",
|
||||
" <ftm_protocol> : 0:Dot11mc, 1:Dot11az_ntb, 2:Dot11az_tb",
|
||||
" <config_file> : Config file with Dot11mc / dot11az parameters",
|
||||
"",
|
||||
" eg: mlanutl mlan0 ftm session_cfg 0 config/ftm.conf - Sets dot11mc FTM session params from config file",
|
||||
" mlanutl mlan0 ftm session_cfg 1 config/ftm.conf - Sets dot11az ntb session params from donfig file",
|
||||
" mlanutl mlan0 ftm session_cfg 1 config/ftm.conf - Sets dot11az ntb session params from config file",
|
||||
" mlanutl mlan0 ftm session_cfg 2 config/ftm.conf - Sets dot11az tb ranging session params from config file",
|
||||
" "};
|
||||
|
||||
static char *ftm_session_ctrl_help[] = {
|
||||
|
@ -308,32 +310,38 @@ static int process_ftm_hostcmd_resp(char *cmd_name, t_u8 *buf)
|
|||
case HostCmd_CMD_FTM_SESSION_CFG:
|
||||
phostcmd = (hostcmd_ds_ftm_session_cmd *)buf;
|
||||
if ((le16_to_cpu(phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.ntb_tlv.type) ==
|
||||
FTM_NTB_RANGING_CFG_TLV_ID)) {
|
||||
.range_tlv.type) ==
|
||||
FTM_NTB_RANGING_CFG_TLV_ID) ||
|
||||
(le16_to_cpu(phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.range_tlv.type) ==
|
||||
FTM_TB_RANGING_CFG_TLV_ID)) {
|
||||
if (le16_to_cpu(phostcmd->cmd.ftm_session_cfg.action) ==
|
||||
MLAN_ACT_GET) {
|
||||
/* Get */
|
||||
printf("\n\nGet NTB Ranging Parameters: \n");
|
||||
printf("\n\nGet Ranging Parameters: \n");
|
||||
} else {
|
||||
/* Set */
|
||||
printf("\n\nSet NTB Ranging Parameters: \n");
|
||||
printf("\n\nSet Ranging Parameters: \n");
|
||||
}
|
||||
printf("---------------------------------\n");
|
||||
printf("format_bw:%d \n",
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.ntb_tlv.val.format_bw);
|
||||
.range_tlv.val.format_bw);
|
||||
printf("az_measurement_freq:%d \n",
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.ntb_tlv.val.az_measurement_freq);
|
||||
.range_tlv.val.az_measurement_freq);
|
||||
printf("az_number_of_measurements:%d \n",
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.ntb_tlv.val.az_number_of_measurements);
|
||||
.range_tlv.val.az_number_of_measurements);
|
||||
printf("max_i2r_sts_upto80:%d \n",
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.ntb_tlv.val.max_i2r_sts_upto80);
|
||||
printf("max_r2i_sts_upto80:%d \n\n",
|
||||
.range_tlv.val.max_i2r_sts_upto80);
|
||||
printf("max_r2i_sts_upto80:%d \n",
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.ntb_tlv.val.max_r2i_sts_upto80);
|
||||
.range_tlv.val.max_r2i_sts_upto80);
|
||||
printf("i2r_lmr_feedback:%d \n\n",
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az
|
||||
.range_tlv.val.i2r_lmr_feedback);
|
||||
} else if ((le16_to_cpu(phostcmd->cmd.ftm_session_cfg.tlv
|
||||
.cfg_11mc.sess_tlv.type) ==
|
||||
FTM_SESSION_CFG_INITATOR_TLV_ID)) {
|
||||
|
@ -819,7 +827,7 @@ done:
|
|||
* @return MLAN_STATUS_SUCCESS--success, otherwise--fail
|
||||
*/
|
||||
|
||||
static int process_dot11az_ntb_cfg(int argc, char *argv[], void *param)
|
||||
static int process_dot11az_ranging_cfg(int argc, char *argv[], void *param)
|
||||
{
|
||||
int ret = MLAN_STATUS_SUCCESS;
|
||||
t_u8 *buffer = NULL;
|
||||
|
@ -850,26 +858,35 @@ static int process_dot11az_ntb_cfg(int argc, char *argv[], void *param)
|
|||
phostcmd->cmd_hdr.size = cpu_to_le16(phostcmd->cmd_hdr.size);
|
||||
phostcmd->cmd.ftm_session_cfg.action =
|
||||
cpu_to_le16(app_data->hostcmd_action);
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.ntb_tlv.type =
|
||||
cpu_to_le16(FTM_NTB_RANGING_CFG_TLV_ID);
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.ntb_tlv.len =
|
||||
cpu_to_le16(sizeof(ntb_ranging_cfg_t));
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.len =
|
||||
cpu_to_le16(sizeof(ranging_cfg_t));
|
||||
|
||||
if (app_data->protocol_type == PROTO_DOT11AZ_TB) {
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.type =
|
||||
cpu_to_le16(FTM_TB_RANGING_CFG_TLV_ID);
|
||||
} else {
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.type =
|
||||
cpu_to_le16(FTM_NTB_RANGING_CFG_TLV_ID);
|
||||
}
|
||||
|
||||
if (app_data->hostcmd_action == MLAN_ACT_SET) {
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.ntb_tlv.val
|
||||
.format_bw = app_data->ntb_cfg.format_bw;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.ntb_tlv.val
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.val
|
||||
.format_bw = app_data->range_cfg.format_bw;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.val
|
||||
.max_i2r_sts_upto80 =
|
||||
app_data->ntb_cfg.max_i2r_sts_upto80;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.ntb_tlv.val
|
||||
app_data->range_cfg.max_i2r_sts_upto80;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.val
|
||||
.max_r2i_sts_upto80 =
|
||||
app_data->ntb_cfg.max_r2i_sts_upto80;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.ntb_tlv.val
|
||||
app_data->range_cfg.max_r2i_sts_upto80;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.val
|
||||
.az_measurement_freq =
|
||||
app_data->ntb_cfg.az_measurement_freq;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.ntb_tlv.val
|
||||
app_data->range_cfg.az_measurement_freq;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.val
|
||||
.az_number_of_measurements =
|
||||
app_data->ntb_cfg.az_number_of_measurements;
|
||||
app_data->range_cfg.az_number_of_measurements;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11az.range_tlv.val
|
||||
.i2r_lmr_feedback =
|
||||
app_data->range_cfg.i2r_lmr_feedback;
|
||||
}
|
||||
/*Perform ioctl and process response*/
|
||||
ret = mlanwls_send_ioctl(buffer);
|
||||
|
@ -914,8 +931,7 @@ static int process_dot11mc_ftm_cfg(int argc, char *argv[], void *param)
|
|||
|
||||
/*Parse the arguments*/
|
||||
phostcmd->cmd_hdr.command = cpu_to_le16(HostCmd_CMD_FTM_SESSION_CFG);
|
||||
phostcmd->cmd_hdr.size =
|
||||
S_DS_GEN + sizeof(t_u16) + sizeof(dot11mc_ftm_cfg_t);
|
||||
phostcmd->cmd_hdr.size = S_DS_GEN + sizeof(t_u16);
|
||||
phostcmd->cmd.ftm_session_cfg.action =
|
||||
cpu_to_le16(app_data->hostcmd_action);
|
||||
|
||||
|
@ -944,6 +960,7 @@ static int process_dot11mc_ftm_cfg(int argc, char *argv[], void *param)
|
|||
app_data->civic_request;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11mc.sess_tlv.lci_req =
|
||||
app_data->lci_request;
|
||||
phostcmd->cmd_hdr.size += sizeof(ftm_session_cfg_tlv_t);
|
||||
|
||||
if (app_data->lci_request) {
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11mc.lci_tlv.type =
|
||||
|
@ -962,6 +979,7 @@ static int process_dot11mc_ftm_cfg(int argc, char *argv[], void *param)
|
|||
.longitude = app_data->lci_cfg.longitude;
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11mc.lci_tlv.val
|
||||
.long_unc = app_data->lci_cfg.long_unc;
|
||||
phostcmd->cmd_hdr.size += sizeof(lci_tlv_t);
|
||||
}
|
||||
|
||||
if (app_data->civic_request) {
|
||||
|
@ -970,8 +988,9 @@ static int process_dot11mc_ftm_cfg(int argc, char *argv[], void *param)
|
|||
FTM_SESSION_CFG_LOCATION_CIVIC_TLV_ID);
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11mc.civic_tlv
|
||||
.len = cpu_to_le16(
|
||||
sizeof(civic_loc_cfg_t) +
|
||||
app_data->civic_cfg.civic_address_length - 1);
|
||||
(sizeof(civic_loc_cfg_t) -
|
||||
sizeof(app_data->civic_cfg.civic_address)) +
|
||||
app_data->civic_cfg.civic_address_length);
|
||||
phostcmd->cmd.ftm_session_cfg.tlv.cfg_11mc.civic_tlv.val
|
||||
.civic_address_type =
|
||||
app_data->civic_cfg.civic_address_type;
|
||||
|
@ -989,6 +1008,8 @@ static int process_dot11mc_ftm_cfg(int argc, char *argv[], void *param)
|
|||
&app_data->civic_cfg.civic_address[0],
|
||||
app_data->civic_cfg.civic_address_length);
|
||||
phostcmd->cmd_hdr.size +=
|
||||
sizeof(civic_loc_tlv_t) -
|
||||
sizeof(app_data->civic_cfg.civic_address) +
|
||||
app_data->civic_cfg
|
||||
.civic_address_length; /*copy the
|
||||
variable len
|
||||
|
@ -1304,9 +1325,10 @@ static int process_ftm_session_cfg(int argc, char *argv[], void *param)
|
|||
}
|
||||
app_data = (wls_app_data_t *)param;
|
||||
|
||||
if (app_data->protocol_type == PROTO_DOT11AZ) {
|
||||
printf("[INFO] Set/Get DOT11AZ Config \n");
|
||||
ret = process_dot11az_ntb_cfg(argc, argv, param);
|
||||
if ((app_data->protocol_type == PROTO_DOT11AZ_NTB) ||
|
||||
(app_data->protocol_type == PROTO_DOT11AZ_TB)) {
|
||||
printf("[INFO] Set/Get DOT11AZ Ranging Config \n");
|
||||
ret = process_dot11az_ranging_cfg(argc, argv, param);
|
||||
} else {
|
||||
printf("[INFO] Set/Get DOT11MC (Legacy) Config \n");
|
||||
ret = process_dot11mc_ftm_cfg(argc, argv, param);
|
||||
|
@ -1349,7 +1371,8 @@ done:
|
|||
|
||||
static int process_subcommand(int argc, char *argv[])
|
||||
{
|
||||
int i, ret;
|
||||
int i = 0;
|
||||
int ret = MLAN_STATUS_SUCCESS;
|
||||
|
||||
/*Parse the user command to update the priv data and call subcommand
|
||||
* handlers*/
|
||||
|
@ -1461,7 +1484,7 @@ static int mlanwls_read_ftm_config(char *file_name)
|
|||
char *data = NULL;
|
||||
int arg_num, li;
|
||||
char *args[30];
|
||||
t_u8 param;
|
||||
t_u8 param = 0;
|
||||
|
||||
// read config
|
||||
config_file = fopen(file_name, "r");
|
||||
|
@ -1582,43 +1605,62 @@ static int mlanwls_read_ftm_config(char *file_name)
|
|||
PRINT_CFG("\t CIVIC_ADDRESS_TYPE=%d\n", param);
|
||||
|
||||
} else if (strcmp(args[0], "ADDRESS") == 0) {
|
||||
memcpy(&(gwls_data.civic_cfg.civic_address[0]),
|
||||
&args[1], strlen(args[1]));
|
||||
gwls_data.civic_cfg.civic_address_length =
|
||||
strlen(args[1]);
|
||||
PRINT_CFG("\t ADDRESS=%s\n", args[1]);
|
||||
if (strlen(args[1]) <= 255) {
|
||||
gwls_data.civic_cfg
|
||||
.civic_address_length =
|
||||
strlen(args[1]);
|
||||
strncpy((char *)&gwls_data.civic_cfg
|
||||
.civic_address[0],
|
||||
args[1],
|
||||
gwls_data.civic_cfg
|
||||
.civic_address_length);
|
||||
PRINT_CFG("\t ADDRESS=%s\n", args[1]);
|
||||
} else {
|
||||
DBG_ERROR(
|
||||
"\t [ERROR] Invalid Civic Address Len\n");
|
||||
}
|
||||
|
||||
} else {
|
||||
// printf("Invalid line entry\n %s",args[1]);
|
||||
}
|
||||
}
|
||||
|
||||
if (gwls_data.protocol_type == PROTO_DOT11AZ) {
|
||||
if (strcmp(args[0], "DOT11AZ_CFG") == 0) {
|
||||
printf("DOT11AZ_CFG\n\n");
|
||||
if ((gwls_data.protocol_type == PROTO_DOT11AZ_NTB) ||
|
||||
(gwls_data.protocol_type == PROTO_DOT11AZ_TB)) {
|
||||
if (strcmp(args[0], "DOT11AZ_RANGING_CFG") == 0) {
|
||||
if (gwls_data.protocol_type ==
|
||||
PROTO_DOT11AZ_NTB) {
|
||||
printf("DOT11AZ_NTB_RANGING_CFG\n\n");
|
||||
} else {
|
||||
printf("DOT11AZ_TB_RANGING_CFG\n\n");
|
||||
}
|
||||
} else if (strcmp(args[0], "FORMAT_BW") == 0) {
|
||||
gwls_data.ntb_cfg.format_bw =
|
||||
gwls_data.range_cfg.format_bw =
|
||||
(t_u8)(atoi(args[1]));
|
||||
PRINT_CFG("\t FORMAT_BW=%d\n", param);
|
||||
} else if (strcmp(args[0], "MAX_I2R_STS_UPTO80") == 0) {
|
||||
gwls_data.ntb_cfg.max_i2r_sts_upto80 =
|
||||
gwls_data.range_cfg.max_i2r_sts_upto80 =
|
||||
(t_u8)(atoi(args[1]));
|
||||
PRINT_CFG("\t MAX_I2R_STS_UPTO80=%d\n", param);
|
||||
} else if (strcmp(args[0], "MAX_R2I_STS_UPTO80") == 0) {
|
||||
gwls_data.ntb_cfg.max_r2i_sts_upto80 =
|
||||
gwls_data.range_cfg.max_r2i_sts_upto80 =
|
||||
(t_u8)(atoi(args[1]));
|
||||
PRINT_CFG("\t MAX_R2I_STS_UPTO80=%d\n", param);
|
||||
} else if (strcmp(args[0], "AZ_MEASUREMENT_FREQ") ==
|
||||
0) {
|
||||
gwls_data.ntb_cfg.az_measurement_freq =
|
||||
gwls_data.range_cfg.az_measurement_freq =
|
||||
(t_u8)(atoi(args[1]));
|
||||
PRINT_CFG("\t AZ_MEASUREMENT_FREQ=%d\n", param);
|
||||
} else if (strcmp(args[0],
|
||||
"AZ_NUMBER_OF_MEASUREMENTS") == 0) {
|
||||
gwls_data.ntb_cfg.az_number_of_measurements =
|
||||
gwls_data.range_cfg.az_number_of_measurements =
|
||||
(t_u8)(atoi(args[1]));
|
||||
PRINT_CFG("\t AZ_NUMBER_OF_MEASUREMENTS=%d\n",
|
||||
param);
|
||||
} else if (strcmp(args[0], "I2R_LMR_FEEDBACK") == 0) {
|
||||
gwls_data.range_cfg.i2r_lmr_feedback =
|
||||
(t_u8)(atoi(args[1]));
|
||||
PRINT_CFG("\t I2R_LMR_FEEDBACK=%d\n\n", param);
|
||||
} else {
|
||||
// printf("Invalid line entry%s\n",args[1]);
|
||||
}
|
||||
|
@ -1654,12 +1696,13 @@ static int mlanwls_init(void)
|
|||
gwls_data.terminate_app = 0;
|
||||
gwls_data.protocol_type = 0;
|
||||
|
||||
/*DOT11AZ NTB Ranging default config*/
|
||||
gwls_data.ntb_cfg.az_measurement_freq = 1;
|
||||
gwls_data.ntb_cfg.az_number_of_measurements = 6;
|
||||
gwls_data.ntb_cfg.format_bw = 2;
|
||||
gwls_data.ntb_cfg.max_i2r_sts_upto80 = 0;
|
||||
gwls_data.ntb_cfg.max_r2i_sts_upto80 = 1;
|
||||
/*DOT11AZ NTB/TB Ranging default config*/
|
||||
gwls_data.range_cfg.az_measurement_freq = 1;
|
||||
gwls_data.range_cfg.az_number_of_measurements = 6;
|
||||
gwls_data.range_cfg.format_bw = 2;
|
||||
gwls_data.range_cfg.max_i2r_sts_upto80 = 0;
|
||||
gwls_data.range_cfg.max_r2i_sts_upto80 = 1;
|
||||
gwls_data.range_cfg.i2r_lmr_feedback = 0;
|
||||
|
||||
/*DOT11MC FTM session default config*/
|
||||
gwls_data.session_cfg.burst_exponent = 0;
|
||||
|
|
|
@ -76,6 +76,7 @@ Change log:
|
|||
#define PROPRIETARY_TLV_BASE_ID 0x0100
|
||||
#define FTM_SESSION_CFG_INITATOR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 273)
|
||||
#define FTM_NTB_RANGING_CFG_TLV_ID (PROPRIETARY_TLV_BASE_ID + 343)
|
||||
#define FTM_TB_RANGING_CFG_TLV_ID (PROPRIETARY_TLV_BASE_ID + 344)
|
||||
#define FTM_RANGE_REPORT_TLV_ID \
|
||||
(PROPRIETARY_TLV_BASE_ID + 0x10C) /* 0x0100 + 0x10C = 0x20C */
|
||||
#define FTM_SESSION_CFG_LCI_TLV_ID (PROPRIETARY_TLV_BASE_ID + 270)
|
||||
|
@ -93,8 +94,9 @@ typedef struct {
|
|||
char **help;
|
||||
} wls_app_command_table;
|
||||
|
||||
/** Structure of FTM_SESSION_CFG_NTB_RANGING TLV data*/
|
||||
typedef struct _ntb_ranging_cfg {
|
||||
/** Structure of FTM_SESSION_CFG_NTB_RANGING / FTM_SESSION_CFG_TB_RANGING TLV
|
||||
* data*/
|
||||
typedef struct _ranging_cfg {
|
||||
/** Indicates the channel BW for session*/
|
||||
/*0: HE20, 1: HE40, 2: HE80, 3: HE80+80, 4: HE160, 5:HE160_SRF*/
|
||||
t_u8 format_bw;
|
||||
|
@ -110,12 +112,14 @@ typedef struct _ntb_ranging_cfg {
|
|||
t_u8 az_measurement_freq;
|
||||
/**Indicates the number of measurements to be done for session*/
|
||||
t_u8 az_number_of_measurements;
|
||||
/** Initator lmr feedback */
|
||||
t_u8 i2r_lmr_feedback;
|
||||
/**Include location civic request (Expect location civic from
|
||||
* responder)*/
|
||||
t_u8 civic_req;
|
||||
/**Include LCI request (Expect LCI info from responder)*/
|
||||
t_u8 lci_req;
|
||||
} __ATTRIB_PACK__ ntb_ranging_cfg_t;
|
||||
} __ATTRIB_PACK__ ranging_cfg_t;
|
||||
|
||||
/** Structure of FTM_SESSION_CFG TLV data*/
|
||||
typedef struct _ftm_session_cfg {
|
||||
|
@ -147,7 +151,7 @@ typedef struct _civic_loc_cfg {
|
|||
/**Civic address length*/
|
||||
t_u8 civic_address_length;
|
||||
/**Civic Address*/
|
||||
t_u8 civic_address[];
|
||||
t_u8 civic_address[256];
|
||||
} __ATTRIB_PACK__ civic_loc_cfg_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG_LCI TLV data*/
|
||||
|
@ -169,14 +173,14 @@ typedef struct _lci_cfg {
|
|||
} __ATTRIB_PACK__ lci_cfg_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG_NTB_RANGING TLV*/
|
||||
typedef struct _ntb_ranging_cfg_tlv {
|
||||
typedef struct _ranging_cfg_tlv {
|
||||
/** Type*/
|
||||
t_u16 type;
|
||||
/** Length*/
|
||||
t_u16 len;
|
||||
/** Value*/
|
||||
ntb_ranging_cfg_t val;
|
||||
} __ATTRIB_PACK__ ntb_ranging_cfg_tlv_t;
|
||||
ranging_cfg_t val;
|
||||
} __ATTRIB_PACK__ ranging_cfg_tlv_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG TLV*/
|
||||
typedef struct _ftm_session_cfg_tlv {
|
||||
|
@ -224,7 +228,7 @@ typedef struct _dot11mc_ftm_cfg {
|
|||
/** Structure for DOT11AZ FTM_SESSION_CFG */
|
||||
typedef struct _dot11az_ftmcfg_ntb_t {
|
||||
/** NTB session cfg */
|
||||
ntb_ranging_cfg_tlv_t ntb_tlv;
|
||||
ranging_cfg_tlv_t range_tlv;
|
||||
} __ATTRIB_PACK__ dot11az_ftm_cfg_t;
|
||||
|
||||
/** Type definition for hostcmd_ftm_session_cfg */
|
||||
|
@ -367,7 +371,7 @@ typedef struct _wls_app_data {
|
|||
/** Is civic data available in cfg*/
|
||||
t_u8 civic_request;
|
||||
/**ntb cfg param*/
|
||||
ntb_ranging_cfg_t ntb_cfg;
|
||||
ranging_cfg_t range_cfg;
|
||||
/** 11mc session cfg param*/
|
||||
ftm_session_cfg_t session_cfg;
|
||||
/** lci cfg data*/
|
||||
|
|
|
@ -110,12 +110,14 @@ t_u8 wlan_check_11ax_twt_supported(mlan_private *pmpriv,
|
|||
(MrvlIEtypes_He_cap_t *)&pmpriv->user_he_cap;
|
||||
MrvlIEtypes_He_cap_t *hw_he_cap =
|
||||
(MrvlIEtypes_He_cap_t *)&pmpriv->adapter->hw_he_cap;
|
||||
t_u16 band_selected = BAND_A;
|
||||
|
||||
if (pbss_desc && !wlan_check_ap_11ax_twt_supported(pbss_desc)) {
|
||||
PRINTM(MINFO, "AP don't support twt feature\n");
|
||||
return MFALSE;
|
||||
}
|
||||
if (pbss_desc) {
|
||||
if (pbss_desc->bss_band & BAND_A) {
|
||||
if (pbss_desc->bss_band & band_selected) {
|
||||
hw_he_cap = (MrvlIEtypes_He_cap_t *)&pmpriv->adapter
|
||||
->hw_he_cap;
|
||||
phecap = (MrvlIEtypes_He_cap_t *)&pmpriv->user_he_cap;
|
||||
|
@ -417,6 +419,7 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
t_u16 cfg_value = 0;
|
||||
t_u16 hw_value = 0;
|
||||
MrvlIEtypes_He_cap_t *phw_hecap = MNULL;
|
||||
t_u16 band_selected = BAND_A;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -436,7 +439,7 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
}
|
||||
bw_80p80 = wlan_is_80_80_support(pmpriv, pbss_desc);
|
||||
phecap = (MrvlIEtypes_He_cap_t *)*ppbuffer;
|
||||
if (pbss_desc->bss_band & BAND_A) {
|
||||
if (pbss_desc->bss_band & band_selected) {
|
||||
memcpy_ext(pmadapter, *ppbuffer, pmpriv->user_he_cap,
|
||||
pmpriv->user_hecap_len, pmpriv->user_hecap_len);
|
||||
*ppbuffer += pmpriv->user_hecap_len;
|
||||
|
@ -458,7 +461,7 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
if (IS_CARD9098(pmpriv->adapter->card_type) ||
|
||||
IS_CARDNW62X(pmpriv->adapter->card_type) ||
|
||||
IS_CARD9097(pmpriv->adapter->card_type)) {
|
||||
if (pbss_desc->bss_band & BAND_A) {
|
||||
if (pbss_desc->bss_band & band_selected) {
|
||||
rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >>
|
||||
8);
|
||||
tx_nss = GET_TXMCSSUPP(pmpriv->adapter->user_htstream >>
|
||||
|
@ -643,15 +646,6 @@ static mlan_status wlan_11ax_ioctl_hecfg(pmlan_adapter pmadapter,
|
|||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_req->buf_len < sizeof(mlan_ds_11ax_cfg)) {
|
||||
PRINTM(MINFO, "MLAN bss IOCTL length is too short.\n");
|
||||
pioctl_req->data_read_written = 0;
|
||||
pioctl_req->buf_len_needed = sizeof(mlan_ds_11ax_cfg);
|
||||
pioctl_req->status_code = MLAN_ERROR_INVALID_PARAMETER;
|
||||
LEAVE();
|
||||
return MLAN_STATUS_RESOURCE;
|
||||
}
|
||||
|
||||
cfg = (mlan_ds_11ax_cfg *)pioctl_req->pbuf;
|
||||
|
||||
if ((cfg->param.he_cfg.band & MBIT(0)) &&
|
||||
|
|
|
@ -418,8 +418,7 @@ static mlan_status wlan_11d_update_chan_pwr_table(mlan_private *pmpriv,
|
|||
/* Channel not found. Update the channel in the channel-power
|
||||
table */
|
||||
parsed_region_chan->chan_pwr[i].chan = chan;
|
||||
parsed_region_chan->chan_pwr[i].band =
|
||||
(t_u8)pbss_desc->bss_band;
|
||||
parsed_region_chan->chan_pwr[i].band = pbss_desc->bss_band;
|
||||
parsed_region_chan->chan_pwr[i].pwr = tx_power;
|
||||
parsed_region_chan->chan_pwr[i].ap_seen = MTRUE;
|
||||
parsed_region_chan->no_of_chan++;
|
||||
|
|
|
@ -686,11 +686,11 @@ static mlan_status wlan_11h_cmd_chan_rpt_req(mlan_private *priv,
|
|||
ptlv_zero_dfs->Header.len = wlan_cpu_to_le16(sizeof(t_u8));
|
||||
if (!is_cancel_req) {
|
||||
ptlv_zero_dfs->zero_dfs_enbl = MTRUE;
|
||||
PRINTM(MCMND, "ZeroDFS: START: chan=%d\n",
|
||||
PRINTM(MCMND, "DFS: START: chan=%d\n",
|
||||
pchan_rpt_req->chan_desc.chanNum);
|
||||
} else {
|
||||
ptlv_zero_dfs->zero_dfs_enbl = MFALSE;
|
||||
PRINTM(MCMND, "ZeroDFS: STOP\n");
|
||||
PRINTM(MCMND, "DFS: STOP\n");
|
||||
}
|
||||
pcmd_ptr->size += sizeof(MrvlIEtypes_ZeroDfsOperation_t);
|
||||
pcmd_ptr->size = wlan_cpu_to_le16(pcmd_ptr->size);
|
||||
|
@ -2426,7 +2426,11 @@ t_s32 wlan_11h_process_start(mlan_private *priv, t_u8 **ppbuffer,
|
|||
((adapter->adhoc_start_band & BAND_A))) {
|
||||
if (!wlan_fw_11d_is_enabled(priv)) {
|
||||
/* No use having 11h enabled without 11d enabled */
|
||||
wlan_11d_enable(priv, MNULL, ENABLE_11D);
|
||||
if (wlan_11d_enable(priv, MNULL, ENABLE_11D)) {
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#ifdef STA_SUPPORT
|
||||
wlan_11d_create_dnld_countryinfo(
|
||||
priv, adapter->adhoc_start_band);
|
||||
|
@ -2530,7 +2534,11 @@ t_s32 wlan_11h_process_join(mlan_private *priv, t_u8 **ppbuffer,
|
|||
if (p11h_bss_info->sensed_11h) {
|
||||
if (!wlan_fw_11d_is_enabled(priv)) {
|
||||
/* No use having 11h enabled without 11d enabled */
|
||||
wlan_11d_enable(priv, MNULL, ENABLE_11D);
|
||||
if (wlan_11d_enable(priv, MNULL, ENABLE_11D)) {
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#ifdef STA_SUPPORT
|
||||
wlan_11d_parse_dnld_countryinfo(
|
||||
priv, priv->pattempted_bss_desc);
|
||||
|
@ -3326,7 +3334,7 @@ mlan_status wlan_11h_print_event_radar_detected(mlan_private *priv,
|
|||
wlan_11h_add_dfs_timestamp(priv->adapter, DFS_TS_REPR_NOP_START,
|
||||
*radar_chan);
|
||||
wlan_set_chan_dfs_state(priv, BAND_A, *radar_chan, DFS_UNAVAILABLE);
|
||||
PRINTM(MEVENT, "ZeroDFS: Radar detected on %d\n", *radar_chan);
|
||||
PRINTM(MEVENT, "DFS: Radar detected on %d\n", *radar_chan);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -3484,6 +3492,7 @@ void wlan_11h_update_bandcfg(mlan_private *pmpriv, Band_Config_t *uap_band_cfg,
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
/**
|
||||
* @brief Get priv current index -- this is used to enter correct rdh_state
|
||||
* during radar handling
|
||||
|
@ -3512,6 +3521,7 @@ wlan_11h_get_priv_curr_idx(mlan_private *pmpriv,
|
|||
}
|
||||
return (found == MTRUE) ? MLAN_STATUS_SUCCESS : MLAN_STATUS_FAILURE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Driver handling for remove customeie
|
||||
|
|
|
@ -1059,7 +1059,7 @@ static void wlan_update_all_stations_ampdu(mlan_private *priv)
|
|||
}
|
||||
while (sta_ptr != (sta_node *)&priv->sta_list) {
|
||||
for (i = 0; i < MAX_NUM_TID; i++) {
|
||||
if (sta_ptr->is_11n_enabled)
|
||||
if (sta_ptr->is_11n_enabled || sta_ptr->is_11ax_enabled)
|
||||
sta_ptr->ampdu_sta[i] =
|
||||
priv->aggr_prio_tbl[i].ampdu_user;
|
||||
}
|
||||
|
@ -1242,7 +1242,8 @@ static mlan_status wlan_11n_ioctl_supported_mcs_set(pmlan_adapter pmadapter,
|
|||
if ((ISSUPP_CHANWIDTH40(pmpriv->usr_dot_11n_dev_cap_bg) ||
|
||||
ISSUPP_CHANWIDTH40(pmpriv->usr_dot_11n_dev_cap_a)) &&
|
||||
!(pmpriv->curr_chan_flags & CHAN_FLAGS_NO_HT40PLUS &&
|
||||
pmpriv->curr_chan_flags & CHAN_FLAGS_NO_HT40MINUS))
|
||||
pmpriv->curr_chan_flags & CHAN_FLAGS_NO_HT40MINUS) &&
|
||||
pmadapter->init_para.mcs32 == 1)
|
||||
SETHT_MCS32(mcs_set);
|
||||
|
||||
cfg = (mlan_ds_11n_cfg *)pioctl_req->pbuf;
|
||||
|
@ -1550,7 +1551,8 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap,
|
|||
* supprot*/
|
||||
if (ISSUPP_CHANWIDTH40(usr_dot_11n_dev_cap) &&
|
||||
!(priv->curr_chan_flags & CHAN_FLAGS_NO_HT40PLUS &&
|
||||
priv->curr_chan_flags & CHAN_FLAGS_NO_HT40MINUS))
|
||||
priv->curr_chan_flags & CHAN_FLAGS_NO_HT40MINUS) &&
|
||||
pmadapter->init_para.mcs32 == 1)
|
||||
SETHT_MCS32(pht_cap->ht_cap.supported_mcs_set);
|
||||
|
||||
/* Clear RD responder bit */
|
||||
|
@ -1626,7 +1628,8 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap,
|
|||
* supprot*/
|
||||
if (ISSUPP_CHANWIDTH40(usr_dot_11n_dev_cap) &&
|
||||
!(priv->curr_chan_flags & CHAN_FLAGS_NO_HT40PLUS &&
|
||||
priv->curr_chan_flags & CHAN_FLAGS_NO_HT40MINUS))
|
||||
priv->curr_chan_flags & CHAN_FLAGS_NO_HT40MINUS) &&
|
||||
pmadapter->init_para.mcs32 == 1)
|
||||
SETHT_MCS32(pht_cap->ht_cap.supported_mcs_set);
|
||||
|
||||
/* Clear RD responder bit */
|
||||
|
|
|
@ -623,6 +623,10 @@ mlan_status wlan_cmd_11n_addba_req(mlan_private *priv, HostCmd_DS_COMMAND *cmd,
|
|||
*/
|
||||
static t_u8 wlan_is_addba_reject(mlan_private *priv, t_u8 tid)
|
||||
{
|
||||
if (tid >= MAX_NUM_TID) {
|
||||
PRINTM(MERROR, "Wrong TID =%d", tid);
|
||||
return ADDBA_RSP_STATUS_REJECT;
|
||||
}
|
||||
#ifdef STA_SUPPORT
|
||||
#endif
|
||||
return priv->addba_reject[tid];
|
||||
|
@ -1421,6 +1425,7 @@ void wlan_flush_rxreorder_tbl(pmlan_adapter pmadapter)
|
|||
static void wlan_update_ampdu_rxwinsize(pmlan_adapter pmadapter, t_u8 coex_flag)
|
||||
{
|
||||
t_u8 i;
|
||||
t_u8 j;
|
||||
t_u32 rx_win_size = 0;
|
||||
pmlan_private priv = MNULL;
|
||||
|
||||
|
@ -1450,7 +1455,9 @@ static void wlan_update_ampdu_rxwinsize(pmlan_adapter pmadapter, t_u8 coex_flag)
|
|||
priv->add_ba_param.rx_win_size =
|
||||
MLAN_UAP_COEX_AMPDU_DEF_RXWINSIZE;
|
||||
#endif
|
||||
|
||||
priv->add_ba_param.rx_win_size =
|
||||
MIN(priv->add_ba_param.rx_win_size,
|
||||
priv->user_rxwinsize);
|
||||
} else {
|
||||
priv->add_ba_param.rx_win_size =
|
||||
priv->user_rxwinsize;
|
||||
|
@ -1461,8 +1468,8 @@ static void wlan_update_ampdu_rxwinsize(pmlan_adapter pmadapter, t_u8 coex_flag)
|
|||
pmadapter->coex_rx_win_size;
|
||||
if (rx_win_size != priv->add_ba_param.rx_win_size) {
|
||||
if (priv->media_connected == MTRUE) {
|
||||
for (i = 0; i < MAX_NUM_TID; i++)
|
||||
wlan_11n_delba(priv, i);
|
||||
for (j = 0; j < MAX_NUM_TID; j++)
|
||||
wlan_11n_delba(priv, j);
|
||||
wlan_recv_event(
|
||||
priv,
|
||||
MLAN_EVENT_ID_DRV_DEFER_HANDLING,
|
||||
|
|
|
@ -66,6 +66,20 @@ Change Log:
|
|||
Local Functions
|
||||
********************************************************/
|
||||
#ifdef STA_SUPPORT
|
||||
/**
|
||||
* @brief This function check if the command was cancel scan command
|
||||
*
|
||||
* @param pcmd A pointer to HostCmd_DS_COMMAND structure
|
||||
* @return N/A
|
||||
*/
|
||||
static t_u8 wlan_is_cancel_scan_cmd(HostCmd_DS_COMMAND *pcmd)
|
||||
{
|
||||
HostCmd_DS_802_11_SCAN_EXT *pext_scan_cmd = &pcmd->params.ext_scan;
|
||||
if (pext_scan_cmd->ext_scan_type == EXT_SCAN_CANCEL)
|
||||
return MTRUE;
|
||||
else
|
||||
return MFALSE;
|
||||
}
|
||||
/**
|
||||
* @brief This function inserts scan command node to scan_pending_q.
|
||||
*
|
||||
|
@ -495,6 +509,7 @@ static t_void wlan_dump_info(mlan_adapter *pmadapter, t_u8 reason)
|
|||
pmadapter->pps_uapsd_mode, pmadapter->sleep_period.period);
|
||||
PRINTM(MERROR, "tx_lock_flag = %d\n", pmadapter->tx_lock_flag);
|
||||
PRINTM(MERROR, "scan_processing = %d\n", pmadapter->scan_processing);
|
||||
PRINTM(MERROR, "scan_state = 0x%x\n", pmadapter->scan_state);
|
||||
PRINTM(MERROR, "bypass_pkt_count=%d\n", pmadapter->bypass_pkt_count);
|
||||
#ifdef SDIO
|
||||
if (IS_SD(pmadapter->card_type)) {
|
||||
|
@ -1123,9 +1138,9 @@ static mlan_status wlan_cmd_host_cmd(pmlan_private pmpriv,
|
|||
*
|
||||
* @return timeout value for this command
|
||||
*/
|
||||
static t_u16 wlan_get_cmd_timeout(t_u16 cmd_id)
|
||||
static t_u32 wlan_get_cmd_timeout(t_u16 cmd_id)
|
||||
{
|
||||
t_u16 timeout;
|
||||
t_u32 timeout;
|
||||
ENTER();
|
||||
switch (cmd_id) {
|
||||
case HostCmd_CMD_802_11_SCAN:
|
||||
|
@ -1206,7 +1221,7 @@ static mlan_status wlan_dnld_cmd_to_fw(mlan_private *pmpriv,
|
|||
#ifdef DEBUG_LEVEL1
|
||||
t_u32 sec = 0, usec = 0;
|
||||
#endif
|
||||
t_u16 timeout = 0;
|
||||
t_u32 timeout = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -1293,6 +1308,9 @@ static mlan_status wlan_dnld_cmd_to_fw(mlan_private *pmpriv,
|
|||
}
|
||||
#endif
|
||||
|
||||
if (pcmd->command == HostCmd_CMD_802_11_SCAN_EXT)
|
||||
pmadapter->scan_state |= wlan_get_ext_scan_state(pcmd);
|
||||
|
||||
PRINTM_GET_SYS_TIME(MCMND, &sec, &usec);
|
||||
PRINTM_NETINTF(MCMND, pmpriv);
|
||||
PRINTM(MCMND,
|
||||
|
@ -1928,7 +1946,15 @@ mlan_status wlan_prepare_cmd(mlan_private *pmpriv, t_u16 cmd_no,
|
|||
#ifdef STA_SUPPORT
|
||||
if (cmd_no == HostCmd_CMD_802_11_SCAN ||
|
||||
cmd_no == HostCmd_CMD_802_11_SCAN_EXT) {
|
||||
wlan_queue_scan_cmd(pmpriv, pcmd_node);
|
||||
if (cmd_no == HostCmd_CMD_802_11_SCAN_EXT &&
|
||||
pmadapter->ext_scan && pmadapter->ext_scan_enh &&
|
||||
pmadapter->ext_scan_type == EXT_SCAN_ENHANCE &&
|
||||
wlan_is_cancel_scan_cmd(cmd_ptr)) {
|
||||
wlan_insert_cmd_to_pending_q(pmadapter, pcmd_node,
|
||||
MFALSE);
|
||||
} else
|
||||
|
||||
wlan_queue_scan_cmd(pmpriv, pcmd_node);
|
||||
} else {
|
||||
#endif
|
||||
if ((cmd_no == HostCmd_CMD_802_11_HS_CFG_ENH) &&
|
||||
|
@ -5062,6 +5088,8 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
MrvlIEtypes_Extension_t *ext_tlv = MNULL;
|
||||
MrvlIEtypes_fw_cap_info_t *fw_cap_tlv = MNULL;
|
||||
|
||||
MrvlIEtypes_Secure_Boot_Uuid_t *sb_uuid_tlv = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
pmadapter->fw_cap_info = wlan_le32_to_cpu(hw_spec->fw_cap_info);
|
||||
|
@ -5358,6 +5386,13 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
PRINTM(MCMND, "fw_cap_info=0x%x fw_cap_ext=0x%x\n",
|
||||
pmadapter->fw_cap_info, pmadapter->fw_cap_ext);
|
||||
break;
|
||||
case TLV_TYPE_SECURE_BOOT_UUID:
|
||||
sb_uuid_tlv = (MrvlIEtypes_Secure_Boot_Uuid_t *)tlv;
|
||||
pmadapter->uuid_lo = sb_uuid_tlv->uuid_lo;
|
||||
pmadapter->uuid_hi = sb_uuid_tlv->uuid_hi;
|
||||
PRINTM(MMSG, "uuid: %llx%llx\n", pmadapter->uuid_lo,
|
||||
pmadapter->uuid_hi);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -9146,6 +9181,7 @@ mlan_status wlan_ret_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of ch_load
|
||||
*
|
||||
|
@ -9168,9 +9204,12 @@ mlan_status wlan_cmd_get_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_GET_CH_LOAD) + S_DS_GEN);
|
||||
cfg_cmd->action = wlan_cpu_to_le16(cmd_action);
|
||||
cfg_cmd->ch_load = wlan_cpu_to_le16(cfg->ch_load_param);
|
||||
cfg_cmd->noise = wlan_cpu_to_le16(cfg->noise);
|
||||
cfg_cmd->duration = wlan_cpu_to_le16(cfg->duration);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of ch_load
|
||||
*
|
||||
|
@ -9185,13 +9224,10 @@ mlan_status wlan_ret_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
{
|
||||
HostCmd_DS_GET_CH_LOAD *cfg_cmd =
|
||||
(HostCmd_DS_GET_CH_LOAD *)&resp->params.ch_load;
|
||||
mlan_ds_misc_cfg *misc_cfg = MNULL;
|
||||
ENTER();
|
||||
if (pioctl_buf) {
|
||||
misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
misc_cfg->param.ch_load.ch_load_param =
|
||||
wlan_le16_to_cpu(cfg_cmd->ch_load);
|
||||
}
|
||||
|
||||
pmpriv->ch_load_param = wlan_le16_to_cpu(cfg_cmd->ch_load);
|
||||
pmpriv->noise = wlan_le16_to_cpu(cfg_cmd->noise);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#define _MLAN_DECL_H_
|
||||
|
||||
/** MLAN release version */
|
||||
#define MLAN_RELEASE_VERSION "322.p3"
|
||||
#define MLAN_RELEASE_VERSION "344.p1"
|
||||
|
||||
/** Re-define generic data types for MLAN/MOAL */
|
||||
/** Signed char (1-byte) */
|
||||
|
@ -441,7 +441,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** SD8977 Card */
|
||||
#define CARD_SD8977 "SD8977"
|
||||
/** SD8978 Card */
|
||||
#define CARD_SD8978 "SD8978"
|
||||
#define CARD_SD8978 "SDIW416"
|
||||
/** SD8997 Card */
|
||||
#define CARD_SD8997 "SD8997"
|
||||
/** SD8987 Card */
|
||||
|
@ -451,7 +451,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** SD9098 Card */
|
||||
#define CARD_SD9098 "SD9098"
|
||||
/** SD9177 Card */
|
||||
#define CARD_SD9177 "SD9177"
|
||||
#define CARD_SD9177 "SDIW612"
|
||||
/** SD8801 Card */
|
||||
#define CARD_SD8801 "SD8801"
|
||||
/** SDNW62X Card */
|
||||
|
@ -490,6 +490,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_PCIEAW690 "PCIEAW690"
|
||||
/** PCIENW62X Card */
|
||||
#define CARD_PCIENW62X "PCIENW62X"
|
||||
/** PCIEIW629 Card */
|
||||
#define CARD_PCIEIW629 "PCIEIW629"
|
||||
#endif
|
||||
|
||||
#ifdef USB
|
||||
|
@ -523,7 +525,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** USB8997 Card */
|
||||
#define CARD_USB8997 "USB8997"
|
||||
/** USB8978 Card */
|
||||
#define CARD_USB8978 "USB8978"
|
||||
#define CARD_USB8978 "USBIW416"
|
||||
/** USB9098 Card */
|
||||
#define CARD_USB9098 "USB9098"
|
||||
/** USB9097 Card */
|
||||
|
@ -699,6 +701,18 @@ typedef enum _mlan_buf_type {
|
|||
#endif
|
||||
} mlan_buf_type;
|
||||
|
||||
#define SCAN_STATE_SCAN_START MBIT(0)
|
||||
#define SCAN_STATE_EXT_SCAN MBIT(1)
|
||||
#define SCAN_STATE_EXT_SCAN_ENH MBIT(2)
|
||||
#define SCAN_STATE_EXT_SCAN_CANCEL MBIT(3)
|
||||
#define SCAN_STATE_EXT_SCAN_CMDRESP MBIT(4)
|
||||
#define SCAN_STATE_EXT_SCAN_ENH_CMDRESP MBIT(5)
|
||||
#define SCAN_STATE_EXT_SCAN_CANCEL_CMDRESP MBIT(6)
|
||||
#define SCAN_STATE_EXT_SCAN_RESULT MBIT(7)
|
||||
#define SCAN_STATE_LAST_EXT_SCAN_RESULT MBIT(8)
|
||||
#define SCAN_STATE_EXT_SCAN_STATUS MBIT(9)
|
||||
#define SCAN_STATE_SCAN_COMPLETE MBIT(10)
|
||||
|
||||
#ifdef USB
|
||||
/** mlan_usb_ep */
|
||||
typedef enum _mlan_usb_ep {
|
||||
|
@ -905,8 +919,8 @@ enum mlan_channel_type {
|
|||
/** channel band */
|
||||
enum { BAND_2GHZ = 0,
|
||||
BAND_5GHZ = 1,
|
||||
BAND_4GHZ = 2,
|
||||
BAND_6GHZ = 3,
|
||||
BAND_6GHZ = 2,
|
||||
BAND_4GHZ = 3,
|
||||
};
|
||||
|
||||
/** channel offset */
|
||||
|
@ -2300,8 +2314,12 @@ typedef struct _mlan_device {
|
|||
t_u32 drv_mode;
|
||||
/** dfs w53 cfg */
|
||||
t_u8 dfs53cfg;
|
||||
/** dfs_offload */
|
||||
t_u8 dfs_offload;
|
||||
/** extend enhance scan */
|
||||
t_u8 ext_scan;
|
||||
/* mcs32 setting */
|
||||
t_u8 mcs32;
|
||||
} mlan_device, *pmlan_device;
|
||||
|
||||
/** MLAN API function prototype */
|
||||
|
|
|
@ -555,6 +555,9 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
/** TLV type: fw cap info */
|
||||
#define TLV_TYPE_FW_CAP_INFO (PROPRIETARY_TLV_BASE_ID + 318)
|
||||
|
||||
/** TLV type: secure boot uuid */
|
||||
#define TLV_TYPE_SECURE_BOOT_UUID (PROPRIETARY_TLV_BASE_ID + 348)
|
||||
|
||||
/** ADDBA TID mask */
|
||||
#define ADDBA_TID_MASK (MBIT(2) | MBIT(3) | MBIT(4) | MBIT(5))
|
||||
/** DELBA TID mask */
|
||||
|
@ -1360,6 +1363,7 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
#define HostCmd_CMD_802_11_BAND_STEERING 0x026f
|
||||
/*** Host Command ID " MC_AGGR_CFG */
|
||||
#define HostCmd_CMD_MC_AGGR_CFG 0x027a
|
||||
#define HostCmd_CMD_802_11_STATS 0x0014
|
||||
#define HostCmd_CMD_GET_CH_LOAD 0x027b
|
||||
|
||||
/** Host Command ID : TDLS configuration */
|
||||
|
@ -3506,10 +3510,33 @@ typedef MLAN_PACK_START struct _HostCmd_DS_MC_AGGR_CFG {
|
|||
/** CTS2Self duration offset */
|
||||
t_u16 cts2self_offset;
|
||||
} MLAN_PACK_END HostCmd_DS_MC_AGGR_CFG;
|
||||
|
||||
/** Stats_Cfg_Params_TLV */
|
||||
typedef struct MLAN_PACK_START _Stats_Cfg_Params_TLV {
|
||||
/** tlvHeader */
|
||||
MrvlIEtypesHeader_t tlvHeader;
|
||||
/** op */
|
||||
t_u8 op;
|
||||
/** reserved */
|
||||
t_u8 reserved;
|
||||
/** mac */
|
||||
mlan_802_11_mac_addr mac;
|
||||
} MLAN_PACK_END Stats_Cfg_Params_TLV_t;
|
||||
|
||||
/** HostCmd_DS_STATS */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_STATS {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
/** TLV buffer */
|
||||
t_u8 tlv_buffer[1];
|
||||
} MLAN_PACK_END HostCmd_DS_STATS;
|
||||
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_GET_CH_LOAD {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
t_u16 ch_load;
|
||||
t_s16 noise;
|
||||
t_u16 duration;
|
||||
} MLAN_PACK_END HostCmd_DS_GET_CH_LOAD;
|
||||
|
||||
/** HostCmd_DS_CMD_802_11_RSSI_INFO */
|
||||
|
@ -6273,9 +6300,12 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_MacAddr_t {
|
|||
/** TLV type : AP WMM params */
|
||||
#define TLV_TYPE_AP_WMM_PARAM (PROPRIETARY_TLV_BASE_ID + 0xd0) /* 0x01d0 */
|
||||
/** TLV type : AP Tx beacon rate */
|
||||
#define TLV_TYPE_UAP_TX_BEACON_RATE \
|
||||
(PROPRIETARY_TLV_BASE_ID + 288) /* 0x0220 \
|
||||
*/
|
||||
#define TLV_TYPE_UAP_TX_BEACON_RATE (PROPRIETARY_TLV_BASE_ID + 288) /* 0x0220 \
|
||||
*/
|
||||
#define NXP_802_11_PER_PEER_STATS_CFG_TLV_ID \
|
||||
(PROPRIETARY_TLV_BASE_ID + 346) /* 0x025A */
|
||||
#define NXP_802_11_PER_PEER_STATS_ENTRY_TLV_ID \
|
||||
(PROPRIETARY_TLV_BASE_ID + 347) /* 0x025B */
|
||||
|
||||
/** MrvlIEtypes_beacon_period_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_beacon_period_t {
|
||||
|
@ -8008,6 +8038,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
|
|||
HostCmd_DS_HAL_PHY_CFG hal_phy_cfg_params;
|
||||
HostCmd_DS_IPS_CONFIG ips_cfg;
|
||||
HostCmd_DS_MC_AGGR_CFG mc_aggr_cfg;
|
||||
HostCmd_DS_STATS stats;
|
||||
HostCmd_DS_GET_CH_LOAD ch_load;
|
||||
} params;
|
||||
} MLAN_PACK_END HostCmd_DS_COMMAND, *pHostCmd_DS_COMMAND;
|
||||
|
@ -8036,6 +8067,15 @@ typedef struct MLAN_PACK_START _opt_sleep_confirm_buffer {
|
|||
OPT_Confirm_Sleep ps_cfm_sleep;
|
||||
} MLAN_PACK_END opt_sleep_confirm_buffer;
|
||||
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_Secure_Boot_Uuid_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
|
||||
/** Secure boot uuid lower and higher 8 bytes */
|
||||
t_u64 uuid_lo;
|
||||
t_u64 uuid_hi;
|
||||
} MLAN_PACK_END MrvlIEtypes_Secure_Boot_Uuid_t;
|
||||
|
||||
/** req host side download vdll block */
|
||||
#define VDLL_IND_TYPE_REQ 0
|
||||
/** notify vdll start offset in firmware image */
|
||||
|
|
|
@ -1225,8 +1225,10 @@ typedef MLAN_PACK_START struct _IEEEtypes_HeOpParam_t {
|
|||
t_u16 co_located_bss : 1; /* bit 15 */
|
||||
/** ER SU Disable */
|
||||
t_u8 er_su_disable : 1; /* bit 16 */
|
||||
/** Reserved, including 6G Operation Info Pressent (bit17) */
|
||||
t_u8 reserved : 7; /* bit 17-23 */
|
||||
/* 6g operation info present */
|
||||
t_u8 he_6g_op_info_present : 1; /* bit 17 */
|
||||
/** Reserved bit 18-23 */
|
||||
t_u8 reserved : 6; /* bit 18-23 */
|
||||
} MLAN_PACK_END IEEEtypes_HeOpParam_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeBssColorInfo_t {
|
||||
|
@ -1666,7 +1668,10 @@ typedef MLAN_PACK_START struct {
|
|||
/**wait for all channel scan to complete to report scan result*/
|
||||
#define BG_SCAN_WAIT_ALL_CHAN_DONE 0x80000000
|
||||
/** Maximum number of channels that can be sent in bg scan config */
|
||||
#define WLAN_BG_SCAN_CHAN_MAX 38
|
||||
#define CHAN_MAX_24G 14
|
||||
#define CHAN_MAX_5G 24
|
||||
#define CHAN_MAX_UNII4 3
|
||||
#define WLAN_BG_SCAN_CHAN_MAX (CHAN_MAX_24G + CHAN_MAX_5G + CHAN_MAX_UNII4)
|
||||
|
||||
/** Enumeration definition */
|
||||
/** EES MODE */
|
||||
|
|
|
@ -369,6 +369,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_IPS_CFG = 0x00200085,
|
||||
MLAN_OID_MISC_MC_AGGR_CFG = 0x00200086,
|
||||
MLAN_OID_MISC_CH_LOAD = 0x00200087,
|
||||
MLAN_OID_MISC_STATS = 0x00200088,
|
||||
MLAN_OID_MISC_CH_LOAD_RESULTS = 0x00200089,
|
||||
};
|
||||
|
||||
/** Sub command size */
|
||||
|
@ -1887,11 +1889,20 @@ typedef struct _mlan_fw_info {
|
|||
t_u8 prohibit_80mhz;
|
||||
/** FW support beacon protection */
|
||||
t_u8 fw_beacon_prot;
|
||||
|
||||
/* lower 8 bytes of uuid */
|
||||
t_u64 uuid_lo;
|
||||
|
||||
/* higher 8 bytes of uuid */
|
||||
t_u64 uuid_hi;
|
||||
} mlan_fw_info, *pmlan_fw_info;
|
||||
|
||||
/** Version string buffer length */
|
||||
#define MLAN_MAX_VER_STR_LEN 128
|
||||
|
||||
/** Maximum length of secure boot uuid */
|
||||
#define MLAN_MAX_UUID_LEN 32
|
||||
|
||||
/** mlan_ver_ext data structure for MLAN_OID_GET_VER_EXT */
|
||||
typedef struct _mlan_ver_ext {
|
||||
/** Selected version string */
|
||||
|
@ -2009,7 +2020,7 @@ typedef struct _mlan_bss_info {
|
|||
/** Channel */
|
||||
t_u32 bss_chan;
|
||||
/** Band */
|
||||
t_u8 bss_band;
|
||||
t_u16 bss_band;
|
||||
/** Region code */
|
||||
t_u32 region_code;
|
||||
/** Connection status */
|
||||
|
@ -2201,6 +2212,8 @@ typedef struct _mlan_debug_info {
|
|||
t_u32 bypass_pkt_count;
|
||||
/** Corresponds to scan_processing member of mlan_adapter */
|
||||
t_u32 scan_processing;
|
||||
/** Corresponds to scan_state member of mlan_adapter */
|
||||
t_u32 scan_state;
|
||||
/** Corresponds to mlan_processing member of mlan_adapter */
|
||||
t_u32 mlan_processing;
|
||||
/** Corresponds to main_lock_flag member of mlan_adapter */
|
||||
|
@ -4434,6 +4447,9 @@ typedef struct _mlan_ds_misc_cck_desense_cfg {
|
|||
#define MLAN_IPADDR_OP_ARP_FILTER MBIT(0)
|
||||
/** IP operation ARP response */
|
||||
#define MLAN_IPADDR_OP_AUTO_ARP_RESP MBIT(1)
|
||||
/** Enable opcode bit for MDNS & NS when device enter into suspend **/
|
||||
#define MLAN_OP_ADD_MDNS MBIT(2)
|
||||
#define MLAN_OP_ADD_IPV6_NS MBIT(3)
|
||||
|
||||
/** Type definition of mlan_ds_misc_ipaddr_cfg for MLAN_OID_MISC_IP_ADDR */
|
||||
typedef struct _mlan_ds_misc_ipaddr_cfg {
|
||||
|
@ -5501,10 +5517,23 @@ typedef struct _mlan_ds_mc_aggr_cfg {
|
|||
/** CTS2Self duration offset */
|
||||
t_u16 cts2self_offset;
|
||||
} mlan_ds_mc_aggr_cfg;
|
||||
|
||||
/** mlan_ds_stats */
|
||||
typedef struct _mlan_ds_stats {
|
||||
/** action */
|
||||
t_u16 action;
|
||||
/** tlv len */
|
||||
t_u16 tlv_len;
|
||||
/** TLV buffer */
|
||||
t_u8 tlv_buf[1];
|
||||
} mlan_ds_stats;
|
||||
|
||||
typedef struct _mlan_ds_ch_load {
|
||||
/** action */
|
||||
t_u8 action;
|
||||
t_u16 ch_load_param;
|
||||
t_s16 noise;
|
||||
t_u16 duration;
|
||||
} mlan_ds_ch_load;
|
||||
|
||||
/** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */
|
||||
|
@ -5649,6 +5678,7 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_tp_state tp_state;
|
||||
mlan_ds_hal_phy_cfg_params hal_phy_cfg_params;
|
||||
mlan_ds_mc_aggr_cfg mc_aggr_cfg;
|
||||
mlan_ds_stats stats;
|
||||
#ifdef UAP_SUPPORT
|
||||
t_u8 wacp_mode;
|
||||
#endif
|
||||
|
|
|
@ -1037,7 +1037,6 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
|
|||
|
||||
pchan_tlv->chan_scan_param[0].bandcfg.chanBand =
|
||||
wlan_band_to_radio_type(pbss_desc->bss_band);
|
||||
|
||||
PRINTM(MINFO, "Assoc: TLV Bandcfg = %x\n",
|
||||
pchan_tlv->chan_scan_param[0].bandcfg);
|
||||
pos += sizeof(pchan_tlv->header) + sizeof(ChanScanParamSet_t);
|
||||
|
@ -1218,8 +1217,7 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
|
|||
wlan_11ax_bandconfig_allowed(pmpriv, pbss_desc))
|
||||
wlan_cmd_append_11ax_tlv(pmpriv, pbss_desc, &pos);
|
||||
|
||||
wlan_wmm_process_association_req(pmpriv, &pos, &pbss_desc->wmm_ie,
|
||||
pbss_desc->pht_cap);
|
||||
wlan_wmm_process_association_req(pmpriv, &pos, &pbss_desc->wmm_ie);
|
||||
if (pmpriv->sec_info.wapi_enabled && pmpriv->wapi_ie_len)
|
||||
wlan_cmd_append_wapi_ie(pmpriv, &pos);
|
||||
|
||||
|
@ -1489,7 +1487,7 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
|
|||
pmpriv->curr_bss_params.bss_descriptor.channel =
|
||||
pbss_desc->phy_param_set.ds_param_set.current_chan;
|
||||
|
||||
pmpriv->curr_bss_params.band = (t_u8)pbss_desc->bss_band;
|
||||
pmpriv->curr_bss_params.band = pbss_desc->bss_band;
|
||||
|
||||
/* Store current channel for further reference.
|
||||
* This would save one extra call to get current
|
||||
|
@ -1498,7 +1496,7 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
|
|||
pmpriv->adapter->dfsr_channel =
|
||||
pmpriv->curr_bss_params.bss_descriptor.channel;
|
||||
|
||||
/*
|
||||
/*`
|
||||
* Adjust the timestamps in the scan table to be relative to the newly
|
||||
* associated AP's TSF
|
||||
*/
|
||||
|
@ -1509,10 +1507,7 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
|
|||
else
|
||||
pmpriv->curr_bss_params.wmm_enabled = MFALSE;
|
||||
|
||||
if ((pmpriv->wmm_required ||
|
||||
(pbss_desc->pht_cap &&
|
||||
(pbss_desc->pht_cap->ieee_hdr.element_id == HT_CAPABILITY))) &&
|
||||
pmpriv->curr_bss_params.wmm_enabled)
|
||||
if (pmpriv->wmm_required && pmpriv->curr_bss_params.wmm_enabled)
|
||||
pmpriv->wmm_enabled = MTRUE;
|
||||
else
|
||||
pmpriv->wmm_enabled = MFALSE;
|
||||
|
@ -1605,8 +1600,6 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
|
|||
|
||||
wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_CONNECTED, pevent);
|
||||
|
||||
/* Send OBSS scan param to the application if available */
|
||||
wlan_2040_coex_event(pmpriv);
|
||||
wlan_coex_ampdu_rxwinsize(pmpriv->adapter);
|
||||
|
||||
if (!pmpriv->sec_info.wpa_enabled && !pmpriv->sec_info.wpa2_enabled &&
|
||||
|
@ -2006,6 +1999,7 @@ mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
|
|||
t_u32 i, rates_size = 0;
|
||||
t_u32 curr_pkt_filter;
|
||||
t_u8 *pos = (t_u8 *)padhoc_join + sizeof(HostCmd_DS_802_11_AD_HOC_JOIN);
|
||||
t_s32 append_size_11h = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -2098,7 +2092,7 @@ mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
|
|||
|
||||
/* Copy the channel information */
|
||||
pmpriv->curr_bss_params.bss_descriptor.channel = pbss_desc->channel;
|
||||
pmpriv->curr_bss_params.band = (t_u8)pbss_desc->bss_band;
|
||||
pmpriv->curr_bss_params.band = pbss_desc->bss_band;
|
||||
|
||||
if (pmpriv->sec_info.wep_status == Wlan802_11WEPEnabled ||
|
||||
pmpriv->sec_info.wpa_enabled || pmpriv->sec_info.ewpa_enabled)
|
||||
|
@ -2144,10 +2138,17 @@ mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
|
|||
* adhoc/infra 11h behavior can be properly triggered.
|
||||
* pos modified if data is appended
|
||||
*/
|
||||
cmd_append_size += wlan_11h_process_join(
|
||||
pmpriv, &pos, &padhoc_join->bss_descriptor.cap,
|
||||
(t_u8)pbss_desc->bss_band, pbss_desc->channel,
|
||||
&pbss_desc->wlan_11h_bss_info);
|
||||
append_size_11h +=
|
||||
wlan_11h_process_join(pmpriv, &pos,
|
||||
&padhoc_join->bss_descriptor.cap,
|
||||
pbss_desc->bss_band, pbss_desc->channel,
|
||||
&pbss_desc->wlan_11h_bss_info);
|
||||
if (append_size_11h >= 0)
|
||||
cmd_append_size += append_size_11h;
|
||||
else {
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (pmpriv->sec_info.wpa_enabled) {
|
||||
prsn_ie_tlv = (MrvlIEtypes_RsnParamSet_t *)pos;
|
||||
|
|
|
@ -1316,6 +1316,10 @@ typedef struct _mlan_private {
|
|||
t_u32 amsdu_tx_cnt;
|
||||
/** tx msdu count in amsdu*/
|
||||
t_u32 msdu_in_tx_amsdu_cnt;
|
||||
/** channel load info for current channel */
|
||||
t_u16 ch_load_param;
|
||||
/** Noise floor value for current channel */
|
||||
t_s16 noise;
|
||||
} mlan_private, *pmlan_private;
|
||||
|
||||
typedef struct _assoc_logger {
|
||||
|
@ -1808,7 +1812,7 @@ typedef struct _mef_entry {
|
|||
int num_wowlan_entry;
|
||||
/** Num for IPv6 neighbor solicitation message offload */
|
||||
int num_ipv6_ns_offload;
|
||||
|
||||
int clear_mef_entry;
|
||||
/** criteria*/
|
||||
t_u32 criteria;
|
||||
/** MEF CFG Array to store etted_entry_bitmap;
|
||||
|
@ -1875,11 +1879,14 @@ typedef struct _mlan_init_para {
|
|||
t_u8 uap_max_sta;
|
||||
/** dfs w53 cfg */
|
||||
t_u8 dfs53cfg;
|
||||
/** dfs_offload */
|
||||
t_u8 dfs_offload;
|
||||
#ifdef PCIE
|
||||
/** adma ring size */
|
||||
t_u16 ring_size;
|
||||
#endif
|
||||
t_u8 ext_scan;
|
||||
t_u8 mcs32;
|
||||
} mlan_init_para, *pmlan_init_para;
|
||||
|
||||
#ifdef SDIO
|
||||
|
@ -2448,6 +2455,8 @@ struct _mlan_adapter {
|
|||
pmlan_private pending_disconnect_priv;
|
||||
/** mlan_processing */
|
||||
t_u32 scan_processing;
|
||||
/** scan state */
|
||||
t_u32 scan_state;
|
||||
/** firmware support for roaming*/
|
||||
t_u8 fw_roaming;
|
||||
/** User set passphrase*/
|
||||
|
@ -2778,6 +2787,11 @@ struct _mlan_adapter {
|
|||
t_u32 tp_state_on;
|
||||
/** Packet drop point */
|
||||
t_u32 tp_state_drop_point;
|
||||
/* lower 8 bytes of uuid */
|
||||
t_u64 uuid_lo;
|
||||
|
||||
/* higher 8 bytes of uuid */
|
||||
t_u64 uuid_hi;
|
||||
};
|
||||
|
||||
/** Check if stream 2X2 enabled */
|
||||
|
@ -2881,7 +2895,7 @@ mlan_status wlan_misc_ioctl_init_shutdown(pmlan_adapter pmadapter,
|
|||
mlan_status wlan_get_info_debug_info(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
|
||||
#if defined(STA_SUPPORT) && defined(UAP_SUPPORT)
|
||||
#if defined(STA_SUPPORT) || defined(UAP_SUPPORT)
|
||||
extern pmlan_operations mlan_ops[];
|
||||
/** Set/Get BSS role */
|
||||
mlan_status wlan_bss_ioctl_bss_role(pmlan_adapter pmadapter,
|
||||
|
@ -3315,6 +3329,7 @@ mlan_status wlan_cmd_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
|
|||
mlan_status wlan_ret_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
t_void *pioctl_buf);
|
||||
|
||||
t_u8 wlan_get_ext_scan_state(HostCmd_DS_COMMAND *pcmd);
|
||||
/** Extended scan command handler */
|
||||
mlan_status wlan_cmd_802_11_scan_ext(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *pcmd,
|
||||
|
@ -3971,6 +3986,8 @@ mlan_status wlan_misc_ioctl_mc_aggr_cfg(pmlan_adapter pmadapter,
|
|||
mlan_ioctl_req *pioctl_req);
|
||||
mlan_status wlan_misc_ioctl_ch_load(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req);
|
||||
mlan_status wlan_misc_ioctl_ch_load_results(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req);
|
||||
mlan_status wlan_cmd_get_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf);
|
||||
mlan_status wlan_ret_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
|
|
|
@ -450,6 +450,7 @@ mlan_status wlan_get_info_debug_info(pmlan_adapter pmadapter,
|
|||
debug_info->port_open = pmpriv->port_open;
|
||||
debug_info->bypass_pkt_count = pmadapter->bypass_pkt_count;
|
||||
debug_info->scan_processing = pmadapter->scan_processing;
|
||||
debug_info->scan_state = pmadapter->scan_state;
|
||||
debug_info->mlan_processing = pmadapter->mlan_processing;
|
||||
debug_info->main_lock_flag = pmadapter->main_lock_flag;
|
||||
debug_info->main_process_cnt = pmadapter->main_process_cnt;
|
||||
|
@ -2421,7 +2422,8 @@ mlan_status wlan_misc_ioctl_tdls_oper(pmlan_adapter pmadapter,
|
|||
sta_ptr->max_amsdu =
|
||||
MLAN_TX_DATA_BUF_SIZE_4K;
|
||||
for (i = 0; i < MAX_NUM_TID; i++) {
|
||||
if (sta_ptr->is_11n_enabled)
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled)
|
||||
sta_ptr->ampdu_sta[i] =
|
||||
pmpriv->aggr_prio_tbl[i]
|
||||
.ampdu_user;
|
||||
|
@ -2474,7 +2476,8 @@ mlan_status wlan_misc_ioctl_tdls_oper(pmlan_adapter pmadapter,
|
|||
wlan_restore_tdls_packets(pmpriv,
|
||||
ptdls_oper->peer_mac,
|
||||
TDLS_TEAR_DOWN);
|
||||
if (sta_ptr->is_11n_enabled) {
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled) {
|
||||
wlan_cleanup_reorder_tbl(
|
||||
pmpriv, ptdls_oper->peer_mac);
|
||||
wlan_11n_cleanup_txbastream_tbl(
|
||||
|
@ -3977,7 +3980,8 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
|
|||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
IS_CARD9097(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type)) {
|
||||
ant_cfg->tx_antenna &= 0x0303;
|
||||
ant_cfg->rx_antenna &= 0x0303;
|
||||
/** 2G antcfg TX */
|
||||
|
@ -5552,32 +5556,35 @@ mlan_status wlan_process_mef_cfg_cmd(mlan_private *pmpriv,
|
|||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
pmlan_callbacks pcb;
|
||||
mef_cfg_data mef;
|
||||
mef_entry_t *pentry;
|
||||
mef_entry_t *pentry = MNULL;
|
||||
mef_entry *pmef;
|
||||
t_u16 entry_num = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
pcb = &pmadapter->callbacks;
|
||||
memset(pmadapter, &mef, 0, sizeof(mef_cfg_data));
|
||||
|
||||
/** check how many entries in adapter*/
|
||||
pmef = &pmadapter->entry_cfg;
|
||||
entry_num += pmef->enable_autoarp_entry;
|
||||
entry_num += pmef->num_wowlan_entry;
|
||||
entry_num += pmef->num_ipv6_ns_offload;
|
||||
if (!entry_num) {
|
||||
if (!entry_num && !pmef->clear_mef_entry) {
|
||||
PRINTM(MIOCTL, "No filter entries\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = pcb->moal_malloc(pmadapter->pmoal_handle,
|
||||
sizeof(mef_entry_t) * entry_num, MLAN_MEM_DEF,
|
||||
(t_u8 **)&mef.pentry);
|
||||
if (ret != MLAN_STATUS_SUCCESS || mef.pentry == MNULL) {
|
||||
PRINTM(MERROR, "Failed to allocate cmd data buffer\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto err_handle;
|
||||
if (entry_num) {
|
||||
ret = pcb->moal_malloc(pmadapter->pmoal_handle,
|
||||
sizeof(mef_entry_t) * entry_num,
|
||||
MLAN_MEM_DEF, (t_u8 **)&mef.pentry);
|
||||
if (ret != MLAN_STATUS_SUCCESS || mef.pentry == MNULL) {
|
||||
PRINTM(MERROR, "Failed to allocate cmd data buffer\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto err_handle;
|
||||
}
|
||||
}
|
||||
|
||||
/** Fill mef_cfg structure*/
|
||||
mef.criteria = pmef->criteria;
|
||||
mef.entry_num = entry_num;
|
||||
|
@ -5666,11 +5673,25 @@ mlan_status wlan_misc_ioctl_mef_flt_cfg(pmlan_adapter pmadapter,
|
|||
pmadapter))
|
||||
PRINTM(MERROR,
|
||||
"Set MEF Entries Error\n");
|
||||
} else if (mef_cfg->op_code &
|
||||
MLAN_IPADDR_OP_IP_REMOVE) {
|
||||
} else if (!(mef_cfg->op_code &
|
||||
MLAN_IPADDR_OP_IP_REMOVE)) {
|
||||
pmef->enable_autoarp_entry = 0;
|
||||
pmef->num_wowlan_entry = 0;
|
||||
pmef->num_ipv6_ns_offload = 0;
|
||||
pmef->clear_mef_entry = 1;
|
||||
memset(pmadapter, &pmef->entry[5], 0,
|
||||
sizeof(mef_entry_t));
|
||||
memset(pmadapter, &pmef->entry[6], 0,
|
||||
sizeof(mef_entry_t));
|
||||
memset(pmadapter, &pmef->entry[7], 0,
|
||||
sizeof(mef_entry_t));
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
wlan_process_mef_cfg_cmd(
|
||||
pmadapter
|
||||
->priv[pioctl_req->bss_index],
|
||||
pmadapter))
|
||||
PRINTM(MERROR,
|
||||
"Clear MEF Entries Error\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -6070,6 +6091,40 @@ mlan_status wlan_misc_ioctl_mc_aggr_cfg(pmlan_adapter pmadapter,
|
|||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
/**
|
||||
* @brief get channel load results
|
||||
*
|
||||
* @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_ch_load_results(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = MNULL;
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_ds_misc_cfg *misc = MNULL;
|
||||
|
||||
ENTER();
|
||||
if (pioctl_req == MNULL)
|
||||
return MLAN_STATUS_FAILURE;
|
||||
pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
cmd_action = pioctl_req->action;
|
||||
|
||||
/* Send request to firmware */
|
||||
if (pmpriv->ch_load_param == 255) {
|
||||
return MLAN_STATUS_FAILURE;
|
||||
} else {
|
||||
misc->param.ch_load.ch_load_param = pmpriv->ch_load_param;
|
||||
misc->param.ch_load.noise = pmpriv->noise;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get channel load
|
||||
|
@ -6082,17 +6137,21 @@ mlan_status wlan_misc_ioctl_mc_aggr_cfg(pmlan_adapter pmadapter,
|
|||
mlan_status wlan_misc_ioctl_ch_load(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_private *pmpriv = MNULL;
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_ds_misc_cfg *misc = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_req == MNULL)
|
||||
return MLAN_STATUS_FAILURE;
|
||||
pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
cmd_action = pioctl_req->action;
|
||||
|
||||
/* Send request to firmware */
|
||||
pmpriv->ch_load_param = 255; /* Default value for identifying
|
||||
update/non-updated value*/
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_GET_CH_LOAD, cmd_action, 0,
|
||||
(t_void *)pioctl_req,
|
||||
(t_void *)&misc->param.ch_load);
|
||||
|
|
|
@ -1036,7 +1036,9 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf,
|
|||
wlan_cpu_to_le16(pvht_cap->header.len);
|
||||
}
|
||||
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter)) {
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter) &&
|
||||
((pmpriv->config_bands & BAND_GAX) ||
|
||||
(pmpriv->config_bands & BAND_AAX))) {
|
||||
phe_cap = (MrvlIEtypes_Extension_t *)ptlv_pos;
|
||||
len = wlan_fill_he_cap_tlv(pmpriv, pmpriv->config_bands,
|
||||
phe_cap, MFALSE);
|
||||
|
@ -4227,6 +4229,7 @@ mlan_status wlan_scan_networks(mlan_private *pmpriv, t_void *pioctl_buf,
|
|||
&pmadapter->scan_pending_q, MNULL, MNULL);
|
||||
pmadapter->pscan_ioctl_req = pioctl_req;
|
||||
pmadapter->scan_processing = MTRUE;
|
||||
pmadapter->scan_state = SCAN_STATE_SCAN_START;
|
||||
wlan_insert_cmd_to_pending_q(pmadapter, pcmd_node,
|
||||
MTRUE);
|
||||
}
|
||||
|
@ -4843,6 +4846,26 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get ext_scan state from ext_scan_type
|
||||
*
|
||||
*
|
||||
* @param pcmd A pointer to HostCmd_DS_COMMAND structure to be sent to
|
||||
* firmware with the HostCmd_DS_802_11_SCAN_EXT structure
|
||||
*
|
||||
* @return
|
||||
* SCAN_STATE_EXT_SCAN_ENH/SCAN_STATE_EXT_SCAN_CANCEL/SCAN_STATE_EXT_SCAN_ENH
|
||||
*/
|
||||
t_u8 wlan_get_ext_scan_state(HostCmd_DS_COMMAND *pcmd)
|
||||
{
|
||||
HostCmd_DS_802_11_SCAN_EXT *pext_scan_cmd = &pcmd->params.ext_scan;
|
||||
if (pext_scan_cmd->ext_scan_type == EXT_SCAN_ENHANCE)
|
||||
return SCAN_STATE_EXT_SCAN_ENH;
|
||||
if (pext_scan_cmd->ext_scan_type == EXT_SCAN_CANCEL)
|
||||
return SCAN_STATE_EXT_SCAN_CANCEL;
|
||||
return SCAN_STATE_EXT_SCAN;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Prepare an extended scan command to be sent to the firmware
|
||||
*
|
||||
|
@ -4932,11 +4955,13 @@ mlan_status wlan_ret_802_11_scan_ext(mlan_private *pmpriv,
|
|||
ENTER();
|
||||
|
||||
PRINTM(MINFO, "EXT scan returns successfully\n");
|
||||
pmadapter->scan_state |= wlan_get_ext_scan_state(resp);
|
||||
ext_scan_type = pext_scan_cmd->ext_scan_type;
|
||||
if (ext_scan_type == EXT_SCAN_CANCEL) {
|
||||
PRINTM(MCMND, "Cancel scan command completed!\n");
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
pmadapter->scan_processing = MFALSE;
|
||||
pmadapter->scan_state |= SCAN_STATE_SCAN_COMPLETE;
|
||||
pmadapter->ext_scan_type = EXT_SCAN_DEFAULT;
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
/* Need to indicate IOCTL complete */
|
||||
|
@ -5756,6 +5781,13 @@ mlan_status wlan_handle_event_ext_scan_report(mlan_private *pmpriv,
|
|||
|
||||
DBG_HEXDUMP(MCMD_D, "EVENT EXT_SCAN", pmbuf->pbuf + pmbuf->data_offset,
|
||||
pmbuf->data_len);
|
||||
|
||||
if (!pevent_scan->more_event)
|
||||
pmadapter->scan_state |= SCAN_STATE_EXT_SCAN_RESULT |
|
||||
SCAN_STATE_LAST_EXT_SCAN_RESULT;
|
||||
else
|
||||
pmadapter->scan_state |= SCAN_STATE_EXT_SCAN_RESULT;
|
||||
|
||||
wlan_parse_ext_scan_result(pmpriv, pevent_scan->num_of_set, ptlv,
|
||||
tlv_buf_left);
|
||||
if (!pevent_scan->more_event &&
|
||||
|
@ -5789,6 +5821,7 @@ mlan_status wlan_handle_event_ext_scan_report(mlan_private *pmpriv,
|
|||
wlan_scan_process_results(pmpriv);
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
pmadapter->scan_processing = MFALSE;
|
||||
pmadapter->scan_state |= SCAN_STATE_SCAN_COMPLETE;
|
||||
pioctl_req = pmadapter->pscan_ioctl_req;
|
||||
pmadapter->pscan_ioctl_req = MNULL;
|
||||
/* Need to indicate IOCTL complete */
|
||||
|
@ -5814,6 +5847,9 @@ mlan_status wlan_handle_event_ext_scan_report(mlan_private *pmpriv,
|
|||
wlan_flush_scan_queue(pmadapter);
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
pmadapter->scan_processing = MFALSE;
|
||||
pmadapter->scan_state |=
|
||||
SCAN_STATE_SCAN_COMPLETE;
|
||||
|
||||
pioctl_req = pmadapter->pscan_ioctl_req;
|
||||
pmadapter->pscan_ioctl_req = MNULL;
|
||||
/* Indicate IOCTL complete */
|
||||
|
@ -5874,6 +5910,7 @@ mlan_status wlan_handle_event_ext_scan_status(mlan_private *pmpriv,
|
|||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
pmadapter->scan_state |= SCAN_STATE_EXT_SCAN_STATUS;
|
||||
|
||||
scan_event =
|
||||
(pmlan_event_scan_status)(pmbuf->pbuf + pmbuf->data_offset);
|
||||
|
@ -5920,6 +5957,7 @@ done:
|
|||
wlan_flush_scan_queue(pmadapter);
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
pmadapter->scan_processing = MFALSE;
|
||||
pmadapter->scan_state |= SCAN_STATE_SCAN_COMPLETE;
|
||||
pioctl_req = pmadapter->pscan_ioctl_req;
|
||||
pmadapter->pscan_ioctl_req = MNULL;
|
||||
/* Indicate IOCTL complete */
|
||||
|
@ -5980,6 +6018,7 @@ done:
|
|||
/** Complete scan ioctl */
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
pmadapter->scan_processing = MFALSE;
|
||||
pmadapter->scan_state |= SCAN_STATE_SCAN_COMPLETE;
|
||||
pioctl_req = pmadapter->pscan_ioctl_req;
|
||||
pmadapter->pscan_ioctl_req = MNULL;
|
||||
/* Need to indicate IOCTL complete */
|
||||
|
@ -6435,7 +6474,9 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv,
|
|||
pvht_cap->header.len = wlan_cpu_to_le16(pvht_cap->header.len);
|
||||
}
|
||||
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter)) {
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter) &&
|
||||
((pmpriv->config_bands & BAND_GAX) ||
|
||||
(pmpriv->config_bands & BAND_AAX))) {
|
||||
phe_cap = (MrvlIEtypes_Extension_t *)tlv;
|
||||
len = wlan_fill_he_cap_tlv(pmpriv, pmpriv->config_bands,
|
||||
phe_cap, MFALSE);
|
||||
|
|
|
@ -2168,7 +2168,7 @@ static mlan_status wlan_sdio_check_fw_status(mlan_adapter *pmadapter,
|
|||
ret = MLAN_STATUS_SUCCESS;
|
||||
break;
|
||||
} else {
|
||||
wlan_mdelay(pmadapter, 100);
|
||||
wlan_mdelay(pmadapter, 10);
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -369,6 +369,7 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter)
|
|||
pmadapter->card_type = pmdevice->card_type;
|
||||
pmadapter->card_rev = pmdevice->card_rev;
|
||||
pmadapter->init_para.uap_max_sta = pmdevice->uap_max_sta;
|
||||
pmadapter->init_para.mcs32 = pmdevice->mcs32;
|
||||
|
||||
#ifdef SDIO
|
||||
if (IS_SD(pmadapter->card_type)) {
|
||||
|
@ -500,6 +501,7 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter)
|
|||
}
|
||||
#endif
|
||||
pmadapter->init_para.dfs53cfg = pmdevice->dfs53cfg;
|
||||
pmadapter->init_para.dfs_offload = pmdevice->dfs_offload;
|
||||
pmadapter->priv_num = 0;
|
||||
pmadapter->priv[0] = MNULL;
|
||||
|
||||
|
|
|
@ -110,7 +110,8 @@ wlan_process_cmdreps_error_tdls_operation(mlan_private *pmpriv,
|
|||
if (ISSUPP_EXTCAP_TDLS_CHAN_SWITCH(
|
||||
sta_ptr->ExtCap.ext_cap))
|
||||
wlan_tdls_config(pmpriv, MFALSE);
|
||||
if (sta_ptr->is_11n_enabled) {
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled) {
|
||||
wlan_cleanup_reorder_tbl(
|
||||
pmpriv, ptdls_oper_data->peer_mac);
|
||||
wlan_11n_cleanup_txbastream_tbl(
|
||||
|
@ -1847,7 +1848,8 @@ static mlan_status wlan_ret_tdls_config(pmlan_private pmpriv,
|
|||
sta_ptr = wlan_get_station_entry(
|
||||
pmpriv, tdls_all_cfg->u.tdls_tear_down.peer_mac_addr);
|
||||
if (sta_ptr) {
|
||||
if (sta_ptr->is_11n_enabled) {
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled) {
|
||||
wlan_cleanup_reorder_tbl(
|
||||
pmpriv, tdls_all_cfg->u.tdls_tear_down
|
||||
.peer_mac_addr);
|
||||
|
@ -2019,7 +2021,8 @@ static mlan_status wlan_ret_tdls_oper(pmlan_private pmpriv,
|
|||
if (ISSUPP_EXTCAP_TDLS_CHAN_SWITCH(
|
||||
sta_ptr->ExtCap.ext_cap))
|
||||
wlan_tdls_config(pmpriv, MFALSE);
|
||||
if (sta_ptr->is_11n_enabled) {
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled) {
|
||||
wlan_cleanup_reorder_tbl(pmpriv,
|
||||
ptdls_oper->peer_mac);
|
||||
wlan_11n_cleanup_txbastream_tbl(
|
||||
|
|
|
@ -148,7 +148,8 @@ static void wlan_parse_tdls_event(pmlan_private priv, pmlan_buffer pevent)
|
|||
}
|
||||
}
|
||||
for (i = 0; i < MAX_NUM_TID; i++) {
|
||||
if (sta_ptr->is_11n_enabled)
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled)
|
||||
sta_ptr->ampdu_sta[i] =
|
||||
priv->aggr_prio_tbl[i]
|
||||
.ampdu_user;
|
||||
|
@ -221,7 +222,8 @@ static void wlan_parse_tdls_event(pmlan_private priv, pmlan_buffer pevent)
|
|||
wlan_restore_tdls_packets(priv,
|
||||
tdls_event->peer_mac_addr,
|
||||
TDLS_TEAR_DOWN);
|
||||
if (sta_ptr->is_11n_enabled) {
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled) {
|
||||
wlan_cleanup_reorder_tbl(
|
||||
priv, tdls_event->peer_mac_addr);
|
||||
wlan_11n_cleanup_txbastream_tbl(
|
||||
|
@ -807,8 +809,8 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
|
|||
MRVDRV_TxPD_POWER_MGMT_NULL_PACKET |
|
||||
MRVDRV_TxPD_POWER_MGMT_LAST_PACKET) ==
|
||||
MLAN_STATUS_SUCCESS) {
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
ret = MLAN_STATUS_SUCCESS;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -885,6 +887,8 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
|
|||
}
|
||||
pmadapter->scan_block = MFALSE;
|
||||
wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_PORT_RELEASE, MNULL);
|
||||
/* Send OBSS scan param to the application */
|
||||
wlan_2040_coex_event(pmpriv);
|
||||
break;
|
||||
|
||||
case EVENT_STOP_TX:
|
||||
|
|
|
@ -304,7 +304,7 @@ static mlan_status wlan_get_info_bss_info(pmlan_adapter pmadapter,
|
|||
info->param.bss_info.beacon_interval = pbss_desc->beacon_period;
|
||||
|
||||
/* Band */
|
||||
info->param.bss_info.bss_band = (t_u8)pbss_desc->bss_band;
|
||||
info->param.bss_info.bss_band = pbss_desc->bss_band;
|
||||
|
||||
/* Region code */
|
||||
info->param.bss_info.region_code = pmadapter->region_code;
|
||||
|
@ -455,6 +455,8 @@ static mlan_status wlan_get_info_ioctl(pmlan_adapter pmadapter,
|
|||
pmpriv->usr_dot_11ac_mcs_support;
|
||||
pget_info->param.fw_info.usr_dot_11ac_dev_cap_a =
|
||||
pmpriv->usr_dot_11ac_dev_cap_a;
|
||||
pget_info->param.fw_info.uuid_lo = pmadapter->uuid_lo;
|
||||
pget_info->param.fw_info.uuid_hi = pmadapter->uuid_hi;
|
||||
pget_info->param.fw_info.hw_hecap_len = pmadapter->hw_hecap_len;
|
||||
pget_info->param.fw_info.hw_2g_hecap_len =
|
||||
pmadapter->hw_2g_hecap_len;
|
||||
|
@ -5336,6 +5338,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
|
|||
case MLAN_OID_MISC_CH_LOAD:
|
||||
status = wlan_misc_ioctl_ch_load(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_CH_LOAD_RESULTS:
|
||||
status = wlan_misc_ioctl_ch_load_results(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_GET_TSF:
|
||||
status = wlan_misc_ioctl_get_tsf(pmadapter, pioctl_req);
|
||||
break;
|
||||
|
|
|
@ -42,6 +42,7 @@ Change log:
|
|||
#include "mlan_main.h"
|
||||
#include "mlan_11n_aggr.h"
|
||||
#include "mlan_11n_rxreorder.h"
|
||||
#include "mlan_11ax.h"
|
||||
#ifdef DRV_EMBEDDED_SUPPLICANT
|
||||
#include "authenticator_api.h"
|
||||
#endif
|
||||
|
@ -314,12 +315,14 @@ void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len)
|
|||
break;
|
||||
case QOS_INFO:
|
||||
sta_ptr->qos_info = pos[2];
|
||||
sta_ptr->is_wmm_enabled = MTRUE;
|
||||
PRINTM(MDAT_D, "TDLS qos info %x\n", sta_ptr->qos_info);
|
||||
break;
|
||||
case VENDOR_SPECIFIC_221:
|
||||
pvendor_ie = (IEEEtypes_VendorHeader_t *)pos;
|
||||
if (!memcmp(priv->adapter, pvendor_ie->oui, wmm_oui,
|
||||
sizeof(wmm_oui))) {
|
||||
sta_ptr->is_wmm_enabled = MTRUE;
|
||||
sta_ptr->qos_info = pos[8]; /** qos info in wmm
|
||||
parameters in
|
||||
response and
|
||||
|
@ -812,7 +815,8 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf)
|
|||
prx_pd->nf);
|
||||
}
|
||||
}
|
||||
if (!sta_ptr || !sta_ptr->is_11n_enabled) {
|
||||
if (!sta_ptr || (!sta_ptr->is_11n_enabled &&
|
||||
!sta_ptr->is_11ax_enabled)) {
|
||||
wlan_process_rx_packet(pmadapter, pmbuf);
|
||||
goto done;
|
||||
}
|
||||
|
|
|
@ -2505,6 +2505,8 @@ static mlan_status wlan_uap_ret_sys_config(pmlan_private pmpriv,
|
|||
MrvlIEtypes_uap_max_sta_cnt_t *tlv_uap_max_sta = MNULL;
|
||||
|
||||
ENTER();
|
||||
sys_config->action = wlan_le16_to_cpu(sys_config->action);
|
||||
|
||||
if (pioctl_buf) {
|
||||
if (pioctl_buf->req_id == MLAN_IOCTL_BSS) {
|
||||
bss = (mlan_ds_bss *)pioctl_buf->pbuf;
|
||||
|
@ -2801,8 +2803,11 @@ static mlan_status wlan_uap_ret_sys_config(pmlan_private pmpriv,
|
|||
} else { /* no ioctl: driver generated get/set */
|
||||
switch (wlan_le16_to_cpu(tlv->header.type)) {
|
||||
case TLV_TYPE_UAP_MAC_ADDRESS:
|
||||
memcpy_ext(pmpriv->adapter, pmpriv->curr_addr, tlv->mac,
|
||||
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
|
||||
if (sys_config->action == HostCmd_ACT_GEN_SET) {
|
||||
memcpy_ext(pmpriv->adapter, pmpriv->curr_addr,
|
||||
tlv->mac, MLAN_MAC_ADDR_LENGTH,
|
||||
MLAN_MAC_ADDR_LENGTH);
|
||||
}
|
||||
break;
|
||||
case TLV_TYPE_UAP_MAX_STA_CNT_PER_CHIP:
|
||||
tlv_uap_max_sta = (MrvlIEtypes_uap_max_sta_cnt_t *)tlv;
|
||||
|
@ -2959,6 +2964,12 @@ static mlan_status wlan_uap_cmd_snmp_mib(pmlan_private pmpriv,
|
|||
psnmp_mib->oid = wlan_cpu_to_le16((t_u16)cmd_oid);
|
||||
psnmp_mib->buf_size = 0;
|
||||
break;
|
||||
case ChanTrackParam_i:
|
||||
psnmp_mib->oid = wlan_cpu_to_le16((t_u16)cmd_oid);
|
||||
psnmp_mib->buf_size = wlan_cpu_to_le16(sizeof(t_u8));
|
||||
psnmp_mib->value[0] = *((t_u8 *)pdata_buf);
|
||||
cmd->size += sizeof(t_u8);
|
||||
break;
|
||||
default:
|
||||
PRINTM(MERROR, "Unsupported OID.\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
|
@ -4426,7 +4437,7 @@ static mlan_status wlan_uap_cmd_add_station(pmlan_private pmpriv,
|
|||
}
|
||||
|
||||
for (i = 0; i < MAX_NUM_TID; i++) {
|
||||
if (sta_ptr->is_11n_enabled)
|
||||
if (sta_ptr->is_11n_enabled || sta_ptr->is_11ax_enabled)
|
||||
sta_ptr->ampdu_sta[i] =
|
||||
pmpriv->aggr_prio_tbl[i].ampdu_user;
|
||||
else
|
||||
|
@ -4440,6 +4451,81 @@ done:
|
|||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of per peer stats
|
||||
*
|
||||
* @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
|
||||
*/
|
||||
static mlan_status wlan_cmd_stats(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf)
|
||||
{
|
||||
HostCmd_DS_STATS *stats_cmd = (HostCmd_DS_STATS *)&cmd->params.stats;
|
||||
Stats_Cfg_Params_TLV_t *cfg_param = MNULL;
|
||||
mlan_ds_stats *stats = (mlan_ds_stats *)pdata_buf;
|
||||
Stats_Cfg_Params_TLV_t *stats_param = MNULL;
|
||||
|
||||
ENTER();
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_STATS);
|
||||
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_STATS) + S_DS_GEN);
|
||||
if (cmd_action) {
|
||||
cmd->size =
|
||||
wlan_cpu_to_le16(sizeof(HostCmd_DS_STATS) + S_DS_GEN +
|
||||
sizeof(Stats_Cfg_Params_TLV_t) - 1);
|
||||
stats_cmd->action = wlan_cpu_to_le16(HostCmd_ACT_GEN_SET);
|
||||
|
||||
stats_param = (Stats_Cfg_Params_TLV_t *)stats->tlv_buf;
|
||||
if (stats_param->tlvHeader.type ==
|
||||
NXP_802_11_PER_PEER_STATS_CFG_TLV_ID) {
|
||||
cfg_param =
|
||||
(Stats_Cfg_Params_TLV_t *)stats_cmd->tlv_buffer;
|
||||
*cfg_param = *stats_param;
|
||||
}
|
||||
} else {
|
||||
cmd->size =
|
||||
wlan_cpu_to_le16(sizeof(HostCmd_DS_STATS) + S_DS_GEN);
|
||||
stats_cmd->action = wlan_cpu_to_le16(HostCmd_ACT_GEN_GET);
|
||||
}
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of stats
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||
* @param pioctl_buf A pointer to mlan_ioctl_req structure
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
static mlan_status wlan_ret_stats(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
HostCmd_DS_STATS *cfg_cmd = (HostCmd_DS_STATS *)&resp->params.stats;
|
||||
mlan_ds_misc_cfg *misc_cfg = MNULL;
|
||||
t_u8 *pBuf = (t_u8 *)&cfg_cmd->tlv_buffer;
|
||||
int len = resp->size;
|
||||
|
||||
ENTER();
|
||||
if (pioctl_buf) {
|
||||
misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
len -= (S_DS_GEN + sizeof(t_u16));
|
||||
memcpy_ext(pmpriv->adapter,
|
||||
(t_u8 *)&misc_cfg->param.stats.tlv_buf, pBuf, len,
|
||||
len);
|
||||
misc_cfg->param.stats.tlv_len = len;
|
||||
pioctl_buf->buf_len = sizeof(mlan_ds_stats) + len - 1;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
Global Functions
|
||||
********************************************************/
|
||||
|
@ -4825,6 +4911,9 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
ret = wlan_cmd_mc_aggr_cfg(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_802_11_STATS:
|
||||
ret = wlan_cmd_stats(pmpriv, cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_GET_CH_LOAD:
|
||||
ret = wlan_cmd_get_ch_load(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
|
@ -5219,6 +5308,9 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
case HostCmd_CMD_MC_AGGR_CFG:
|
||||
ret = wlan_ret_mc_aggr_cfg(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_802_11_STATS:
|
||||
ret = wlan_ret_stats(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_GET_CH_LOAD:
|
||||
ret = wlan_ret_ch_load(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
|
@ -5311,6 +5403,22 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
|
|||
MNULL);
|
||||
}
|
||||
#endif
|
||||
if (wlan_11h_radar_detect_required(pmpriv,
|
||||
pmpriv->uap_channel)) {
|
||||
if (!wlan_11h_is_active(pmpriv)) {
|
||||
/* active 11h extention in Fw */
|
||||
ret = wlan_11h_activate(pmpriv, MNULL, MTRUE);
|
||||
ret = wlan_11h_config_master_radar_det(pmpriv,
|
||||
MTRUE);
|
||||
ret = wlan_11h_check_update_radar_det_state(
|
||||
pmpriv);
|
||||
}
|
||||
if (pmpriv->uap_host_based &&
|
||||
!pmpriv->adapter->init_para.dfs_offload)
|
||||
pmpriv->intf_state_11h.is_11h_host = MTRUE;
|
||||
wlan_11h_set_dfs_check_chan(pmpriv,
|
||||
pmpriv->uap_channel);
|
||||
}
|
||||
break;
|
||||
case EVENT_MICRO_AP_BSS_ACTIVE:
|
||||
PRINTM(MEVENT, "EVENT: MICRO_AP_BSS_ACTIVE\n");
|
||||
|
@ -5365,14 +5473,15 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
|
|||
MAC2STR(sta_addr));
|
||||
if (!sta_ptr)
|
||||
break;
|
||||
if (pmpriv->is_11n_enabled
|
||||
if (pmpriv->is_11n_enabled || pmpriv->is_11ax_enabled
|
||||
#ifdef DRV_EMBEDDED_AUTHENTICATOR
|
||||
|| IsAuthenticatorEnabled(pmpriv->psapriv)
|
||||
#endif
|
||||
) {
|
||||
wlan_check_sta_capability(pmpriv, pmbuf, sta_ptr);
|
||||
for (i = 0; i < MAX_NUM_TID; i++) {
|
||||
if (sta_ptr->is_11n_enabled)
|
||||
if (sta_ptr->is_11n_enabled ||
|
||||
sta_ptr->is_11ax_enabled)
|
||||
sta_ptr->ampdu_sta[i] =
|
||||
pmpriv->aggr_prio_tbl[i]
|
||||
.ampdu_user;
|
||||
|
@ -5404,10 +5513,11 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
|
|||
wlan_recv_event(pmpriv, pevent->event_id, pevent);
|
||||
memcpy_ext(pmadapter, sta_addr, pmadapter->event_body + 2,
|
||||
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
|
||||
sta_ptr = wlan_get_station_entry(pmpriv, sta_addr);
|
||||
PRINTM_NETINTF(MMSG, pmpriv);
|
||||
PRINTM(MMSG, "wlan: EVENT: MICRO_AP_STA_DEAUTH " MACSTR "\n",
|
||||
MAC2STR(sta_addr));
|
||||
if (pmpriv->is_11n_enabled) {
|
||||
if (pmpriv->is_11n_enabled || pmpriv->is_11ax_enabled) {
|
||||
wlan_cleanup_reorder_tbl(pmpriv, sta_addr);
|
||||
wlan_11n_cleanup_txbastream_tbl(pmpriv, sta_addr);
|
||||
}
|
||||
|
@ -5620,7 +5730,8 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
|
|||
ret = wlan_11h_check_update_radar_det_state(
|
||||
pmpriv);
|
||||
}
|
||||
if (pmpriv->uap_host_based)
|
||||
if (pmpriv->uap_host_based &&
|
||||
!pmpriv->adapter->init_para.dfs_offload)
|
||||
pmpriv->intf_state_11h.is_11h_host = MTRUE;
|
||||
wlan_11h_set_dfs_check_chan(pmpriv,
|
||||
pchan_info->channel);
|
||||
|
|
|
@ -1462,7 +1462,7 @@ static mlan_status wlan_uap_callback_11h_channel_check_req(t_void *priv)
|
|||
if (dfs_state == DFS_AVAILABLE) {
|
||||
wlan_11h_set_dfs_check_chan(
|
||||
pmpriv, puap_state_chan_cb->channel);
|
||||
PRINTM(MCMND, "ZERODFS: Channel %d is Avaliable\n",
|
||||
PRINTM(MCMND, "DFS: Channel %d is Avaliable\n",
|
||||
puap_state_chan_cb->channel);
|
||||
pcb->moal_ioctl_complete(pmpriv->adapter->pmoal_handle,
|
||||
pioctl, MLAN_STATUS_COMPLETE);
|
||||
|
@ -1832,6 +1832,39 @@ mlan_status wlan_uap_get_beacon_dtim(pmlan_private pmpriv)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get/Start/Stop/Reset stats
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_PENDING --success, otherwise fail
|
||||
*/
|
||||
static mlan_status wlan_misc_ioctl_stats(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_ds_misc_cfg *misc = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
cmd_action = pioctl_req->action;
|
||||
|
||||
/* Send request to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_STATS, cmd_action, 0,
|
||||
(t_void *)pioctl_req,
|
||||
(t_void *)&misc->param.stats);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set/Get deauth control.
|
||||
*
|
||||
|
@ -1869,6 +1902,43 @@ static mlan_status wlan_uap_snmp_mib_ctrl_deauth(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set/Get channel tracking control.
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_PENDING --success, otherwise fail
|
||||
*/
|
||||
static mlan_status wlan_uap_snmp_mib_chan_track(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_ds_snmp_mib *mib = (mlan_ds_snmp_mib *)pioctl_req->pbuf;
|
||||
t_u16 cmd_action = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
mib = (mlan_ds_snmp_mib *)pioctl_req->pbuf;
|
||||
if (pioctl_req->action == MLAN_ACT_SET) {
|
||||
cmd_action = HostCmd_ACT_GEN_SET;
|
||||
} else {
|
||||
cmd_action = HostCmd_ACT_GEN_GET;
|
||||
}
|
||||
|
||||
/* Send command to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_SNMP_MIB, cmd_action,
|
||||
ChanTrackParam_i, (t_void *)pioctl_req,
|
||||
&mib->param.chan_track);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief MLAN uap ioctl handler
|
||||
*
|
||||
|
@ -2065,6 +2135,8 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
pget_info->param.fw_info.antinfo = pmadapter->antinfo;
|
||||
pget_info->param.fw_info.max_ap_assoc_sta =
|
||||
pmadapter->max_sta_conn;
|
||||
pget_info->param.fw_info.uuid_lo = pmadapter->uuid_lo;
|
||||
pget_info->param.fw_info.uuid_hi = pmadapter->uuid_hi;
|
||||
} else if (pget_info->sub_command == MLAN_OID_LINK_STATS)
|
||||
status = wlan_ioctl_link_statistic(pmpriv, pioctl_req);
|
||||
break;
|
||||
|
@ -2139,8 +2211,13 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
if (misc->sub_command == MLAN_OID_MISC_MC_AGGR_CFG)
|
||||
status = wlan_misc_ioctl_mc_aggr_cfg(pmadapter,
|
||||
pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_STATS)
|
||||
status = wlan_misc_ioctl_stats(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_CH_LOAD)
|
||||
status = wlan_misc_ioctl_ch_load(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_CH_LOAD_RESULTS)
|
||||
status = wlan_misc_ioctl_ch_load_results(pmadapter,
|
||||
pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_GET_TSF)
|
||||
status = wlan_misc_ioctl_get_tsf(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_GET_CHAN_REGION_CFG)
|
||||
|
@ -2249,6 +2326,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
if (snmp->sub_command == MLAN_OID_SNMP_MIB_DOT11H_FAKERADAR)
|
||||
status = wlan_uap_snmp_mib_11h_fakeradar(pmadapter,
|
||||
pioctl_req);
|
||||
if (snmp->sub_command == MLAN_OID_SNMP_MIB_CHAN_TRACK)
|
||||
status = wlan_uap_snmp_mib_chan_track(pmadapter,
|
||||
pioctl_req);
|
||||
break;
|
||||
case MLAN_IOCTL_SEC_CFG:
|
||||
sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf;
|
||||
|
|
|
@ -481,7 +481,7 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf)
|
|||
}
|
||||
}
|
||||
/* check if UAP enable 11n */
|
||||
if (!priv->is_11n_enabled ||
|
||||
if ((!priv->is_11n_enabled && !priv->is_11ax_enabled) ||
|
||||
(!wlan_11n_get_rxreorder_tbl((mlan_private *)priv, prx_pd->priority,
|
||||
ta) &&
|
||||
(prx_pd->rx_pkt_type != PKT_TYPE_AMSDU))) {
|
||||
|
|
|
@ -43,6 +43,7 @@ Change log:
|
|||
#include "mlan_main.h"
|
||||
#include "mlan_wmm.h"
|
||||
#include "mlan_11n.h"
|
||||
#include "mlan_11ax.h"
|
||||
#ifdef SDIO
|
||||
#include "mlan_sdio.h"
|
||||
#endif /* SDIO */
|
||||
|
@ -1651,6 +1652,47 @@ void wlan_wmm_setup_ac_downgrade(pmlan_private priv)
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function checks whether a station has WMM enabled or not
|
||||
*
|
||||
* @param priv A pointer to mlan_private
|
||||
* @param mac station mac address
|
||||
* @return MTRUE or MFALSE
|
||||
*/
|
||||
static t_u8 is_station_wmm_enabled(mlan_private *priv, t_u8 *mac)
|
||||
{
|
||||
sta_node *sta_ptr = MNULL;
|
||||
sta_ptr = wlan_get_station_entry(priv, mac);
|
||||
if (sta_ptr) {
|
||||
if (sta_ptr->is_11n_enabled || sta_ptr->is_11ax_enabled)
|
||||
return MTRUE;
|
||||
}
|
||||
return MFALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function checks whether wmm is supported
|
||||
*
|
||||
* @param priv A pointer to mlan_private
|
||||
* @param ra Address of the receiver STA
|
||||
*
|
||||
* @return MTRUE or MFALSE
|
||||
*/
|
||||
static int wlan_is_wmm_enabled(mlan_private *priv, t_u8 *ra)
|
||||
{
|
||||
int ret = MFALSE;
|
||||
ENTER();
|
||||
#ifdef UAP_SUPPORT
|
||||
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
|
||||
if ((!(ra[0] & 0x01)) &&
|
||||
(priv->is_11n_enabled || priv->is_11ax_enabled))
|
||||
ret = is_station_wmm_enabled(priv, ra);
|
||||
}
|
||||
#endif /* UAP_SUPPORT */
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Allocate and add a RA list for all TIDs with the given RA
|
||||
*
|
||||
|
@ -1677,7 +1719,7 @@ void wlan_ralist_add(mlan_private *priv, t_u8 *ra)
|
|||
ra_list->ba_status = BA_STREAM_NOT_SETUP;
|
||||
ra_list->amsdu_in_ampdu = MFALSE;
|
||||
if (queuing_ra_based(priv)) {
|
||||
ra_list->is_wmm_enabled = wlan_is_11n_enabled(priv, ra);
|
||||
ra_list->is_wmm_enabled = wlan_is_wmm_enabled(priv, ra);
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu =
|
||||
get_station_max_amsdu_size(priv, ra);
|
||||
|
@ -1688,7 +1730,7 @@ void wlan_ralist_add(mlan_private *priv, t_u8 *ra)
|
|||
status = wlan_get_tdls_link_status(priv, ra);
|
||||
if (MTRUE == wlan_is_tdls_link_setup(status)) {
|
||||
ra_list->is_wmm_enabled =
|
||||
is_station_11n_enabled(priv, ra);
|
||||
is_station_wmm_enabled(priv, ra);
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu =
|
||||
get_station_max_amsdu_size(priv,
|
||||
|
@ -2018,7 +2060,7 @@ int wlan_ralist_update(mlan_private *priv, t_u8 *old_ra, t_u8 *new_ra)
|
|||
|
||||
if (queuing_ra_based(priv)) {
|
||||
ra_list->is_wmm_enabled =
|
||||
wlan_is_11n_enabled(priv, new_ra);
|
||||
wlan_is_wmm_enabled(priv, new_ra);
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu =
|
||||
get_station_max_amsdu_size(
|
||||
|
@ -2356,13 +2398,11 @@ mlan_status wlan_ret_wmm_get_status(pmlan_private priv, t_u8 *ptlv,
|
|||
* @param ppassoc_buf Output parameter: Pointer to the TLV output buffer,
|
||||
* modified on return to point after the appended WMM TLV
|
||||
* @param pwmm_ie Pointer to the WMM IE for the BSS we are joining
|
||||
* @param pht_cap Pointer to the HT IE for the BSS we are joining
|
||||
*
|
||||
* @return Length of data appended to the association tlv buffer
|
||||
*/
|
||||
t_u32 wlan_wmm_process_association_req(pmlan_private priv, t_u8 **ppassoc_buf,
|
||||
IEEEtypes_WmmParameter_t *pwmm_ie,
|
||||
IEEEtypes_HTCap_t *pht_cap)
|
||||
IEEEtypes_WmmParameter_t *pwmm_ie)
|
||||
{
|
||||
MrvlIEtypes_WmmParamSet_t *pwmm_tlv;
|
||||
t_u32 ret_len = 0;
|
||||
|
@ -2387,10 +2427,7 @@ t_u32 wlan_wmm_process_association_req(pmlan_private priv, t_u8 **ppassoc_buf,
|
|||
PRINTM(MINFO, "WMM: process assoc req: bss->wmmIe=0x%x\n",
|
||||
pwmm_ie->vend_hdr.element_id);
|
||||
|
||||
if ((priv->wmm_required ||
|
||||
(pht_cap && (pht_cap->ieee_hdr.element_id == HT_CAPABILITY) &&
|
||||
(priv->config_bands & BAND_GN || priv->config_bands & BAND_AN))) &&
|
||||
pwmm_ie->vend_hdr.element_id == WMM_IE) {
|
||||
if (priv->wmm_required && pwmm_ie->vend_hdr.element_id == WMM_IE) {
|
||||
pwmm_tlv = (MrvlIEtypes_WmmParamSet_t *)*ppassoc_buf;
|
||||
pwmm_tlv->header.type = (t_u16)wmm_info_ie[0];
|
||||
pwmm_tlv->header.type = wlan_cpu_to_le16(pwmm_tlv->header.type);
|
||||
|
|
|
@ -175,8 +175,7 @@ mlan_status wlan_ret_wmm_param_config(pmlan_private pmpriv,
|
|||
/** Process WMM association request */
|
||||
extern t_u32 wlan_wmm_process_association_req(pmlan_private priv,
|
||||
t_u8 **ppAssocBuf,
|
||||
IEEEtypes_WmmParameter_t *pWmmIE,
|
||||
IEEEtypes_HTCap_t *pHTCap);
|
||||
IEEEtypes_WmmParameter_t *pWmmIE);
|
||||
#endif /* STA_SUPPORT */
|
||||
|
||||
/** setup wmm queue priorities */
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
#define _MLAN_DECL_H_
|
||||
|
||||
/** MLAN release version */
|
||||
#define MLAN_RELEASE_VERSION "322.p3"
|
||||
#define MLAN_RELEASE_VERSION "344.p1"
|
||||
|
||||
/** Re-define generic data types for MLAN/MOAL */
|
||||
/** Signed char (1-byte) */
|
||||
|
@ -441,7 +441,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** SD8977 Card */
|
||||
#define CARD_SD8977 "SD8977"
|
||||
/** SD8978 Card */
|
||||
#define CARD_SD8978 "SD8978"
|
||||
#define CARD_SD8978 "SDIW416"
|
||||
/** SD8997 Card */
|
||||
#define CARD_SD8997 "SD8997"
|
||||
/** SD8987 Card */
|
||||
|
@ -451,7 +451,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** SD9098 Card */
|
||||
#define CARD_SD9098 "SD9098"
|
||||
/** SD9177 Card */
|
||||
#define CARD_SD9177 "SD9177"
|
||||
#define CARD_SD9177 "SDIW612"
|
||||
/** SD8801 Card */
|
||||
#define CARD_SD8801 "SD8801"
|
||||
/** SDNW62X Card */
|
||||
|
@ -490,6 +490,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_PCIEAW690 "PCIEAW690"
|
||||
/** PCIENW62X Card */
|
||||
#define CARD_PCIENW62X "PCIENW62X"
|
||||
/** PCIEIW629 Card */
|
||||
#define CARD_PCIEIW629 "PCIEIW629"
|
||||
#endif
|
||||
|
||||
#ifdef USB
|
||||
|
@ -523,7 +525,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** USB8997 Card */
|
||||
#define CARD_USB8997 "USB8997"
|
||||
/** USB8978 Card */
|
||||
#define CARD_USB8978 "USB8978"
|
||||
#define CARD_USB8978 "USBIW416"
|
||||
/** USB9098 Card */
|
||||
#define CARD_USB9098 "USB9098"
|
||||
/** USB9097 Card */
|
||||
|
@ -699,6 +701,18 @@ typedef enum _mlan_buf_type {
|
|||
#endif
|
||||
} mlan_buf_type;
|
||||
|
||||
#define SCAN_STATE_SCAN_START MBIT(0)
|
||||
#define SCAN_STATE_EXT_SCAN MBIT(1)
|
||||
#define SCAN_STATE_EXT_SCAN_ENH MBIT(2)
|
||||
#define SCAN_STATE_EXT_SCAN_CANCEL MBIT(3)
|
||||
#define SCAN_STATE_EXT_SCAN_CMDRESP MBIT(4)
|
||||
#define SCAN_STATE_EXT_SCAN_ENH_CMDRESP MBIT(5)
|
||||
#define SCAN_STATE_EXT_SCAN_CANCEL_CMDRESP MBIT(6)
|
||||
#define SCAN_STATE_EXT_SCAN_RESULT MBIT(7)
|
||||
#define SCAN_STATE_LAST_EXT_SCAN_RESULT MBIT(8)
|
||||
#define SCAN_STATE_EXT_SCAN_STATUS MBIT(9)
|
||||
#define SCAN_STATE_SCAN_COMPLETE MBIT(10)
|
||||
|
||||
#ifdef USB
|
||||
/** mlan_usb_ep */
|
||||
typedef enum _mlan_usb_ep {
|
||||
|
@ -905,8 +919,8 @@ enum mlan_channel_type {
|
|||
/** channel band */
|
||||
enum { BAND_2GHZ = 0,
|
||||
BAND_5GHZ = 1,
|
||||
BAND_4GHZ = 2,
|
||||
BAND_6GHZ = 3,
|
||||
BAND_6GHZ = 2,
|
||||
BAND_4GHZ = 3,
|
||||
};
|
||||
|
||||
/** channel offset */
|
||||
|
@ -2300,8 +2314,12 @@ typedef struct _mlan_device {
|
|||
t_u32 drv_mode;
|
||||
/** dfs w53 cfg */
|
||||
t_u8 dfs53cfg;
|
||||
/** dfs_offload */
|
||||
t_u8 dfs_offload;
|
||||
/** extend enhance scan */
|
||||
t_u8 ext_scan;
|
||||
/* mcs32 setting */
|
||||
t_u8 mcs32;
|
||||
} mlan_device, *pmlan_device;
|
||||
|
||||
/** MLAN API function prototype */
|
||||
|
|
|
@ -1225,8 +1225,10 @@ typedef MLAN_PACK_START struct _IEEEtypes_HeOpParam_t {
|
|||
t_u16 co_located_bss : 1; /* bit 15 */
|
||||
/** ER SU Disable */
|
||||
t_u8 er_su_disable : 1; /* bit 16 */
|
||||
/** Reserved, including 6G Operation Info Pressent (bit17) */
|
||||
t_u8 reserved : 7; /* bit 17-23 */
|
||||
/* 6g operation info present */
|
||||
t_u8 he_6g_op_info_present : 1; /* bit 17 */
|
||||
/** Reserved bit 18-23 */
|
||||
t_u8 reserved : 6; /* bit 18-23 */
|
||||
} MLAN_PACK_END IEEEtypes_HeOpParam_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeBssColorInfo_t {
|
||||
|
@ -1666,7 +1668,10 @@ typedef MLAN_PACK_START struct {
|
|||
/**wait for all channel scan to complete to report scan result*/
|
||||
#define BG_SCAN_WAIT_ALL_CHAN_DONE 0x80000000
|
||||
/** Maximum number of channels that can be sent in bg scan config */
|
||||
#define WLAN_BG_SCAN_CHAN_MAX 38
|
||||
#define CHAN_MAX_24G 14
|
||||
#define CHAN_MAX_5G 24
|
||||
#define CHAN_MAX_UNII4 3
|
||||
#define WLAN_BG_SCAN_CHAN_MAX (CHAN_MAX_24G + CHAN_MAX_5G + CHAN_MAX_UNII4)
|
||||
|
||||
/** Enumeration definition */
|
||||
/** EES MODE */
|
||||
|
|
|
@ -369,6 +369,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_IPS_CFG = 0x00200085,
|
||||
MLAN_OID_MISC_MC_AGGR_CFG = 0x00200086,
|
||||
MLAN_OID_MISC_CH_LOAD = 0x00200087,
|
||||
MLAN_OID_MISC_STATS = 0x00200088,
|
||||
MLAN_OID_MISC_CH_LOAD_RESULTS = 0x00200089,
|
||||
};
|
||||
|
||||
/** Sub command size */
|
||||
|
@ -1887,11 +1889,20 @@ typedef struct _mlan_fw_info {
|
|||
t_u8 prohibit_80mhz;
|
||||
/** FW support beacon protection */
|
||||
t_u8 fw_beacon_prot;
|
||||
|
||||
/* lower 8 bytes of uuid */
|
||||
t_u64 uuid_lo;
|
||||
|
||||
/* higher 8 bytes of uuid */
|
||||
t_u64 uuid_hi;
|
||||
} mlan_fw_info, *pmlan_fw_info;
|
||||
|
||||
/** Version string buffer length */
|
||||
#define MLAN_MAX_VER_STR_LEN 128
|
||||
|
||||
/** Maximum length of secure boot uuid */
|
||||
#define MLAN_MAX_UUID_LEN 32
|
||||
|
||||
/** mlan_ver_ext data structure for MLAN_OID_GET_VER_EXT */
|
||||
typedef struct _mlan_ver_ext {
|
||||
/** Selected version string */
|
||||
|
@ -2009,7 +2020,7 @@ typedef struct _mlan_bss_info {
|
|||
/** Channel */
|
||||
t_u32 bss_chan;
|
||||
/** Band */
|
||||
t_u8 bss_band;
|
||||
t_u16 bss_band;
|
||||
/** Region code */
|
||||
t_u32 region_code;
|
||||
/** Connection status */
|
||||
|
@ -2201,6 +2212,8 @@ typedef struct _mlan_debug_info {
|
|||
t_u32 bypass_pkt_count;
|
||||
/** Corresponds to scan_processing member of mlan_adapter */
|
||||
t_u32 scan_processing;
|
||||
/** Corresponds to scan_state member of mlan_adapter */
|
||||
t_u32 scan_state;
|
||||
/** Corresponds to mlan_processing member of mlan_adapter */
|
||||
t_u32 mlan_processing;
|
||||
/** Corresponds to main_lock_flag member of mlan_adapter */
|
||||
|
@ -4434,6 +4447,9 @@ typedef struct _mlan_ds_misc_cck_desense_cfg {
|
|||
#define MLAN_IPADDR_OP_ARP_FILTER MBIT(0)
|
||||
/** IP operation ARP response */
|
||||
#define MLAN_IPADDR_OP_AUTO_ARP_RESP MBIT(1)
|
||||
/** Enable opcode bit for MDNS & NS when device enter into suspend **/
|
||||
#define MLAN_OP_ADD_MDNS MBIT(2)
|
||||
#define MLAN_OP_ADD_IPV6_NS MBIT(3)
|
||||
|
||||
/** Type definition of mlan_ds_misc_ipaddr_cfg for MLAN_OID_MISC_IP_ADDR */
|
||||
typedef struct _mlan_ds_misc_ipaddr_cfg {
|
||||
|
@ -5501,10 +5517,23 @@ typedef struct _mlan_ds_mc_aggr_cfg {
|
|||
/** CTS2Self duration offset */
|
||||
t_u16 cts2self_offset;
|
||||
} mlan_ds_mc_aggr_cfg;
|
||||
|
||||
/** mlan_ds_stats */
|
||||
typedef struct _mlan_ds_stats {
|
||||
/** action */
|
||||
t_u16 action;
|
||||
/** tlv len */
|
||||
t_u16 tlv_len;
|
||||
/** TLV buffer */
|
||||
t_u8 tlv_buf[1];
|
||||
} mlan_ds_stats;
|
||||
|
||||
typedef struct _mlan_ds_ch_load {
|
||||
/** action */
|
||||
t_u8 action;
|
||||
t_u16 ch_load_param;
|
||||
t_s16 noise;
|
||||
t_u16 duration;
|
||||
} mlan_ds_ch_load;
|
||||
|
||||
/** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */
|
||||
|
@ -5649,6 +5678,7 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_tp_state tp_state;
|
||||
mlan_ds_hal_phy_cfg_params hal_phy_cfg_params;
|
||||
mlan_ds_mc_aggr_cfg mc_aggr_cfg;
|
||||
mlan_ds_stats stats;
|
||||
#ifdef UAP_SUPPORT
|
||||
t_u8 wacp_mode;
|
||||
#endif
|
||||
|
|
|
@ -175,6 +175,11 @@ extern const struct net_device_ops woal_netdev_ops;
|
|||
/********************************************************
|
||||
* Global Functions
|
||||
********************************************************/
|
||||
#ifdef UAP_SUPPORT
|
||||
#if CFG80211_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
|
||||
int woal_11ax_cfg(moal_private *priv, t_u8 action, mlan_ds_11ax_he_cfg *he_cfg);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Get the private structure from wiphy
|
||||
|
@ -293,6 +298,32 @@ t_u8 woal_band_cfg_to_ieee_band(t_u32 band)
|
|||
return ret_radio_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Convert IEEE band type to radio_type
|
||||
*
|
||||
* @param ieeeband IEEE band
|
||||
*
|
||||
* @return radio_type
|
||||
*/
|
||||
t_u8 woal_ieee_band_to_radio_type(t_u8 ieee_band)
|
||||
{
|
||||
t_u8 radio_type = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
switch (ieee_band) {
|
||||
case IEEE80211_BAND_5GHZ:
|
||||
radio_type = BAND_5GHZ;
|
||||
break;
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
default:
|
||||
radio_type = BAND_2GHZ;
|
||||
break;
|
||||
}
|
||||
LEAVE();
|
||||
return radio_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set/Enable encryption key
|
||||
*
|
||||
|
@ -2411,6 +2442,8 @@ void woal_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
#ifdef UAP_CFG80211
|
||||
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
|
||||
/*
|
||||
* @brief prepare and send WOAL_EVENT_CANCEL_CHANRPT
|
||||
*
|
||||
|
@ -2431,17 +2464,15 @@ static void woal_cancel_chanrpt_event(moal_private *priv)
|
|||
return;
|
||||
}
|
||||
evt->priv = priv;
|
||||
#ifdef UAP_CFG80211
|
||||
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
|
||||
evt->type = WOAL_EVENT_CANCEL_CHANRPT;
|
||||
#endif
|
||||
#endif
|
||||
INIT_LIST_HEAD(&evt->link);
|
||||
spin_lock_irqsave(&handle->evt_lock, flags);
|
||||
list_add_tail(&evt->link, &handle->evt_queue);
|
||||
spin_unlock_irqrestore(&handle->evt_lock, flags);
|
||||
queue_work(handle->evt_workqueue, &handle->evt_work);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE
|
||||
#if KERNEL_VERSION(3, 3, 0) <= CFG80211_VERSION_CODE
|
||||
|
@ -2646,11 +2677,13 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
|
|||
woal_cancel_chanrpt_event(priv);
|
||||
#endif
|
||||
#endif
|
||||
#ifdef UAP_SUPPORT
|
||||
if (!priv->bss_started) {
|
||||
PRINTM(MCMND,
|
||||
"Drop deauth packet before AP started\n");
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
PRINTM(MMSG,
|
||||
"wlan: HostMlme %s send deauth/disassoc\n",
|
||||
priv->netdev->name);
|
||||
|
@ -3369,6 +3402,7 @@ static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, int len,
|
|||
case HT_OPERATION:
|
||||
case VHT_CAPABILITY:
|
||||
case VHT_OPERATION:
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME)) {
|
||||
if ((out_len + length + 2) < (int)ie_out_len) {
|
||||
moal_memcpy_ext(priv->phandle,
|
||||
|
@ -3381,6 +3415,7 @@ static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, int len,
|
|||
"IE too big, fail copy COUNTRY INFO IE\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case EXTENDED_SUPPORTED_RATES:
|
||||
case WLAN_EID_ERP_INFO:
|
||||
|
@ -3393,11 +3428,14 @@ static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, int len,
|
|||
break;
|
||||
case EXTENSION:
|
||||
ext_id = *(pos + 2);
|
||||
if ((ext_id == HE_CAPABILITY ||
|
||||
ext_id == HE_OPERATION) &&
|
||||
!moal_extflg_isset(priv->phandle, EXT_HOST_MLME))
|
||||
if ((ext_id == HE_CAPABILITY || ext_id == HE_OPERATION)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
&& !moal_extflg_isset(priv->phandle, EXT_HOST_MLME)
|
||||
#endif
|
||||
)
|
||||
break;
|
||||
else {
|
||||
#ifdef UAP_SUPPORT
|
||||
#if CFG80211_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
|
||||
if (ext_id == HE_CAPABILITY) {
|
||||
mlan_ds_11ax_he_cfg he_cfg;
|
||||
|
@ -3440,6 +3478,7 @@ static t_u16 woal_filter_beacon_ies(moal_private *priv, const t_u8 *ie, int len,
|
|||
"Fail to get 11ax he_cap parameters\n");
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
#endif
|
||||
{
|
||||
if ((out_len + length + 2) <
|
||||
|
@ -4172,14 +4211,14 @@ struct ieee80211_supported_band *woal_setup_wiphy_bands(t_u8 ieee_band)
|
|||
sizeof(struct ieee80211_supported_band),
|
||||
GFP_KERNEL);
|
||||
if (!band) {
|
||||
PRINTM(MERROR, "No memory for band\n");
|
||||
PRINTM(MERROR, "No memory for 5g band\n");
|
||||
break;
|
||||
}
|
||||
band->channels =
|
||||
kmemdup(&cfg80211_channels_5ghz,
|
||||
sizeof(cfg80211_channels_5ghz), GFP_KERNEL);
|
||||
if (!band->channels) {
|
||||
PRINTM(MERROR, "No memory for band->channel\n");
|
||||
PRINTM(MERROR, "No memory for 5g band->channel\n");
|
||||
kfree(band);
|
||||
band = NULL;
|
||||
break;
|
||||
|
@ -4192,14 +4231,14 @@ struct ieee80211_supported_band *woal_setup_wiphy_bands(t_u8 ieee_band)
|
|||
sizeof(struct ieee80211_supported_band),
|
||||
GFP_KERNEL);
|
||||
if (!band) {
|
||||
PRINTM(MERROR, "No memory for band\n");
|
||||
PRINTM(MERROR, "No memory for 2g band\n");
|
||||
break;
|
||||
}
|
||||
band->channels =
|
||||
kmemdup(&cfg80211_channels_2ghz,
|
||||
sizeof(cfg80211_channels_2ghz), GFP_KERNEL);
|
||||
if (!band->channels) {
|
||||
PRINTM(MERROR, "No memory for band->channel\n");
|
||||
PRINTM(MERROR, "No memory for 2g band->channel\n");
|
||||
kfree(band);
|
||||
band = NULL;
|
||||
break;
|
||||
|
@ -4596,6 +4635,7 @@ void woal_cfg80211_free_bands(struct wiphy *wiphy)
|
|||
}
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
/*
|
||||
* @brief prepare and send fake deauth packet to cfg80211 to
|
||||
* notify wpa_supplicant about disconnection
|
||||
|
@ -4627,6 +4667,7 @@ void woal_deauth_event(moal_private *priv, int reason_code)
|
|||
spin_unlock_irqrestore(&handle->evt_lock, flags);
|
||||
queue_work(handle->evt_workqueue, &handle->evt_work);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef STA_CFG80211
|
||||
#if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE
|
||||
|
@ -4675,27 +4716,6 @@ void woal_cfg80211_notify_sched_scan_stop(moal_private *priv)
|
|||
PRINTM(MEVENT, "Notify sched scan stopped\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief sched_scan work handler
|
||||
*
|
||||
* @param work a pointer to work_struct
|
||||
*
|
||||
* @return 0 -- success, otherwise fail
|
||||
*/
|
||||
void woal_sched_scan_work_queue(struct work_struct *work)
|
||||
{
|
||||
struct delayed_work *delayed_work =
|
||||
container_of(work, struct delayed_work, work);
|
||||
moal_private *priv =
|
||||
container_of(delayed_work, moal_private, sched_scan_work);
|
||||
ENTER();
|
||||
|
||||
if (priv->sched_scanning)
|
||||
woal_cfg80211_notify_sched_scan_stop(priv);
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief report sched_scan result to kernel
|
||||
*
|
||||
|
@ -4711,8 +4731,6 @@ void woal_report_sched_scan_result(moal_private *priv)
|
|||
priv->bg_scan_reqid
|
||||
#endif
|
||||
);
|
||||
queue_delayed_work(priv->sched_scan_workqueue, &priv->sched_scan_work,
|
||||
msecs_to_jiffies(2000));
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@ -4902,6 +4920,7 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy,
|
|||
0x300 &&
|
||||
(radio->param.ant_cfg.rx_antenna & 0xFF00) != 0)) {
|
||||
bands->ht_cap.mcs.rx_mask[1] = 0;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
|
||||
bands->vht_cap.vht_mcs.rx_mcs_map =
|
||||
(__force __le16)0xfffe;
|
||||
bands->vht_cap.vht_mcs.tx_mcs_map =
|
||||
|
@ -4910,6 +4929,7 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy,
|
|||
(__force __le16)0x186;
|
||||
bands->vht_cap.vht_mcs.tx_highest =
|
||||
(__force __le16)0x186;
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
|
||||
if (bands->n_iftype_data &&
|
||||
bands->iftype_data &&
|
||||
|
@ -4936,6 +4956,7 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy,
|
|||
(radio->param.ant_cfg.rx_antenna & 0xFF00) ==
|
||||
0x300) {
|
||||
bands->ht_cap.mcs.rx_mask[1] = 0xff;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
|
||||
bands->vht_cap.vht_mcs.rx_mcs_map =
|
||||
(__force __le16)0xfffa;
|
||||
bands->vht_cap.vht_mcs.tx_mcs_map =
|
||||
|
@ -4944,6 +4965,7 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy,
|
|||
(__force __le16)0x30c;
|
||||
bands->vht_cap.vht_mcs.tx_highest =
|
||||
(__force __le16)0x30c;
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
|
||||
if (bands->n_iftype_data &&
|
||||
bands->iftype_data &&
|
||||
|
@ -5161,8 +5183,8 @@ static void woal_update_wiphy_chan_dfs_state(struct wiphy *wiphy, t_u8 channel,
|
|||
}
|
||||
#if CFG80211_VERSION_CODE > KERNEL_VERSION(3, 8, 13)
|
||||
if (i < sband->n_channels)
|
||||
PRINTM(MCMND, "ZERODFS: Set channel %d dfs_state: %d\n",
|
||||
channel, sband->channels[i].dfs_state);
|
||||
PRINTM(MCMND, "DFS: Set channel %d dfs_state: %d\n", channel,
|
||||
sband->channels[i].dfs_state);
|
||||
#endif
|
||||
LEAVE();
|
||||
}
|
||||
|
|
|
@ -123,6 +123,7 @@ void woal_regulatory_work_queue(struct work_struct *work);
|
|||
#endif
|
||||
|
||||
t_u8 woal_band_cfg_to_ieee_band(t_u32 band);
|
||||
t_u8 woal_ieee_band_to_radio_type(t_u8 ieee_band);
|
||||
|
||||
int woal_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
|
@ -474,7 +475,6 @@ void woal_channel_switch_event(moal_private *priv, chan_band_info *pchan_info);
|
|||
#if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE
|
||||
void woal_bgscan_stop_event(moal_private *priv);
|
||||
void woal_cfg80211_notify_sched_scan_stop(moal_private *priv);
|
||||
void woal_sched_scan_work_queue(struct work_struct *work);
|
||||
void woal_report_sched_scan_result(moal_private *priv);
|
||||
#endif
|
||||
#endif
|
||||
|
@ -485,7 +485,9 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy,
|
|||
mlan_ds_radio_cfg *radio);
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
void woal_deauth_event(moal_private *priv, int reason_code);
|
||||
#endif
|
||||
|
||||
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
|
||||
mlan_status woal_chandef_create(moal_private *priv,
|
||||
|
|
|
@ -262,6 +262,7 @@ int woal_cfg80211_vendor_event(moal_private *priv, int event, t_u8 *data,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
|
||||
/**
|
||||
* @brief send fw dump complete event to vendorhal
|
||||
*
|
||||
|
@ -275,6 +276,7 @@ void woal_cfg80211_vendor_event_fw_dump(moal_private *priv)
|
|||
woal_cfg80211_vendor_event(priv, event_fw_dump_done, CUS_EVT_FW_DUMP,
|
||||
strlen(CUS_EVT_FW_DUMP));
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief send dfs vendor event to kernel
|
||||
|
|
|
@ -125,6 +125,7 @@ static struct debug_data items[] = {
|
|||
item_addr(bypass_pkt_count), INFO_ADDR},
|
||||
{"scan_processing", item_size(scan_processing),
|
||||
item_addr(scan_processing), INFO_ADDR},
|
||||
{"scan_state", item_size(scan_state), item_addr(scan_state), INFO_ADDR},
|
||||
{"num_cmd_timeout", item_size(num_cmd_timeout),
|
||||
item_addr(num_cmd_timeout), INFO_ADDR},
|
||||
{"timeout_cmd_id", item_size(timeout_cmd_id), item_addr(timeout_cmd_id),
|
||||
|
|
|
@ -3036,6 +3036,7 @@ static int woal_priv_get_chanstats(moal_private *priv, t_u8 *respbuf,
|
|||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
mdelay(10);
|
||||
memset(&scan_resp, 0, sizeof(scan_resp));
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_get_scan_table(priv, MOAL_IOCTL_WAIT, &scan_resp)) {
|
||||
|
@ -4607,6 +4608,7 @@ static int woal_priv_set_get_scancfg(moal_private *priv, t_u8 *respbuf,
|
|||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
req->action = MLAN_ACT_SET;
|
||||
moal_memcpy_ext(priv->phandle, &scan->param.scan_cfg, data,
|
||||
sizeof(data), sizeof(scan->param.scan_cfg));
|
||||
|
@ -10765,7 +10767,8 @@ static int woal_priv_fake_radar(moal_private *priv, t_u8 *respbuf,
|
|||
ENTER();
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (priv && !(priv->chan.chan->flags & IEEE80211_CHAN_RADAR)) {
|
||||
if (priv && priv->chan.chan &&
|
||||
!(priv->chan.chan->flags & IEEE80211_CHAN_RADAR)) {
|
||||
PRINTM(MERROR, "Current op channel NOT DFS\n");
|
||||
LEAVE();
|
||||
return -EINVAL;
|
||||
|
@ -10990,6 +10993,7 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
/**
|
||||
* @brief determine the center frquency center index for bandwidth
|
||||
* of 80 MHz and 160 MHz
|
||||
|
@ -11206,6 +11210,7 @@ static t_u8 woal_get_center_freq_idx(moal_private *priv, t_u16 band,
|
|||
}
|
||||
return center_freq_idx;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(UAP_SUPPORT)
|
||||
/**
|
||||
|
@ -11845,21 +11850,24 @@ static int woal_priv_do_dfs_cac(moal_private *priv, t_u8 *respbuf,
|
|||
if (!data[0] ||
|
||||
(priv->chan_rpt_req.chanNum &&
|
||||
(priv->chan_rpt_req.chanNum != data[0]))) {
|
||||
if (priv->chan_rpt_pending) {
|
||||
if (priv->chan_rpt_pending ||
|
||||
(priv->bss_type == MLAN_BSS_TYPE_DFS)) {
|
||||
woal_11h_cancel_chan_report_ioctl(
|
||||
priv, MOAL_IOCTL_WAIT);
|
||||
priv->chan_rpt_pending = MFALSE;
|
||||
}
|
||||
memset(&priv->chan_rpt_req, 0,
|
||||
sizeof(mlan_ds_11h_chan_rep_req));
|
||||
PRINTM(MCMND, "ZeroDFS: Stop Radar detect\n");
|
||||
PRINTM(MCMND, "DFS: Stop Radar detect\n");
|
||||
if (!data[0]) {
|
||||
woal_uap_11h_ctrl(priv, MFALSE);
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_UAP)
|
||||
woal_uap_11h_ctrl(priv, MFALSE);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
if (data[0] == priv->chan_rpt_req.chanNum)
|
||||
if (data[0] == priv->chan_rpt_req.chanNum &&
|
||||
priv->bss_type == MLAN_BSS_TYPE_UAP)
|
||||
woal_uap_11h_ctrl(priv, MFALSE);
|
||||
memset(&ch_dfs_state, 0, sizeof(ch_dfs_state));
|
||||
ch_dfs_state.channel = data[0];
|
||||
|
@ -11868,7 +11876,7 @@ static int woal_priv_do_dfs_cac(moal_private *priv, t_u8 *respbuf,
|
|||
if (!ch_dfs_state.dfs_required ||
|
||||
ch_dfs_state.dfs_state == DFS_UNAVAILABLE) {
|
||||
PRINTM(MCMND,
|
||||
"ZeroDFS: This channel=%d under NOP or not DFS channel\n",
|
||||
"DFS: This channel=%d under NOP or not DFS channel\n",
|
||||
data[0]);
|
||||
LEAVE();
|
||||
return -EINVAL;
|
||||
|
@ -11916,7 +11924,7 @@ static int woal_priv_do_dfs_cac(moal_private *priv, t_u8 *respbuf,
|
|||
&chan_rpt_req, sizeof(mlan_ds_11h_chan_rep_req),
|
||||
sizeof(mlan_ds_11h_chan_rep_req));
|
||||
PRINTM(MCMND,
|
||||
"ZeroDFS: Start Radar detect on channel=%d, bandwidth=%d, cac time=%d\n",
|
||||
"DFS: Start Radar detect on channel=%d, bandwidth=%d, cac time=%d\n",
|
||||
chan_rpt_req.chanNum,
|
||||
(int)(chan_rpt_req.bandcfg.chanWidth),
|
||||
chan_rpt_req.millisec_dwell_time);
|
||||
|
@ -12271,6 +12279,124 @@ done:
|
|||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief per peer stats configure
|
||||
*
|
||||
* @param priv Pointer to moal_private structure
|
||||
* @param respbuf Pointer to response buffer
|
||||
* @param resplen Response buffer length
|
||||
*
|
||||
* @return 0 --success, otherwise fail
|
||||
*/
|
||||
static int woal_priv_stats(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen)
|
||||
{
|
||||
mlan_ioctl_req *ioctl_req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_ds_stats *stats;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
int ret = 0;
|
||||
int header_len = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!priv || !priv->phandle) {
|
||||
PRINTM(MERROR, "priv or handle is null\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
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_STATS;
|
||||
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
|
||||
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_STATS);
|
||||
stats = (mlan_ds_stats *)(respbuf + header_len);
|
||||
ioctl_req->action = stats->action;
|
||||
|
||||
moal_memcpy_ext(priv->phandle, &misc->param.stats, stats,
|
||||
sizeof(mlan_ds_stats) + stats->tlv_len - 1,
|
||||
sizeof(mlan_ds_stats) + stats->tlv_len - 1);
|
||||
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
moal_memcpy_ext(priv->phandle, respbuf + header_len,
|
||||
(mlan_ds_stats *)&misc->param.stats, ioctl_req->buf_len,
|
||||
respbuflen - header_len);
|
||||
ret = header_len + ioctl_req->buf_len;
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
/**
|
||||
* @brief get channel load results
|
||||
*
|
||||
* @param priv Pointer to moal_private structure
|
||||
* @param respbuf Pointer to response buffer
|
||||
* @param resplen Response buffer length
|
||||
*
|
||||
* @return 0 --success, otherwise fail
|
||||
*/
|
||||
static int woal_priv_get_ch_load_results(moal_private *priv, t_u8 *respbuf,
|
||||
t_u32 respbuflen)
|
||||
{
|
||||
mlan_ioctl_req *ioctl_req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
mlan_ds_ch_load *cl_cfg;
|
||||
int ret = 0;
|
||||
int header_len = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!priv || !priv->phandle) {
|
||||
PRINTM(MERROR, "priv or handle is null\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
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_CH_LOAD_RESULTS;
|
||||
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
|
||||
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_CH_LOAD_RESULTS);
|
||||
cl_cfg = (mlan_ds_ch_load *)(respbuf + header_len);
|
||||
ioctl_req->action = cl_cfg->action;
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EAGAIN;
|
||||
goto done;
|
||||
}
|
||||
|
||||
cl_cfg->ch_load_param = misc->param.ch_load.ch_load_param;
|
||||
cl_cfg->noise = misc->param.ch_load.noise;
|
||||
ret = header_len + sizeof(misc->param.ch_load);
|
||||
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(ioctl_req);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get channel load
|
||||
*
|
||||
|
@ -12312,14 +12438,14 @@ static int woal_priv_get_ch_load(moal_private *priv, t_u8 *respbuf,
|
|||
cl_cfg = (mlan_ds_ch_load *)(respbuf + header_len);
|
||||
ioctl_req->action = cl_cfg->action;
|
||||
misc->param.ch_load.ch_load_param = cl_cfg->ch_load_param;
|
||||
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
misc->param.ch_load.noise = cl_cfg->noise;
|
||||
misc->param.ch_load.duration = cl_cfg->duration;
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_NO_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS && status != MLAN_STATUS_PENDING) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
cl_cfg->ch_load_param = misc->param.ch_load.ch_load_param;
|
||||
ret = header_len + sizeof(misc->param.ch_load);
|
||||
|
||||
done:
|
||||
|
@ -13670,6 +13796,63 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* * @brief Set and get txwatchdog check
|
||||
* * @param priv Pointer to moal_private structure
|
||||
* * @param respbuf Pointer to response buffer
|
||||
* * @param resplen Response buffer length
|
||||
* *
|
||||
* * @return Number of bytes written, negative for failure.
|
||||
* */
|
||||
static int woal_priv_txwatchdog(moal_private *priv, t_u8 *respbuf,
|
||||
t_u32 respbuflen)
|
||||
{
|
||||
int ret = 0;
|
||||
int header_len = 0;
|
||||
int user_data_len = 0;
|
||||
int data[1] = {0};
|
||||
int allowed = 1;
|
||||
t_u32 action;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!priv || !priv->phandle) {
|
||||
PRINTM(MERROR, "priv or handle is null\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_TXWATCHDOG);
|
||||
|
||||
if (strlen(respbuf) == header_len) {
|
||||
action = MLAN_ACT_GET;
|
||||
ret = sizeof(t_u32);
|
||||
} else {
|
||||
action = MLAN_ACT_SET;
|
||||
parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data),
|
||||
&user_data_len);
|
||||
if (user_data_len != allowed) {
|
||||
PRINTM(MERROR, "Invalid number of args! %d\n",
|
||||
user_data_len);
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
if (action == MLAN_ACT_SET) {
|
||||
priv->txwatchdog_disable = ((*data == 0) ? MTRUE : MFALSE);
|
||||
} else {
|
||||
*data = ((priv->txwatchdog_disable == MTRUE) ? 0 : 1);
|
||||
}
|
||||
memcpy(respbuf, data, sizeof(t_u32));
|
||||
PRINTM(MINFO, "priv->txwatchdog_disable:%u, action:%u, data[0]=%d\n",
|
||||
priv->txwatchdog_disable, action, data[0]);
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(PCIE)
|
||||
/**
|
||||
* @brief Enable SSU support
|
||||
|
@ -14371,6 +14554,7 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
/**
|
||||
* @brief Set/Get target channel
|
||||
* @param priv Pointer to moal_private structure
|
||||
|
@ -14466,6 +14650,7 @@ done:
|
|||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
|
@ -15531,6 +15716,7 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
/**
|
||||
* @brief move the uAP to transition channel
|
||||
*
|
||||
|
@ -15558,6 +15744,7 @@ void woal_move_to_next_channel(moal_private *priv)
|
|||
woal_action_channel_switch(priv, MTRUE, 0, next_chan, 0, MOAL_NO_WAIT);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Set extended channel switch ie
|
||||
|
@ -17838,6 +18025,30 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int woal_priv_get_uuid(moal_private *priv, t_u8 *respbuf,
|
||||
t_u32 respbuflen)
|
||||
{
|
||||
int ret = -1;
|
||||
mlan_fw_info fw_info;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!respbuf) {
|
||||
PRINTM(MERROR, "response buffer is not available!\n");
|
||||
ret = -1;
|
||||
} else {
|
||||
fw_info.uuid_lo = fw_info.uuid_hi = 0x0ULL;
|
||||
|
||||
woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info);
|
||||
snprintf(respbuf, MLAN_MAX_UUID_LEN + 1, "%llx%llx",
|
||||
fw_info.uuid_lo, fw_info.uuid_hi);
|
||||
ret = strlen(respbuf);
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set priv command for Android
|
||||
* @param dev A pointer to net_device structure
|
||||
|
@ -17865,7 +18076,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
int len = 0;
|
||||
gfp_t flag;
|
||||
char *cmd_buf = NULL;
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
int cfg80211_wext;
|
||||
#endif
|
||||
|
||||
|
@ -17875,7 +18086,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
cfg80211_wext = priv->phandle->params.cfg80211_wext;
|
||||
#endif
|
||||
if (copy_from_user(&priv_cmd, req->ifr_data,
|
||||
|
@ -18767,12 +18978,24 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
len = woal_priv_mc_aggr_cfg(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_STATS,
|
||||
strlen(PRIV_CMD_STATS)) == 0) {
|
||||
/* stats */
|
||||
len = woal_priv_stats(priv, buf, priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_CH_LOAD,
|
||||
strlen(PRIV_CMD_CH_LOAD)) == 0) {
|
||||
/* mc_aggr_cfg*/
|
||||
len = woal_priv_get_ch_load(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP),
|
||||
PRIV_CMD_CH_LOAD_RESULTS,
|
||||
strlen(PRIV_CMD_CH_LOAD_RESULTS)) == 0) {
|
||||
/* mc_aggr_cfg*/
|
||||
len = woal_priv_get_ch_load_results(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_TX_BF_CAP,
|
||||
strlen(PRIV_CMD_TX_BF_CAP)) == 0) {
|
||||
/* Set/Get Transmit beamforming capabilities */
|
||||
|
@ -18900,6 +19123,11 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
len = woal_priv_port_ctrl(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_TXWATCHDOG,
|
||||
strlen(PRIV_CMD_TXWATCHDOG)) == 0) {
|
||||
len = woal_priv_txwatchdog(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_PB_BYPASS,
|
||||
strlen(PRIV_CMD_PB_BYPASS)) == 0) {
|
||||
/* Private IOCTL entry to get the By-passed TX packet
|
||||
|
@ -18936,6 +19164,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
len = woal_priv_cfg_get_tsf_info(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
#ifdef UAP_SUPPORT
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP),
|
||||
PRIV_CMD_TARGET_CHANNEL,
|
||||
strlen(PRIV_CMD_TARGET_CHANNEL)) == 0) {
|
||||
|
@ -18950,6 +19179,7 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
len = woal_priv_backup_channel(priv, buf,
|
||||
priv_cmd.total_len);
|
||||
goto handled;
|
||||
#endif
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP),
|
||||
PRIV_CMD_DFS_REPEATER_CFG,
|
||||
strlen(PRIV_CMD_DFS_REPEATER_CFG)) == 0) {
|
||||
|
@ -19126,6 +19356,10 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
|
|||
strlen(PRIV_CMD_IPS_CFG)) == 0) {
|
||||
len = woal_priv_ips_cfg(priv, buf, priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_GET_SB_UUID,
|
||||
strlen(PRIV_CMD_GET_SB_UUID)) == 0) {
|
||||
len = woal_priv_get_uuid(priv, buf, priv_cmd.total_len);
|
||||
goto handled;
|
||||
} else {
|
||||
PRINTM(MERROR,
|
||||
"Unknown NXP PRIVATE command %s, ignored\n",
|
||||
|
|
|
@ -301,7 +301,9 @@ typedef struct _chan_stats {
|
|||
|
||||
#define PRIV_CMD_MCAST_AGGR_GROUP "mcast_aggr_group"
|
||||
#define PRIV_CMD_MC_AGGR_CFG "mc_aggr_cfg"
|
||||
#define PRIV_CMD_STATS "stats"
|
||||
#define PRIV_CMD_CH_LOAD "getchload"
|
||||
#define PRIV_CMD_CH_LOAD_RESULTS "getloadresults"
|
||||
|
||||
#define PRIV_CMD_ARB_CFG "arb"
|
||||
|
||||
|
@ -379,6 +381,12 @@ typedef struct _ssu_params_cfg {
|
|||
|
||||
#define PRIV_CMD_BOOTSLEEP "bootsleep"
|
||||
|
||||
/** Private command ID to config txwatchdog enable/disable */
|
||||
#define PRIV_CMD_TXWATCHDOG "txwatchdog"
|
||||
|
||||
/** Private command to get secure boot uuid */
|
||||
#define PRIV_CMD_GET_SB_UUID "getuuid"
|
||||
|
||||
/** Private command: 11AX Cfg */
|
||||
#define PRIV_CMD_11AXCFG "11axcfg"
|
||||
/** Private command: 11AX Cmd */
|
||||
|
@ -539,6 +547,7 @@ typedef struct woal_priv_addba {
|
|||
#define ACTION_ADD 2
|
||||
/** Action field value: remove */
|
||||
#define ACTION_REMOVE 3
|
||||
|
||||
#define MC_AGGR_CTRL MBIT(0)
|
||||
/* mcast_aggr_group */
|
||||
typedef struct _mcast_aggr_group {
|
||||
|
|
|
@ -137,7 +137,7 @@ static int shutdown_hs;
|
|||
static int slew_rate = 3;
|
||||
#endif
|
||||
int tx_work = 0;
|
||||
static int rps = 0;
|
||||
|
||||
static int tx_skb_clone = 0;
|
||||
#ifdef IMX_SUPPORT
|
||||
static int pmqos = 1;
|
||||
|
@ -146,6 +146,7 @@ static int pmqos = 0;
|
|||
#endif
|
||||
|
||||
static int chan_track = 0;
|
||||
static int mcs32 = 1;
|
||||
|
||||
#if defined(STA_SUPPORT)
|
||||
/** 802.11d configuration */
|
||||
|
@ -1175,17 +1176,6 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
|
|||
PRINTM(MMSG, "tx_work %s\n",
|
||||
moal_extflg_isset(handle, EXT_TX_WORK) ? "on" :
|
||||
"off");
|
||||
} else if (strncmp(line, "rps", strlen("rps")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
goto err;
|
||||
if (out_data)
|
||||
moal_extflg_set(handle, EXT_RPS);
|
||||
else
|
||||
moal_extflg_clear(handle, EXT_RPS);
|
||||
PRINTM(MMSG, "rps %s\n",
|
||||
moal_extflg_isset(handle, EXT_RPS) ? "on" :
|
||||
"off");
|
||||
} else if (strncmp(line, "tx_skb_clone",
|
||||
strlen("tx_skb_clone")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
|
@ -1317,6 +1307,13 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
|
|||
PRINTM(MMSG, "wacp_moe=%d\n", params->wacp_mode);
|
||||
}
|
||||
#endif
|
||||
else if (strncmp(line, "mcs32", strlen("mcs32")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
goto err;
|
||||
params->mcs32 = out_data;
|
||||
PRINTM(MMSG, "mcs32=%d\n", params->mcs32);
|
||||
}
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
else if (strncmp(line, "host_mlme", strlen("host_mlme")) == 0) {
|
||||
|
@ -1427,11 +1424,13 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
|
|||
woal_dup_string(&handle->params.uap_name, uap_name);
|
||||
handle->params.uap_max_sta = uap_max_sta;
|
||||
handle->params.wacp_mode = wacp_mode;
|
||||
handle->params.mcs32 = mcs32;
|
||||
if (params) {
|
||||
handle->params.max_uap_bss = params->max_uap_bss;
|
||||
woal_dup_string(&handle->params.uap_name, params->uap_name);
|
||||
handle->params.uap_max_sta = params->uap_max_sta;
|
||||
handle->params.wacp_mode = params->wacp_mode;
|
||||
handle->params.mcs32 = params->mcs32;
|
||||
}
|
||||
#endif /* UAP_SUPPORT */
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
|
@ -1610,8 +1609,7 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
|
|||
moal_extflg_set(handle, EXT_NAPI);
|
||||
if (tx_work)
|
||||
moal_extflg_set(handle, EXT_TX_WORK);
|
||||
if (rps)
|
||||
moal_extflg_set(handle, EXT_RPS);
|
||||
|
||||
if (tx_skb_clone)
|
||||
moal_extflg_set(handle, EXT_TX_SKB_CLONE);
|
||||
if (pmqos)
|
||||
|
@ -1839,11 +1837,6 @@ void woal_init_from_dev_tree(void)
|
|||
PRINTM(MIOCTL, "tx_work=0x%x\n", data);
|
||||
tx_work = data;
|
||||
}
|
||||
} else if (!strncmp(prop->name, "rps", strlen("rps"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
PRINTM(MIOCTL, "rps=0x%x\n", data);
|
||||
rps = data;
|
||||
}
|
||||
} else if (!strncmp(prop->name, "tx_skb_clone",
|
||||
strlen("tx_skb_clone"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
|
@ -1855,6 +1848,11 @@ void woal_init_from_dev_tree(void)
|
|||
PRINTM(MIOCTL, "pmqos=0x%x\n", data);
|
||||
pmqos = data;
|
||||
}
|
||||
} else if (!strncmp(prop->name, "mcs32", strlen("mcs32"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
PRINTM(MIOCTL, "mcs32=0x%x\n", data);
|
||||
mcs32 = data;
|
||||
}
|
||||
}
|
||||
#ifdef MFG_CMD_SUPPORT
|
||||
else if (!strncmp(prop->name, "mfg_mode", strlen("mfg_mode"))) {
|
||||
|
@ -2125,8 +2123,13 @@ void woal_init_from_dev_tree(void)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
else if (!strncmp(prop->name, "sched_scan",
|
||||
strlen("sched_scan"))) {
|
||||
else if (!strncmp(prop->name, "mcs32", strlen("mcs32"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
PRINTM(MERROR, "mcs32=0x%x\n", data);
|
||||
mcs32 = data;
|
||||
}
|
||||
} else if (!strncmp(prop->name, "sched_scan",
|
||||
strlen("sched_scan"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
PRINTM(MIOCTL, "sched_scan=%d\n", data);
|
||||
sched_scan = data;
|
||||
|
@ -2437,13 +2440,13 @@ MODULE_PARM_DESC(
|
|||
#endif
|
||||
module_param(tx_work, uint, 0660);
|
||||
MODULE_PARM_DESC(tx_work, "1: Enable tx_work; 0: Disable tx_work");
|
||||
module_param(rps, uint, 0660);
|
||||
MODULE_PARM_DESC(rps, "1: Enable rps; 0: Disable rps");
|
||||
module_param(tx_skb_clone, uint, 0660);
|
||||
MODULE_PARM_DESC(tx_skb_clone,
|
||||
"1: Enable tx_skb_clone; 0: Disable tx_skb_clone");
|
||||
module_param(pmqos, uint, 0660);
|
||||
MODULE_PARM_DESC(pmqos, "1: Enable pmqos; 0: Disable pmqos");
|
||||
module_param(mcs32, uint, 0660);
|
||||
MODULE_PARM_DESC(mcs32, "1: Enable mcs32; 0: Disable mcs32");
|
||||
|
||||
module_param(dpd_data_cfg, charp, 0);
|
||||
MODULE_PARM_DESC(dpd_data_cfg, "DPD data file name");
|
||||
|
|
|
@ -2908,7 +2908,6 @@ static mlan_status woal_set_wake_on_mdns(moal_handle *handle, t_u8 enable)
|
|||
sizeof(filter->byte_seq));
|
||||
entry->rpn[2] = RPN_TYPE_AND;
|
||||
filter++;
|
||||
|
||||
filter->fill_flag = (FILLING_TYPE | FILLING_PATTERN | FILLING_OFFSET |
|
||||
FILLING_NUM_BYTES);
|
||||
filter->type = TYPE_BYTE_EQ + 1;
|
||||
|
@ -2917,7 +2916,6 @@ static mlan_status woal_set_wake_on_mdns(moal_handle *handle, t_u8 enable)
|
|||
filter->num_bytes = 1;
|
||||
entry->rpn[3] = RPN_TYPE_AND;
|
||||
filter++;
|
||||
|
||||
filter->fill_flag = (FILLING_TYPE | FILLING_PATTERN | FILLING_OFFSET |
|
||||
FILLING_NUM_BYTES);
|
||||
filter->type = TYPE_BYTE_EQ + 1;
|
||||
|
@ -2927,16 +2925,14 @@ static mlan_status woal_set_wake_on_mdns(moal_handle *handle, t_u8 enable)
|
|||
filter++;
|
||||
entry->filter_num = 4;
|
||||
if (enable) {
|
||||
ret = woal_request_ioctl(woal_get_priv(handle,
|
||||
MLAN_BSS_ROLE_ANY),
|
||||
req, MOAL_NO_WAIT);
|
||||
if (ret != MLAN_STATUS_SUCCESS && ret != MLAN_STATUS_PENDING)
|
||||
PRINTM(MIOCTL, "Set Mdns wake up failed! ret=%d\n",
|
||||
ret);
|
||||
mef_cfg->op_code = MLAN_OP_ADD_MDNS;
|
||||
} else {
|
||||
PRINTM(MIOCTL, "Mdns wake up is disable\n");
|
||||
mef_cfg->op_code = MLAN_IPADDR_OP_IP_REMOVE;
|
||||
}
|
||||
|
||||
ret = woal_request_ioctl(woal_get_priv(handle, MLAN_BSS_ROLE_ANY), req,
|
||||
MOAL_NO_WAIT);
|
||||
if (ret != MLAN_STATUS_SUCCESS && ret != MLAN_STATUS_PENDING)
|
||||
PRINTM(MIOCTL, "Set Mdns wake up failed! ret=%d\n", ret);
|
||||
done:
|
||||
if (ret != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
|
@ -2953,7 +2949,7 @@ done:
|
|||
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING -- success, otherwise
|
||||
* fail
|
||||
*/
|
||||
static mlan_status woal_set_ipv6_ns_offload(moal_handle *handle)
|
||||
static mlan_status woal_set_ipv6_ns_offload(moal_handle *handle, t_u8 enable)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
|
@ -3003,7 +2999,11 @@ static mlan_status woal_set_ipv6_ns_offload(moal_handle *handle)
|
|||
moal_memcpy_ext(handle, filter->byte_seq, "\x87", 1,
|
||||
sizeof(filter->byte_seq));
|
||||
entry->filter_num = 2;
|
||||
|
||||
if (enable) {
|
||||
mef_cfg->op_code = MLAN_OP_ADD_IPV6_NS;
|
||||
} else {
|
||||
mef_cfg->op_code = MLAN_IPADDR_OP_IP_REMOVE;
|
||||
}
|
||||
ret = woal_request_ioctl(woal_get_priv(handle, MLAN_BSS_ROLE_ANY), req,
|
||||
MOAL_NO_WAIT);
|
||||
if (ret != MLAN_STATUS_SUCCESS && ret != MLAN_STATUS_PENDING)
|
||||
|
@ -3425,12 +3425,16 @@ mlan_status woal_cancel_hs(moal_private *priv, t_u8 wait_option)
|
|||
woal_set_clear_pmk(priv, MLAN_ACT_CLEAR);
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (priv->phandle->hs_auto_arp) {
|
||||
PRINTM(MIOCTL, "Cancel Host Sleep... remove ipv6 offload\n");
|
||||
/** Set ipv6 router advertisement message offload */
|
||||
woal_set_ipv6_ra_offload(priv->phandle, MFALSE);
|
||||
}
|
||||
/** Set Neighbor Solitation message offload */
|
||||
woal_set_ipv6_ns_offload(priv->phandle, MFALSE);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (priv->phandle->hs_auto_arp) {
|
||||
|
@ -3720,14 +3724,16 @@ int woal_enable_hs(moal_private *priv)
|
|||
#endif
|
||||
}
|
||||
media_connected = woal_check_media_connected(handle);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (handle->hs_auto_arp && media_connected) {
|
||||
PRINTM(MIOCTL, "Host Sleep enabled... set ipv6 offload\n");
|
||||
/** Set ipv6 router advertisement message offload */
|
||||
woal_set_ipv6_ra_offload(handle, MTRUE);
|
||||
/** Set Neighbor Solitation message offload */
|
||||
woal_set_ipv6_ns_offload(handle);
|
||||
woal_set_ipv6_ns_offload(handle, MTRUE);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (handle->hs_auto_arp) {
|
||||
|
|
|
@ -77,9 +77,11 @@ Change log:
|
|||
#include <linux/of.h>
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
#include <net/addrconf.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/********************************************************
|
||||
Global Variables
|
||||
|
@ -908,8 +910,10 @@ void woal_send_fw_dump_complete_event(moal_private *priv)
|
|||
woal_send_iwevcustom_event(priv, CUS_EVT_FW_DUMP_DONE);
|
||||
#endif
|
||||
#ifdef STA_CFG80211
|
||||
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
|
||||
if (IS_STA_CFG80211(cfg80211_wext))
|
||||
woal_cfg80211_vendor_event_fw_dump(priv);
|
||||
#endif
|
||||
#endif
|
||||
woal_broadcast_event(priv, CUS_EVT_FW_DUMP_DONE,
|
||||
strlen(CUS_EVT_FW_DUMP_DONE));
|
||||
|
@ -964,7 +968,7 @@ static void woal_hang_work_queue(struct work_struct *work)
|
|||
// disconnect
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
|
||||
if (IS_STA_CFG80211(cfg80211_wext) &&
|
||||
if (IS_STA_CFG80211(cfg80211_wext) && priv->wdev &&
|
||||
priv->wdev->connected) {
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (priv->host_mlme)
|
||||
|
@ -1247,6 +1251,7 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
/**
|
||||
* @brief This function handle the net interface ipv6 address change event
|
||||
|
@ -1320,6 +1325,7 @@ done:
|
|||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief This function validates a SSID as being able to be printed
|
||||
|
@ -2068,11 +2074,15 @@ mlan_status woal_init_sw(moal_handle *handle)
|
|||
#ifdef UAP_SUPPORT
|
||||
device.uap_max_sta = handle->params.uap_max_sta;
|
||||
#endif
|
||||
device.mcs32 = handle->params.mcs32;
|
||||
device.hs_wake_interval = handle->params.hs_wake_interval;
|
||||
device.indication_gpio = handle->params.indication_gpio;
|
||||
device.hs_mimo_switch = moal_extflg_isset(handle, EXT_HS_MIMO_SWITCH);
|
||||
|
||||
device.dfs53cfg = handle->params.dfs53cfg;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
device.dfs_offload = moal_extflg_isset(handle, EXT_DFS_OFFLOAD);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < handle->drv_mode.intf_num; i++) {
|
||||
device.bss_attr[i].bss_type =
|
||||
|
@ -3346,6 +3356,7 @@ static mlan_status woal_add_card_dpc(moal_handle *handle)
|
|||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
int i;
|
||||
char str_buf[MLAN_MAX_VER_STR_LEN];
|
||||
|
||||
ENTER();
|
||||
|
||||
#if defined(USB)
|
||||
|
@ -3452,6 +3463,7 @@ static mlan_status woal_add_card_dpc(moal_handle *handle)
|
|||
woal_set_uap_operation_ctrl(handle);
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
handle->woal_inet6_notifier.notifier_call = woal_inet6_netdeive_event;
|
||||
if (register_inet6addr_notifier(&handle->woal_inet6_notifier)) {
|
||||
|
@ -3460,6 +3472,7 @@ static mlan_status woal_add_card_dpc(moal_handle *handle)
|
|||
goto err;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef MFG_CMD_SUPPORT
|
||||
done:
|
||||
|
@ -3472,8 +3485,10 @@ err:
|
|||
if (ret != MLAN_STATUS_SUCCESS) {
|
||||
PRINTM(MERROR, "Failed to add interface\n");
|
||||
unregister_inetaddr_notifier(&handle->woal_notifier);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
unregister_inet6addr_notifier(&handle->woal_inet6_notifier);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for (i = 0; i < MIN(MLAN_MAX_BSS_NUM, handle->priv_num); i++)
|
||||
|
@ -4709,9 +4724,6 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index,
|
|||
moal_private *priv = NULL;
|
||||
char name[256];
|
||||
int i = 0;
|
||||
#ifdef STA_CFG80211
|
||||
char sched_scan_str[256];
|
||||
#endif
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
char csa_str[256];
|
||||
|
@ -4924,15 +4936,6 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index,
|
|||
goto error;
|
||||
}
|
||||
}
|
||||
strcpy(sched_scan_str, "SCHED_SCAN");
|
||||
strcat(sched_scan_str, name);
|
||||
priv->sched_scan_workqueue = alloc_workqueue(
|
||||
sched_scan_str, WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1);
|
||||
if (!priv->sched_scan_workqueue) {
|
||||
PRINTM(MERROR, "cannot alloc sched_scan workqueue \n");
|
||||
goto error;
|
||||
}
|
||||
INIT_DELAYED_WORK(&priv->sched_scan_work, woal_sched_scan_work_queue);
|
||||
|
||||
#endif /* STA_SUPPORT */
|
||||
#endif /* STA_CFG80211 */
|
||||
|
@ -5050,12 +5053,6 @@ error:
|
|||
destroy_workqueue(priv->mclist_workqueue);
|
||||
priv->mclist_workqueue = NULL;
|
||||
}
|
||||
#ifdef STA_CFG80211
|
||||
if (priv->sched_scan_workqueue) {
|
||||
destroy_workqueue(priv->sched_scan_workqueue);
|
||||
priv->sched_scan_workqueue = NULL;
|
||||
}
|
||||
#endif
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
if (priv->wdev &&
|
||||
IS_STA_OR_UAP_CFG80211(handle->params.cfg80211_wext))
|
||||
|
@ -5166,13 +5163,6 @@ void woal_remove_interface(moal_handle *handle, t_u8 bss_index)
|
|||
priv->mclist_workqueue = NULL;
|
||||
}
|
||||
|
||||
#ifdef STA_CFG80211
|
||||
if (priv->sched_scan_workqueue) {
|
||||
destroy_workqueue(priv->sched_scan_workqueue);
|
||||
priv->sched_scan_workqueue = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
/* Unregister wiphy device and free */
|
||||
if (priv->wdev && IS_STA_OR_UAP_CFG80211(handle->params.cfg80211_wext))
|
||||
|
@ -6105,6 +6095,7 @@ void woal_mlan_debug_info(moal_private *priv)
|
|||
PRINTM(MERROR, "tx_lock_flag = %d\n", info->tx_lock_flag);
|
||||
PRINTM(MERROR, "port_open = %d\n", info->port_open);
|
||||
PRINTM(MERROR, "scan_processing = %d\n", info->scan_processing);
|
||||
PRINTM(MERROR, "scan_state = 0x%x\n", info->scan_state);
|
||||
for (i = 0; i < (int)info->ralist_num; i++) {
|
||||
PRINTM(MERROR,
|
||||
"ralist ra: %02x:%02x:%02x:%02x:%02x:%02x tid=%d pkts=%d pause=%d\n",
|
||||
|
@ -6176,7 +6167,8 @@ void woal_tx_timeout(struct net_device *dev
|
|||
dev->name, priv->bss_index, priv->num_tx_timeout);
|
||||
woal_set_trans_start(dev);
|
||||
|
||||
if (priv->num_tx_timeout == NUM_TX_TIMEOUT_THRESHOLD) {
|
||||
if (priv->num_tx_timeout == NUM_TX_TIMEOUT_THRESHOLD &&
|
||||
priv->txwatchdog_disable == MFALSE) {
|
||||
if (drvdbg & MFW_D)
|
||||
auto_fw_dump = MTRUE;
|
||||
woal_mlan_debug_info(priv);
|
||||
|
@ -6204,6 +6196,7 @@ struct net_device_stats *woal_get_stats(struct net_device *dev)
|
|||
return &priv->stats;
|
||||
}
|
||||
|
||||
#if !defined(STA_CFG80211) && !defined(UAP_CFG80211)
|
||||
/**
|
||||
* @brief This function determine the 802.1p/1d tag to use
|
||||
*
|
||||
|
@ -6270,6 +6263,7 @@ unsigned int woal_classify8021d(struct sk_buff *skb)
|
|||
out:
|
||||
return tid;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
|
||||
/**
|
||||
|
@ -6307,7 +6301,11 @@ u16 woal_select_queue(struct net_device *dev, struct sk_buff *skb
|
|||
return index;
|
||||
}
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
tid = skb->priority = cfg80211_classify8021d(skb, NULL);
|
||||
#else
|
||||
tid = skb->priority = cfg80211_classify8021d(skb);
|
||||
#endif
|
||||
#else
|
||||
tid = skb->priority = woal_classify8021d(skb);
|
||||
#endif
|
||||
|
@ -7062,10 +7060,8 @@ static int woal_start_xmit(moal_private *priv, struct sk_buff *skb)
|
|||
#endif
|
||||
|
||||
if (is_zero_timeval(priv->phandle->tx_time_start)) {
|
||||
priv->phandle->tx_time_start.time_sec =
|
||||
pmbuf->in_ts_sec;
|
||||
priv->phandle->tx_time_start.time_usec =
|
||||
pmbuf->in_ts_usec;
|
||||
priv->phandle->tx_time_start.time_sec = pmbuf->in_ts_sec;
|
||||
priv->phandle->tx_time_start.time_usec = pmbuf->in_ts_usec;
|
||||
PRINTM(MINFO, "%s : start_timeval=%d:%d \n", __func__,
|
||||
priv->phandle->tx_time_start.time_sec,
|
||||
priv->phandle->tx_time_start.time_usec);
|
||||
|
@ -7521,7 +7517,10 @@ void woal_init_priv(moal_private *priv, t_u8 wait_option)
|
|||
if (priv->bss_type != MLAN_BSS_TYPE_WIFIDIRECT)
|
||||
#endif
|
||||
{
|
||||
priv->current_addr[4] += priv->bss_index;
|
||||
if (priv->bss_index) {
|
||||
priv->current_addr[0] |= 0x02;
|
||||
priv->current_addr[4] += priv->bss_index;
|
||||
}
|
||||
PRINTM(MCMND, "Set %s interface addr: " MACSTR "\n",
|
||||
priv->netdev->name, MAC2STR(priv->current_addr));
|
||||
}
|
||||
|
@ -8722,7 +8721,7 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
|
|||
|
||||
if (seqnum == 1) {
|
||||
if (drvdbg & MFW_D)
|
||||
drvdbg &= ~MFW_D;
|
||||
phandle->fw_dump_status = MTRUE;
|
||||
if (phandle->fw_dump == MFALSE) {
|
||||
PRINTM(MMSG, "=====FW trigger dump====\n");
|
||||
phandle->fw_dump = MTRUE;
|
||||
|
@ -9138,6 +9137,7 @@ static int woal_dump_mlan_drv_info(moal_private *priv, t_u8 *buf)
|
|||
ptr += sprintf(ptr, "tx_lock_flag = %d\n", info->tx_lock_flag);
|
||||
ptr += sprintf(ptr, "port_open = %d\n", info->port_open);
|
||||
ptr += sprintf(ptr, "scan_processing = %d\n", info->scan_processing);
|
||||
ptr += sprintf(ptr, "scan_state = %d\n", info->scan_state);
|
||||
|
||||
#ifdef PCIE
|
||||
if (IS_PCIE(priv->phandle->card_type)) {
|
||||
|
@ -9533,8 +9533,8 @@ void woal_moal_debug_info(moal_private *priv, moal_handle *handle, u8 flag)
|
|||
}
|
||||
#endif
|
||||
#ifdef DEBUG_LEVEL1
|
||||
if (drvdbg & MFW_D) {
|
||||
drvdbg &= ~MFW_D;
|
||||
if ((drvdbg & MFW_D) && !phandle->fw_dump_status) {
|
||||
phandle->fw_dump_status = MTRUE;
|
||||
phandle->fw_dbg = MTRUE;
|
||||
queue_work(phandle->workqueue, &phandle->main_work);
|
||||
}
|
||||
|
@ -9814,6 +9814,7 @@ t_void woal_evt_work_queue(struct work_struct *work)
|
|||
break;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef UAP_SUPPORT
|
||||
case WOAL_EVENT_CHAN_RPT:
|
||||
woal_process_chan_event((moal_private *)evt->priv,
|
||||
WOAL_EVENT_CHAN_RPT,
|
||||
|
@ -9826,6 +9827,7 @@ t_void woal_evt_work_queue(struct work_struct *work)
|
|||
evt->radar_info.channel,
|
||||
evt->radar_info.radar);
|
||||
break;
|
||||
#endif
|
||||
#ifdef UAP_CFG80211
|
||||
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
|
||||
case WOAL_EVENT_CANCEL_CHANRPT:
|
||||
|
@ -9834,6 +9836,8 @@ t_void woal_evt_work_queue(struct work_struct *work)
|
|||
break;
|
||||
#endif
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
kfree(evt);
|
||||
spin_lock_irqsave(&handle->evt_lock, flags);
|
||||
|
@ -9867,10 +9871,12 @@ t_void woal_rx_work_queue(struct work_struct *work)
|
|||
return;
|
||||
}
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
|
||||
if (handle->cfg80211_suspend == MTRUE) {
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
woal_get_monotonic_time(&start_timeval);
|
||||
mlan_rx_process(handle->pmlan_adapter, NULL);
|
||||
|
@ -9966,7 +9972,8 @@ t_void woal_main_work_queue(struct work_struct *work)
|
|||
}
|
||||
if (handle->fw_dbg == MTRUE) {
|
||||
handle->fw_dbg = MFALSE;
|
||||
handle->ops.dump_fw_info(handle);
|
||||
if (handle->ops.dump_fw_info)
|
||||
handle->ops.dump_fw_info(handle);
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
|
@ -10581,9 +10588,11 @@ mlan_status woal_remove_card(void *card)
|
|||
atomic_read(&handle->ioctl_pending));
|
||||
}
|
||||
unregister_inetaddr_notifier(&handle->woal_notifier);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
unregister_inet6addr_notifier(&handle->woal_inet6_notifier);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
|
||||
|
@ -10753,8 +10762,10 @@ mlan_status woal_switch_drv_mode(moal_handle *handle, t_u32 mode)
|
|||
}
|
||||
|
||||
unregister_inetaddr_notifier(&handle->woal_notifier);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
unregister_inet6addr_notifier(&handle->woal_inet6_notifier);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Remove interface */
|
||||
|
|
|
@ -145,8 +145,10 @@ Change log:
|
|||
#include <linux/suspend.h>
|
||||
#endif /* IMX_SUPPORT */
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
|
||||
#include <linux/pm_qos.h>
|
||||
#else
|
||||
#include <linux/pm_qos_params.h>
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
|
@ -220,6 +222,10 @@ Change log:
|
|||
#define IEEE80211_NUM_BANDS NUM_NL80211_BANDS
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
|
||||
#define IEEE80211_BAND_6GHZ NL80211_BAND_6GHZ
|
||||
#endif
|
||||
|
||||
/**
|
||||
* interface name
|
||||
*/
|
||||
|
@ -266,6 +272,8 @@ typedef t_u8 BOOLEAN;
|
|||
#define CARD_TYPE_USB_USB 6
|
||||
/** card type PCIE_USB */
|
||||
#define CARD_TYPE_PCIE_USB 7
|
||||
/** card type SD9177_UART */
|
||||
#define CARD_TYPE_SD9177_UART 1 // As per datasheet/SoC design
|
||||
|
||||
/** Driver version */
|
||||
extern char driver_version[];
|
||||
|
@ -818,10 +826,12 @@ typedef enum {
|
|||
#define CUS_EVT_RADAR_DETECTED "EVENT=RADAR_DETECTED"
|
||||
/** Custom event : CAC finished */
|
||||
#define CUS_EVT_CAC_FINISHED "EVENT=CAC_FINISHED"
|
||||
#ifdef UAP_SUPPORT
|
||||
void woal_move_to_next_channel(moal_private *priv);
|
||||
void woal_chan_event(moal_private *priv, t_u8 type, t_u8 channel, t_u8 radar);
|
||||
void woal_process_chan_event(moal_private *priv, t_u8 type, t_u8 channel,
|
||||
t_u8 radar);
|
||||
#endif
|
||||
|
||||
/** Custom event : WEP ICV error */
|
||||
#define CUS_EVT_WEP_ICV_ERR "EVENT=WEP_ICV_ERR"
|
||||
|
@ -1427,10 +1437,6 @@ struct _moal_private {
|
|||
wlan_bgscan_cfg scan_cfg;
|
||||
/** sched scaning flag */
|
||||
t_u8 sched_scanning;
|
||||
/** sched_scan work queue */
|
||||
struct workqueue_struct *sched_scan_workqueue;
|
||||
/** sched_scan work */
|
||||
struct delayed_work sched_scan_work;
|
||||
/** bgscan request id */
|
||||
t_u64 bg_scan_reqid;
|
||||
#ifdef STA_CFG80211
|
||||
|
@ -1694,6 +1700,12 @@ struct _moal_private {
|
|||
void *rings[RING_ID_MAX];
|
||||
t_u8 pkt_fate_monitor_enable;
|
||||
void *packet_filter;
|
||||
/** txwatchdog disable */
|
||||
t_u8 txwatchdog_disable;
|
||||
|
||||
/** secure boot uuid lower and higher 8 bytes */
|
||||
t_u64 uuid_lo;
|
||||
t_u64 uuid_hi;
|
||||
};
|
||||
|
||||
#ifdef SDIO
|
||||
|
@ -2059,7 +2071,6 @@ enum ext_mod_params {
|
|||
#endif
|
||||
#endif
|
||||
EXT_TX_WORK,
|
||||
EXT_RPS,
|
||||
EXT_TX_SKB_CLONE,
|
||||
EXT_PMQOS,
|
||||
EXT_CHAN_TRACK,
|
||||
|
@ -2154,6 +2165,8 @@ typedef struct _moal_mod_para {
|
|||
t_u16 inact_tmo;
|
||||
char *reg_alpha2;
|
||||
int dfs53cfg;
|
||||
t_u8 mcs32;
|
||||
|
||||
} moal_mod_para;
|
||||
|
||||
void woal_tp_acnt_timer_func(void *context);
|
||||
|
@ -2545,6 +2558,8 @@ struct _moal_handle {
|
|||
moal_drv_timer fw_dump_timer __ATTRIB_ALIGN__;
|
||||
/** fw dump buffer total len */
|
||||
t_u64 fw_dump_len;
|
||||
/** fw dump status for each chip, useful in multichip drive */
|
||||
BOOLEAN fw_dump_status;
|
||||
/** Pointer of fw dump buffer */
|
||||
t_u8 *fw_dump_buf;
|
||||
/** FW dump full name */
|
||||
|
@ -2588,8 +2603,10 @@ struct _moal_handle {
|
|||
/* feature_control */
|
||||
t_u32 feature_control;
|
||||
struct notifier_block woal_notifier;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
struct notifier_block woal_inet6_notifier;
|
||||
#endif
|
||||
#endif
|
||||
mlan_ds_misc_keep_alive keep_alive[MAX_KEEP_ALIVE_ID];
|
||||
struct net_device napi_dev;
|
||||
|
@ -3777,8 +3794,10 @@ monitor_iface *woal_prepare_mon_if(moal_private *priv, const char *name,
|
|||
#endif
|
||||
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
|
||||
void woal_cfg80211_vendor_event_fw_dump(moal_private *priv);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
|
|
|
@ -44,9 +44,11 @@ Change log:
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
#include <net/addrconf.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/********************************************************
|
||||
Local Variables
|
||||
|
@ -143,6 +145,11 @@ static moal_if_ops pcie_ops;
|
|||
********************************************************/
|
||||
|
||||
static mlan_status woal_pcie_preinit(struct pci_dev *pdev);
|
||||
#if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \
|
||||
defined(PCIE9097) || defined(PCIENW62X)
|
||||
static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
|
||||
t_u8 resetflag);
|
||||
#endif
|
||||
|
||||
/** @brief This function updates the card types
|
||||
*
|
||||
|
@ -305,8 +312,10 @@ static mlan_status woal_do_flr(moal_handle *handle, bool prepare, bool flr_flag)
|
|||
}
|
||||
|
||||
unregister_inetaddr_notifier(&handle->woal_notifier);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
unregister_inet6addr_notifier(&handle->woal_inet6_notifier);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Remove interface */
|
||||
|
@ -531,6 +540,46 @@ static void woal_pcie_remove(struct pci_dev *dev)
|
|||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles PCIE driver remove
|
||||
*
|
||||
* @param pdev A pointer to pci_dev structure
|
||||
*
|
||||
* @return error code
|
||||
*/
|
||||
static void woal_pcie_shutdown(struct pci_dev *dev)
|
||||
{
|
||||
pcie_service_card *card;
|
||||
moal_handle *handle;
|
||||
|
||||
ENTER();
|
||||
PRINTM(MCMND, "<--- Enter woal_pcie_shutdown --->\n");
|
||||
|
||||
card = pci_get_drvdata(dev);
|
||||
if (!card) {
|
||||
PRINTM(MINFO, "PCIE card removed from slot\n");
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
handle = card->handle;
|
||||
if (handle->second_mac)
|
||||
goto done;
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(handle->card_type) || IS_PCIENW62X(handle->card_type) ||
|
||||
IS_PCIE9097(handle->card_type)) {
|
||||
if (RDWR_STATUS_FAILURE !=
|
||||
woal_pcie_rdwr_firmware(handle, 0, 1))
|
||||
PRINTM(MMSG, "wlan: start in-bound IR...\n");
|
||||
}
|
||||
#endif
|
||||
done:
|
||||
handle->surprise_removed = MTRUE;
|
||||
pci_disable_device(dev);
|
||||
PRINTM(MCMND, "<--- Leave woal_pcie_shutdown --->\n");
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle suspend
|
||||
*
|
||||
|
@ -916,6 +965,7 @@ static struct pci_driver REFDATA wlan_pcie = {
|
|||
.id_table = wlan_ids,
|
||||
.probe = woal_pcie_probe,
|
||||
.remove = woal_pcie_remove,
|
||||
.shutdown = woal_pcie_shutdown,
|
||||
#ifdef CONFIG_PM
|
||||
/* Power Management Hooks */
|
||||
.suspend = woal_pcie_suspend,
|
||||
|
@ -1176,13 +1226,21 @@ static mlan_status woal_pcie_init(pcie_service_card *card)
|
|||
pci_set_master(pdev);
|
||||
|
||||
PRINTM(MINFO, "Try set_consistent_dma_mask(32)\n");
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
|
||||
ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
|
||||
#else
|
||||
ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
|
||||
#endif
|
||||
if (ret) {
|
||||
PRINTM(MERROR, "set_dma_mask(32) failed\n");
|
||||
goto err_set_dma_mask;
|
||||
}
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
|
||||
ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));
|
||||
#else
|
||||
ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
|
||||
#endif
|
||||
if (ret) {
|
||||
PRINTM(MERROR, "set_consistent_dma_mask(64) failed\n");
|
||||
goto err_set_dma_mask;
|
||||
|
@ -1821,6 +1879,7 @@ static memory_type_mapping mem_type_mapping_tbl_8897[] = {
|
|||
defined(PCIENW62X)
|
||||
#define DEBUG_HOST_READY_8997 0xCC
|
||||
#define DEBUG_HOST_EVENT_READY 0xAA
|
||||
#define DEBUG_HOST_RESET_READY 0x99
|
||||
static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL,
|
||||
0xDD, 0x00};
|
||||
|
||||
|
@ -1850,10 +1909,12 @@ static mlan_status woal_read_reg_eight_bit(moal_handle *handle, t_u32 reg,
|
|||
*
|
||||
* @param phandle A pointer to moal_handle
|
||||
* @param doneflag done flag
|
||||
* @param resetflag reset flag;
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag)
|
||||
static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
|
||||
t_u8 resetflag)
|
||||
{
|
||||
int ret = 0;
|
||||
int tries = 0;
|
||||
|
@ -1883,33 +1944,38 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag)
|
|||
debug_host_ready = DEBUG_HOST_EVENT_READY;
|
||||
else
|
||||
debug_host_ready = DEBUG_HOST_READY_8997;
|
||||
if (resetflag)
|
||||
debug_host_ready = DEBUG_HOST_RESET_READY;
|
||||
dump_ctrl_reg = PCIE9098_DUMP_CTRL_REG;
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = woal_pcie_write_reg(phandle, dump_ctrl_reg, debug_host_ready);
|
||||
if (ret) {
|
||||
PRINTM(MERROR, "PCIE Write ERR\n");
|
||||
PRINTM(MERROR, "PCIE Write ERR, reg=0x%x debug_reay=0x%x\n",
|
||||
dump_ctrl_reg, debug_host_ready);
|
||||
return RDWR_STATUS_FAILURE;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
if (phandle->event_fw_dump)
|
||||
if (phandle->event_fw_dump || resetflag)
|
||||
return RDWR_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
ret = woal_pcie_read_reg(phandle, dump_ctrl_reg, ®_data);
|
||||
if (ret) {
|
||||
PRINTM(MERROR, "PCIE Read DEBUG_DUMP_CTRL_REG fail\n");
|
||||
PRINTM(MERROR, "PCIE Read DEBUG_DUMP_CTRL_REG 0x%x fail\n",
|
||||
dump_ctrl_reg);
|
||||
return RDWR_STATUS_FAILURE;
|
||||
}
|
||||
for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
|
||||
ret = woal_read_reg_eight_bit(phandle, dump_ctrl_reg,
|
||||
&ctrl_data);
|
||||
if (ret) {
|
||||
PRINTM(MERROR, "PCIE READ ERR\n");
|
||||
PRINTM(MERROR, "PCIE READ reg 0x%x 8bit ERR\n",
|
||||
dump_ctrl_reg);
|
||||
return RDWR_STATUS_FAILURE;
|
||||
}
|
||||
if (ctrl_data == DEBUG_FW_DONE)
|
||||
|
@ -1917,7 +1983,9 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag)
|
|||
if (doneflag && ctrl_data == doneflag)
|
||||
return RDWR_STATUS_DONE;
|
||||
if (ctrl_data != debug_host_ready) {
|
||||
PRINTM(MMSG, "The ctrl reg was changed, try again!\n");
|
||||
PRINTM(MMSG,
|
||||
"The ctrl reg was changed, ctrl_data=0x%x, host_ready:0x%x try again!\n",
|
||||
ctrl_data, debug_host_ready);
|
||||
ret = woal_pcie_write_reg(phandle, dump_ctrl_reg,
|
||||
debug_host_ready);
|
||||
if (ret) {
|
||||
|
@ -1932,7 +2000,8 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag)
|
|||
#endif
|
||||
}
|
||||
if (ctrl_data == debug_host_ready) {
|
||||
PRINTM(MERROR, "Fail to pull ctrl_data\n");
|
||||
PRINTM(MERROR, "Fail to pull ctrl_data=0x%x host_ready=0x%x\n",
|
||||
ctrl_data, debug_host_ready);
|
||||
return RDWR_STATUS_FAILURE;
|
||||
}
|
||||
return RDWR_STATUS_SUCCESS;
|
||||
|
@ -1984,7 +2053,8 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle)
|
|||
PRINTM(MMSG, "====PCIE DEBUG MODE OUTPUT START: %u.%06u ====\n", sec,
|
||||
usec);
|
||||
/* read the number of the memories which will dump */
|
||||
if (RDWR_STATUS_FAILURE == woal_pcie_rdwr_firmware(phandle, doneflag))
|
||||
if (RDWR_STATUS_FAILURE ==
|
||||
woal_pcie_rdwr_firmware(phandle, doneflag, 0))
|
||||
goto done;
|
||||
reg = DEBUG_DUMP_START_REG;
|
||||
ret = woal_read_reg_eight_bit(phandle, reg, &dump_num);
|
||||
|
@ -1998,7 +2068,7 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle)
|
|||
idx < dump_num && idx < ARRAY_SIZE(mem_type_mapping_tbl_8897);
|
||||
idx++) {
|
||||
if (RDWR_STATUS_FAILURE ==
|
||||
woal_pcie_rdwr_firmware(phandle, doneflag))
|
||||
woal_pcie_rdwr_firmware(phandle, doneflag, 0))
|
||||
goto done;
|
||||
memory_size = 0;
|
||||
reg = DEBUG_DUMP_START_REG;
|
||||
|
@ -2042,7 +2112,7 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle)
|
|||
PRINTM(MMSG, "Start %s output %u.%06u, please wait...\n",
|
||||
mem_type_mapping_tbl[idx].mem_name, sec, usec);
|
||||
do {
|
||||
stat = woal_pcie_rdwr_firmware(phandle, doneflag);
|
||||
stat = woal_pcie_rdwr_firmware(phandle, doneflag, 0);
|
||||
if (RDWR_STATUS_FAILURE == stat)
|
||||
goto done;
|
||||
|
||||
|
@ -2133,7 +2203,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
|
|||
IS_PCIE9097(phandle->card_type)) {
|
||||
if (phandle->event_fw_dump) {
|
||||
if (RDWR_STATUS_FAILURE !=
|
||||
woal_pcie_rdwr_firmware(phandle, doneflag)) {
|
||||
woal_pcie_rdwr_firmware(phandle, doneflag, 0)) {
|
||||
PRINTM(MMSG,
|
||||
"====PCIE FW DUMP EVENT MODE START ====\n");
|
||||
return;
|
||||
|
@ -2147,7 +2217,8 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
|
|||
PRINTM(MMSG, "====PCIE DEBUG MODE OUTPUT START: %u.%06u ====\n", sec,
|
||||
usec);
|
||||
/* read the number of the memories which will dump */
|
||||
if (RDWR_STATUS_FAILURE == woal_pcie_rdwr_firmware(phandle, doneflag))
|
||||
if (RDWR_STATUS_FAILURE ==
|
||||
woal_pcie_rdwr_firmware(phandle, doneflag, 0))
|
||||
goto done;
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
|
@ -2186,7 +2257,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
|
|||
PRINTM(MMSG, "Start %s output %u.%06u, please wait...\n",
|
||||
mem_type_mapping_tbl->mem_name, sec, usec);
|
||||
do {
|
||||
stat = woal_pcie_rdwr_firmware(phandle, doneflag);
|
||||
stat = woal_pcie_rdwr_firmware(phandle, doneflag, 0);
|
||||
if (RDWR_STATUS_FAILURE == stat)
|
||||
goto done;
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ Change log:
|
|||
#define PCIEUARTNW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieuartnw62x_combo.bin"
|
||||
#define PCIEUSBNW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbnw62x_combo.bin"
|
||||
#define PCIENW62X_DEFAULT_WLAN_FW_NAME "nxp/pcienw62x_wlan.bin"
|
||||
#endif /* PCIE8997 */
|
||||
#endif /* PCIENW62X */
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
#define PCIE_NUM_MSIX_VECTORS 32
|
||||
|
|
|
@ -89,6 +89,7 @@ static int woal_info_proc_read(struct seq_file *sfp, void *data)
|
|||
struct net_device *netdev = (struct net_device *)sfp->private;
|
||||
char fmt[MLAN_MAX_VER_STR_LEN];
|
||||
moal_private *priv = (moal_private *)netdev_priv(netdev);
|
||||
mlan_fw_info fw_info;
|
||||
#ifdef STA_SUPPORT
|
||||
int i = 0;
|
||||
moal_handle *handle = NULL;
|
||||
|
@ -113,6 +114,8 @@ static int woal_info_proc_read(struct seq_file *sfp, void *data)
|
|||
t_u8 c[4];
|
||||
} ver;
|
||||
|
||||
fw_info.uuid_lo = fw_info.uuid_hi = 0x0ULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (priv == NULL)
|
||||
|
@ -162,6 +165,11 @@ static int woal_info_proc_read(struct seq_file *sfp, void *data)
|
|||
ver.l = handle->fw_release_number;
|
||||
seq_printf(sfp, "firmware_major_version=%u.%u.%u\n", ver.c[2], ver.c[1],
|
||||
ver.c[0]);
|
||||
|
||||
woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info);
|
||||
if (fw_info.uuid_lo || fw_info.uuid_hi)
|
||||
seq_printf(sfp, "uuid = %llx%llx\n", fw_info.uuid_lo,
|
||||
fw_info.uuid_hi);
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_WIFIDIRECT) {
|
||||
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA)
|
||||
|
@ -531,18 +539,14 @@ static ssize_t woal_config_write(struct file *f, const char __user *buf,
|
|||
if (ref_handle) {
|
||||
priv = woal_get_priv(ref_handle, MLAN_BSS_ROLE_ANY);
|
||||
if (priv) {
|
||||
#ifdef DEBUG_LEVEL1
|
||||
drvdbg &= ~MFW_D;
|
||||
#endif
|
||||
handle->fw_dump_status = MTRUE;
|
||||
woal_mlan_debug_info(priv);
|
||||
woal_moal_debug_info(priv, NULL, MFALSE);
|
||||
}
|
||||
}
|
||||
priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY);
|
||||
if (priv) {
|
||||
#ifdef DEBUG_LEVEL1
|
||||
drvdbg &= ~MFW_D;
|
||||
#endif
|
||||
handle->fw_dump_status = MTRUE;
|
||||
woal_mlan_debug_info(priv);
|
||||
woal_moal_debug_info(priv, NULL, MFALSE);
|
||||
handle->ops.dump_fw_info(handle);
|
||||
|
|
|
@ -159,10 +159,10 @@ Change log:
|
|||
#define SD9177_DEFAULT_COMBO_FW_NAME "nxp/sdsd_nw61x.bin"
|
||||
#define SD9177_DEFAULT_COMBO_V1_FW_NAME "nxp/sduart_nw61x_v1.bin"
|
||||
#define SDUART9177_DEFAULT_COMBO_FW_NAME "nxp/sduart_nw61x.bin"
|
||||
#define SDSD9177_DEFAULT_COMBO_FW_NAME "sdsd_nw61x.bin"
|
||||
#define SDSD9177_DEFAULT_COMBO_FW_NAME "nxp/sdsd_nw61x.bin"
|
||||
#define SD9177_DEFAULT_WLAN_FW_NAME "nxp/sd_w61x.bin"
|
||||
#define SDUART9177_DEFAULT_COMBO_V1_FW_NAME "nxp/sduart_nw61x_v1.bin"
|
||||
#define SDSD9177_DEFAULT_COMBO_V1_FW_NAME "sdsd_nw61x_v1.bin"
|
||||
#define SDSD9177_DEFAULT_COMBO_V1_FW_NAME "nxp/sdsd_nw61x_v1.bin"
|
||||
#define SD9177_DEFAULT_WLAN_V1_FW_NAME "nxp/sd_w61x_v1.bin"
|
||||
#endif /* SD9177 */
|
||||
|
||||
|
|
|
@ -95,7 +95,7 @@ static moal_if_ops sdiommc_ops;
|
|||
#endif
|
||||
#ifdef SDNW62X
|
||||
/** Device ID for SDNW62X */
|
||||
#define SD_DEVICE_ID_NW62X (0x020C)
|
||||
#define SD_DEVICE_ID_NW62X (0x020D)
|
||||
#endif
|
||||
|
||||
/** WLAN IDs */
|
||||
|
@ -1184,14 +1184,21 @@ static void woal_sdiommc_unregister_dev(moal_handle *handle)
|
|||
ENTER();
|
||||
if (handle->card) {
|
||||
struct sdio_mmc_card *card = handle->card;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
|
||||
struct sdio_func *func = card->func;
|
||||
|
||||
#endif
|
||||
/* Release the SDIO IRQ */
|
||||
sdio_claim_host(card->func);
|
||||
sdio_release_irq(card->func);
|
||||
sdio_disable_func(card->func);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
|
||||
if (handle->driver_status)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
|
||||
mmc_hw_reset(func->card);
|
||||
#else
|
||||
mmc_hw_reset(func->card->host);
|
||||
#endif
|
||||
#endif
|
||||
sdio_release_host(card->func);
|
||||
|
||||
sdio_set_drvdata(card->func, NULL);
|
||||
|
@ -1553,7 +1560,7 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
|
|||
switch (revision_id) {
|
||||
case SD9177_A0:
|
||||
if (magic == CHIP_MAGIC_VALUE) {
|
||||
if (strap == CARD_TYPE_SD_UART)
|
||||
if (strap == CARD_TYPE_SD9177_UART)
|
||||
strcpy(handle->card_info->fw_name,
|
||||
SDUART9177_DEFAULT_COMBO_FW_NAME);
|
||||
else
|
||||
|
@ -1565,7 +1572,7 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
|
|||
break;
|
||||
case SD9177_A1:
|
||||
if (magic == CHIP_MAGIC_VALUE) {
|
||||
if (strap == CARD_TYPE_SD_UART)
|
||||
if (strap == CARD_TYPE_SD9177_UART)
|
||||
strcpy(handle->card_info->fw_name,
|
||||
SDUART9177_DEFAULT_COMBO_V1_FW_NAME);
|
||||
else
|
||||
|
|
|
@ -101,8 +101,9 @@ extern int wifi_status;
|
|||
mlan_status moal_malloc(t_void *pmoal, t_u32 size, t_u32 flag, t_u8 **ppbuf)
|
||||
{
|
||||
moal_handle *handle = (moal_handle *)pmoal;
|
||||
gfp_t mem_flag =
|
||||
(in_interrupt() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;
|
||||
gfp_t mem_flag = (in_interrupt() || in_atomic() || irqs_disabled()) ?
|
||||
GFP_ATOMIC :
|
||||
GFP_KERNEL;
|
||||
|
||||
#ifdef USB
|
||||
if (!IS_USB(handle->card_type))
|
||||
|
@ -208,8 +209,13 @@ mlan_status moal_malloc_consistent(t_void *pmoal, t_u32 size, t_u8 **ppbuf,
|
|||
if (!card)
|
||||
return MLAN_STATUS_FAILURE;
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
|
||||
*ppbuf = (t_u8 *)dma_alloc_coherent(&card->dev->dev, size,
|
||||
(dma_addr_t *)&dma, GFP_KERNEL);
|
||||
#else
|
||||
*ppbuf = (t_u8 *)pci_alloc_consistent(card->dev, size,
|
||||
(dma_addr_t *)&dma);
|
||||
#endif
|
||||
if (*ppbuf == NULL) {
|
||||
PRINTM(MERROR,
|
||||
"%s: allocate consistent memory (%d bytes) failed!\n",
|
||||
|
@ -268,9 +274,12 @@ mlan_status moal_map_memory(t_void *pmoal, t_u8 *pbuf, t_u64 *pbuf_pa,
|
|||
if (!card)
|
||||
return MLAN_STATUS_FAILURE;
|
||||
|
||||
/* Init memory to device */
|
||||
/* Init memory to device */
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
|
||||
dma = dma_map_single(&card->dev->dev, pbuf, size, flag);
|
||||
if (dma_mapping_error(&card->dev->dev, dma)) {
|
||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
|
||||
dma = pci_map_single(card->dev, pbuf, size, flag);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
|
||||
if (pci_dma_mapping_error(card->dev, dma)) {
|
||||
#else
|
||||
if (pci_dma_mapping_error(dma)) {
|
||||
|
@ -500,8 +509,9 @@ mlan_status moal_init_timer(t_void *pmoal, t_void **pptimer,
|
|||
t_void *pcontext)
|
||||
{
|
||||
moal_drv_timer *timer = NULL;
|
||||
gfp_t mem_flag =
|
||||
(in_interrupt() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;
|
||||
gfp_t mem_flag = (in_interrupt() || in_atomic() || irqs_disabled()) ?
|
||||
GFP_ATOMIC :
|
||||
GFP_KERNEL;
|
||||
|
||||
timer = kmalloc(sizeof(moal_drv_timer), mem_flag);
|
||||
if (timer == NULL)
|
||||
|
@ -1139,25 +1149,27 @@ mlan_status moal_send_packet_complete(t_void *pmoal, pmlan_buffer pmbuf,
|
|||
}
|
||||
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
|
||||
index = skb_get_queue_mapping(skb);
|
||||
if(index < 4)
|
||||
{
|
||||
if (index < 4) {
|
||||
atomic_dec(&handle->tx_pending);
|
||||
if (atomic_dec_return(
|
||||
&priv->wmm_tx_pending[index]) ==
|
||||
LOW_TX_PENDING) {
|
||||
&priv->wmm_tx_pending[index]) ==
|
||||
LOW_TX_PENDING) {
|
||||
struct netdev_queue *txq =
|
||||
netdev_get_tx_queue(
|
||||
priv->netdev, index);
|
||||
if (netif_tx_queue_stopped(txq)) {
|
||||
netif_tx_wake_queue(txq);
|
||||
priv->netdev,
|
||||
index);
|
||||
if (netif_tx_queue_stopped(
|
||||
txq)) {
|
||||
netif_tx_wake_queue(
|
||||
txq);
|
||||
PRINTM(MINFO,
|
||||
"Wakeup Kernel Queue:%d\n",
|
||||
index);
|
||||
"Wakeup Kernel Queue:%d\n",
|
||||
index);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
PRINTM(MERROR,"Wakeup invalid Kernel Queue\n");
|
||||
} else {
|
||||
PRINTM(MERROR,
|
||||
"Invalid queue index for skb\n");
|
||||
}
|
||||
#else /*#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)*/
|
||||
if (atomic_dec_return(&handle->tx_pending) <
|
||||
|
@ -1513,7 +1525,8 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle,
|
|||
/** Antenna */
|
||||
rth->body.antenna_signal = -(rt_info.nf - rt_info.snr);
|
||||
rth->body.antenna_noise = -rt_info.nf;
|
||||
rth->body.antenna = rt_info.antenna;
|
||||
/* Convert FW antenna value to radiotap spec */
|
||||
rth->body.antenna = (t_u16)rt_info.antenna >> 1;
|
||||
/** MCS */
|
||||
if (format == MLAN_RATE_FORMAT_HT) {
|
||||
rth->hdr.it_present |= cpu_to_le32(
|
||||
|
@ -1594,10 +1607,10 @@ static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle,
|
|||
/** PARTIAL_AID */
|
||||
/** TODO: Not support now */
|
||||
/** mcs_nss */
|
||||
rth->body.u.vht.mcs_nss[0] =
|
||||
(vht_sig2 & (0xF0)) >> 4;
|
||||
rth->body.u.vht.mcs_nss[0] = vht_sig2 & (0xF0);
|
||||
/* Convert FW NSS value to radiotap spec */
|
||||
rth->body.u.vht.mcs_nss[0] |=
|
||||
(vht_sig1 & (0x1C00)) >> (10 - 4);
|
||||
((vht_sig1 & (0x1C00)) >> 10) + 1;
|
||||
/** coding */
|
||||
if (vht_sig2 & MBIT(2))
|
||||
rth->body.u.vht.coding |=
|
||||
|
@ -1741,7 +1754,12 @@ mlan_status moal_recv_amsdu_packet(t_void *pmoal, pmlan_buffer pmbuf)
|
|||
frame->dev = netdev;
|
||||
frame->priority = skb->priority;
|
||||
payload = frame->data;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
|
||||
if (ether_addr_equal(payload, rfc1042_eth_hdr)) {
|
||||
#else
|
||||
if (!memcmp(payload, rfc1042_eth_hdr,
|
||||
sizeof(rfc1042_eth_hdr))) {
|
||||
#endif
|
||||
/* Remove RFC1042 */
|
||||
skb_pull(frame, 6);
|
||||
memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN);
|
||||
|
@ -2191,6 +2209,7 @@ void moal_connection_status_check_pmqos(t_void *pmoal)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
|
||||
/**
|
||||
|
@ -2224,6 +2243,7 @@ static void woal_rx_mgmt_pkt_event(moal_private *priv, t_u8 *pkt, t_u16 len)
|
|||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief This function handles event receive
|
||||
|
@ -2288,7 +2308,9 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
t_u8 event_buf[64];
|
||||
t_u8 radar_chan;
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
moal_private *cfg_priv = NULL;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
t_u8 auto_fw_dump = MFALSE;
|
||||
|
@ -2760,13 +2782,25 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
#if CFG80211_VERSION_CODE > KERNEL_VERSION(2, 6, 35)
|
||||
if (IS_STA_CFG80211(cfg80211_wext)) {
|
||||
struct cfg80211_bss *bss = NULL;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
|
||||
bss = cfg80211_get_bss(priv->wdev->wiphy, NULL,
|
||||
priv->cfg_bssid, NULL, 0,
|
||||
IEEE80211_BSS_TYPE_ESS,
|
||||
IEEE80211_PRIVACY_ANY);
|
||||
|
||||
#else
|
||||
bss = cfg80211_get_bss(priv->wdev->wiphy, NULL,
|
||||
priv->cfg_bssid, NULL, 0,
|
||||
WLAN_CAPABILITY_ESS,
|
||||
WLAN_CAPABILITY_ESS);
|
||||
#endif
|
||||
if (bss) {
|
||||
cfg80211_unlink_bss(priv->wdev->wiphy, bss);
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
cfg80211_put_bss(priv->wdev->wiphy, bss);
|
||||
#else
|
||||
cfg80211_put_bss(bss);
|
||||
#endif
|
||||
}
|
||||
if (!hw_test && priv->roaming_enabled)
|
||||
woal_config_bgscan_and_rssi(priv, MFALSE);
|
||||
|
@ -3052,15 +3086,6 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
CUS_EVT_RADAR_DETECTED, radar_chan);
|
||||
woal_broadcast_event(priv, event_buf, strlen(event_buf));
|
||||
PRINTM(MEVENT, "Radar detected on channel %d\n", radar_chan);
|
||||
if ((priv->target_chan && priv->bss_started &&
|
||||
(priv->target_chan != radar_chan)) ||
|
||||
priv->backup_chan) {
|
||||
PRINTM(MEVENT, "Move to target or backup chan %d %d\n",
|
||||
priv->target_chan, priv->backup_chan);
|
||||
woal_move_to_next_channel(priv);
|
||||
priv->target_chan = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
|
@ -3070,6 +3095,17 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
if (cfg_priv) {
|
||||
woal_update_channel_dfs_state(radar_chan,
|
||||
DFS_UNAVAILABLE);
|
||||
#ifdef UAP_SUPPORT
|
||||
if ((priv->target_chan && priv->bss_started &&
|
||||
(priv->target_chan != radar_chan)) ||
|
||||
priv->backup_chan) {
|
||||
PRINTM(MEVENT,
|
||||
"Move to target or backup chan %d %d\n",
|
||||
priv->target_chan, priv->backup_chan);
|
||||
woal_move_to_next_channel(priv);
|
||||
priv->target_chan = 0;
|
||||
break;
|
||||
}
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_DFS) {
|
||||
woal_chan_event(priv, WOAL_EVENT_RADAR,
|
||||
priv->chan_rpt_req.chanNum,
|
||||
|
@ -3077,6 +3113,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (priv->phandle->is_cac_timer_set) {
|
||||
if (priv->bss_index == priv->phandle->cac_bss_index) {
|
||||
PRINTM(MEVENT, "radar detected during CAC \n");
|
||||
|
@ -3093,9 +3130,10 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
NL80211_RADAR_CAC_ABORTED,
|
||||
GFP_KERNEL);
|
||||
#else
|
||||
cfg80211_cac_event(priv->netdev,
|
||||
NL80211_RADAR_CAC_ABORTED,
|
||||
GFP_KERNEL);
|
||||
cfg80211_cac_event(
|
||||
priv->netdev,
|
||||
NL80211_RADAR_CAC_ABORTED,
|
||||
GFP_KERNEL);
|
||||
#endif
|
||||
cfg80211_radar_event(
|
||||
priv->wdev->wiphy,
|
||||
|
@ -3378,12 +3416,14 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
PRINTM(MEVENT,
|
||||
"FW_REMAIN_ON_CHANNEL_EXPIRED cookie = %#llx\n",
|
||||
priv->phandle->cookie);
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (priv->host_mlme &&
|
||||
(priv->auth_flag & HOST_MLME_AUTH_PENDING)) {
|
||||
priv->auth_flag = 0;
|
||||
priv->host_mlme = MFALSE;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
}
|
||||
#endif
|
||||
priv->phandle->remain_on_channel = MFALSE;
|
||||
if (priv->phandle->cookie &&
|
||||
!priv->phandle->is_remain_timer_set) {
|
||||
|
@ -3420,12 +3460,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
moal_memcpy_ext(priv->phandle, addr,
|
||||
pmevent->event_buf, ETH_ALEN,
|
||||
ETH_ALEN);
|
||||
/** these field add in kernel 3.2, but some
|
||||
* kernel do have the pacth to support it,
|
||||
* like T3T and pxa978T 3.0.31 JB, these
|
||||
* patch are needed to support
|
||||
* wpa_supplicant 2.x */
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 31)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
|
||||
if (pmevent->event_len > ETH_ALEN) {
|
||||
#if CFG80211_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
|
||||
/* set station info filled flag */
|
||||
|
|
|
@ -275,6 +275,7 @@ static int woal_cfg80211_add_station(struct wiphy *wiphy,
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
|
||||
static int woal_cfg80211_deauthenticate(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct cfg80211_deauth_request *req);
|
||||
|
@ -282,6 +283,7 @@ static int woal_cfg80211_deauthenticate(struct wiphy *wiphy,
|
|||
static int woal_cfg80211_disassociate(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct cfg80211_disassoc_request *req);
|
||||
#endif
|
||||
|
||||
/** cfg80211 operations */
|
||||
static struct cfg80211_ops woal_cfg80211_ops = {
|
||||
|
@ -292,8 +294,10 @@ static struct cfg80211_ops woal_cfg80211_ops = {
|
|||
#endif
|
||||
.connect = woal_cfg80211_connect,
|
||||
.disconnect = woal_cfg80211_disconnect,
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
|
||||
.deauth = woal_cfg80211_deauthenticate,
|
||||
.disassoc = woal_cfg80211_disassociate,
|
||||
#endif
|
||||
.get_station = woal_cfg80211_get_station,
|
||||
.dump_station = woal_cfg80211_dump_station,
|
||||
.dump_survey = woal_cfg80211_dump_survey,
|
||||
|
@ -1833,7 +1837,8 @@ woal_cfg80211_connect_scan(moal_private *priv,
|
|||
if (conn_param->channel) {
|
||||
scan_req->chan_list[0].chan_number =
|
||||
conn_param->channel->hw_value;
|
||||
scan_req->chan_list[0].radio_type = conn_param->channel->band;
|
||||
scan_req->chan_list[0].radio_type =
|
||||
woal_ieee_band_to_radio_type(conn_param->channel->band);
|
||||
if (conn_param->channel->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
|
@ -1853,7 +1858,8 @@ woal_cfg80211_connect_scan(moal_private *priv,
|
|||
ch = &sband->channels[i];
|
||||
if (ch->flags & IEEE80211_CHAN_DISABLED)
|
||||
continue;
|
||||
scan_req->chan_list[chan_idx].radio_type = band;
|
||||
scan_req->chan_list[chan_idx].radio_type =
|
||||
woal_ieee_band_to_radio_type(band);
|
||||
if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
|
@ -2023,7 +2029,8 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
|
|||
if (req->bss->channel) {
|
||||
scan_req->chan_list[0].chan_number =
|
||||
req->bss->channel->hw_value;
|
||||
scan_req->chan_list[0].radio_type = req->bss->channel->band;
|
||||
scan_req->chan_list[0].radio_type =
|
||||
woal_ieee_band_to_radio_type(req->bss->channel->band);
|
||||
if (req->bss->channel->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
|
@ -2043,7 +2050,8 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
|
|||
ch = &sband->channels[i];
|
||||
if (ch->flags & IEEE80211_CHAN_DISABLED)
|
||||
continue;
|
||||
scan_req->chan_list[chan_idx].radio_type = band;
|
||||
scan_req->chan_list[chan_idx].radio_type =
|
||||
woal_ieee_band_to_radio_type(band);
|
||||
if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
|
@ -2539,25 +2547,30 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
|
|||
->assoc_req_buf;
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
|
||||
|
||||
mutex_lock(&priv->wdev->mtx);
|
||||
cfg80211_rx_assoc_resp(
|
||||
priv->netdev, bss,
|
||||
assoc_info->assoc_resp_buf,
|
||||
assoc_info->assoc_resp_len, -1,
|
||||
assoc_req_buf,
|
||||
assoc_info->assoc_req_len);
|
||||
mutex_unlock(&priv->wdev->mtx);
|
||||
#else
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)
|
||||
mutex_lock(&priv->wdev->mtx);
|
||||
cfg80211_rx_assoc_resp(
|
||||
priv->netdev, bss,
|
||||
assoc_info->assoc_resp_buf,
|
||||
assoc_info->assoc_resp_len, -1);
|
||||
mutex_unlock(&priv->wdev->mtx);
|
||||
#else
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
|
||||
mutex_lock(&priv->wdev->mtx);
|
||||
cfg80211_rx_assoc_resp(
|
||||
priv->netdev, bss,
|
||||
assoc_info->assoc_resp_buf,
|
||||
assoc_info->assoc_resp_len);
|
||||
mutex_unlock(&priv->wdev->mtx);
|
||||
#else
|
||||
cfg80211_send_rx_assoc(
|
||||
priv->netdev, bss,
|
||||
|
@ -3961,6 +3974,7 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
|
|||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
char *reg_alpha2 = NULL;
|
||||
#endif
|
||||
t_u8 dfs_region = NXP_DFS_UNKNOWN;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -3974,16 +3988,19 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
|
|||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)
|
||||
dfs_region = request->dfs_region;
|
||||
#endif
|
||||
PRINTM(MCMND,
|
||||
"cfg80211 regulatory domain callback "
|
||||
"%c%c initiator=%d dfs_region=%d\n",
|
||||
request->alpha2[0], request->alpha2[1], request->initiator,
|
||||
request->dfs_region);
|
||||
dfs_region);
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
if (!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED))
|
||||
#endif
|
||||
handle->dfs_region = request->dfs_region;
|
||||
handle->dfs_region = dfs_region;
|
||||
|
||||
memset(&fw_info, 0, sizeof(mlan_fw_info));
|
||||
woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info);
|
||||
|
@ -4008,8 +4025,7 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
|
|||
region[2] = ' ';
|
||||
if ((handle->country_code[0] != request->alpha2[0]) ||
|
||||
(handle->country_code[1] != request->alpha2[1])) {
|
||||
if (handle->params.cntry_txpwr &&
|
||||
!handle->params.txpwrlimit_cfg) {
|
||||
if (handle->params.cntry_txpwr) {
|
||||
t_u8 country_code[COUNTRY_CODE_LEN];
|
||||
handle->country_code[0] = request->alpha2[0];
|
||||
handle->country_code[1] = request->alpha2[1];
|
||||
|
@ -4280,8 +4296,8 @@ static int woal_find_wps_ie_in_probereq(const t_u8 *ie, int len)
|
|||
}
|
||||
|
||||
#ifdef UAP_CFG80211
|
||||
/** scan result expired value */
|
||||
#define SCAN_RESULT_EXPIRTED 1
|
||||
/** scan result expired value */
|
||||
/**
|
||||
* @brief check if the scan result expired
|
||||
*
|
||||
|
@ -4512,7 +4528,8 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
|
|||
i++) {
|
||||
chan = priv->phandle->scan_request->channels[i];
|
||||
scan_req->chan_list[i].chan_number = chan->hw_value;
|
||||
scan_req->chan_list[i].radio_type = chan->band;
|
||||
scan_req->chan_list[i].radio_type =
|
||||
woal_ieee_band_to_radio_type(chan->band);
|
||||
if ((chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) ||
|
||||
!priv->phandle->scan_request->n_ssids)
|
||||
scan_req->chan_list[i].scan_type =
|
||||
|
@ -5380,6 +5397,7 @@ static int woal_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
|
||||
/**
|
||||
* @brief This function is deauthentication handler when host MLME
|
||||
* enable.
|
||||
|
@ -5399,6 +5417,9 @@ static int woal_cfg80211_deauthenticate(struct wiphy *wiphy,
|
|||
struct cfg80211_deauth_request *req)
|
||||
{
|
||||
int ret = 0;
|
||||
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 11, 0)
|
||||
moal_private *pmpriv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
if (priv->host_mlme) {
|
||||
|
@ -5413,9 +5434,9 @@ static int woal_cfg80211_deauthenticate(struct wiphy *wiphy,
|
|||
|
||||
ret = woal_cfg80211_disconnect(wiphy, dev, req->reason_code);
|
||||
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 11, 0)
|
||||
if (priv->wdev->iftype == NL80211_IFTYPE_STATION ||
|
||||
priv->wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)
|
||||
cfg80211_disconnected(priv->netdev, 0, NULL, 0, GFP_KERNEL);
|
||||
if (pmpriv->wdev->iftype == NL80211_IFTYPE_STATION ||
|
||||
pmpriv->wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)
|
||||
cfg80211_disconnected(pmpriv->netdev, 0, NULL, 0, GFP_KERNEL);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
@ -5438,6 +5459,9 @@ static int woal_cfg80211_disassociate(struct wiphy *wiphy,
|
|||
struct cfg80211_disassoc_request *req)
|
||||
{
|
||||
int ret = 0;
|
||||
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 11, 0)
|
||||
moal_private *pmpriv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
if (priv->host_mlme) {
|
||||
|
@ -5452,12 +5476,13 @@ static int woal_cfg80211_disassociate(struct wiphy *wiphy,
|
|||
|
||||
ret = woal_cfg80211_disconnect(wiphy, dev, req->reason_code);
|
||||
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 11, 0)
|
||||
if (priv->wdev->iftype == NL80211_IFTYPE_STATION ||
|
||||
priv->wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)
|
||||
cfg80211_disconnected(priv->netdev, 0, NULL, 0, GFP_KERNEL);
|
||||
if (pmpriv->wdev->iftype == NL80211_IFTYPE_STATION ||
|
||||
pmpriv->wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)
|
||||
cfg80211_disconnected(pmpriv->netdev, 0, NULL, 0, GFP_KERNEL);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Request the driver to get the station information
|
||||
|
@ -5939,10 +5964,8 @@ int woal_cfg80211_remain_on_channel_cfg(moal_private *priv, t_u8 wait_option,
|
|||
return -EBUSY;
|
||||
}
|
||||
#endif
|
||||
if (chan->band == IEEE80211_BAND_2GHZ)
|
||||
chan_cfg.bandcfg.chanBand = BAND_2GHZ;
|
||||
else if (chan->band == IEEE80211_BAND_5GHZ)
|
||||
chan_cfg.bandcfg.chanBand = BAND_5GHZ;
|
||||
chan_cfg.bandcfg.chanBand =
|
||||
woal_ieee_band_to_radio_type(chan->band);
|
||||
switch (channel_type) {
|
||||
case CHAN_HT40MINUS:
|
||||
chan_cfg.bandcfg.chan2Offset = SEC_CHAN_BELOW;
|
||||
|
@ -6298,13 +6321,13 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)
|
||||
PRINTM(MIOCTL,
|
||||
"%s sched scan: n_ssids=%d n_match_sets=%d n_channels=%d interval=%d ie_len=%d\n",
|
||||
PRINTM(MCMND,
|
||||
"%s sched scan: n_ssids=%d n_match_sets=%d n_channels=%d interval=%d iterations=%d ie_len=%d\n",
|
||||
priv->netdev->name, request->n_ssids, request->n_match_sets,
|
||||
request->n_channels, request->scan_plans[0].interval,
|
||||
(int)request->ie_len);
|
||||
request->scan_plans[0].iterations, (int)request->ie_len);
|
||||
#else
|
||||
PRINTM(MIOCTL,
|
||||
PRINTM(MCMND,
|
||||
"%s sched scan: n_ssids=%d n_match_sets=%d n_channels=%d interval=%d ie_len=%d\n",
|
||||
priv->netdev->name, request->n_ssids, request->n_match_sets,
|
||||
request->n_channels, request->interval, (int)request->ie_len);
|
||||
|
@ -6326,7 +6349,8 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev,
|
|||
i++) {
|
||||
chan = request->channels[i];
|
||||
priv->scan_cfg.chan_list[i].chan_number = chan->hw_value;
|
||||
priv->scan_cfg.chan_list[i].radio_type = chan->band;
|
||||
priv->scan_cfg.chan_list[i].radio_type =
|
||||
woal_ieee_band_to_radio_type(chan->band);
|
||||
if (chan->flags &
|
||||
(IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_RADAR))
|
||||
priv->scan_cfg.chan_list[i].scan_type =
|
||||
|
@ -6368,10 +6392,14 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev,
|
|||
* second */
|
||||
/* We want to use 30 second for per scan cycle */
|
||||
priv->scan_cfg.scan_interval = MIN_BGSCAN_INTERVAL;
|
||||
priv->scan_cfg.repeat_count = 0;
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)
|
||||
if (request->scan_plans[0].interval * 1000 > MIN_BGSCAN_INTERVAL)
|
||||
/* interval in seconds */
|
||||
if (request->scan_plans[0].interval)
|
||||
priv->scan_cfg.scan_interval =
|
||||
request->scan_plans[0].interval * 1000;
|
||||
priv->scan_cfg.repeat_count = request->scan_plans[0].iterations;
|
||||
if (request->n_scan_plans >= 2) {
|
||||
priv->scan_cfg.config_ees = MTRUE;
|
||||
priv->scan_cfg.ees_mode =
|
||||
|
@ -6380,24 +6408,23 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev,
|
|||
request->scan_plans[0].interval * 1000;
|
||||
priv->scan_cfg.high_period_count =
|
||||
request->scan_plans[0].iterations;
|
||||
priv->scan_cfg.mid_period = request->scan_plans[1].interval;
|
||||
if (request->scan_plans[1].iterations == 0)
|
||||
priv->scan_cfg.mid_period_count = DEF_REPEAT_COUNT;
|
||||
else
|
||||
priv->scan_cfg.mid_period_count =
|
||||
request->scan_plans[1].iterations;
|
||||
priv->scan_cfg.mid_period =
|
||||
request->scan_plans[1].interval * 1000;
|
||||
priv->scan_cfg.mid_period_count =
|
||||
request->scan_plans[1].iterations;
|
||||
if (request->n_scan_plans == 3) {
|
||||
priv->scan_cfg.ees_mode |= MBIT(EES_MODE_LOW);
|
||||
priv->scan_cfg.low_period =
|
||||
request->scan_plans[2].interval;
|
||||
priv->scan_cfg.low_period_count = DEF_REPEAT_COUNT;
|
||||
request->scan_plans[2].interval * 1000;
|
||||
priv->scan_cfg.low_period_count =
|
||||
request->scan_plans[2].iterations;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (request->interval > MIN_BGSCAN_INTERVAL)
|
||||
/* interval in miliseconds */
|
||||
if (request->interval)
|
||||
priv->scan_cfg.scan_interval = request->interval;
|
||||
#endif
|
||||
priv->scan_cfg.repeat_count = DEF_REPEAT_COUNT;
|
||||
priv->scan_cfg.report_condition =
|
||||
BG_SCAN_SSID_MATCH | BG_SCAN_WAIT_ALL_CHAN_DONE;
|
||||
priv->scan_cfg.bss_type = MLAN_BSS_MODE_INFRA;
|
||||
|
@ -6506,8 +6533,10 @@ int woal_cfg80211_resume(struct wiphy *wiphy)
|
|||
woal_inform_bss_from_scan_result(
|
||||
handle->priv[i], NULL,
|
||||
MOAL_IOCTL_WAIT);
|
||||
#if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE
|
||||
woal_report_sched_scan_result(
|
||||
handle->priv[i]);
|
||||
#endif
|
||||
handle->priv[i]->last_event = 0;
|
||||
PRINTM(MCMND,
|
||||
"Report sched scan result in cfg80211 resume\n");
|
||||
|
@ -8688,6 +8717,7 @@ void woal_clear_conn_params(moal_private *priv)
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
|
||||
/**
|
||||
* @brief Build new roaming connect ie for okc
|
||||
*
|
||||
|
@ -8829,6 +8859,7 @@ done:
|
|||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Start roaming: driver handle roaming
|
||||
|
@ -9498,6 +9529,7 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv,
|
|||
wiphy->bands[IEEE80211_BAND_5GHZ]);
|
||||
#endif
|
||||
}
|
||||
|
||||
kfree(req);
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)
|
||||
|
@ -9713,6 +9745,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
#endif
|
||||
priv->phandle->band = IEEE80211_BAND_5GHZ;
|
||||
}
|
||||
|
||||
/* Supported bands */
|
||||
if (fw_info.fw_bands & (BAND_B | BAND_G | BAND_GN | BAND_GAC)) {
|
||||
wiphy->bands[IEEE80211_BAND_2GHZ] =
|
||||
|
@ -9816,6 +9849,19 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
|
||||
wiphy->features |= NL80211_FEATURE_TDLS_CHANNEL_SWITCH;
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
#define WLAN_EXT_FEATURE_DFS_OFFLOAD 25
|
||||
if (moal_extflg_isset(priv->phandle, EXT_DFS_OFFLOAD)) {
|
||||
if (NUM_NL80211_EXT_FEATURES > WLAN_EXT_FEATURE_DFS_OFFLOAD) {
|
||||
PRINTM(MCMND,
|
||||
"wlan: Set NL80211_EXT_FEATURE_DFS_OFFLOAD\n");
|
||||
wiphy_ext_feature_set(wiphy,
|
||||
WLAN_EXT_FEATURE_DFS_OFFLOAD);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
|
||||
if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME))
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM);
|
||||
|
@ -9899,6 +9945,14 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
PRINTM(MIOCTL, "Follow countryIE provided by AP.\n");
|
||||
}
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
|
||||
/*REGULATORY_IGNORE_STALE_KICKOFF: the regulatory core will _not_ make
|
||||
* sure all interfaces on this wiphy reside on allowed channels. If this
|
||||
* flag is not set, upon a regdomain change, the interfaces are given a
|
||||
* grace period (currently 60 seconds) to disconnect or move to an
|
||||
* allowed channel.*/
|
||||
wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF;
|
||||
#endif
|
||||
|
||||
memset(&priv->phandle->country_code, 0,
|
||||
sizeof(priv->phandle->country_code));
|
||||
|
@ -9938,9 +9992,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
wiphy->interface_modes &= ~(MBIT(NL80211_IFTYPE_MONITOR));
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
if (fw_info.force_reg ||
|
||||
(priv->phandle->params.txpwrlimit_cfg &&
|
||||
priv->phandle->params.cntry_txpwr == CNTRY_RGPOWER_MODE)) {
|
||||
if (fw_info.force_reg) {
|
||||
PRINTM(MCMND, "FW region_code=%d force_reg=%d\n",
|
||||
fw_info.region_code, fw_info.force_reg);
|
||||
country = region_code_2_string(fw_info.region_code);
|
||||
|
|
|
@ -2121,8 +2121,8 @@ int woal_11h_chan_dfs_state(moal_private *priv, t_u8 action,
|
|||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
if (action == MLAN_ACT_GET) {
|
||||
if (IS_UAP_CFG80211(cfg80211_wext)) {
|
||||
ret = woal_get_wiphy_chan_dfs_state(priv->wdev->wiphy,
|
||||
ch_dfs_state);
|
||||
ret = woal_get_wiphy_chan_dfs_state(
|
||||
priv->phandle->wiphy, ch_dfs_state);
|
||||
if (!ret) {
|
||||
LEAVE();
|
||||
return ret;
|
||||
|
@ -2208,11 +2208,11 @@ static int woal_uap_skip_cac(struct net_device *dev, struct ifreq *req)
|
|||
goto done;
|
||||
if (param.skip_cac && ch_dfs_state.dfs_state == DFS_USABLE)
|
||||
PRINTM(MMSG,
|
||||
"ZeroDFS: Requst skip cac on the channel %d which hasn't do CAC before!\n",
|
||||
"DFS: Requst skip cac on the channel %d which hasn't do CAC before!\n",
|
||||
param.channel);
|
||||
ch_dfs_state.dfs_state = dfs_state;
|
||||
woal_11h_chan_dfs_state(priv, MLAN_ACT_SET, &ch_dfs_state);
|
||||
PRINTM(MCMND, "ZeroDFS: Skip CAC on chan %d %d\n", param.channel,
|
||||
PRINTM(MCMND, "DFS: Skip CAC on chan %d %d\n", param.channel,
|
||||
param.skip_cac);
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
|
|
|
@ -138,8 +138,17 @@ static int woal_deauth_assoc_station(moal_private *priv, u8 *mac_addr,
|
|||
|
||||
for (i = 0; i < info->param.sta_list.sta_count; i++) {
|
||||
if (!memcmp(info->param.sta_list.info[i].mac_address, mac_addr,
|
||||
ETH_ALEN))
|
||||
ETH_ALEN)) {
|
||||
PRINTM(MMSG, "wlan: deauth station " MACSTR "\n",
|
||||
MAC2STR(mac_addr));
|
||||
ret = woal_deauth_station(priv, mac_addr, reason_code);
|
||||
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
|
||||
if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME))
|
||||
cfg80211_del_sta(priv->netdev, mac_addr,
|
||||
GFP_KERNEL);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
|
@ -673,11 +682,17 @@ static void woal_convert_chan_to_bandconfig(moal_private *priv,
|
|||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
if (chandef->chan->hw_value <= MAX_BG_CHANNEL)
|
||||
memset(bandcfg, 0, sizeof(Band_Config_t));
|
||||
switch (chandef->chan->band) {
|
||||
case NL80211_BAND_2GHZ:
|
||||
bandcfg->chanBand = BAND_2GHZ;
|
||||
else
|
||||
break;
|
||||
case NL80211_BAND_5GHZ:
|
||||
bandcfg->chanBand = BAND_5GHZ;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (chandef->width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
|
@ -700,10 +715,16 @@ static void woal_convert_chan_to_bandconfig(moal_private *priv,
|
|||
default:
|
||||
break;
|
||||
}
|
||||
PRINTM(MCMND,
|
||||
"cfg80211 AP: channel=%d, chanBand=0x%x chanWidth=0x%x chan2Offset=0x%x\n",
|
||||
chandef->chan->hw_value, bandcfg->chanBand, bandcfg->chanWidth,
|
||||
bandcfg->chan2Offset);
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
/**
|
||||
* @brief Enable radar detect for DFS channel
|
||||
*
|
||||
|
@ -851,8 +872,10 @@ static int woal_cfg80211_beacon_config(moal_private *priv,
|
|||
int GoAgeoutTime = priv->phandle->params.GoAgeoutTime;
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
mlan_ds_11h_chan_nop_info chan_nop_info;
|
||||
Band_Config_t bandcfg;
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
mlan_ds_11h_chan_nop_info chan_nop_info;
|
||||
#endif
|
||||
ENTER();
|
||||
|
||||
|
@ -955,12 +978,14 @@ static int woal_cfg80211_beacon_config(moal_private *priv,
|
|||
sizeof(struct cfg80211_chan_def), sizeof(priv->chan));
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
woal_convert_chan_to_bandconfig(priv, &bandcfg, ¶ms->chandef);
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
if (priv->phandle->usr_nop_period_sec) {
|
||||
PRINTM(MCMND, "Checking if AP's channel %d is under NOP\n",
|
||||
priv->channel);
|
||||
woal_convert_chan_to_bandconfig(priv, &bandcfg,
|
||||
¶ms->chandef);
|
||||
memset(&chan_nop_info, 0, sizeof(chan_nop_info));
|
||||
chan_nop_info.curr_chan = priv->channel;
|
||||
chan_nop_info.chan_width = bandcfg.chanWidth;
|
||||
|
@ -1088,6 +1113,11 @@ static int woal_cfg80211_beacon_config(moal_private *priv,
|
|||
params->head_len, params->tail,
|
||||
params->tail_len);
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
moal_memcpy_ext(priv->phandle, &sys_config->bandcfg, &bandcfg,
|
||||
sizeof(bandcfg), sizeof(bandcfg));
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
enable_11ac = woal_check_11ac_capability(
|
||||
priv, sys_config->bandcfg.chanBand, params);
|
||||
|
@ -1295,7 +1325,7 @@ static int woal_cfg80211_beacon_config(moal_private *priv,
|
|||
(priv->cipher == WLAN_CIPHER_SUITE_WEP104)) {
|
||||
sys_config->protocol = PROTOCOL_STATIC_WEP;
|
||||
sys_config->key_mgmt = KEY_MGMT_NONE;
|
||||
sys_config->.wpa_cfg.length = 0;
|
||||
sys_config->wpa_cfg.length = 0;
|
||||
moal_memcpy_ext(priv->phandle, &sys_config->wep_cfg.key0,
|
||||
&priv->uap_wep_key[0], sizeof(wep_key),
|
||||
sizeof(sys_config->wep_cfg.key0));
|
||||
|
@ -2825,6 +2855,11 @@ int woal_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
|
|||
if (moal_extflg_isset(priv->phandle, EXT_DFS_OFFLOAD))
|
||||
woal_cancel_cac_block(priv);
|
||||
#endif
|
||||
if (priv->media_connected == MFALSE) {
|
||||
PRINTM(MINFO, "cfg80211: Media not connected!\n");
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
|
||||
if (param) {
|
||||
|
@ -2832,23 +2867,10 @@ int woal_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
|
|||
reason_code = param->reason_code;
|
||||
}
|
||||
#endif
|
||||
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
|
||||
if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME)) {
|
||||
if (mac_addr)
|
||||
cfg80211_del_sta(dev, mac_addr, GFP_KERNEL);
|
||||
}
|
||||
#endif
|
||||
if (priv->media_connected == MFALSE) {
|
||||
PRINTM(MINFO, "cfg80211: Media not connected!\n");
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** we will not send deauth to p2p interface, it might cause WPS failure
|
||||
*/
|
||||
if (mac_addr) {
|
||||
PRINTM(MMSG, "wlan: deauth station " MACSTR "\n",
|
||||
MAC2STR(mac_addr));
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
if (!priv->phandle->is_go_timer_set)
|
||||
#endif
|
||||
|
@ -3276,10 +3298,8 @@ static void woal_switch_uap_channel(moal_private *priv, t_u8 wait_option)
|
|||
priv->csa_chan.width);
|
||||
break;
|
||||
}
|
||||
if (priv->csa_chan.chan->band == IEEE80211_BAND_2GHZ)
|
||||
uap_channel.bandcfg.chanBand = BAND_2GHZ;
|
||||
else if (priv->csa_chan.chan->band == IEEE80211_BAND_5GHZ)
|
||||
uap_channel.bandcfg.chanBand = BAND_5GHZ;
|
||||
uap_channel.bandcfg.chanBand =
|
||||
woal_ieee_band_to_radio_type(priv->csa_chan.chan->band);
|
||||
uap_channel.bandcfg.chan2Offset = chan2Offset;
|
||||
if (MLAN_STATUS_SUCCESS != woal_set_get_ap_channel(priv, MLAN_ACT_SET,
|
||||
wait_option,
|
||||
|
@ -3327,6 +3347,7 @@ void woal_csa_work_queue(struct work_struct *work)
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
|
||||
/*
|
||||
* @brief handle WOAL_EVENT_CANCEL_CHANRPT
|
||||
*
|
||||
|
@ -3336,7 +3357,6 @@ void woal_csa_work_queue(struct work_struct *work)
|
|||
*/
|
||||
void woal_process_cancel_chanrpt_event(moal_private *priv)
|
||||
{
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
if (priv->phandle->is_cac_timer_set &&
|
||||
priv->bss_index == priv->phandle->cac_bss_index) {
|
||||
woal_cancel_timer(&priv->phandle->cac_timer);
|
||||
|
@ -3354,8 +3374,8 @@ void woal_process_cancel_chanrpt_event(moal_private *priv)
|
|||
sizeof(struct cfg80211_chan_def));
|
||||
priv->phandle->cac_bss_index = 0xff;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue