MA-22742 2024 Q3 WCS WiFi/BT patch integrate

Reason: integrate WCS 2024 Q3 CF release patch, WiFi driver

FW info:
SDIO_WLAN_UART_BT_8997_16.92.21.p137.1_16.92.21.p119.3
PCIE_WLAN_UART_BT_8997_16.92.21.p137.1_16.92.21.p119.3

PCIE_WLAN_UART_BT_9098_17.92.1.p149.44_17.92.1.p149.44
SDIO_WLAN_UART_BT_8987_16.92.21.p137_16.92.21.p137
SDIO_WLAN_UART_BT_9098_17.92.1.p149.44_17.92.1.p149.44
SDIO_WLAN_UART_BT_IW416_16.92.21.p137_16.92.21.p137
SDIO_WLAN_UART_BT_IW612_18.99.3.p15_18.99.3.p15

Change-Id: Ifb7bb00203eb5dbc614a885e4483ed8323d3b0a4
Signed-off-by: yunjie <yunjie.jia@nxp.com>
This commit is contained in:
yunjie 2024-08-09 12:26:13 +00:00
parent 1ffe548cc2
commit 3df11f19c8
55 changed files with 1077 additions and 168 deletions

View file

@ -155,7 +155,7 @@ APPDIR= $(shell if test -d "mapp"; then echo mapp; fi)
#############################################################################
ccflags-y += -I$(KERNELDIR)/include
ccflags-y += -DMLAN_RELEASE_VERSION='"437.p21"'
ccflags-y += -DMLAN_RELEASE_VERSION='"437.p24"'
ccflags-y += -DFPNUM='"92"'

2
README
View file

@ -9,7 +9,7 @@
Goto source code directory.
make [clean] build
The driver and utility binaries can be found in bin_wlan directory.
The driver code supports Linux kernel from 2.6.32 to 6.7.0.
The driver code supports Linux kernel from 2.6.32 to 6.8.4.
2) FOR DRIVER INSTALL

View file

@ -3,7 +3,7 @@
* @brief This file contains the functions for 11ax related features.
*
*
* Copyright 2018-2022 NXP
* Copyright 2018-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -3,7 +3,7 @@
* @brief This file contains functions for 802.11D.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -3,7 +3,7 @@
* @brief This file contains functions for 11n handling.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -3,7 +3,7 @@
* @brief This file contains functions for 11n Aggregation.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -114,7 +114,8 @@ static void wlan_11n_form_amsdu_txpd(mlan_private *priv, mlan_buffer *mbuf)
ENTER();
ptx_pd = (TxPD *)mbuf->pbuf;
memset(pmadapter, ptx_pd, 0, sizeof(TxPD));
// coverity[bad_memset:SUPPRESS]
memset(pmadapter, ptx_pd, 0, Tx_PD_SIZEOF(pmadapter));
/*
* Original priority has been overwritten
@ -123,7 +124,7 @@ static void wlan_11n_form_amsdu_txpd(mlan_private *priv, mlan_buffer *mbuf)
ptx_pd->bss_num = GET_BSS_NUM(priv);
ptx_pd->bss_type = priv->bss_type;
/* Always zero as the data is followed by TxPD */
ptx_pd->tx_pkt_offset = sizeof(TxPD);
ptx_pd->tx_pkt_offset = Tx_PD_SIZEOF(pmadapter);
ptx_pd->tx_pkt_type = PKT_TYPE_AMSDU;
if (mbuf->flags & MLAN_BUF_FLAG_TDLS)
ptx_pd->flags = MRVDRV_TxPD_FLAGS_TDLS_PACKET;
@ -184,10 +185,11 @@ static t_u16 wlan_form_amsdu_txpd(mlan_private *priv, mlan_buffer *pmbuf,
t_u16 data_len = pmbuf->data_len;
ENTER();
head_ptr = pmbuf->pbuf + pmbuf->data_offset - sizeof(TxPD) -
head_ptr = pmbuf->pbuf + pmbuf->data_offset - Tx_PD_SIZEOF(pmadapter) -
priv->intf_hr_len;
ptx_pd = (TxPD *)(head_ptr + priv->intf_hr_len);
memset(pmadapter, ptx_pd, 0, sizeof(TxPD));
// coverity[bad_memset:SUPPRESS]
memset(pmadapter, ptx_pd, 0, Tx_PD_SIZEOF(pmadapter));
/* Set the BSS number to TxPD */
ptx_pd->bss_num = GET_BSS_NUM(priv);
@ -219,7 +221,7 @@ static t_u16 wlan_form_amsdu_txpd(mlan_private *priv, mlan_buffer *pmbuf,
PRINTM(MDATA, "amsdu_pkt_len=%d, extra_len=%d\n", amsdu_pkt_len,
pmbuf->data_len - data_len);
DBG_HEXDUMP(MDAT_D, "AMSDU TxPD", ptx_pd, sizeof(TxPD));
DBG_HEXDUMP(MDAT_D, "AMSDU TxPD", ptx_pd, Tx_PD_SIZEOF(pmadapter));
LEAVE();
return (pmbuf->data_len - data_len);
@ -302,8 +304,8 @@ static INLINE void wlan_11n_update_pktlen_amsdu_txpd(mlan_private *priv,
ENTER();
ptx_pd = (TxPD *)mbuf->pbuf;
ptx_pd->tx_pkt_length =
(t_u16)wlan_cpu_to_le16(mbuf->data_len - sizeof(TxPD));
ptx_pd->tx_pkt_length = (t_u16)wlan_cpu_to_le16(
mbuf->data_len - Tx_PD_SIZEOF(priv->adapter));
ptx_pd->pkt_delay_2ms =
wlan_wmm_compute_driver_packet_delay(priv, mbuf);
@ -643,8 +645,9 @@ done:
*
* @return Final packet size or MLAN_STATUS_FAILURE
*/
int wlan_send_amsdu_subframe_list(mlan_private *priv, raListTbl *pra_list,
int headroom, int ptrindex)
static int wlan_send_amsdu_subframe_list(mlan_private *priv,
raListTbl *pra_list, int headroom,
int ptrindex)
{
int pkt_size = 0;
pmlan_adapter pmadapter = priv->adapter;
@ -681,7 +684,8 @@ int wlan_send_amsdu_subframe_list(mlan_private *priv, raListTbl *pra_list,
&pra_list->buf_head,
MNULL, MNULL);
/* Collects TP statistics */
if (pmadapter->tp_state_on && (pkt_size > sizeof(TxPD)))
if (pmadapter->tp_state_on &&
(pkt_size > Tx_PD_SIZEOF(pmadapter)))
pmadapter->callbacks.moal_tp_accounting(
pmadapter->pmoal_handle, pmbuf_src, 3);
pra_list->total_pkts--;
@ -849,7 +853,7 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list,
}
/* Form AMSDU */
wlan_11n_form_amsdu_txpd(priv, pmbuf_aggr);
pkt_size = sizeof(TxPD);
pkt_size = Tx_PD_SIZEOF(pmadapter);
#ifdef STA_SUPPORT
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA)
ptx_pd = (TxPD *)pmbuf_aggr->pbuf;
@ -868,7 +872,8 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list,
&pra_list->buf_head,
MNULL, MNULL);
/* Collects TP statistics */
if (pmadapter->tp_state_on && (pkt_size > sizeof(TxPD)))
if (pmadapter->tp_state_on &&
(pkt_size > Tx_PD_SIZEOF(pmadapter)))
pmadapter->callbacks.moal_tp_accounting(
pmadapter->pmoal_handle, pmbuf_src, 3);
pra_list->total_pkts--;
@ -922,7 +927,8 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list,
pmbuf_aggr->data_len += headroom;
pmbuf_aggr->pbuf = data - headroom;
tx_param.next_pkt_len =
((pmbuf_src) ? pmbuf_src->data_len + sizeof(TxPD) : 0);
((pmbuf_src) ? pmbuf_src->data_len + Tx_PD_SIZEOF(pmadapter) :
0);
/* Collects TP statistics */
if (pmadapter->tp_state_on) {
pmadapter->callbacks.moal_tp_accounting(pmadapter->pmoal_handle,

View file

@ -3221,6 +3221,67 @@ static void wlan_sort_cfp_otp_table(mlan_adapter *pmadapter)
}
}
/**
* @brief Set max tx power value per channel in otp tables
*
* @param pmapdater a pointer to mlan_adapter structure
* @param is6g 6g table true or false
*
* @return
* None
*/
static void wlan_set_otp_cfp_max_tx_pwr(mlan_adapter *pmadapter, t_bool is6g)
{
t_u8 i, j;
t_u8 rows, cols, max = 0;
if (!pmadapter->otp_region)
return;
if (!is6g && pmadapter->cfp_otp_bg && pmadapter->tx_power_table_bg) {
rows = pmadapter->tx_power_table_bg_rows;
cols = pmadapter->tx_power_table_bg_cols;
if (pmadapter->tx_power_table_bg_size < (rows * cols))
goto table_a;
for (i = 0; i < rows; i++) {
max = 0;
if ((pmadapter->cfp_otp_bg + i)->dynamic.flags &
NXP_CHANNEL_DISABLED)
continue;
/* get the max value among all mod group for this
* channel */
for (j = 1; j < cols; j++)
max = MAX(
max,
pmadapter->tx_power_table_bg[i * cols +
j]);
(pmadapter->cfp_otp_bg + i)->max_tx_power = max;
}
}
table_a:
if (!is6g && pmadapter->cfp_otp_a && pmadapter->tx_power_table_a) {
rows = pmadapter->tx_power_table_a_rows;
cols = pmadapter->tx_power_table_a_cols;
if (pmadapter->tx_power_table_a_size < (rows * cols))
return;
for (i = 0; i < rows; i++) {
max = 0;
if ((pmadapter->cfp_otp_a + i)->dynamic.flags &
NXP_CHANNEL_DISABLED)
continue;
/* get the max value among all mod group for this
* channel */
for (j = 1; j < cols; j++)
max = MAX(max,
pmadapter->tx_power_table_a[i * cols +
j]);
(pmadapter->cfp_otp_a + i)->max_tx_power = max;
}
}
}
/**
* @brief Update CFP tables and power tables from FW
*
@ -3550,6 +3611,9 @@ void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left)
}
if (!pmadapter->cfp_otp_bg || !pmadapter->tx_power_table_bg)
goto out;
wlan_set_otp_cfp_max_tx_pwr(pmadapter, MFALSE);
/* Set remaining flags for BG */
rows = pmadapter->tx_power_table_bg_rows;
cols = pmadapter->tx_power_table_bg_cols;

View file

@ -5122,6 +5122,15 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter)
&dmcs_policy);
}
if (pmadapter->init_para.reject_addba_req) {
mlan_ds_reject_addba_req rej_addba_req_cfg;
rej_addba_req_cfg.conditions =
pmadapter->init_para.reject_addba_req;
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_REJECT_ADDBA_REQ,
HostCmd_ACT_GEN_SET, 0, (t_void *)MNULL,
&rej_addba_req_cfg);
}
#define DEF_AUTO_NULL_PKT_PERIOD 30
if (pmpriv_sta) {
t_u32 value = DEF_AUTO_NULL_PKT_PERIOD;
@ -10577,15 +10586,17 @@ mlan_status wlan_cmd_tx_frame(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
data_len -= sizeof(pkt_type) + sizeof(tx_control);
pdata += sizeof(pkt_type) + sizeof(tx_control);
}
memcpy_ext(pmpriv->adapter, tx_frame_cmd->buffer + sizeof(TxPD), pdata,
memcpy_ext(pmpriv->adapter,
tx_frame_cmd->buffer + Tx_PD_SIZEOF(pmpriv->adapter), pdata,
data_len, data_len);
memset(pmpriv->adapter, plocal_tx_pd, 0, sizeof(TxPD));
// coverity[bad_memset:SUPPRESS]
memset(pmpriv->adapter, plocal_tx_pd, 0, Tx_PD_SIZEOF(pmpriv->adapter));
plocal_tx_pd->bss_num = GET_BSS_NUM(pmpriv);
plocal_tx_pd->bss_type = pmpriv->bss_type;
plocal_tx_pd->tx_pkt_length = (t_u16)data_len;
plocal_tx_pd->priority = (t_u8)tx_frame->priority;
plocal_tx_pd->tx_pkt_offset = sizeof(TxPD);
plocal_tx_pd->tx_pkt_offset = Tx_PD_SIZEOF(pmpriv->adapter);
plocal_tx_pd->pkt_delay_2ms = 0xff;
if (tx_frame->buf_type == MLAN_BUF_TYPE_RAW_DATA) {
@ -10599,7 +10610,7 @@ mlan_status wlan_cmd_tx_frame(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
}
endian_convert_TxPD(plocal_tx_pd);
cmd_size += sizeof(TxPD) + data_len;
cmd_size += Tx_PD_SIZEOF(pmpriv->adapter) + data_len;
cmd->size = wlan_cpu_to_le16(cmd_size);
LEAVE();

View file

@ -3,7 +3,7 @@
* @brief This file declares the generic data structures and APIs.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -2762,6 +2762,8 @@ typedef struct _mlan_device {
t_u32 antcfg;
/** dmcs */
t_u8 dmcs;
t_u32 reject_addba_req;
} mlan_device, *pmlan_device;
/** MLAN API function prototype */

View file

@ -3,7 +3,7 @@
* @brief This file contains FW event ID definitions.
*
*
* Copyright 2023 NXP
* Copyright 2023-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -5,7 +5,7 @@
* in MLAN module.
*
*
* Copyright 2008-2023 NXP
* Copyright 2008-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -257,8 +257,8 @@ typedef enum _KEY_INFO_WAPI {
#define EXTRA_LEN 256
/** Buffer size for ethernet Tx packets */
#define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
(MV_ETH_FRAME_LEN + sizeof(TxPD) + EXTRA_LEN)
#define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE(_adapter) \
(MV_ETH_FRAME_LEN + Tx_PD_SIZEOF(_adapter) + EXTRA_LEN)
/** Buffer size for ethernet Rx packets */
#define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
@ -1215,6 +1215,8 @@ enum host_cmd_id {
#define FW_CAPINFO_EXT_SEC_RG_POWER MBIT(19)
/** FW cap info bit 20: RX_SW_INT */
#define FW_CAPINFO_EXT_RX_SW_INT MBIT(20)
/** FW cap info bit 21: EASY_MESH_SUPPORT */
#define FW_CAPINFO_EASY_MESH MBIT(21)
/** Check if 5G 1x1 only is supported by firmware */
#define IS_FW_SUPPORT_5G_1X1_ONLY(_adapter) \
@ -1261,6 +1263,12 @@ enum host_cmd_id {
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_SEC_RG_POWER)
#define IS_FW_SUPPORT_RX_SW_INT(_adapter) \
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_RX_SW_INT)
/** Check if easy mesh supported by firmware */
#define IS_FW_SUPPORT_EASY_MESH(_adapter) \
(_adapter->fw_cap_ext & FW_CAPINFO_EASY_MESH)
#define Tx_PD_SIZEOF(_adapter) \
(IS_FW_SUPPORT_EASY_MESH(_adapter) ? sizeof(TxPD) : (sizeof(TxPD) - 8))
/** MrvlIEtypes_PrevBssid_t */
typedef MLAN_PACK_START struct _MrvlIEtypes_PrevBssid_t {
@ -1442,6 +1450,11 @@ typedef enum _ENH_PS_MODES {
/** Command RET code, MSB is set to 1 */
#define HostCmd_RET_BIT 0x8000
/** Special purpose action : Set */
#define HostCmd_ACT_SPC_AUTO_SET 0x8002
/** Special purpose action : Set */
#define HostCmd_ACT_SPC_AUTO_NOSET 0x8003
/** General purpose action : Get */
#define HostCmd_ACT_GEN_GET 0x0000
/** General purpose action : Set */
@ -4879,6 +4892,32 @@ typedef MLAN_PACK_START struct {
t_u8 wmm_param_tlv[sizeof(IEEEtypes_WmmParameter_t) + 2];
} MLAN_PACK_END HostCmd_DS_WMM_GET_STATUS;
/**
* @brief Command structure for the HostCmd_CMD_WMM_HOST_ADDTS_REQ firmware
* command
*/
typedef MLAN_PACK_START struct {
/* TS id - unique per tid, TA, RA combination */
t_u8 tsid;
/* RA BSSID */
t_u8 peer_addr[MLAN_MAC_ADDR_LENGTH];
/* User priority (UP) */
t_u8 user_prio;
/* Admitted Air time for UP */
t_u16 admitted_time;
} MLAN_PACK_END HostCmd_DS_WMM_HOST_ADDTS_REQ;
/**
* @brief Command structure for the HostCmd_CMD_WMM_HOST_DELTS_REQ firmware
* command
*/
typedef MLAN_PACK_START struct {
/* TS id - unique per tid, TA, RA combination */
t_u8 tsid;
/* RA BSSID */
t_u8 peer_addr[MLAN_MAC_ADDR_LENGTH];
} MLAN_PACK_END HostCmd_DS_WMM_HOST_DELTS_REQ;
/**
* @brief Command structure for the HostCmd_CMD_WMM_ADDTS_REQ firmware command
*/
@ -7186,7 +7225,8 @@ typedef MLAN_PACK_START struct _HostCmd_DS_SENSOR_TEMP {
#define TLV_TYPE_IPV6_RA_OFFLOAD (PROPRIETARY_TLV_BASE_ID + 0xE6) /** 0x1E6*/
typedef MLAN_PACK_START struct {
MrvlIEtypesHeader_t Header;
t_u8 ipv6_addr[16];
/** ipv6 address buffer */
t_u8 ipv6_addrs[];
} MLAN_PACK_END MrvlIETypes_IPv6AddrParamSet_t;
typedef MLAN_PACK_START struct _HostCmd_DS_IPV6_RA_OFFLOAD {
@ -7196,6 +7236,8 @@ typedef MLAN_PACK_START struct _HostCmd_DS_IPV6_RA_OFFLOAD {
t_u16 action;
/** 0x00: disable IPv6 RA Offload; 0x01: enable IPv6 RA offload */
t_u8 enable;
/** Number of IPv6 address configured in FW */
t_u8 ipv6_addr_count;
MrvlIETypes_IPv6AddrParamSet_t ipv6_addr_param;
} MLAN_PACK_END HostCmd_DS_IPV6_RA_OFFLOAD;
@ -7994,6 +8036,11 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
HostCmd_DS_EDMAC_CFG ed_mac_cfg;
HostCmd_gpio_cfg_ops gpio_cfg_ops;
/** WMM HOST ADDTS */
HostCmd_DS_WMM_HOST_ADDTS_REQ host_add_ts;
/** WMM HOST DELTS */
HostCmd_DS_WMM_HOST_DELTS_REQ host_del_ts;
} params;
} MLAN_PACK_END HostCmd_DS_COMMAND, *pHostCmd_DS_COMMAND;

View file

@ -3,7 +3,7 @@
* @brief This file contains host command ID definitions.
*
*
* Copyright 2023 NXP
* Copyright 2023-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -457,5 +457,10 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
/** Host Command ID: PCIE ADMA INIT */
ENUM_ELEMENT(HostCmd_CMD_PCIE_ADMA_INIT, 0x0284),
/** Host Command ID : WMM HOST ADDTS req */
ENUM_ELEMENT(HostCmd_CMD_WMM_HOST_ADDTS_REQ, 0x0287),
/** Host Command ID : WMM HOST DELTS req */
ENUM_ELEMENT(HostCmd_CMD_WMM_HOST_DELTS_REQ, 0x0288),
/* Always keep this last */
ENUM_ELEMENT_LAST(__HostCmd_CMD_Last)

View file

@ -4,7 +4,7 @@
* definitions used in MLAN and MOAL module.
*
*
* Copyright 2008-2023 NXP
* Copyright 2008-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -884,6 +884,27 @@ typedef MLAN_PACK_START enum _IEEEtypes_WMM_Tspec_Action_e {
} MLAN_PACK_END IEEEtypes_WMM_Tspec_Action_e;
/** NAN SDF vendor oui size */
#define NAN_SDF_VENDOR_SIZE 4
/** NAN service descriptor attribute offset */
#define NAN_SDA_OFFSET 5
/** NAN service control type offset */
#define NAN_SRVC_CTRL_OFFSET 11
/** Service control field */
#define NAN_SRV_CTRL_TYPE_MASK (BIT(0) | BIT(1))
/** NAN publish frame */
#define NAN_PUBLISH 0
/** NAN Attribute ID list */
typedef MLAN_PACK_START enum _Nan_AttrId_e {
NAN_ATTR_SDA = 0x03
} MLAN_PACK_END Nan_AttrId_e;
/** Public Action Codes */
typedef MLAN_PACK_START enum _IEEEtypes_Public_ActionCategory_e {
IEEE_PUBLIC_ACTION_CATEGORY_VENDOR_SPECIFIC = 9
} MLAN_PACK_END IEEEtypes_Public_ActionCategory_e;
/** WMM TSPEC Category Action Base */
typedef MLAN_PACK_START struct {
IEEEtypes_ActionCategory_e category;

View file

@ -4,7 +4,7 @@
* and HW.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -3,7 +3,7 @@
* @brief This file declares the IOCTL data structures and APIs.
*
*
* Copyright 2008-2023 NXP
* Copyright 2008-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -183,6 +183,8 @@ enum _mlan_ioctl_req_id {
MLAN_OID_WMM_CFG_QUEUE_STATS = 0x000A0006,
MLAN_OID_WMM_CFG_QUEUE_STATUS = 0x000A0007,
MLAN_OID_WMM_CFG_TS_STATUS = 0x000A0008,
MLAN_OID_WMM_CFG_HOST_ADDTS = 0x000A000A,
MLAN_OID_WMM_CFG_HOST_DELTS = 0x000A000B,
/* WPS Configuration Group */
MLAN_IOCTL_WPS_CFG = 0x000B0000,
@ -2986,6 +2988,8 @@ typedef struct _mlan_data_rate {
typedef struct _mlan_ds_rate {
/** Sub-command */
t_u32 sub_command;
/** Only set auto tx fix rate */
t_u16 auto_null_fixrate_enable;
/** Rate configuration parameter */
union {
/** Rate configuration for MLAN_OID_RATE_CFG */
@ -3609,6 +3613,26 @@ typedef struct _mlan_ds_wmm_queue_config {
t_u8 reserved[10];
} mlan_ds_wmm_queue_config, *pmlan_ds_wmm_queue_config;
/** WMM HOST ADDTS configuration parameters */
typedef struct _mlan_ds_tx_addts {
/* TS id - unique per tid, TA, RA combination */
t_u8 tsid;
/* RA BSSID */
t_u8 peer[MLAN_MAC_ADDR_LENGTH];
/* User priority (UP) */
t_u8 user_prio;
/* Admitted Air time for UP */
t_u16 admitted_time;
} mlan_ds_tx_addts_cfg;
/** WMM HOST DELTS configuration parameters */
typedef struct _mlan_ds_tx_delts {
/* TS id - unique per tid, TA, RA combination */
t_u8 tsid;
/* RA BSSID */
t_u8 peer[MLAN_MAC_ADDR_LENGTH];
} mlan_ds_tx_delts_cfg;
/** Type definition of mlan_ds_wmm_cfg for MLAN_IOCTL_WMM_CFG */
typedef struct _mlan_ds_wmm_cfg {
/** Sub-command */
@ -3623,6 +3647,10 @@ typedef struct _mlan_ds_wmm_cfg {
mlan_ds_wmm_addts addts;
/** WMM delete TS for MLAN_OID_WMM_CFG_DELTS */
mlan_ds_wmm_delts delts;
/** WMM add TS for host config */
mlan_ds_tx_addts_cfg host_addts;
/** WMM del TS for host config */
mlan_ds_tx_delts_cfg host_delts;
/** WMM queue configuration for MLAN_OID_WMM_CFG_QUEUE_CONFIG */
mlan_ds_wmm_queue_config q_cfg;
/** AC Parameters Record WMM_AC_BE, WMM_AC_BK, WMM_AC_VI,
@ -4138,7 +4166,7 @@ typedef struct _mlan_ds_11ax_rutxpwr_cmd {
* and 6 for other SOCs */
t_u8 col;
/**ru tx data */
t_u8 rutxSubPwr[89];
t_s8 rutxSubPwr[89];
} mlan_ds_11ax_rutxpwr_cmd, *pmlan_ds_11ax_rutxpwr_cmd;
/** Type definition of mlan_ds_11ax_cmd_cfg for MLAN_OID_11AX_CMD_CFG */
@ -4787,7 +4815,10 @@ typedef struct _mlan_ds_misc_ipaddr_cfg {
typedef struct _mlan_ds_misc_ipv6_ra_offload {
/** 0: disable; 1: enable*/
t_u8 enable;
t_u8 ipv6_addr[16];
/** Number of IPv6 address configured in FW */
t_u8 ipv6_addrs_count;
/** Ipv6 address array */
t_u8 ipv6_addrs[];
} mlan_ds_misc_ipv6_ra_offload;
/* MEF configuration disable */

View file

@ -8,7 +8,7 @@
* both adhoc and infrastructure networks
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -5,7 +5,7 @@
* in MLAN module.
*
*
* Copyright 2008-2023 NXP
* Copyright 2008-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -1948,6 +1948,7 @@ typedef struct _mlan_init_para {
t_u32 antcfg;
/** dmcs*/
t_u8 dmcs;
t_u32 reject_addba_req;
} mlan_init_para, *pmlan_init_para;
#ifdef SDIO

View file

@ -4809,8 +4809,23 @@ static mlan_status wlan_rate_ioctl_set_rate_index(pmlan_adapter pmadapter,
pmpriv->is_data_rate_auto, pmpriv->data_rate);
/* Send request to firmware */
if (ds_rate->auto_null_fixrate_enable == 1) {
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_TX_RATE_CFG,
HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req,
HostCmd_ACT_SPC_AUTO_SET, 0,
(t_void *)pioctl_req,
(t_void *)bitmap_rates);
ds_rate->auto_null_fixrate_enable = 0xff;
} else if (ds_rate->auto_null_fixrate_enable == 0) {
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_TX_RATE_CFG,
HostCmd_ACT_SPC_AUTO_NOSET, 0,
(t_void *)pioctl_req,
(t_void *)bitmap_rates);
ds_rate->auto_null_fixrate_enable = 0xff;
} else
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_TX_RATE_CFG,
HostCmd_ACT_GEN_SET, 0,
(t_void *)pioctl_req,
(t_void *)bitmap_rates);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;

View file

@ -3,7 +3,7 @@
* @brief This file contains PCI-E specific code
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -2849,7 +2849,7 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
t_u32 rdptr, rd_index;
mlan_buffer *pmbuf = MNULL;
t_u32 txbd_val = 0;
t_u16 rx_len, rx_type;
t_u16 rx_len = 0, rx_type;
const t_u32 num_rx_buffs = pmadapter->pcard_pcie->txrx_bd_size;
t_u32 reg_rxbd_rdptr = pmadapter->pcard_pcie->reg->reg_rxbd_rdptr;
#if defined(PCIE8997) || defined(PCIE8897)
@ -2902,6 +2902,14 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
goto done;
}
pmbuf = pmadapter->pcard_pcie->rx_buf_list[rd_index];
/* if in previous Interrupt, SKB allocation fails, then there
* will be no valid pmbuf in RxRing at the current index. we can
* attempt reattch a valid pmbuf at same index and continue Rx.
*/
if (!pmbuf) {
PRINTM(MDAT_D, "RECV DATA: invalid pmbuf");
goto reattach;
}
if (MLAN_STATUS_FAILURE ==
pcb->moal_unmap_memory(pmadapter->pmoal_handle,
pmbuf->pbuf + pmbuf->data_offset,
@ -2972,6 +2980,13 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
pmadapter->data_received = MTRUE;
}
} else {
/* Queue the mlan_buffer again */
PRINTM(MERROR, "PCIE: Drop invalid packet, length=%d",
rx_len);
}
reattach:
if ((rx_len <= MLAN_RX_DATA_BUF_SIZE) || (!pmbuf)) {
/* Create new buffer and attach it to Rx Ring */
pmbuf = wlan_alloc_mlan_buffer(pmadapter,
MLAN_RX_DATA_BUF_SIZE,
@ -2983,10 +2998,6 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
ret = MLAN_STATUS_FAILURE;
goto done;
}
} else {
/* Queue the mlan_buffer again */
PRINTM(MERROR, "PCIE: Drop invalid packet, length=%d",
rx_len);
}
if (MLAN_STATUS_FAILURE ==
@ -5191,6 +5202,9 @@ static mlan_status wlan_pcie_interrupt_ext(t_u16 msg_id,
ENTER();
ret = wlan_pcie_interrupt(msg_id, pmadapter);
if (ret == MLAN_STATUS_SUCCESS) {
/* if we get interrupt, it means device wakes up, no need to
* wake up */
pmadapter->pm_wakeup_timeout = 0;
wlan_process_pcie_int_status(pmadapter);
}
LEAVE();

View file

@ -6,7 +6,7 @@
* for sending scan commands to the firmware.
*
*
* Copyright 2008-2023 NXP
* Copyright 2008-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -6444,8 +6444,7 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv,
pscan_gap_tlv->header.type =
wlan_cpu_to_le16(TLV_TYPE_SCAN_CHANNEL_GAP);
pscan_gap_tlv->header.len = sizeof(pscan_gap_tlv->gap);
pscan_gap_tlv->gap =
wlan_cpu_to_le16((t_u16)pmadapter->scan_chan_gap);
pscan_gap_tlv->gap = wlan_cpu_to_le16((t_u16)scan_chan_gap);
/** indicate FW, gap is optional */
pscan_gap_tlv->gap |= GAP_FLAG_OPTIONAL;
tlv += sizeof(pscan_gap_tlv->header) +

View file

@ -3,7 +3,7 @@
* @brief This file contains APIs to MOAL module.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -328,6 +328,7 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter)
pmadapter->init_para.wacp_mode = pmdevice->wacp_mode;
pmadapter->init_para.mcs32 = pmdevice->mcs32;
pmadapter->init_para.antcfg = pmdevice->antcfg;
pmadapter->init_para.reject_addba_req = pmdevice->reject_addba_req;
pmadapter->init_para.dmcs = pmdevice->dmcs;
#ifdef SDIO

View file

@ -2972,6 +2972,8 @@ static mlan_status wlan_cmd_ipv6_ra_offload(mlan_private *pmpriv,
mlan_ds_misc_ipv6_ra_offload *ipv6_ra_offload =
(mlan_ds_misc_ipv6_ra_offload *)pdata_buf;
MrvlIEtypesHeader_t *ie = &ipv6_ra_cfg->ipv6_addr_param.Header;
t_u8 *pipv6addrs = ipv6_ra_cfg->ipv6_addr_param.ipv6_addrs;
t_u8 *psrcipv6addr = ipv6_ra_offload->ipv6_addrs;
ENTER();
@ -2980,13 +2982,16 @@ static mlan_status wlan_cmd_ipv6_ra_offload(mlan_private *pmpriv,
if (cmd_action == HostCmd_ACT_GEN_SET) {
ipv6_ra_cfg->enable = ipv6_ra_offload->enable;
ie->type = wlan_cpu_to_le16(TLV_TYPE_IPV6_RA_OFFLOAD);
ie->len = wlan_cpu_to_le16(16);
memcpy_ext(pmpriv->adapter,
ipv6_ra_cfg->ipv6_addr_param.ipv6_addr,
ipv6_ra_offload->ipv6_addr, 16,
sizeof(ipv6_ra_cfg->ipv6_addr_param.ipv6_addr));
ipv6_ra_cfg->ipv6_addr_count =
ipv6_ra_offload->ipv6_addrs_count;
memcpy_ext(pmpriv->adapter, pipv6addrs, psrcipv6addr,
(ipv6_ra_offload->ipv6_addrs_count * IPADDR_LEN),
(ipv6_ra_offload->ipv6_addrs_count * IPADDR_LEN));
ie->len = wlan_cpu_to_le16(16 *
ipv6_ra_offload->ipv6_addrs_count);
pcmd->size = wlan_cpu_to_le16(
S_DS_GEN + sizeof(HostCmd_DS_IPV6_RA_OFFLOAD));
S_DS_GEN + sizeof(HostCmd_DS_IPV6_RA_OFFLOAD) +
(IPADDR_LEN * ipv6_ra_cfg->ipv6_addr_count));
} else if (cmd_action == HostCmd_ACT_GEN_GET)
pcmd->size = wlan_cpu_to_le16(S_DS_GEN +
sizeof(ipv6_ra_cfg->action));
@ -3886,6 +3891,12 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
case HostCmd_CMD_WMM_DELTS_REQ:
ret = wlan_cmd_wmm_delts_req(pmpriv, cmd_ptr, pdata_buf);
break;
case HostCmd_CMD_WMM_HOST_ADDTS_REQ:
ret = wlan_cmd_wmm_host_addts_req(pmpriv, cmd_ptr, pdata_buf);
break;
case HostCmd_CMD_WMM_HOST_DELTS_REQ:
ret = wlan_cmd_wmm_host_delts_req(pmpriv, cmd_ptr, pdata_buf);
break;
case HostCmd_CMD_WMM_QUEUE_CONFIG:
ret = wlan_cmd_wmm_queue_config(pmpriv, cmd_ptr, pdata_buf);
break;

View file

@ -2521,9 +2521,11 @@ static mlan_status wlan_ret_ipv6_ra_offload(pmlan_private pmpriv,
ipv6_ra = (mlan_ds_misc_ipv6_ra_offload *)&misc->param
.ipv6_ra_offload;
ipv6_ra->enable = ipv6_ra_resp->enable;
memcpy_ext(pmpriv->adapter, ipv6_ra->ipv6_addr,
ipv6_ra_resp->ipv6_addr_param.ipv6_addr, 16,
sizeof(ipv6_ra->ipv6_addr));
ipv6_ra->ipv6_addrs_count = ipv6_ra_resp->ipv6_addr_count;
memcpy_ext(pmpriv->adapter, ipv6_ra->ipv6_addrs,
ipv6_ra_resp->ipv6_addr_param.ipv6_addrs,
(ipv6_ra->ipv6_addrs_count * IPADDR_LEN),
(ipv6_ra->ipv6_addrs_count * IPADDR_LEN));
}
LEAVE();
@ -3404,6 +3406,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_WMM_DELTS_REQ:
ret = wlan_ret_wmm_delts_req(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_WMM_HOST_ADDTS_REQ:
case HostCmd_CMD_WMM_HOST_DELTS_REQ:
break;
case HostCmd_CMD_WMM_QUEUE_CONFIG:
ret = wlan_ret_wmm_queue_config(pmpriv, resp, pioctl_buf);
break;

View file

@ -3,7 +3,7 @@
* @brief This file contains MLAN event handling.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -5312,7 +5312,7 @@ mlan_status wlan_scan_ioctl(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req)
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (pmadapter->remain_on_channel
if (pmadapter->remain_on_channel && pioctl_req->action == MLAN_ACT_SET
#ifdef WIFI_DIRECT_SUPPORT
&& (pmpriv->bss_type != MLAN_BSS_TYPE_WIFIDIRECT)
#endif

View file

@ -4,7 +4,7 @@
* module.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -4,7 +4,7 @@
* transmission in MLAN module.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -85,22 +85,24 @@ t_void *wlan_ops_sta_process_txpd(t_void *priv, pmlan_buffer pmbuf)
}
if (pmbuf->data_offset <
(sizeof(TxPD) + pmpriv->intf_hr_len + DMA_ALIGNMENT)) {
(Tx_PD_SIZEOF(pmadapter) + pmpriv->intf_hr_len + DMA_ALIGNMENT)) {
PRINTM(MERROR,
"not enough space for TxPD: headroom=%d pkt_len=%d, required=%d\n",
pmbuf->data_offset, pmbuf->data_len,
sizeof(TxPD) + pmpriv->intf_hr_len + DMA_ALIGNMENT);
Tx_PD_SIZEOF(pmadapter) + pmpriv->intf_hr_len +
DMA_ALIGNMENT);
pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID;
goto done;
}
/* head_ptr should be aligned */
head_ptr = pmbuf->pbuf + pmbuf->data_offset - sizeof(TxPD) -
head_ptr = pmbuf->pbuf + pmbuf->data_offset - Tx_PD_SIZEOF(pmadapter) -
pmpriv->intf_hr_len;
head_ptr = (t_u8 *)((t_ptr)head_ptr & ~((t_ptr)(DMA_ALIGNMENT - 1)));
plocal_tx_pd = (TxPD *)(head_ptr + pmpriv->intf_hr_len);
memset(pmadapter, plocal_tx_pd, 0, sizeof(TxPD));
// coverity[bad_memset:SUPPRESS]
memset(pmadapter, plocal_tx_pd, 0, Tx_PD_SIZEOF(pmadapter));
/* Set the BSS number to TxPD */
plocal_tx_pd->bss_num = GET_BSS_NUM(pmpriv);
plocal_tx_pd->bss_type = pmpriv->bss_type;
@ -230,7 +232,7 @@ mlan_status wlan_send_null_packet(pmlan_private priv, t_u8 flags)
{
pmlan_adapter pmadapter = MNULL;
TxPD *ptx_pd;
/* sizeof(TxPD) + Interface specific header */
/* Tx_PD_SIZEOF(pmadapter) + Interface specific header */
#define NULL_PACKET_HDR 256
t_u32 data_len = NULL_PACKET_HDR;
pmlan_buffer pmbuf = MNULL;
@ -280,12 +282,12 @@ mlan_status wlan_send_null_packet(pmlan_private priv, t_u8 flags)
pmbuf->buf_type = MLAN_BUF_TYPE_DATA;
pmbuf->flags |= MLAN_BUF_FLAG_NULL_PKT;
ptr = pmbuf->pbuf + pmbuf->data_offset;
pmbuf->data_len = sizeof(TxPD) + priv->intf_hr_len;
pmbuf->data_len = Tx_PD_SIZEOF(pmadapter) + priv->intf_hr_len;
ptx_pd = (TxPD *)(ptr + priv->intf_hr_len);
ptx_pd->tx_control = priv->pkt_tx_ctrl;
ptx_pd->flags = flags;
ptx_pd->priority = WMM_HIGHEST_PRIORITY;
ptx_pd->tx_pkt_offset = sizeof(TxPD);
ptx_pd->tx_pkt_offset = Tx_PD_SIZEOF(pmadapter);
/* Set the BSS number to TxPD */
ptx_pd->bss_num = GET_BSS_NUM(priv);
ptx_pd->bss_type = priv->bss_type;
@ -325,7 +327,8 @@ mlan_status wlan_send_null_packet(pmlan_private priv, t_u8 flags)
PRINTM_GET_SYS_TIME(MDATA, &sec, &usec);
PRINTM_NETINTF(MDATA, priv);
PRINTM(MDATA, "%lu.%06lu : Null data => FW\n", sec, usec);
DBG_HEXDUMP(MDAT_D, "Null data", ptr, sizeof(TxPD) + priv->intf_hr_len);
DBG_HEXDUMP(MDAT_D, "Null data", ptr,
Tx_PD_SIZEOF(pmadapter) + priv->intf_hr_len);
done:
LEAVE();
return ret;

View file

@ -203,8 +203,8 @@ mlan_status wlan_process_tx(pmlan_private priv, pmlan_buffer pmbuf,
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA)
plocal_tx_pd = (TxPD *)(head_ptr + priv->intf_hr_len);
#endif
dest_mac_first_octet = *(head_ptr + priv->intf_hr_len + sizeof(TxPD) +
DEST_MAC_OFFSET);
dest_mac_first_octet = *(head_ptr + priv->intf_hr_len +
Tx_PD_SIZEOF(pmadapter) + DEST_MAC_OFFSET);
if (dest_mac_first_octet & 0x01)
wlan_drv_mcast_cycle_delay_calulation(pmadapter, pmbuf);
@ -223,7 +223,7 @@ done:
case MLAN_STATUS_PRESOURCE:
PRINTM(MINFO, "MLAN_STATUS_PRESOURCE is returned\n");
DBG_HEXDUMP(MDAT_D, "Tx", head_ptr + priv->intf_hr_len,
MIN(pmbuf->data_len + sizeof(TxPD),
MIN(pmbuf->data_len + Tx_PD_SIZEOF(pmadapter),
MAX_DATA_DUMP_LEN));
break;
#endif
@ -246,12 +246,12 @@ done:
break;
case MLAN_STATUS_PENDING:
DBG_HEXDUMP(MDAT_D, "Tx", head_ptr + priv->intf_hr_len,
MIN(pmbuf->data_len + sizeof(TxPD),
MIN(pmbuf->data_len + Tx_PD_SIZEOF(pmadapter),
MAX_DATA_DUMP_LEN));
break;
case MLAN_STATUS_SUCCESS:
DBG_HEXDUMP(MDAT_D, "Tx", head_ptr + priv->intf_hr_len,
MIN(pmbuf->data_len + sizeof(TxPD),
MIN(pmbuf->data_len + Tx_PD_SIZEOF(pmadapter),
MAX_DATA_DUMP_LEN));
wlan_write_data_complete(pmadapter, pmbuf, ret);
break;

View file

@ -5690,6 +5690,8 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
wlan_delete_station_list(pmpriv);
pmpriv->port_open = MFALSE;
pmpriv->amsdu_disable = MFALSE;
pmpriv->rxpd_rate_info = 0;
pmpriv->rxpd_rate = 0;
pmpriv->tx_pause = MFALSE;
break;
case EVENT_MICRO_AP_MIC_COUNTERMEASURES:

View file

@ -3,7 +3,7 @@
* @brief This file contains AP mode transmit and receive functions
*
*
* Copyright 2009-2021 NXP
* Copyright 2009-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -189,12 +189,13 @@ t_void *wlan_ops_uap_process_txpd(t_void *priv, pmlan_buffer pmbuf)
pmbuf->data_offset += sizeof(pkt_type) + sizeof(tx_control);
pmbuf->data_len -= sizeof(pkt_type) + sizeof(tx_control);
}
if (pmbuf->data_offset <
(sizeof(TxPD) + pmpriv->intf_hr_len + DMA_ALIGNMENT)) {
if (pmbuf->data_offset < (Tx_PD_SIZEOF(pmpriv->adapter) +
pmpriv->intf_hr_len + DMA_ALIGNMENT)) {
PRINTM(MERROR,
"not enough space for TxPD: headroom=%d pkt_len=%d, required=%d\n",
pmbuf->data_offset, pmbuf->data_len,
sizeof(TxPD) + pmpriv->intf_hr_len + DMA_ALIGNMENT);
Tx_PD_SIZEOF(pmpriv->adapter) + pmpriv->intf_hr_len +
DMA_ALIGNMENT);
DBG_HEXDUMP(MDAT_D, "drop pkt",
pmbuf->pbuf + pmbuf->data_offset, pmbuf->data_len);
pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID;
@ -202,12 +203,13 @@ t_void *wlan_ops_uap_process_txpd(t_void *priv, pmlan_buffer pmbuf)
}
/* head_ptr should be aligned */
head_ptr = pmbuf->pbuf + pmbuf->data_offset - sizeof(TxPD) -
pmpriv->intf_hr_len;
head_ptr = pmbuf->pbuf + pmbuf->data_offset -
Tx_PD_SIZEOF(pmpriv->adapter) - pmpriv->intf_hr_len;
head_ptr = (t_u8 *)((t_ptr)head_ptr & ~((t_ptr)(DMA_ALIGNMENT - 1)));
plocal_tx_pd = (TxPD *)(head_ptr + pmpriv->intf_hr_len);
memset(pmpriv->adapter, plocal_tx_pd, 0, sizeof(TxPD));
// coverity[bad_memset:SUPPRESS]
memset(pmpriv->adapter, plocal_tx_pd, 0, Tx_PD_SIZEOF(pmpriv->adapter));
/* Set the BSS number to TxPD */
plocal_tx_pd->bss_num = GET_BSS_NUM(pmpriv);
@ -668,8 +670,8 @@ mlan_status wlan_uap_recv_packet(mlan_private *priv, pmlan_buffer pmbuf)
newbuf->in_ts_sec = pmbuf->in_ts_sec;
newbuf->in_ts_usec = pmbuf->in_ts_usec;
newbuf->data_offset =
(sizeof(TxPD) + priv->intf_hr_len +
DMA_ALIGNMENT);
(Tx_PD_SIZEOF(pmadapter) +
priv->intf_hr_len + DMA_ALIGNMENT);
util_scalar_increment(
pmadapter->pmoal_handle,
&pmadapter->pending_bridge_pkts,
@ -716,8 +718,8 @@ mlan_status wlan_uap_recv_packet(mlan_private *priv, pmlan_buffer pmbuf)
newbuf->in_ts_sec = pmbuf->in_ts_sec;
newbuf->in_ts_usec = pmbuf->in_ts_usec;
newbuf->data_offset =
(sizeof(TxPD) + priv->intf_hr_len +
DMA_ALIGNMENT);
(Tx_PD_SIZEOF(pmadapter) +
priv->intf_hr_len + DMA_ALIGNMENT);
util_scalar_increment(
pmadapter->pmoal_handle,
&pmadapter->pending_bridge_pkts,
@ -826,8 +828,8 @@ mlan_status wlan_process_uap_rx_packet(mlan_private *priv, pmlan_buffer pmbuf)
newbuf->in_ts_sec = pmbuf->in_ts_sec;
newbuf->in_ts_usec = pmbuf->in_ts_usec;
newbuf->data_offset =
(sizeof(TxPD) + priv->intf_hr_len +
DMA_ALIGNMENT);
(Tx_PD_SIZEOF(pmadapter) +
priv->intf_hr_len + DMA_ALIGNMENT);
util_scalar_increment(
pmadapter->pmoal_handle,
&pmadapter->pending_bridge_pkts,
@ -884,7 +886,8 @@ mlan_status wlan_process_uap_rx_packet(mlan_private *priv, pmlan_buffer pmbuf)
newbuf->in_ts_usec =
pmbuf->in_ts_usec;
newbuf->data_offset =
(sizeof(TxPD) +
(Tx_PD_SIZEOF(
pmadapter) +
priv->intf_hr_len +
DMA_ALIGNMENT);
util_scalar_increment(

View file

@ -3,7 +3,7 @@
* @brief This file contains USB specific code
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -3,7 +3,7 @@
* @brief This file contains functions for WMM.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -856,7 +856,8 @@ static INLINE void wlan_send_single_packet(pmlan_private priv, raListTbl *ptr,
pmadapter->pmoal_handle, priv->wmm.ra_list_spinlock);
tx_param.next_pkt_len =
((pmbuf_next) ? pmbuf_next->data_len + sizeof(TxPD) :
((pmbuf_next) ? pmbuf_next->data_len +
Tx_PD_SIZEOF(pmadapter) :
0);
status = wlan_process_tx(priv, pmbuf, &tx_param);
@ -962,7 +963,8 @@ static INLINE void wlan_send_processed_packet(pmlan_private priv,
pmadapter->callbacks.moal_spin_unlock(
pmadapter->pmoal_handle, priv->wmm.ra_list_spinlock);
tx_param.next_pkt_len =
((pmbuf_next) ? pmbuf_next->data_len + sizeof(TxPD) :
((pmbuf_next) ? pmbuf_next->data_len +
Tx_PD_SIZEOF(pmadapter) :
0);
ret = pmadapter->ops.host_to_card(priv, MLAN_TYPE_DATA, pmbuf,
@ -1007,9 +1009,9 @@ static INLINE void wlan_send_processed_packet(pmlan_private priv,
case MLAN_STATUS_PENDING:
break;
case MLAN_STATUS_SUCCESS:
DBG_HEXDUMP(MDAT_D, "Tx",
pmbuf->pbuf + pmbuf->data_offset,
MIN(pmbuf->data_len + sizeof(TxPD),
DBG_HEXDUMP(
MDAT_D, "Tx", pmbuf->pbuf + pmbuf->data_offset,
MIN(pmbuf->data_len + Tx_PD_SIZEOF(pmadapter),
MAX_DATA_DUMP_LEN));
wlan_write_data_complete(pmadapter, pmbuf, ret);
break;
@ -2877,6 +2879,69 @@ t_void wlan_restore_tdls_packets(pmlan_private priv, t_u8 *mac,
LEAVE();
}
/**
* @brief This function prepares the command of HOST ADDTS
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param pdata_buf A pointer to data buffer
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_wmm_host_addts_req(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf)
{
mlan_ds_tx_addts_cfg *paddts = (mlan_ds_tx_addts_cfg *)pdata_buf;
HostCmd_DS_WMM_HOST_ADDTS_REQ *pcmd_addts = &cmd->params.host_add_ts;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_HOST_ADDTS_REQ);
cmd->size = wlan_cpu_to_le16(sizeof(*pcmd_addts) + S_DS_GEN);
cmd->result = 0;
pcmd_addts->tsid = paddts->tsid;
;
pcmd_addts->user_prio = paddts->user_prio;
pcmd_addts->admitted_time = wlan_cpu_to_le16(paddts->admitted_time);
memcpy_ext(pmpriv->adapter, pcmd_addts->peer_addr, paddts->peer,
sizeof(pcmd_addts->peer_addr), MLAN_MAC_ADDR_LENGTH);
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares the command of HOST DELTS
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param pdata_buf A pointer to data buffer
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_wmm_host_delts_req(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf)
{
mlan_ds_tx_delts_cfg *pdelts = (mlan_ds_tx_delts_cfg *)pdata_buf;
HostCmd_DS_WMM_HOST_DELTS_REQ *pcmd_delts = &cmd->params.host_del_ts;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_HOST_DELTS_REQ);
cmd->size = wlan_cpu_to_le16(sizeof(*pcmd_delts) + S_DS_GEN);
cmd->result = 0;
pcmd_delts->tsid = pdelts->tsid;
memcpy_ext(pmpriv->adapter, pcmd_delts->peer_addr, pdelts->peer,
sizeof(pcmd_delts->peer_addr), sizeof(MLAN_MAC_ADDR_LENGTH));
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares the command of ADDTS
*
@ -3309,6 +3374,67 @@ static mlan_status wlan_wmm_ioctl_delts_req(pmlan_adapter pmadapter,
return ret;
}
/**
* @brief Request for add a TSPEC
*
* @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_wmm_ioctl_host_addts_req(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_wmm_cfg *cfg = MNULL;
ENTER();
cfg = (mlan_ds_wmm_cfg *)pioctl_req->pbuf;
/* Send request to firmware */
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_HOST_ADDTS_REQ, 0, 0,
(t_void *)pioctl_req,
(t_void *)&cfg->param.host_addts);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
LEAVE();
return ret;
}
/**
* @brief Request for delete a TSPEC
*
* @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_wmm_ioctl_host_delts_req(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_wmm_cfg *cfg = MNULL;
ENTER();
cfg = (mlan_ds_wmm_cfg *)pioctl_req->pbuf;
/* Send request to firmware */
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_HOST_DELTS_REQ, 0, 0,
(t_void *)pioctl_req,
(t_void *)&cfg->param.host_delts);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
LEAVE();
return ret;
}
/**
* @brief To get and start/stop queue stats on a WMM AC
*
@ -3619,6 +3745,12 @@ mlan_status wlan_wmm_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_WMM_CFG_DELTS:
status = wlan_wmm_ioctl_delts_req(pmadapter, pioctl_req);
break;
case MLAN_OID_WMM_CFG_HOST_ADDTS:
status = wlan_wmm_ioctl_host_addts_req(pmadapter, pioctl_req);
break;
case MLAN_OID_WMM_CFG_HOST_DELTS:
status = wlan_wmm_ioctl_host_delts_req(pmadapter, pioctl_req);
break;
case MLAN_OID_WMM_CFG_QUEUE_STATS:
status = wlan_wmm_ioctl_queue_stats(pmadapter, pioctl_req);
break;

View file

@ -4,7 +4,7 @@
* of wmm functionalities
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -203,6 +203,14 @@ extern mlan_status wlan_cmd_wmm_queue_stats(pmlan_private pmpriv,
extern mlan_status wlan_cmd_wmm_ts_status(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf);
/** WMM HOST ADDTS request command handler */
extern mlan_status wlan_cmd_wmm_host_addts_req(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf);
/** WMM HOST DELTS request command handler */
extern mlan_status wlan_cmd_wmm_host_delts_req(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf);
/*
* Functions used in the cmdresp handling routine

View file

@ -3,7 +3,7 @@
* @brief This file declares the generic data structures and APIs.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -2762,6 +2762,8 @@ typedef struct _mlan_device {
t_u32 antcfg;
/** dmcs */
t_u8 dmcs;
t_u32 reject_addba_req;
} mlan_device, *pmlan_device;
/** MLAN API function prototype */

View file

@ -4,7 +4,7 @@
* definitions used in MLAN and MOAL module.
*
*
* Copyright 2008-2023 NXP
* Copyright 2008-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -884,6 +884,27 @@ typedef MLAN_PACK_START enum _IEEEtypes_WMM_Tspec_Action_e {
} MLAN_PACK_END IEEEtypes_WMM_Tspec_Action_e;
/** NAN SDF vendor oui size */
#define NAN_SDF_VENDOR_SIZE 4
/** NAN service descriptor attribute offset */
#define NAN_SDA_OFFSET 5
/** NAN service control type offset */
#define NAN_SRVC_CTRL_OFFSET 11
/** Service control field */
#define NAN_SRV_CTRL_TYPE_MASK (BIT(0) | BIT(1))
/** NAN publish frame */
#define NAN_PUBLISH 0
/** NAN Attribute ID list */
typedef MLAN_PACK_START enum _Nan_AttrId_e {
NAN_ATTR_SDA = 0x03
} MLAN_PACK_END Nan_AttrId_e;
/** Public Action Codes */
typedef MLAN_PACK_START enum _IEEEtypes_Public_ActionCategory_e {
IEEE_PUBLIC_ACTION_CATEGORY_VENDOR_SPECIFIC = 9
} MLAN_PACK_END IEEEtypes_Public_ActionCategory_e;
/** WMM TSPEC Category Action Base */
typedef MLAN_PACK_START struct {
IEEEtypes_ActionCategory_e category;

View file

@ -3,7 +3,7 @@
* @brief This file declares the IOCTL data structures and APIs.
*
*
* Copyright 2008-2023 NXP
* Copyright 2008-2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -183,6 +183,8 @@ enum _mlan_ioctl_req_id {
MLAN_OID_WMM_CFG_QUEUE_STATS = 0x000A0006,
MLAN_OID_WMM_CFG_QUEUE_STATUS = 0x000A0007,
MLAN_OID_WMM_CFG_TS_STATUS = 0x000A0008,
MLAN_OID_WMM_CFG_HOST_ADDTS = 0x000A000A,
MLAN_OID_WMM_CFG_HOST_DELTS = 0x000A000B,
/* WPS Configuration Group */
MLAN_IOCTL_WPS_CFG = 0x000B0000,
@ -2986,6 +2988,8 @@ typedef struct _mlan_data_rate {
typedef struct _mlan_ds_rate {
/** Sub-command */
t_u32 sub_command;
/** Only set auto tx fix rate */
t_u16 auto_null_fixrate_enable;
/** Rate configuration parameter */
union {
/** Rate configuration for MLAN_OID_RATE_CFG */
@ -3609,6 +3613,26 @@ typedef struct _mlan_ds_wmm_queue_config {
t_u8 reserved[10];
} mlan_ds_wmm_queue_config, *pmlan_ds_wmm_queue_config;
/** WMM HOST ADDTS configuration parameters */
typedef struct _mlan_ds_tx_addts {
/* TS id - unique per tid, TA, RA combination */
t_u8 tsid;
/* RA BSSID */
t_u8 peer[MLAN_MAC_ADDR_LENGTH];
/* User priority (UP) */
t_u8 user_prio;
/* Admitted Air time for UP */
t_u16 admitted_time;
} mlan_ds_tx_addts_cfg;
/** WMM HOST DELTS configuration parameters */
typedef struct _mlan_ds_tx_delts {
/* TS id - unique per tid, TA, RA combination */
t_u8 tsid;
/* RA BSSID */
t_u8 peer[MLAN_MAC_ADDR_LENGTH];
} mlan_ds_tx_delts_cfg;
/** Type definition of mlan_ds_wmm_cfg for MLAN_IOCTL_WMM_CFG */
typedef struct _mlan_ds_wmm_cfg {
/** Sub-command */
@ -3623,6 +3647,10 @@ typedef struct _mlan_ds_wmm_cfg {
mlan_ds_wmm_addts addts;
/** WMM delete TS for MLAN_OID_WMM_CFG_DELTS */
mlan_ds_wmm_delts delts;
/** WMM add TS for host config */
mlan_ds_tx_addts_cfg host_addts;
/** WMM del TS for host config */
mlan_ds_tx_delts_cfg host_delts;
/** WMM queue configuration for MLAN_OID_WMM_CFG_QUEUE_CONFIG */
mlan_ds_wmm_queue_config q_cfg;
/** AC Parameters Record WMM_AC_BE, WMM_AC_BK, WMM_AC_VI,
@ -4138,7 +4166,7 @@ typedef struct _mlan_ds_11ax_rutxpwr_cmd {
* and 6 for other SOCs */
t_u8 col;
/**ru tx data */
t_u8 rutxSubPwr[89];
t_s8 rutxSubPwr[89];
} mlan_ds_11ax_rutxpwr_cmd, *pmlan_ds_11ax_rutxpwr_cmd;
/** Type definition of mlan_ds_11ax_cmd_cfg for MLAN_OID_11AX_CMD_CFG */
@ -4787,7 +4815,10 @@ typedef struct _mlan_ds_misc_ipaddr_cfg {
typedef struct _mlan_ds_misc_ipv6_ra_offload {
/** 0: disable; 1: enable*/
t_u8 enable;
t_u8 ipv6_addr[16];
/** Number of IPv6 address configured in FW */
t_u8 ipv6_addrs_count;
/** Ipv6 address array */
t_u8 ipv6_addrs[];
} mlan_ds_misc_ipv6_ra_offload;
/* MEF configuration disable */

View file

@ -2889,6 +2889,34 @@ done:
return ret;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
/*
* @brief validate if packet is NAN publish
*
* @param buf Frame buffer
*
* @return true -- success, otherwise false
*/
static BOOLEAN is_nan_publish(const t_u8 *buf)
{
t_u8 nan_sdf_oui[4] = {0x50, 0x6f, 0x9a, 0x13};
t_u8 nan_attr_id, nan_srv_ctrl_type;
if (!memcmp(nan_sdf_oui, buf + 1, NAN_SDF_VENDOR_SIZE)) {
nan_attr_id = *(buf + NAN_SDA_OFFSET);
nan_srv_ctrl_type =
*(buf + NAN_SDA_OFFSET + NAN_SRVC_CTRL_OFFSET);
if (nan_attr_id == NAN_ATTR_SDA &&
(nan_srv_ctrl_type & NAN_SRV_CTRL_TYPE_MASK) ==
NAN_PUBLISH) {
return MTRUE;
}
}
return MFALSE;
}
#endif
#if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE
#if KERNEL_VERSION(3, 3, 0) <= CFG80211_VERSION_CODE
#if KERNEL_VERSION(3, 6, 0) <= CFG80211_VERSION_CODE
@ -3041,6 +3069,9 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
moal_private *remain_priv = NULL;
#endif
t_u16 fc, type, stype;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
t_u8 category, action;
#endif
ENTER();
if (buf == NULL || len == 0) {
@ -3226,6 +3257,26 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
*cookie = get_random_u32() | 1;
#endif
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
if (ieee80211_is_action(
((struct ieee80211_mgmt *)buf)->frame_control)) {
category = *(buf + sizeof(moal_802_11_action_header) - 1);
action = *(buf + sizeof(moal_802_11_action_header));
if (category == IEEE_MGMT_ACTION_CATEGORY_PUBLIC &&
action == IEEE_PUBLIC_ACTION_CATEGORY_VENDOR_SPECIFIC &&
is_nan_publish(buf + sizeof(moal_802_11_action_header))) {
priv->phandle->nan_cookie = *cookie;
if (priv->phandle->is_nan_timer_set) {
woal_cancel_timer(&priv->phandle->nan_timer);
priv->phandle->is_nan_timer_set = MFALSE;
}
priv->phandle->is_nan_timer_set = MTRUE;
woal_mod_timer(&priv->phandle->nan_timer, wait);
}
}
#endif
ret = woal_mgmt_tx(priv, buf, len, chan, *cookie, wait);
done:

View file

@ -3,7 +3,7 @@
* @brief This file contains the CFG80211 vendor specific defines.
*
*
* Copyright 2015-2021 NXP
* Copyright 2015-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -2080,7 +2080,7 @@ done:
static int woal_setget_priv_txratecfg(moal_private *priv, t_u8 *respbuf,
t_u32 respbuflen)
{
t_u32 data[4];
t_u32 data[5];
mlan_ioctl_req *req = NULL;
mlan_ds_rate *rate = NULL;
woal_tx_rate_cfg *ratecfg = NULL;
@ -2102,12 +2102,18 @@ static int woal_setget_priv_txratecfg(moal_private *priv, t_u8 *respbuf,
data, ARRAY_SIZE(data), &user_data_len);
}
if (user_data_len > 4) {
if (user_data_len > 5) {
PRINTM(MERROR, "Too many arguments\n");
ret = -EINVAL;
goto done;
}
if ((user_data_len == 5) && (data[4] > 1)) {
PRINTM(MERROR, "Invalid auto_null_fixrate parameter");
ret = -EINVAL;
goto done;
}
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_rate));
if (req == NULL) {
ret = -ENOMEM;
@ -2119,6 +2125,8 @@ static int woal_setget_priv_txratecfg(moal_private *priv, t_u8 *respbuf,
rate->sub_command = MLAN_OID_RATE_CFG;
rate->param.rate_cfg.rate_type = MLAN_RATE_INDEX;
rate->auto_null_fixrate_enable = 0xFF;
if (user_data_len == 0) {
/* Get operation */
req->action = MLAN_ACT_GET;
@ -2180,7 +2188,7 @@ static int woal_setget_priv_txratecfg(moal_private *priv, t_u8 *respbuf,
}
rate->param.rate_cfg.nss = data[2];
}
if (user_data_len == 4) {
if ((user_data_len == 4) || (data[4] == 1)) {
rate->param.rate_cfg.rate_setting =
data[3] & ~0x0C00;
PRINTM(MIOCTL,
@ -2246,6 +2254,13 @@ static int woal_setget_priv_txratecfg(moal_private *priv, t_u8 *respbuf,
} else {
rate->param.rate_cfg.rate_setting = 0xffff;
}
if (user_data_len == 5) {
rate->auto_null_fixrate_enable = data[4];
PRINTM(MINFO,
"SET: auto_null_fixrate_enable: 0x%x\n",
data[4]);
}
}
}

View file

@ -4,7 +4,7 @@
* driver.
*
*
* Copyright 2018-2022 NXP
* Copyright 2018-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -421,6 +421,8 @@ static int dfs53cfg = DFS_W53_DEFAULT_FW;
static int keep_previous_scan = 1;
static int auto_11ax = 1;
static int reject_addba_req = 0;
/**
* @brief This function read a line in module parameter file
*
@ -1539,6 +1541,14 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
goto err;
params->dual_nb = out_data;
PRINTM(MMSG, "dual_nb=%d\n", params->dual_nb);
} else if (strncmp(line, "reject_addba_req",
strlen("reject_addba_req")) == 0) {
if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS)
goto err;
params->reject_addba_req = out_data;
PRINTM(MMSG, "reject_addba_req=%x\n",
params->reject_addba_req);
}
}
if (end)
@ -1903,6 +1913,7 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
}
handle->params.keep_previous_scan = keep_previous_scan;
handle->params.auto_11ax = auto_11ax;
handle->params.reject_addba_req = reject_addba_req;
handle->params.dual_nb = dual_nb;
if (params)
handle->params.dual_nb = params->dual_nb;
@ -2448,6 +2459,13 @@ void woal_init_from_dev_tree(void)
PRINTM(MERROR, "auto_11ax=0x%x\n", data);
auto_11ax = data;
}
} else if (!strncmp(prop->name, "reject_addba_req",
strlen("reject_addba_req"))) {
if (!of_property_read_u32(dt_node, prop->name, &data)) {
PRINTM(MERROR, "rej_addba_req_cfg=0x%x\n",
data);
reject_addba_req = data;
}
}
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
@ -3019,3 +3037,8 @@ MODULE_PARM_DESC(
module_param(dual_nb, int, 0);
MODULE_PARM_DESC(dual_nb, "0: Single BT (Default); 1: Dual BT");
module_param(reject_addba_req, int, 0);
MODULE_PARM_DESC(
reject_addba_req,
"Bit1: Reject the addba request when FW auto re-connect enabled (STA BSS only); Bit0: Reject the addba request when HS activated");

View file

@ -36,7 +36,7 @@ Change log:
#ifdef UAP_SUPPORT
#include "moal_uap.h"
#endif
#include <linux/list.h>
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
#include "moal_cfg80211.h"
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
@ -1210,10 +1210,13 @@ void woal_check_mc_connection(moal_private *priv, t_u8 wait_option,
int i;
#endif
t_u16 enable = 0;
if (woal_mc_policy_cfg(priv, &enable, wait_option, MLAN_ACT_GET)) {
if (priv->phandle->card_info->drcs &&
moal_extflg_isset(priv->phandle, EXT_CFG80211_DRCS)) {
if (woal_mc_policy_cfg(priv, &enable, wait_option,
MLAN_ACT_GET)) {
PRINTM(MERROR, "Get multi-channel policy failed\n");
}
}
if (!enable)
return;
@ -3090,8 +3093,10 @@ static mlan_status woal_set_ipv6_ra_offload(moal_handle *handle, t_u8 enable)
moal_private *priv = NULL;
mlan_ds_misc_cfg *misc = NULL;
mlan_ioctl_req *req = NULL;
mlan_ds_misc_ipv6_ra_offload *ipv6_ra;
t_u8 *ipv6_ra;
int i = 0;
unsigned long flags;
struct ipv6addr_entry *ipv6_entry = NULL;
ENTER();
@ -3115,10 +3120,18 @@ static mlan_status woal_set_ipv6_ra_offload(moal_handle *handle, t_u8 enable)
misc->sub_command = MLAN_OID_MISC_IPV6_RA_OFFLOAD;
req->req_id = MLAN_IOCTL_MISC_CFG;
req->action = MLAN_ACT_SET;
ipv6_ra = &misc->param.ipv6_ra_offload;
ipv6_ra->enable = enable;
moal_memcpy_ext(priv->phandle, ipv6_ra->ipv6_addr, priv->ipv6_addr, 16,
sizeof(ipv6_ra->ipv6_addr));
misc->param.ipv6_ra_offload.enable = enable;
misc->param.ipv6_ra_offload.ipv6_addrs_count = priv->ipv6count;
spin_lock_irqsave(&priv->ipv6addr_lock, flags);
ipv6_ra = misc->param.ipv6_ra_offload.ipv6_addrs;
list_for_each_entry (ipv6_entry, &priv->ipv6_addrses, link) {
moal_memcpy_ext(priv->phandle, ipv6_ra, ipv6_entry->ipv6_addr,
IPADDR_LEN, IPADDR_LEN);
ipv6_ra += IPADDR_LEN;
}
spin_unlock_irqrestore(&priv->ipv6addr_lock, flags);
ret = woal_request_ioctl(woal_get_priv(handle, MLAN_BSS_ROLE_STA), req,
MOAL_NO_WAIT);
if (ret != MLAN_STATUS_SUCCESS && ret != MLAN_STATUS_PENDING)
@ -3691,7 +3704,7 @@ mlan_status woal_cancel_hs(moal_private *priv, t_u8 wait_option)
hscfg.conditions = HOST_SLEEP_CFG_CANCEL;
hscfg.is_invoke_hostcmd = MTRUE;
ret = woal_set_get_hs_params(priv, MLAN_ACT_SET, wait_option, &hscfg);
if (ret != MLAN_STATUS_SUCCESS) {
if (ret != MLAN_STATUS_SUCCESS && ret != MLAN_STATUS_PENDING) {
PRINTM(MERROR, "%s: woal_set_get_hs_params failed \n",
__func__);
LEAVE();
@ -8306,7 +8319,7 @@ static int parse_tx_pwr_string(moal_handle *handle, const char *s, size_t len,
if (pos)
d->data3 = (t_u32)woal_string_to_number(pos);
if (((d->data1 > pow_limit) && (d->data1 != 0xffffffff)) ||
if (((d->data1 > pow_limit) && (d->data1 <= 0xfffffff0)) ||
(d->data2 > 2))
ret = -EINVAL;

View file

@ -344,7 +344,7 @@ static struct _card_info card_info_SD8978 = {
#ifdef SD8997
static struct _card_info card_info_SD8997 = {
.embedded_supp = 1,
.drcs = 1,
.drcs = 0,
.go_noa = 1,
.v16_fw_api = 1,
.pmic = 1,
@ -648,7 +648,7 @@ static struct _card_info card_info_SDIW615 = {
#ifdef PCIE8997
static struct _card_info card_info_PCIE8997 = {
.embedded_supp = 1,
.drcs = 1,
.drcs = 0,
.go_noa = 1,
.v16_fw_api = 1,
.pmic = 1,
@ -1235,6 +1235,13 @@ void woal_clean_up(moal_handle *handle)
GFP_KERNEL);
}
#endif
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
if (handle->is_nan_timer_set) {
woal_cancel_timer(&handle->nan_timer);
handle->is_nan_timer_set = MFALSE;
}
#endif
// stop bgscan
#ifdef STA_CFG80211
@ -1690,6 +1697,65 @@ done:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
#if IS_ENABLED(CONFIG_IPV6)
/**
* @brief This function deletes the IPv6 Address entry
*
* @param priv A pointer to moal_private structure
*
* @return N/A
*/
static void woal_remove_ipv6_address(moal_private *priv, t_u8 *addr)
{
struct ipv6addr_entry *ipv6_entry = NULL, *tmp_ipv6_entry;
unsigned long flags;
spin_lock_irqsave(&priv->ipv6addr_lock, flags);
list_for_each_entry_safe (ipv6_entry, tmp_ipv6_entry,
&priv->ipv6_addrses, link) {
if (memcmp(addr, ipv6_entry->ipv6_addr, IPADDR_LEN) == 0) {
priv->ipv6count -= 1;
list_del(&ipv6_entry->link);
kfree(ipv6_entry);
break;
}
}
spin_unlock_irqrestore(&priv->ipv6addr_lock, flags);
if (list_empty(&priv->ipv6_addrses))
priv->ipv6_addr_configured = MFALSE;
}
/**
* @brief This function adds the IPv6 Address entry
*
* @param priv A pointer to moal_private structure
*
* @return N/A
*/
static void woal_add_ipv6_address(moal_private *priv, t_u8 *addr)
{
struct ipv6addr_entry *pipv6_entry = NULL, *ipv6_entry = NULL;
unsigned long flags;
list_for_each_entry (ipv6_entry, &priv->ipv6_addrses, link) {
if (!memcmp(ipv6_entry->ipv6_addr, addr, IPADDR_LEN)) {
PRINTM(MIOCTL, "ipv6 addr already exists\n");
return;
}
}
pipv6_entry = kzalloc(sizeof(struct ipv6addr_entry), GFP_ATOMIC);
if (pipv6_entry) {
spin_lock_irqsave(&priv->ipv6addr_lock, flags);
INIT_LIST_HEAD(&pipv6_entry->link);
moal_memcpy_ext(priv->phandle, pipv6_entry->ipv6_addr,
(t_u8 *)addr, IPADDR_LEN, IPADDR_LEN);
list_add_tail(&pipv6_entry->link, &priv->ipv6_addrses);
spin_unlock_irqrestore(&priv->ipv6addr_lock, flags);
priv->ipv6count += 1;
}
priv->ipv6_addr_configured = MTRUE;
}
/**
* @brief This function handle the net interface ipv6 address change event
*
@ -1706,7 +1772,7 @@ static int woal_inet6_netdeive_event(struct notifier_block *nb,
struct net_device *ndev = ifa->idev->dev;
moal_private *priv;
int ret = NOTIFY_OK;
t_u8 addr[16] = {0};
ENTER();
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
@ -1741,15 +1807,13 @@ static int woal_inet6_netdeive_event(struct notifier_block *nb,
switch (event) {
case NETDEV_UP:
PRINTM(MIOCTL, "[%s]: New ipv6 addr\n", ndev->name);
moal_memcpy_ext(priv->phandle, priv->ipv6_addr,
(t_u8 *)&ifa->addr, sizeof(priv->ipv6_addr),
sizeof(priv->ipv6_addr));
priv->ipv6_addr_configured = MTRUE;
moal_memcpy_ext(priv->phandle, addr, (t_u8 *)&ifa->addr,
sizeof(addr), sizeof(addr));
woal_add_ipv6_address(priv, addr);
break;
case NETDEV_DOWN:
PRINTM(MIOCTL, "[%s]: Ipv6 addr removed.\n", ndev->name);
memset(priv->ipv6_addr, 0, sizeof(priv->ipv6_addr));
priv->ipv6_addr_configured = MFALSE;
woal_remove_ipv6_address(priv, (t_u8 *)&ifa->addr);
break;
default:
PRINTM(MIOCTL, "[%s]: Ignore event: %u\n", ndev->name,
@ -1790,6 +1854,37 @@ BOOLEAN woal_ssid_valid(mlan_802_11_ssid *pssid)
return MTRUE;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
/**
* @brief Tx management timeout for NAN function
*
* @param context A pointer to context
* @return N/A
*/
void woal_nan_timer_func(void *context)
{
moal_handle *handle = (moal_handle *)context;
moal_private *priv = handle->priv[handle->remain_bss_index];
ENTER();
if (!priv->phandle->nan_cookie) {
PRINTM(MWARN, "NAN cookie not set\n");
LEAVE();
return;
}
PRINTM(MEVENT, "NAN timer started.\n");
cfg80211_tx_mgmt_expired(priv->wdev, priv->phandle->nan_cookie,
&priv->phandle->chan, GFP_ATOMIC);
priv->phandle->is_nan_timer_set = MFALSE;
priv->phandle->nan_cookie = 0;
LEAVE();
return;
}
#endif
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
/**
@ -2451,6 +2546,11 @@ mlan_status woal_init_sw(moal_handle *handle)
handle);
handle->is_remain_timer_set = MFALSE;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
woal_initialize_timer(&handle->nan_timer, woal_nan_timer_func, handle);
#endif
#endif
#endif
@ -2574,6 +2674,7 @@ mlan_status woal_init_sw(moal_handle *handle)
device.second_mac = handle->second_mac;
device.antcfg = handle->params.antcfg;
device.dmcs = moal_extflg_isset(handle, EXT_DMCS);
device.reject_addba_req = handle->params.reject_addba_req;
for (i = 0; i < handle->drv_mode.intf_num; i++) {
device.bss_attr[i].bss_type =
@ -5512,6 +5613,13 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index,
#endif
#endif
#ifdef STA_CFG80211
#ifdef STA_SUPPORT
INIT_LIST_HEAD(&priv->ipv6_addrses);
spin_lock_init(&priv->ipv6addr_lock);
#endif
#endif
#ifdef STA_SUPPORT
INIT_LIST_HEAD(&priv->pmksa_cache_list);
if (bss_type == MLAN_BSS_TYPE_STA) {
@ -9828,6 +9936,7 @@ void woal_fw_dump_timer_func(void *context)
handle->is_fw_dump_timer_set = MFALSE;
if (handle->priv_num)
woal_process_hang(handle);
handle->fw_dump = MFALSE;
LEAVE();
return;
}

View file

@ -436,6 +436,24 @@ typedef struct _moal_drv_timer {
t_u32 timer_is_canceled;
} moal_drv_timer, *pmoal_drv_timer;
/** moal_802_11_action header */
typedef struct {
/** Frame Cotrol */
t_u16 frame_control;
/** Duration */
t_u16 duration;
/** dest addr */
t_u8 da[ETH_ALEN];
/** source addr */
t_u8 sa[ETH_ALEN];
/** bssid */
t_u8 bssid[ETH_ALEN];
/** seq_ctrl */
t_u16 seq_ctrl;
/** category */
t_u8 category;
} __attribute__((packed)) moal_802_11_action_header;
/**
* @brief Timer handler
*
@ -1373,7 +1391,7 @@ struct rf_test_mode_data {
/* Rx fcs error count */
t_u32 rx_pkt_fcs_err_count;
/* Tx power config values */
t_u32 tx_power_data[3];
t_s32 tx_power_data[3];
/* Tx continuous config values */
t_u32 tx_cont_data[6];
/* Tx frame config values */
@ -1550,6 +1568,13 @@ enum scan_set_band {
};
#endif
/** IPv6 address node */
struct ipv6addr_entry {
/** list node link */
struct list_head link;
/** IPv6 address entry */
t_u8 ipv6_addr[16];
};
/** Private structure for MOAL */
struct _moal_private {
/** Handle structure */
@ -1637,7 +1662,12 @@ struct _moal_private {
/** IP addr */
t_u8 ip_addr[IPADDR_LEN];
t_u8 ipv6_addr_configured;
t_u8 ipv6_addr[16];
/** IPv6 addr count */
t_u8 ipv6count;
/** IPv6 addr Queue */
struct list_head ipv6_addrses;
/** Lock for IPv6 addrs */
spinlock_t ipv6addr_lock;
#ifdef STA_SUPPORT
/** scan type */
t_u8 scan_type;
@ -2598,6 +2628,8 @@ typedef struct _moal_mod_para {
int hs_auto_arp;
/** Dual-BT **/
int dual_nb;
/* reject addba req config for HS or FW Auto-reconnect */
t_u32 reject_addba_req;
} moal_mod_para;
void woal_tp_acnt_timer_func(void *context);
@ -2917,6 +2949,15 @@ struct _moal_handle {
t_u64 cookie;
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
/** Tx frame wait cancel timer set flag */
BOOLEAN is_nan_timer_set;
/** Tx frame wait timer for nan publish */
moal_drv_timer nan_timer __ATTRIB_ALIGN__;
/** NAN cookie */
t_u64 nan_cookie;
#endif
#ifdef WIFI_DIRECT_SUPPORT
/** NoA duration */
t_u32 noa_duration;
@ -4116,6 +4157,9 @@ int woal_hostcmd_ioctl(struct net_device *dev, struct ifreq *req);
mlan_status woal_set_remain_channel_ioctl(moal_private *priv, t_u8 wait_option,
pmlan_ds_remain_chan pchan);
void woal_remain_timer_func(void *context);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
void woal_nan_timer_func(void *context);
#endif
#ifdef WIFI_DIRECT_SUPPORT
mlan_status woal_wifi_direct_mode_cfg(moal_private *priv, t_u16 action,
t_u16 *mode);

View file

@ -4,7 +4,7 @@
* related functions.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -461,6 +461,7 @@ static mlan_status woal_do_flr(moal_handle *handle, bool prepare, bool flr_flag)
if (IS_PCIE9098(handle->card_type))
handle->event_fw_dump = MTRUE;
#endif
handle->fw_dump = MFALSE;
goto exit;

View file

@ -4,7 +4,7 @@
* driver.
*
*
* Copyright 2014-2021 NXP
* Copyright 2014-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -4,7 +4,7 @@
* driver.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -4,7 +4,7 @@
* related functions.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -3117,6 +3117,7 @@ static mlan_status woal_do_sdiommc_flr(moal_handle *handle, bool prepare,
if (IS_SD9177(handle->card_type))
handle->event_fw_dump = MTRUE;
#endif
handle->fw_dump = MFALSE;
goto exit;

View file

@ -2780,7 +2780,7 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
*
* @return N/A
*/
t_void woal_process_event_tx_status(moal_private *priv,
static t_void woal_process_event_tx_status(moal_private *priv,
tx_mgmt_status_event *tx_status)
{
unsigned long flag;

View file

@ -4,7 +4,7 @@
* functions defined in moal module
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -315,6 +315,14 @@ static int woal_cfg80211_disassociate(struct wiphy *wiphy,
struct cfg80211_disassoc_request *req);
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
static int woal_cfg80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev,
u8 tsid, const u8 *peer, u8 user_prio,
u16 admitted_time);
static int woal_cfg80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev,
u8 tsid, const u8 *peer);
#endif /* KERNEL_VERSION(3, 8, 0) */
/** cfg80211 operations */
static struct cfg80211_ops woal_cfg80211_ops = {
.change_virtual_intf = woal_cfg80211_change_virtual_intf,
@ -452,6 +460,11 @@ static struct cfg80211_ops woal_cfg80211_ops = {
#ifdef CONFIG_NL80211_TESTMODE
.testmode_cmd = woal_testmode_cmd,
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
.add_tx_ts = woal_cfg80211_add_tx_ts,
.del_tx_ts = woal_cfg80211_del_tx_ts,
#endif /* KERNEL_VERSION(3, 8, 0) */
};
/** Region code mapping */
@ -2602,6 +2615,8 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
{
struct cfg80211_bss *bss = NULL;
unsigned long flags;
t_u8 qos_cfg = 0;
int uapsd_queues = -1;
u8 *assoc_req_buf = NULL;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
struct cfg80211_rx_assoc_resp_data resp = {
@ -2664,6 +2679,22 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
assoc_req_buf =
assoc_info
->assoc_req_buf;
if (!woal_priv_qos_cfg(priv,
MLAN_ACT_GET,
&qos_cfg) &&
qos_cfg != 0) {
int ac;
uapsd_queues = 0;
for (ac = WMM_AC_BK;
ac <= WMM_AC_VO; ac++) {
if (qos_cfg &
MBIT(WMM_AC_VO -
ac))
uapsd_queues |=
MBIT(ac);
}
}
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
resp.links[0].bss = bss;
resp.buf = assoc_info->assoc_resp_buf;
@ -2671,6 +2702,7 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
resp.req_ies = assoc_req_buf;
resp.req_ies_len =
assoc_info->assoc_req_len;
resp.uapsd_queues = uapsd_queues;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
wiphy_lock(priv->wdev->wiphy);
cfg80211_rx_assoc_resp(priv->netdev,
@ -2688,8 +2720,8 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
cfg80211_rx_assoc_resp(
priv->netdev, bss,
assoc_info->assoc_resp_buf,
assoc_info->assoc_resp_len, -1,
assoc_req_buf,
assoc_info->assoc_resp_len,
uapsd_queues, assoc_req_buf,
assoc_info->assoc_req_len);
mutex_unlock(&priv->wdev->mtx);
#else
@ -2698,7 +2730,8 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
cfg80211_rx_assoc_resp(
priv->netdev, bss,
assoc_info->assoc_resp_buf,
assoc_info->assoc_resp_len, -1);
assoc_info->assoc_resp_len,
uapsd_queues);
mutex_unlock(&priv->wdev->mtx);
#else
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
@ -2874,7 +2907,7 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
goto done;
}
if (!ssid_bssid->ssid.ssid_len || ssid_bssid->ssid.ssid[0] < 0x20) {
if (!ssid_bssid->ssid.ssid_len) {
PRINTM(MERROR, "Invalid SSID - aborting\n");
ret = -EINVAL;
goto done;
@ -3597,6 +3630,7 @@ static mlan_status woal_cfg80211_dump_station_info(moal_private *priv,
MBIT(NL80211_STA_INFO_RX_PACKETS) |
MBIT(NL80211_STA_INFO_TX_PACKETS) |
MBIT(NL80211_STA_INFO_SIGNAL) |
MBIT(NL80211_STA_INFO_SIGNAL_AVG) |
MBIT(NL80211_STA_INFO_TX_BITRATE) |
MBIT(NL80211_STA_INFO_RX_BITRATE);
#else
@ -3635,7 +3669,10 @@ static mlan_status woal_cfg80211_dump_station_info(moal_private *priv,
sinfo->tx_bytes = priv->stats.tx_bytes;
sinfo->rx_packets = priv->stats.rx_packets;
sinfo->tx_packets = priv->stats.tx_packets;
sinfo->signal = signal.bcn_rssi_avg;
sinfo->signal = signal.bcn_rssi_last;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)
sinfo->signal_avg = signal.bcn_rssi_avg;
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)
sinfo->tx_failed = stats.failed;
#endif
@ -3792,6 +3829,7 @@ create_custom_regdomain(moal_private *priv,
int idx, freq, prev_freq = 0;
t_u8 chan;
t_u16 num_chan = 0;
t_u16 pwr, prev_pwr = 0;
t_u32 bw, prev_bw = 0;
t_u16 chflags, prev_chflags = 0, valid_rules = 0;
struct ieee80211_regdomain *regd = NULL;
@ -3843,11 +3881,25 @@ create_custom_regdomain(moal_private *priv,
bw = MHZ_TO_KHZ(20);
}
pwr = custom_reg->cfp_tbl[idx].max_tx_power;
if (idx == 0 || prev_chflags != chflags || prev_bw != bw ||
freq - prev_freq > 20) {
valid_rules++;
new_rule = true;
}
if (!new_rule && pwr != prev_pwr) {
if (band == IEEE80211_BAND_2GHZ &&
!(chflags & NXP_CHANNEL_NOHT40)) {
/* skip adding new pwr rule for 40 MHz 2G
* overlapping bonded channels, as max tx
* power value may differ
*/
} else {
valid_rules++;
new_rule = true;
}
}
rule = &regd->reg_rules[valid_rules - 1];
@ -3861,7 +3913,9 @@ create_custom_regdomain(moal_private *priv,
continue;
rule->freq_range.start_freq_khz = MHZ_TO_KHZ(freq - 10);
rule->power_rule.max_eirp = DBM_TO_MBM(19);
rule->power_rule.max_eirp = DBM_TO_MBM(pwr);
prev_pwr = pwr;
rule->flags = 0;
if (chflags & NXP_CHANNEL_PASSIVE)
@ -6434,6 +6488,10 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev,
int index = 0;
int j = 0;
struct cfg80211_ssid *match_ssid = NULL;
#ifdef WIFI_DIRECT_SUPPORT
mlan_scan_cfg scan_cfg;
#endif
ENTER();
#ifdef UAP_CFG80211
@ -6591,10 +6649,21 @@ int woal_cfg80211_sched_scan_start(struct wiphy *wiphy, struct net_device *dev,
priv->scan_cfg.action = BG_SCAN_ACT_SET;
priv->scan_cfg.enable = MTRUE;
#ifdef WIFI_DIRECT_SUPPORT
if (priv->phandle->miracast_mode)
memset(&scan_cfg, 0, sizeof(mlan_scan_cfg));
if (MLAN_STATUS_SUCCESS != woal_get_scan_config(priv, &scan_cfg)) {
PRINTM(MERROR, "Fail to get scan request IE\n");
}
if (priv->phandle->miracast_mode) {
priv->scan_cfg.scan_chan_gap = priv->phandle->scan_chan_gap;
} else {
if (scan_cfg.scan_chan_gap)
priv->scan_cfg.scan_chan_gap = scan_cfg.scan_chan_gap;
else if (woal_is_any_interface_active(priv->phandle))
priv->scan_cfg.scan_chan_gap =
priv->phandle->scan_chan_gap;
else
priv->scan_cfg.scan_chan_gap = 0;
}
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
@ -6683,7 +6752,7 @@ int woal_cfg80211_resume(struct wiphy *wiphy)
PRINTM(MERROR, "woal_cfg80211_resume: priv is NULL\n");
goto done;
}
handle->cfg80211_suspend = MFALSE;
for (i = 0; i < MIN(handle->priv_num, MLAN_MAX_BSS_NUM); i++) {
if (handle->priv[i] &&
(GET_BSS_ROLE(handle->priv[i]) == MLAN_BSS_ROLE_STA)) {
@ -6791,7 +6860,6 @@ int woal_cfg80211_resume(struct wiphy *wiphy)
#endif
done:
handle->cfg80211_suspend = MFALSE;
woal_queue_rx_task(handle);
PRINTM(MCMND, "<--- Leave woal_cfg80211_resume --->\n");
return 0;
@ -10332,6 +10400,10 @@ mlan_status woal_register_cfg80211(moal_private *priv)
wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR;
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
wiphy->features |= NL80211_FEATURE_SUPPORTS_WMM_ADMISSION;
#endif /* KERNEL_VERSION(3, 19, 0) */
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA);
wiphy_ext_feature_set(wiphy,
@ -10503,3 +10575,140 @@ err_wiphy:
LEAVE();
return ret;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
/**
* @brief Add WMM tspec TS
* @param wiphy A pointer to wiphy structure
* @param dev A pointer to net_device structure
* @param tsid A u8 tsid value for the TS
* @param peer A pointer to peer MAC address
* @param user_prio A u8 user priority value
* @param admitted_time A u16 admitted time for the TS
*
* @return 0 -- success, otherwise fail
*/
static int woal_cfg80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev,
u8 tsid, const u8 *peer, u8 user_prio,
u16 admitted_time)
{
mlan_ioctl_req *req = NULL;
mlan_ds_tx_addts_cfg *ts_cfg = NULL;
mlan_ds_wmm_cfg *pwmm = NULL;
int ret = 0;
mlan_status status = MLAN_STATUS_FAILURE;
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
ENTER();
if (peer == NULL || tsid >= MAX_NUM_TID || user_prio >= MAX_NUM_TID) {
PRINTM(MERROR, "ADDTS: Invalid parameters\n");
ret = -EINVAL;
goto done;
}
if (memcmp(peer, priv->cfg_bssid, MLAN_MAC_ADDR_LENGTH)) {
PRINTM(MERROR, "ADDTS: Invalid peer Address\n");
ret = -EINVAL;
goto done;
}
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_wmm_cfg));
if (req == NULL) {
ret = -ENOMEM;
goto done;
}
pwmm = (mlan_ds_wmm_cfg *)req->pbuf;
pwmm->sub_command = MLAN_OID_WMM_CFG_HOST_ADDTS;
ts_cfg = &pwmm->param.host_addts;
ts_cfg->tsid = tsid;
ts_cfg->user_prio = user_prio;
ts_cfg->admitted_time = admitted_time;
moal_memcpy_ext(priv->phandle, ts_cfg->peer, peer, sizeof(ts_cfg->peer),
MLAN_MAC_ADDR_LENGTH);
req->action = MLAN_ACT_SET;
req->req_id = MLAN_IOCTL_WMM_CFG;
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
goto done;
}
PRINTM(MMSG,
"WMM AC - ADDTS tsid=%u peer=" MACSTR
" up=%u admitted_time=%u\n",
tsid, MAC2STR(peer), user_prio, admitted_time);
done:
if (status != MLAN_STATUS_PENDING)
kfree(req);
LEAVE();
return ret;
}
/**
* @brief Set del tx tspec parameters
* @param wiphy A pointer to wiphy structure
* @param dev A pointer to net_device structure
* @param params A pointer to ieee80211_txq_params structure
*
* @return 0 -- success, otherwise fail
*/
static int woal_cfg80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev,
u8 tsid, const u8 *peer)
{
mlan_ioctl_req *req = NULL;
mlan_ds_wmm_cfg *pwmm = NULL;
mlan_ds_tx_delts_cfg *ts_cfg = NULL;
int ret = 0;
mlan_status status = MLAN_STATUS_FAILURE;
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
ENTER();
if (peer == NULL || tsid >= MAX_NUM_TID) {
PRINTM(MERROR, "DELTS: Invalid parameters \n");
ret = -EINVAL;
goto done;
}
if (memcmp(peer, priv->cfg_bssid, MLAN_MAC_ADDR_LENGTH)) {
PRINTM(MERROR, "DELTS: Invalid peer Address\n");
ret = -EINVAL;
goto done;
}
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_wmm_cfg));
if (req == NULL) {
ret = -ENOMEM;
goto done;
}
pwmm = (mlan_ds_wmm_cfg *)req->pbuf;
pwmm->sub_command = MLAN_OID_WMM_CFG_HOST_DELTS;
ts_cfg = &pwmm->param.host_delts;
ts_cfg->tsid = tsid;
moal_memcpy_ext(priv->phandle, ts_cfg->peer, peer, sizeof(ts_cfg->peer),
MLAN_MAC_ADDR_LENGTH);
req->action = MLAN_ACT_SET;
req->req_id = MLAN_IOCTL_WMM_CFG;
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
goto done;
}
PRINTM(MMSG, "WMM AC - DELTS tsid=%u peer=" MACSTR "\n", tsid,
MAC2STR(peer));
done:
if (status != MLAN_STATUS_PENDING)
kfree(req);
LEAVE();
return ret;
}
#endif /* KERNEL_VERSION(3, 8, 0) */

View file

@ -2557,7 +2557,7 @@ done:
*
* @return 0 --success, otherwise fail
*/
int woal_uap_wacp_mode(struct net_device *dev, struct ifreq *req)
static int woal_uap_wacp_mode(struct net_device *dev, struct ifreq *req)
{
moal_private *priv = (moal_private *)netdev_priv(dev);
mlan_ioctl_req *ioctl_req = NULL;

View file

@ -3,7 +3,7 @@
* @brief This file contains uap driver specific defines etc.
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2022, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -1969,6 +1969,10 @@ moal_private *woal_alloc_virt_interface(moal_handle *handle, t_u8 bss_index,
spin_lock_init(&priv->dhcp_discover_lock);
#endif
#ifdef STA_CFG80211
INIT_LIST_HEAD(&priv->ipv6_addrses);
spin_lock_init(&priv->ipv6addr_lock);
#endif
spin_lock_init(&priv->connect_lock);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
@ -3991,11 +3995,14 @@ int woal_cfg80211_start_radar_detection(struct wiphy *wiphy,
snprintf(event_buf, sizeof(event_buf) - 1, "%s %d", CUS_EVT_CAC_START,
chandef->chan->hw_value);
woal_broadcast_event(priv, event_buf, strlen(event_buf));
if (MLAN_STATUS_SUCCESS ==
woal_mc_policy_cfg(priv, &enable, MOAL_IOCTL_WAIT, MLAN_ACT_GET)) {
if (priv->phandle->card_info->drcs) {
if (MLAN_STATUS_SUCCESS == woal_mc_policy_cfg(priv, &enable,
MOAL_IOCTL_WAIT,
MLAN_ACT_GET)) {
if (enable) {
if (MLAN_STATUS_SUCCESS ==
woal_get_active_intf_channel(priv, &channel)) {
woal_get_active_intf_channel(priv,
&channel)) {
if (channel.channel !=
chandef->chan->hw_value) {
PRINTM(MERROR,
@ -4010,6 +4017,7 @@ int woal_cfg80211_start_radar_detection(struct wiphy *wiphy,
}
}
}
}
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_11h_cfg));
if (NULL == req) {
ret = -ENOMEM;

View file

@ -4,7 +4,7 @@
* driver.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991

View file

@ -4,7 +4,7 @@
* driver.
*
*
* Copyright 2008-2021 NXP
* Copyright 2008-2021, 2024 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991