meta-freescale/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/wlan_src_driver_patch_release_lf-6.6.52-2.2.0.patch
Leon Anavi 1344f74197 kernel-module-nxp-wlan: Add Upstream-Status
Add Upstream-Status to patch.

Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
2025-04-04 17:26:12 +03:00

1907 lines
72 KiB
Diff

Upstream-Status: Inappropriate [platform specific]
diff --git a/Makefile b/Makefile
index 024e977..d61798e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
# File: Makefile
#
-# Copyright 2008-2024 NXP
+# Copyright 2008-2025 NXP
#
# This software file (the File) is distributed by NXP
# under the terms of the GNU General Public License Version 2, June 1991
@@ -188,7 +188,7 @@ APPDIR= $(shell if test -d "mapp"; then echo mapp; fi)
#############################################################################
ccflags-y += -I$(KERNELDIR)/include
- ccflags-y += -DMLAN_RELEASE_VERSION='"505.p4"'
+ ccflags-y += -DMLAN_RELEASE_VERSION='"505.p7.1"'
ccflags-y += -DFPNUM='"92"'
diff --git a/mlan/mlan_cmdevt.c b/mlan/mlan_cmdevt.c
index 49c645e..dc0c8ba 100644
--- a/mlan/mlan_cmdevt.c
+++ b/mlan/mlan_cmdevt.c
@@ -4,7 +4,7 @@
* @brief This file contains the handling of CMD/EVENT in MLAN
*
*
- * Copyright 2009-2024 NXP
+ * Copyright 2009-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -5272,6 +5272,17 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter)
}
}
#endif
+ if (pmpriv && (pmadapter->init_para.disable_11h_tpc)) {
+ /* Send command to FW to disable 11h tpc */
+ ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_SNMP_MIB,
+ HostCmd_ACT_GEN_SET,
+ Dot11h_disable_tpc_i, MNULL,
+ &pmadapter->init_para.disable_11h_tpc);
+ if (ret) {
+ ret = MLAN_STATUS_FAILURE;
+ goto done;
+ }
+ }
#ifdef STA_SUPPORT
if (pmpriv_sta && (pmadapter->ps_mode == Wlan802_11PowerModePSP)) {
ret = wlan_prepare_cmd(pmpriv_sta,
diff --git a/mlan/mlan_decl.h b/mlan/mlan_decl.h
index d1367d6..97bc08f 100644
--- a/mlan/mlan_decl.h
+++ b/mlan/mlan_decl.h
@@ -3,7 +3,7 @@
* @brief This file declares the generic data structures and APIs.
*
*
- * Copyright 2008-2022, 2024 NXP
+ * Copyright 2008-2022, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -2782,6 +2782,7 @@ typedef struct _mlan_device {
t_u32 max_tx_pending;
t_u16 tx_budget;
t_u8 mclient_scheduling;
+ t_u8 disable_11h_tpc;
} mlan_device, *pmlan_device;
/** MLAN API function prototype */
diff --git a/mlan/mlan_fw.h b/mlan/mlan_fw.h
index 6ce0451..df8efa6 100644
--- a/mlan/mlan_fw.h
+++ b/mlan/mlan_fw.h
@@ -5,7 +5,7 @@
* in MLAN module.
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -1674,11 +1674,14 @@ typedef MLAN_PACK_START struct _RxPD {
t_u32 rx_info;
/** Reserved */
- t_u8 reserved3[8];
+ t_u8 reserved3[7];
+ t_u8 rx_pkt_flags;
t_u8 ta_mac[6];
t_u8 reserved4[2];
} MLAN_PACK_END RxPD, *PRxPD;
+#define RX_PKT_FLAG_MEF_MATCH_PKT MBIT(0)
+
/** IEEEtypes_FrameCtl_t*/
#ifdef BIG_ENDIAN_SUPPORT
typedef MLAN_PACK_START struct _IEEEtypes_FrameCtl_t {
@@ -3686,6 +3689,7 @@ typedef enum _SNMP_MIB_INDEX {
StopDeauth_i = 44,
Dot11H_fakeRadar = 45,
ChanTrackParam_i = 46,
+ Dot11h_disable_tpc_i = 47,
} SNMP_MIB_INDEX;
/** max SNMP buf size */
diff --git a/mlan/mlan_join.c b/mlan/mlan_join.c
index f4c8860..34fe4e7 100644
--- a/mlan/mlan_join.c
+++ b/mlan/mlan_join.c
@@ -7,7 +7,7 @@
* to the firmware.
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -1046,6 +1046,7 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
t_u32 rates_size;
t_u16 tmp_cap;
t_u8 *pos;
+ IEEEtypes_CapInfo_t *pcap_info;
t_u8 ft_akm = 0;
t_u8 oper_class;
t_u8 oper_class_flag = MFALSE;
@@ -1524,6 +1525,11 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
memcpy_ext(pmadapter, &tmp_cap, &pbss_desc->cap_info,
sizeof(passo->cap_info), sizeof(tmp_cap));
+ /* retain spectrum_mgmt capability */
+ pcap_info = &passo->cap_info;
+ if (pcap_info->spectrum_mgmt)
+ SPECTRUM_MGMT_ENABLED(tmp_cap);
+
if (pmpriv->config_bands == BAND_B)
SHORT_SLOT_TIME_DISABLED(tmp_cap);
diff --git a/mlan/mlan_main.h b/mlan/mlan_main.h
index 2e41d37..258bd1f 100644
--- a/mlan/mlan_main.h
+++ b/mlan/mlan_main.h
@@ -5,7 +5,7 @@
* in MLAN module.
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -2042,6 +2042,7 @@ typedef struct _mlan_init_para {
t_u16 tx_budget;
t_u8 mclient_scheduling;
t_u32 reject_addba_req;
+ t_u8 disable_11h_tpc;
} mlan_init_para, *pmlan_init_para;
#ifdef SDIO
diff --git a/mlan/mlan_pcie.c b/mlan/mlan_pcie.c
index 3575a9a..c29fb6e 100644
--- a/mlan/mlan_pcie.c
+++ b/mlan/mlan_pcie.c
@@ -3,7 +3,7 @@
* @brief This file contains PCI-E specific code
*
*
- * Copyright 2008-2021, 2024 NXP
+ * Copyright 2008-2021, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -2134,6 +2134,8 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
ptx_bd_buf->flags = 0;
ptx_bd_buf->frag_len = 0;
ptx_bd_buf->offset = 0;
+ pcb->moal_spin_lock(pmadapter->pmoal_handle,
+ pmadapter->pmlan_pcie_lock);
pmadapter->pcard_pcie->txbd_rdptr++;
if ((pmadapter->pcard_pcie->txbd_rdptr &
txrx_rw_ptr_mask) == num_tx_buffs)
@@ -2141,6 +2143,8 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
((pmadapter->pcard_pcie->txbd_rdptr &
txrx_rw_ptr_rollover_ind) ^
txrx_rw_ptr_rollover_ind);
+ pcb->moal_spin_unlock(pmadapter->pmoal_handle,
+ pmadapter->pmlan_pcie_lock);
}
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
@@ -2154,9 +2158,13 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
padma_bd_buf->flags = 0;
padma_bd_buf->pkt_size = 0;
padma_bd_buf->reserved = 0;
+ pcb->moal_spin_lock(pmadapter->pmoal_handle,
+ pmadapter->pmlan_pcie_lock);
pmadapter->pcard_pcie->txbd_rdptr++;
pmadapter->pcard_pcie->txbd_rdptr &=
ADMA_RW_PTR_WRAP_MASK;
+ pcb->moal_spin_unlock(pmadapter->pmoal_handle,
+ pmadapter->pmlan_pcie_lock);
}
#endif
}
diff --git a/mlan/mlan_shim.c b/mlan/mlan_shim.c
index 0752d7f..d27ab7e 100644
--- a/mlan/mlan_shim.c
+++ b/mlan/mlan_shim.c
@@ -3,7 +3,7 @@
* @brief This file contains APIs to MOAL module.
*
*
- * Copyright 2008-2021, 2024 NXP
+ * Copyright 2008-2021, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -474,6 +474,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->init_para.disable_11h_tpc = pmdevice->disable_11h_tpc;
pmadapter->priv_num = 0;
pmadapter->priv[0] = MNULL;
diff --git a/mlan/mlan_sta_cmd.c b/mlan/mlan_sta_cmd.c
index 4dd1712..2e16779 100644
--- a/mlan/mlan_sta_cmd.c
+++ b/mlan/mlan_sta_cmd.c
@@ -5,7 +5,7 @@
* it is ready.
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -242,6 +242,18 @@ static mlan_status wlan_cmd_802_11_snmp_mib(pmlan_private pmpriv,
cmd->size += sizeof(t_u16);
}
break;
+ case Dot11h_disable_tpc_i:
+ psnmp_mib->oid = wlan_cpu_to_le16((t_u16)Dot11h_disable_tpc_i);
+ if (cmd_action == HostCmd_ACT_GEN_SET) {
+ psnmp_mib->query_type =
+ wlan_cpu_to_le16(HostCmd_ACT_GEN_SET);
+ psnmp_mib->buf_size = wlan_cpu_to_le16(sizeof(t_u16));
+ ul_temp = *(t_u32 *)pdata_buf;
+ *((t_u16 *)(psnmp_mib->value)) =
+ wlan_cpu_to_le16((t_u16)ul_temp);
+ cmd->size += sizeof(t_u16);
+ }
+ break;
case WwsMode_i:
psnmp_mib->oid = wlan_cpu_to_le16((t_u16)WwsMode_i);
if (cmd_action == HostCmd_ACT_GEN_SET) {
diff --git a/mlan/mlan_sta_cmdresp.c b/mlan/mlan_sta_cmdresp.c
index 116506c..f88f91d 100644
--- a/mlan/mlan_sta_cmdresp.c
+++ b/mlan/mlan_sta_cmdresp.c
@@ -4,7 +4,7 @@
* responses generated by firmware.
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -643,6 +643,13 @@ static mlan_status wlan_ret_802_11_snmp_mib(pmlan_private pmpriv,
(ul_temp & SLAVE_RADAR_DET_MASK) ? MTRUE :
MFALSE;
}
+ /* Update state for 11h tpc disable */
+ if (oid == Dot11h_disable_tpc_i) {
+ /* Set 11h tpc to private */
+ ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
+ PRINTM(MCMND, "SNMP_RESP: Dot11h_disable_tpc_i =%u\n",
+ ul_temp);
+ }
}
if (pioctl_buf) {
diff --git a/mlan/mlan_uap_cmdevent.c b/mlan/mlan_uap_cmdevent.c
index 6c50db9..66c01c5 100644
--- a/mlan/mlan_uap_cmdevent.c
+++ b/mlan/mlan_uap_cmdevent.c
@@ -3,7 +3,7 @@
* @brief This file contains the handling of AP mode command and event
*
*
- * Copyright 2009-2024 NXP
+ * Copyright 2009-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -3024,6 +3024,7 @@ static mlan_status wlan_uap_cmd_snmp_mib(pmlan_private pmpriv,
switch (cmd_oid) {
case Dot11D_i:
case Dot11H_i:
+ case Dot11h_disable_tpc_i:
psnmp_mib->oid = wlan_cpu_to_le16((t_u16)cmd_oid);
psnmp_mib->buf_size = wlan_cpu_to_le16(sizeof(t_u16));
ul_temp = *(t_u32 *)pdata_buf;
diff --git a/mlan/mlan_wmm.c b/mlan/mlan_wmm.c
index 9a8083a..6da49ea 100644
--- a/mlan/mlan_wmm.c
+++ b/mlan/mlan_wmm.c
@@ -3,7 +3,7 @@
* @brief This file contains functions for WMM.
*
*
- * Copyright 2008-2021, 2024 NXP
+ * Copyright 2008-2021, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -840,11 +840,11 @@ static raListTbl *wlan_wmm_get_highest_priolist_ptr(pmlan_adapter pmadapter,
*
* @return byte budget
*/
-static t_u32 wlan_wmm_get_byte_budget(pmlan_adapter pmadapter, t_u32 time_budget_us, t_u32 phy_rate_kbps)
+static t_u32 wlan_wmm_get_byte_budget(t_u32 time_budget_us, t_u32 phy_rate_kbps)
{
const t_u32 min_budget = MV_ETH_FRAME_LEN;
- t_u64 byte_budget = pmadapter->callbacks.moal_do_div((t_u64)phy_rate_kbps * time_budget_us,
- 8 * 1000u);
+ t_u64 byte_budget =
+ ((t_u64)phy_rate_kbps * time_budget_us) / (8 * 1000u);
if (byte_budget > INT_MAX)
return INT_MAX;
@@ -891,7 +891,7 @@ wlan_wmm_allocate_sta_table(pmlan_adapter pmadapter, t_u8 *ra)
sta_table->budget.time_budget_init_us = pmadapter->init_para.tx_budget;
sta_table->budget.byte_budget_init = wlan_wmm_get_byte_budget(
- pmadapter, sta_table->budget.time_budget_init_us, default_rate);
+ sta_table->budget.time_budget_init_us, default_rate);
sta_table->budget.queue_packets = default_queue_packets;
sta_table->budget.phy_rate_kbps = default_rate;
@@ -900,14 +900,14 @@ wlan_wmm_allocate_sta_table(pmlan_adapter pmadapter, t_u8 *ra)
sta_table->budget.mpdu_no_amsdu_pps_cap =
pmadapter->tx_mpdu_no_amsdu_pps;
- sta_table->budget.mpdu_with_amsdu_budget_init = pmadapter->callbacks.moal_do_div(
- (t_u64)sta_table->budget.mpdu_with_amsdu_pps_cap *
- sta_table->budget.time_budget_init_us,
- 1000000);
- sta_table->budget.mpdu_no_amsdu_budget_init = pmadapter->callbacks.moal_do_div(
- (t_u64)sta_table->budget.mpdu_no_amsdu_pps_cap *
- sta_table->budget.time_budget_init_us,
- 1000000);
+ sta_table->budget.mpdu_with_amsdu_budget_init =
+ ((t_u64)sta_table->budget.mpdu_with_amsdu_pps_cap *
+ sta_table->budget.time_budget_init_us) /
+ 1000000;
+ sta_table->budget.mpdu_no_amsdu_budget_init =
+ ((t_u64)sta_table->budget.mpdu_no_amsdu_pps_cap *
+ sta_table->budget.time_budget_init_us) /
+ 1000000;
for (i = 0; i < NELEMENTS(sta_table->budget.bytes); ++i) {
sta_table->budget.bytes[i] = sta_table->budget.byte_budget_init;
@@ -3142,12 +3142,12 @@ static t_void wlan_wmm_update_queue_packets_budget(pmlan_adapter pmadapter,
list_entry, struct wmm_sta_table, active_sta_entry);
const t_u64 sta_capacity = sta->budget.byte_budget_init;
const t_u32 max_pkts_by_airtime =
- wlan_wmm_get_byte_budget(pmadapter, max_pending_tx_time_us,
+ wlan_wmm_get_byte_budget(max_pending_tx_time_us,
sta->budget.phy_rate_kbps) /
MV_ETH_FRAME_LEN;
- t_u32 sta_share = pmadapter->callbacks.moal_do_div((t_u64)queue_packets_limit * sta_capacity,
- total_capacity);
+ t_u32 sta_share =
+ queue_packets_limit * sta_capacity / total_capacity;
sta_share = MAX(sta_share, min_sta_share);
sta_share = MIN(sta_share, queue_packets_limit * 7 / 8);
sta_share = MIN(sta_share, max_pkts_by_airtime);
@@ -5183,7 +5183,6 @@ static void wlan_wmm_adjust_sta_tx_budget(pmlan_private priv,
struct wmm_sta_table *sta,
HostCmd_TX_RATE_QUERY *rate)
{
- mlan_adapter *pmadapter = priv->adapter;
const t_u8 ppdu_type_legacy = 0;
const t_u8 ppdu_type_ht = 1;
const t_u8 ppdu_type_vht = 2;
@@ -5211,7 +5210,7 @@ static void wlan_wmm_adjust_sta_tx_budget(pmlan_private priv,
if (phy_rate > 0) {
const t_u32 old_phy_rate = sta->budget.phy_rate_kbps;
sta->budget.byte_budget_init = wlan_wmm_get_byte_budget(
- pmadapter, sta->budget.time_budget_init_us, phy_rate);
+ sta->budget.time_budget_init_us, phy_rate);
sta->budget.phy_rate_kbps = phy_rate;
if (old_phy_rate / phy_rate >= 2 ||
diff --git a/mlinux/mlan_decl.h b/mlinux/mlan_decl.h
index d1367d6..97bc08f 100644
--- a/mlinux/mlan_decl.h
+++ b/mlinux/mlan_decl.h
@@ -3,7 +3,7 @@
* @brief This file declares the generic data structures and APIs.
*
*
- * Copyright 2008-2022, 2024 NXP
+ * Copyright 2008-2022, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -2782,6 +2782,7 @@ typedef struct _mlan_device {
t_u32 max_tx_pending;
t_u16 tx_budget;
t_u8 mclient_scheduling;
+ t_u8 disable_11h_tpc;
} mlan_device, *pmlan_device;
/** MLAN API function prototype */
diff --git a/mlinux/moal_cfg80211.c b/mlinux/moal_cfg80211.c
index 074fd59..0e54436 100644
--- a/mlinux/moal_cfg80211.c
+++ b/mlinux/moal_cfg80211.c
@@ -3,7 +3,7 @@
* @brief This file contains the functions for CFG80211.
*
*
- * Copyright 2011-2024 NXP
+ * Copyright 2011-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -1105,10 +1105,7 @@ void woal_cancel_cac(moal_private *priv)
if (woal_11h_cancel_chan_report_ioctl(priv, MOAL_IOCTL_WAIT))
PRINTM(MERROR, "%s: cancel chan report failed \n",
__func__);
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev, &priv->phandle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED, GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev, &priv->phandle->dfs_channel,
NL80211_RADAR_CAC_ABORTED, GFP_KERNEL);
#else
@@ -1203,12 +1200,7 @@ int woal_cfg80211_change_virtual_intf(struct wiphy *wiphy,
PRINTM(MERROR,
"%s: cancel chan report failed \n",
__func__);
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev,
- &priv->phandle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED,
- GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev,
&priv->phandle->dfs_channel,
NL80211_RADAR_CAC_ABORTED,
@@ -1322,8 +1314,8 @@ int woal_cfg80211_change_virtual_intf(struct wiphy *wiphy,
#endif /* WIFI_DIRECT_SUPPORT */
#if defined(STA_SUPPORT) && defined(UAP_SUPPORT)
if (priv->bss_type == MLAN_BSS_TYPE_UAP) {
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
woal_cfg80211_del_beacon(wiphy, dev, 0);
#else
woal_cfg80211_del_beacon(wiphy, dev);
@@ -1562,7 +1554,8 @@ fail:
*/
#endif
int woal_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index,
@@ -1638,7 +1631,8 @@ int woal_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
*/
#endif
int woal_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index,
@@ -1655,13 +1649,9 @@ int woal_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
LEAVE();
return -EFAULT;
}
- /* del_key will be trigger from cfg80211_rx_mlme_mgmt funtion
- * where we receive deauth/disassoicate packet in rx_work
- * use MOAL_NO_WAIT to avoid dead lock
- */
if (MLAN_STATUS_FAILURE ==
woal_cfg80211_set_key(priv, 0, 0, NULL, 0, NULL, 0, key_index,
- mac_addr, 1, 0, MOAL_NO_WAIT)) {
+ mac_addr, 1, 0, MOAL_IOCTL_WAIT)) {
PRINTM(MERROR, "Error deleting the crypto keys\n");
LEAVE();
return -EFAULT;
@@ -1697,7 +1687,8 @@ int woal_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
#endif
int woal_cfg80211_set_default_key(struct wiphy *wiphy,
struct net_device *netdev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index
@@ -1736,7 +1727,8 @@ int woal_cfg80211_set_default_key(struct wiphy *wiphy,
#if KERNEL_VERSION(2, 6, 30) <= CFG80211_VERSION_CODE
int woal_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
struct net_device *netdev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index)
@@ -1750,7 +1742,8 @@ int woal_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
#if KERNEL_VERSION(5, 10, 0) <= CFG80211_VERSION_CODE
int woal_cfg80211_set_default_beacon_key(struct wiphy *wiphy,
struct net_device *netdev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index)
@@ -2337,8 +2330,8 @@ done:
* @return 0 -- success, otherwise fail
*/
int woal_cfg80211_set_bitrate_mask(struct wiphy *wiphy, struct net_device *dev,
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
unsigned int link_id,
#endif
const u8 *peer,
@@ -5484,11 +5477,11 @@ void woal_cfg80211_notify_channel(moal_private *priv,
CFG80211_VERSION_CODE < KERNEL_VERSION(6, 9, 0)
cfg80211_ch_switch_notify(priv->netdev, &chandef, 0, 0);
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && \
- IMX_ANDROID_13)) && \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))) && \
CFG80211_VERSION_CODE < KERNEL_VERSION(6, 9, 0)
cfg80211_ch_switch_notify(priv->netdev, &chandef, 0, 0);
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
- IMX_ANDROID_13 || IMX_ANDROID_12_BACKPORT)
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
cfg80211_ch_switch_notify(priv->netdev, &chandef, 0);
#else
cfg80211_ch_switch_notify(priv->netdev, &chandef);
diff --git a/mlinux/moal_cfg80211.h b/mlinux/moal_cfg80211.h
index 3323055..1b8484b 100644
--- a/mlinux/moal_cfg80211.h
+++ b/mlinux/moal_cfg80211.h
@@ -3,7 +3,7 @@
* @brief This file contains the CFG80211 specific defines.
*
*
- * Copyright 2011-2022, 2024 NXP
+ * Copyright 2011-2022, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -133,7 +133,8 @@ int woal_cfg80211_change_virtual_intf(struct wiphy *wiphy,
int woal_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed);
int woal_cfg80211_add_key(struct wiphy *wiphy, struct net_device *dev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index,
@@ -143,7 +144,8 @@ int woal_cfg80211_add_key(struct wiphy *wiphy, struct net_device *dev,
const t_u8 *mac_addr, struct key_params *params);
int woal_cfg80211_del_key(struct wiphy *wiphy, struct net_device *dev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index,
@@ -167,8 +169,8 @@ int woal_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device *dev);
#endif
int woal_cfg80211_set_bitrate_mask(struct wiphy *wiphy, struct net_device *dev,
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
unsigned int link_id,
#endif
const u8 *peer,
@@ -219,7 +221,8 @@ int woal_cfg80211_set_channel(struct wiphy *wiphy,
#if KERNEL_VERSION(2, 6, 37) < CFG80211_VERSION_CODE
int woal_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *dev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index, bool ucast, bool mcast);
@@ -231,7 +234,8 @@ int woal_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *dev,
#if KERNEL_VERSION(2, 6, 30) <= CFG80211_VERSION_CODE
int woal_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
struct net_device *netdev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index);
@@ -240,7 +244,8 @@ int woal_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
#if KERNEL_VERSION(5, 10, 0) <= CFG80211_VERSION_CODE
int woal_cfg80211_set_default_beacon_key(struct wiphy *wiphy,
struct net_device *netdev,
-#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || IMX_ANDROID_13)
+#if ((KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))
int link_id,
#endif
t_u8 key_index);
@@ -453,8 +458,8 @@ int woal_cfg80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
struct beacon_parameters *params);
#endif
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev,
unsigned int link_id);
#else
@@ -472,12 +477,7 @@ int woal_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
#endif
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
-#if KERNEL_VERSION(6, 12, 0) <= CFG80211_VERSION_CODE
-int woal_cfg80211_start_radar_detection(struct wiphy *wiphy,
- struct net_device *dev,
- struct cfg80211_chan_def *chandef,
- u32 cac_time_msi, int link_id);
-#elif KERNEL_VERSION(3, 15, 0) <= CFG80211_VERSION_CODE
+#if KERNEL_VERSION(3, 15, 0) <= CFG80211_VERSION_CODE
int woal_cfg80211_start_radar_detection(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_chan_def *chandef,
diff --git a/mlinux/moal_init.c b/mlinux/moal_init.c
index f790666..845d272 100644
--- a/mlinux/moal_init.c
+++ b/mlinux/moal_init.c
@@ -4,7 +4,7 @@
* driver.
*
*
- * Copyright 2018-2022, 2024 NXP
+ * Copyright 2018-2022, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -336,6 +336,9 @@ static int mon_filter = DEFAULT_NETMON_FILTER;
int dual_nb;
+/** disable 802.11h tpc configuration */
+static int disable_11h_tpc = 0;
+
#ifdef DEBUG_LEVEL1
#ifdef DEBUG_LEVEL2
#define DEFAULT_DEBUG_MASK (0xffffffff)
@@ -1597,6 +1600,14 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
params->reject_addba_req = out_data;
PRINTM(MMSG, "reject_addba_req=%x\n",
params->reject_addba_req);
+ } else if (strncmp(line, "disable_11h_tpc",
+ strlen("disable_11h_tpc")) == 0) {
+ if (parse_line_read_int(line, &out_data) !=
+ MLAN_STATUS_SUCCESS)
+ goto err;
+ params->disable_11h_tpc = out_data;
+ PRINTM(MMSG, "disable_11h_tpc=%x\n",
+ params->disable_11h_tpc);
}
}
@@ -2000,6 +2011,13 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
handle->params.dual_nb = dual_nb;
if (params)
handle->params.dual_nb = params->dual_nb;
+
+ handle->params.disable_11h_tpc = disable_11h_tpc;
+ /* Ignore country IE when 11h tpc is disabled */
+ if (disable_11h_tpc)
+ moal_extflg_set(handle, EXT_COUNTRY_IE_IGNORE);
+ if (params)
+ handle->params.disable_11h_tpc = params->disable_11h_tpc;
}
/**
@@ -2568,6 +2586,12 @@ void woal_init_from_dev_tree(void)
data);
reject_addba_req = data;
}
+ } else if (!strncmp(prop->name, "disable_11h_tpc",
+ strlen("disable_11h_tpc"))) {
+ if (!of_property_read_u32(dt_node, prop->name, &data)) {
+ PRINTM(MERROR, "disable_11h_tpc=0x%x\n", data);
+ disable_11h_tpc = data;
+ }
}
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
@@ -3187,3 +3211,7 @@ 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");
+
+module_param(disable_11h_tpc, int, 0);
+MODULE_PARM_DESC(disable_11h_tpc,
+ "0: Enable 802.11h tpc; 1: Disable 802.11h tpc");
diff --git a/mlinux/moal_ioctl.c b/mlinux/moal_ioctl.c
index 94b8b2a..49711ea 100644
--- a/mlinux/moal_ioctl.c
+++ b/mlinux/moal_ioctl.c
@@ -3,7 +3,7 @@
* @brief This file contains ioctl function to MLAN
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -6101,13 +6101,19 @@ mlan_status woal_cancel_scan(moal_private *priv, t_u8 wait_option)
#ifdef STA_CFG80211
unsigned long flags;
#endif
+
+#ifdef STA_CFG80211
+ // cancel scan timeout
+ if (IS_STA_CFG80211(handle->params.cfg80211_wext) &&
+ handle->scan_request)
+ cancel_delayed_work(&handle->scan_timeout_work);
+#endif
/* If scan is in process, cancel the scan command */
if (!handle->scan_pending_on_block || !scan_priv) {
#ifdef STA_CFG80211
spin_lock_irqsave(&handle->scan_req_lock, flags);
if (IS_STA_CFG80211(handle->params.cfg80211_wext) &&
handle->scan_request) {
- cancel_delayed_work(&handle->scan_timeout_work);
/* some supplicant cannot handle SCAN abort event */
if (scan_priv &&
(scan_priv->bss_type == MLAN_BSS_TYPE_STA))
@@ -6138,7 +6144,6 @@ mlan_status woal_cancel_scan(moal_private *priv, t_u8 wait_option)
spin_lock_irqsave(&handle->scan_req_lock, flags);
if (IS_STA_CFG80211(handle->params.cfg80211_wext) &&
handle->scan_request) {
- cancel_delayed_work(&handle->scan_timeout_work);
/** some supplicant can not handle SCAN abort event */
if (scan_priv->bss_type == MLAN_BSS_TYPE_STA)
woal_cfg80211_scan_done(handle->scan_request, MTRUE);
diff --git a/mlinux/moal_main.c b/mlinux/moal_main.c
index e7f3242..a478a2c 100644
--- a/mlinux/moal_main.c
+++ b/mlinux/moal_main.c
@@ -4,7 +4,7 @@
* driver.
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -174,6 +174,7 @@ static struct _card_info card_info_SD8887 = {
.fw_reset_val = 1,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0x90,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@@ -214,6 +215,7 @@ static struct _card_info card_info_SD8897 = {
.fw_reset_val = 1,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xC0,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@@ -299,6 +301,7 @@ static struct _card_info card_info_SD8977 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@@ -342,6 +345,7 @@ static struct _card_info card_info_SD8978 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@@ -385,6 +389,7 @@ static struct _card_info card_info_SD8997 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@@ -429,6 +434,7 @@ static struct _card_info card_info_SD9098 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@@ -473,6 +479,7 @@ static struct _card_info card_info_SD9097 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@@ -517,6 +524,7 @@ static struct _card_info card_info_SDIW624 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@@ -561,6 +569,7 @@ static struct _card_info card_info_SDAW693 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@@ -605,6 +614,7 @@ static struct _card_info card_info_SD9177 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@@ -649,6 +659,7 @@ static struct _card_info card_info_SDIW610 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x45001064,
.slew_rate_bit_offset = 16,
#endif
@@ -976,6 +987,7 @@ static struct _card_info card_info_SD8987 = {
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
+ .fw_winner_status_reg = 0xFC,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@@ -989,8 +1001,7 @@ static struct _card_info card_info_SD8987 = {
/** Driver version */
char driver_version[] =
- INTF_CARDTYPE KERN_VERSION "--" MLAN_RELEASE_VERSION "-GPL"
- "-("
+ INTF_CARDTYPE KERN_VERSION "--" MLAN_RELEASE_VERSION "-("
"FP" FPNUM ")"
#ifdef DEBUG_LEVEL2
"-dbg"
@@ -1224,11 +1235,7 @@ void woal_clean_up(moal_handle *handle)
handle->cac_period = MFALSE;
priv = handle->priv[handle->cac_bss_index];
if (priv) {
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev, &handle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED,
- GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev, &handle->dfs_channel,
NL80211_RADAR_CAC_ABORTED,
GFP_KERNEL);
@@ -1259,8 +1266,8 @@ void woal_clean_up(moal_handle *handle)
#ifdef STA_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
if (IS_STA_CFG80211(cfg80211_wext) && priv->wdev &&
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
priv->wdev->connected) {
#else
priv->wdev->current_bss) {
@@ -1305,6 +1312,92 @@ void woal_clean_up(moal_handle *handle)
return;
}
+/**
+ * @brief This function send the auto recovery failure event to userspace using
+ * netlink
+ *
+ * @param handle Pointer to structure moal_handle
+ *
+ * @return N/A
+ */
+void woal_send_auto_recovery_failure_event(moal_handle *handle)
+{
+ mlan_status ret = MLAN_STATUS_SUCCESS;
+ struct sk_buff *skb = NULL;
+ struct nlmsghdr *nlh = NULL;
+ struct sock *sk = handle->nl_sk;
+ int len = strlen(CUS_EVT_FW_RECOVER_FAIL);
+ ENTER();
+
+ /* interface name to be prepended to event */
+ /* NL_MAX_PAYLOAD = 3 * 1024 */
+ if ((len + IFNAMSIZ) > NL_MAX_PAYLOAD) {
+ PRINTM(MERROR, "event size is too big, len=%d\n", (int)len);
+ ret = MLAN_STATUS_FAILURE;
+ goto done;
+ }
+ if (sk) {
+ /* Allocate skb */
+ skb = alloc_skb(NLMSG_SPACE(NL_MAX_PAYLOAD), GFP_ATOMIC);
+ if (!skb) {
+ PRINTM(MERROR, "Could not allocate skb for netlink\n");
+ ret = MLAN_STATUS_FAILURE;
+ goto done;
+ }
+ memset(skb->data, 0, NLMSG_SPACE(NL_MAX_PAYLOAD));
+
+ nlh = (struct nlmsghdr *)skb->data;
+ nlh->nlmsg_len = NLMSG_SPACE(len + IFNAMSIZ);
+
+ /* From kernel */
+ nlh->nlmsg_pid = 0;
+ nlh->nlmsg_flags = 0;
+
+ /* Data */
+ skb_put(skb, nlh->nlmsg_len);
+ moal_memcpy_ext(handle, NLMSG_DATA(nlh), "wlan", sizeof("wlan"),
+ nlh->nlmsg_len - NLMSG_LENGTH(0));
+
+ moal_memcpy_ext(handle, ((t_u8 *)(NLMSG_DATA(nlh))) + IFNAMSIZ,
+ CUS_EVT_FW_RECOVER_FAIL, len,
+ nlh->nlmsg_len - NLMSG_LENGTH(IFNAMSIZ));
+
+ /* From Kernel */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)
+ NETLINK_CB(skb).pid = 0;
+#else
+ NETLINK_CB(skb).portid = 0;
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
+ /* Multicast message */
+ NETLINK_CB(skb).dst_pid = 0;
+#endif
+
+ /* Multicast group number */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14)
+ NETLINK_CB(skb).dst_groups = NL_MULTICAST_GROUP;
+#else
+ NETLINK_CB(skb).dst_group = NL_MULTICAST_GROUP;
+#endif
+
+ /* Send message */
+ ret = netlink_broadcast(sk, skb, 0, NL_MULTICAST_GROUP,
+ GFP_ATOMIC);
+ if (ret) {
+ PRINTM(MWARN, "netlink_broadcast failed: ret=%d\n",
+ ret);
+ goto done;
+ }
+
+ } else {
+ PRINTM(MERROR,
+ "Could not send event through NETLINK. Link down.\n");
+ }
+done:
+ LEAVE();
+}
+
/**
* @brief This function send the auto recovery complete event to kernel
*
@@ -1412,8 +1505,8 @@ static void woal_hang_work_queue(struct work_struct *work)
#ifdef STA_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
if (IS_STA_CFG80211(cfg80211_wext) && priv->wdev &&
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
priv->wdev->connected) {
#else
priv->wdev->current_bss) {
@@ -2603,6 +2696,7 @@ mlan_status woal_init_sw(moal_handle *handle)
handle->rtt_capa.responder_supported = MTRUE;
handle->rtt_capa.mc_version = 60;
handle->is_edmac_enabled = MFALSE;
+ handle->driver_init = MFALSE;
/* Register to MLAN */
memset(&device, 0, sizeof(mlan_device));
@@ -2716,6 +2810,7 @@ mlan_status woal_init_sw(moal_handle *handle)
device.dmcs = handle->params.dmcs;
device.pref_dbc = handle->params.pref_dbc;
device.reject_addba_req = handle->params.reject_addba_req;
+ device.disable_11h_tpc = (t_u32)handle->params.disable_11h_tpc;
for (i = 0; i < handle->drv_mode.intf_num; i++) {
device.bss_attr[i].bss_type =
@@ -4274,6 +4369,15 @@ err:
#ifdef CONFIG_PROC_FS
woal_proc_exit(handle);
#endif
+
+#if defined(STA_CFG80211) || defined(UAP_CFG80211)
+ if (handle->wiphy) {
+ wiphy_unregister(handle->wiphy);
+ woal_cfg80211_free_bands(handle->wiphy);
+ wiphy_free(handle->wiphy);
+ handle->wiphy = NULL;
+ }
+#endif
}
LEAVE();
return ret;
@@ -4770,6 +4874,7 @@ static mlan_status woal_request_fw_dpc(moal_handle *handle,
if (ret)
goto done;
+ handle->driver_init = MTRUE;
done:
/* We should hold the semaphore until callback finishes execution */
MOAL_REL_SEMAPHORE(&AddRemoveCardSem);
@@ -4910,6 +5015,9 @@ mlan_status woal_init_fw(moal_handle *handle)
ret = woal_add_card_dpc(handle);
if (ret)
goto done;
+
+ handle->driver_init = MTRUE;
+
/* Release semaphore if download is not required */
MOAL_REL_SEMAPHORE(&AddRemoveCardSem);
done:
@@ -6653,8 +6761,8 @@ int woal_close(struct net_device *dev)
woal_cancel_scan(priv, MOAL_IOCTL_WAIT);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
if (IS_STA_CFG80211(cfg80211_wext) && priv->wdev &&
priv->wdev->connected) {
#else
@@ -10391,8 +10499,8 @@ t_void woal_send_disconnect_to_system(moal_private *priv,
if (IS_STA_CFG80211(cfg80211_wext)) {
spin_lock_irqsave(&priv->connect_lock, flags);
if (!priv->cfg_disconnect && !priv->cfg_connect && priv->wdev &&
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
priv->wdev->connected) {
#else
priv->wdev->current_bss) {
@@ -12222,7 +12330,9 @@ t_void woal_scan_timeout_handler(struct work_struct *work)
woal_inform_bss_from_scan_result(priv, NULL,
MOAL_NO_WAIT);
spin_lock_irqsave(&handle->scan_req_lock, flags);
- woal_cfg80211_scan_done(handle->scan_request, MFALSE);
+ if (handle->scan_request)
+ woal_cfg80211_scan_done(handle->scan_request,
+ MFALSE);
handle->scan_request = NULL;
handle->fake_scan_complete = MFALSE;
spin_unlock_irqrestore(&handle->scan_req_lock, flags);
@@ -14035,6 +14145,13 @@ int woal_request_fw_reload(moal_handle *phandle, t_u8 mode)
moal_handle *ref_handle = NULL;
ENTER();
+
+ if (!handle->driver_init) {
+ PRINTM(MMSG, "Ignore fw reload, driver not initialized\n");
+ LEAVE();
+ return -EFAULT;
+ }
+
wifi_status = WIFI_STATUS_FW_RELOAD;
#ifdef PCIE
if (mode == FW_RELOAD_PCIE_RESET) {
@@ -14710,4 +14827,3 @@ MODULE_DESCRIPTION("M-WLAN Driver");
MODULE_AUTHOR("NXP");
MODULE_VERSION(MLAN_RELEASE_VERSION);
MODULE_LICENSE("GPL");
-MODULE_LICENSE("GPL");
diff --git a/mlinux/moal_main.h b/mlinux/moal_main.h
index 6d87dcf..f8941c7 100644
--- a/mlinux/moal_main.h
+++ b/mlinux/moal_main.h
@@ -3,7 +3,7 @@
* @brief This file contains wlan driver specific defines etc.
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -408,6 +408,7 @@ typedef enum _MOAL_HARDWARE_STATUS {
#define WIFI_STATUS_SCAN_TIMEOUT 8
#define WIFI_STATUS_FW_DUMP 9
#define WIFI_STATUS_FW_RELOAD 10
+#define WIFI_STATUS_FW_RECOVERY_FAIL 11
/** fw cap info 11p */
#define FW_CAPINFO_80211P MBIT(24)
@@ -2124,6 +2125,7 @@ typedef struct _card_info {
t_u8 func1_reg_end;
t_u32 slew_rate_reg;
t_u8 slew_rate_bit_offset;
+ t_u32 fw_winner_status_reg;
#endif
#if defined(SDIO) || defined(PCIE)
t_u32 fw_stuck_code_reg;
@@ -2724,6 +2726,8 @@ typedef struct _moal_mod_para {
int dual_nb;
/* reject addba req config for HS or FW Auto-reconnect */
t_u32 reject_addba_req;
+ /** disable_11h_tpc setting */
+ int disable_11h_tpc;
} moal_mod_para;
void woal_tp_acnt_timer_func(void *context);
@@ -3265,6 +3269,7 @@ struct _moal_handle {
#endif
t_u32 ips_ctrl;
BOOLEAN is_edmac_enabled;
+ bool driver_init;
};
/**
@@ -4330,6 +4335,7 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_num,
t_u8 bss_type);
void woal_clean_up(moal_handle *handle);
void woal_send_auto_recovery_complete_event(moal_handle *handle);
+void woal_send_auto_recovery_failure_event(moal_handle *handle);
void woal_remove_interface(moal_handle *handle, t_u8 bss_index);
void woal_set_multicast_list(struct net_device *dev);
mlan_status woal_request_fw(moal_handle *handle);
diff --git a/mlinux/moal_pcie.c b/mlinux/moal_pcie.c
index 9034124..f3e8b8c 100644
--- a/mlinux/moal_pcie.c
+++ b/mlinux/moal_pcie.c
@@ -4,7 +4,7 @@
* related functions.
*
*
- * Copyright 2008-2022, 2024 NXP
+ * Copyright 2008-2022, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -153,6 +153,8 @@ static const struct pci_device_id wlan_ids[] = {
/* moal interface ops */
static moal_if_ops pcie_ops;
+MODULE_DEVICE_TABLE(pci, wlan_ids);
+
/********************************************************
Global Variables
********************************************************/
@@ -2547,8 +2549,10 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
moal_private *priv = NULL;
#ifdef DUMP_TO_PROC
if (phandle->fw_dump_buf) {
- PRINTM(MERROR, "FW dump already exist\n");
- return;
+ PRINTM(MMSG, "FW dump already exist, free existing dump\n");
+ moal_vfree(phandle, phandle->fw_dump_buf);
+ phandle->fw_dump_buf = NULL;
+ phandle->fw_dump_len = 0;
}
#endif
mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE);
diff --git a/mlinux/moal_sdio_mmc.c b/mlinux/moal_sdio_mmc.c
index 299829e..44a09f0 100644
--- a/mlinux/moal_sdio_mmc.c
+++ b/mlinux/moal_sdio_mmc.c
@@ -4,7 +4,7 @@
* related functions.
*
*
- * Copyright 2008-2022, 2024 NXP
+ * Copyright 2008-2022, 2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -165,6 +165,8 @@ static const struct sdio_device_id wlan_ids[] = {
{},
};
+MODULE_DEVICE_TABLE(sdio, wlan_ids);
+
int woal_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id);
void woal_sdio_remove(struct sdio_func *func);
static void woal_sdiommc_work(struct work_struct *work);
@@ -281,7 +283,7 @@ static void woal_sdio_interrupt(struct sdio_func *func)
moal_handle *handle;
sdio_mmc_card *card;
mlan_status status;
-
+ t_u32 host_int_status_reg_val;
ENTER();
card = sdio_get_drvdata(func);
@@ -301,6 +303,14 @@ static void woal_sdio_interrupt(struct sdio_func *func)
PRINTM(MINFO, "*** IN SDIO IRQ ***\n");
PRINTM(MINTR, "*\n");
+ if (handle->fw_reseting == MTRUE && (!handle->pmlan_adapter)) {
+ handle->ops.read_reg(handle, 0x0c, &host_int_status_reg_val);
+ PRINTM(MERROR,
+ "*** Recv intr during fw reset, host int status reg value is %d, ignore it ***\n",
+ host_int_status_reg_val);
+ LEAVE();
+ return;
+ }
/* call mlan_interrupt to read int status */
status = mlan_interrupt(0, handle->pmlan_adapter);
if (status == MLAN_STATUS_FAILURE) {
@@ -3092,8 +3102,10 @@ static void woal_sdiommc_dump_fw_info(moal_handle *phandle)
}
#ifdef DUMP_TO_PROC
if (phandle->fw_dump_buf) {
- PRINTM(MERROR, "FW dump already exist\n");
- return;
+ PRINTM(MMSG, "FW dump already exist, free existing dump\n");
+ moal_vfree(phandle, phandle->fw_dump_buf);
+ phandle->fw_dump_buf = NULL;
+ phandle->fw_dump_len = 0;
}
#endif
/** cancel all pending commands */
@@ -3298,6 +3310,30 @@ void woal_sdio_reset_hw(moal_handle *handle)
return;
}
+/**
+ * @brief This function check fw winner status
+ *
+ * @param handle A pointer to moal_handle structure
+ *
+ * @return 1--success, otherwise failure
+ */
+static BOOLEAN woal_sdiommc_check_winner_status(moal_handle *handle)
+{
+ t_u32 value = 1;
+ t_u32 winner_status_reg = handle->card_info->fw_winner_status_reg;
+
+ ENTER();
+#ifdef SD8801
+ if (IS_SD8801(handle->card_type)) {
+ LEAVE();
+ return MTRUE;
+ }
+#endif
+ handle->ops.read_reg(handle, winner_status_reg, &value);
+ LEAVE();
+ return (value == 0);
+}
+
/**
* @brief This function reload fw
*
@@ -3322,8 +3358,7 @@ static int woal_sdiommc_reset_fw(moal_handle *handle)
ret = -EFAULT;
goto done;
}
- udelay(2000);
- udelay(2000);
+ udelay(4000);
/** wait SOC fully wake up */
for (tries = 0; tries < MAX_POLL_TRIES; ++tries) {
ret = handle->ops.write_reg(handle, reset_reg, 0xba);
@@ -3364,6 +3399,13 @@ static int woal_sdiommc_reset_fw(moal_handle *handle)
reset_reg, value);
ret = -EFAULT;
goto done;
+ } else {
+ for (tries = 0; tries < 1000; ++tries) {
+ if (woal_sdiommc_check_winner_status(handle)) {
+ break;
+ }
+ udelay(1000);
+ }
}
PRINTM(MMSG, "SDIO Trigger FW In-band Reset success");
done:
@@ -3609,13 +3651,19 @@ static void woal_sdiommc_work(struct work_struct *work)
}
if (woal_sdiommc_reset_fw(handle)) {
PRINTM(MERROR, "SDIO In-band Reset Fail\n");
- goto done;
+ woal_send_auto_recovery_failure_event(handle);
+ wifi_status = WIFI_STATUS_FW_RECOVERY_FAIL;
+ return;
}
+
handle->surprise_removed = MFALSE;
if (MLAN_STATUS_SUCCESS == woal_do_sdiommc_flr(handle, false, true))
handle->fw_reseting = MFALSE;
- else
+ else {
handle = NULL;
+ wifi_status = WIFI_STATUS_FW_RECOVERY_FAIL;
+ return;
+ }
if (ref_handle) {
ref_handle->surprise_removed = MFALSE;
@@ -3624,7 +3672,6 @@ static void woal_sdiommc_work(struct work_struct *work)
ref_handle->fw_reseting = MFALSE;
}
card->work_flags = MFALSE;
-done:
wifi_status = WIFI_STATUS_OK;
if (handle)
woal_send_auto_recovery_complete_event(handle);
diff --git a/mlinux/moal_shim.c b/mlinux/moal_shim.c
index 992e6ac..514aa95 100644
--- a/mlinux/moal_shim.c
+++ b/mlinux/moal_shim.c
@@ -3,7 +3,7 @@
* @brief This file contains the callback functions registered to MLAN
*
*
- * Copyright 2008-2024 NXP
+ * Copyright 2008-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -3734,12 +3734,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
&priv->phandle->cac_timer);
priv->phandle->is_cac_timer_set = MFALSE;
if (radar_detected) {
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev,
- &priv->phandle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED,
- GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev,
&priv->phandle->dfs_channel,
NL80211_RADAR_CAC_ABORTED,
@@ -3761,19 +3756,11 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
// WARN_ON(!time_after_eq(jiffies,
// timeout)); mdelay(100); Using
// optimized delay
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- timeout =
- (priv->wdev->links[0].cac_start_time +
- msecs_to_jiffies(
- priv->wdev
- ->links[0].cac_time_ms));
-#else
timeout =
(priv->wdev->cac_start_time +
msecs_to_jiffies(
priv->wdev
->cac_time_ms));
-#endif
if (!time_after_eq(jiffies, timeout)) {
/* Exact time to make host and
* device timer in sync */
@@ -3790,12 +3777,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
}
#endif
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev,
- &priv->phandle->dfs_channel,
- NL80211_RADAR_CAC_FINISHED,
- GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev,
&priv->phandle->dfs_channel,
NL80211_RADAR_CAC_FINISHED,
@@ -3873,12 +3855,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
woal_11h_cancel_chan_report_ioctl(priv,
MOAL_NO_WAIT);
/* upstream: inform cfg80211 */
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev,
- &priv->phandle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED,
- GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev,
&priv->phandle->dfs_channel,
NL80211_RADAR_CAC_ABORTED,
@@ -3980,8 +3957,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|| priv->uap_host_based
#endif
#ifdef STA_CFG80211
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
|| priv->wdev->connected
#else
|| priv->wdev->current_bss
@@ -4132,12 +4109,12 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0,
0);
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && \
- IMX_ANDROID_13)) && \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))) && \
CFG80211_VERSION_CODE < KERNEL_VERSION(6, 9, 0)
cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0,
0);
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
- IMX_ANDROID_13 || IMX_ANDROID_12_BACKPORT)
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0);
#else
cfg80211_ch_switch_notify(priv->netdev, &priv->chan);
@@ -4486,8 +4463,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
PRINTM(MEVENT,
"HostMlme %s: Receive deauth/disassociate\n",
priv->netdev->name);
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
if (!priv->wdev->connected) {
#else
if (!priv->wdev->current_bss) {
@@ -4919,8 +4896,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
roam_info =
kzalloc(sizeof(struct cfg80211_roam_info), GFP_ATOMIC);
if (roam_info) {
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
roam_info->links[0].bssid = priv->cfg_bssid;
#else
roam_info->bssid = priv->cfg_bssid;
diff --git a/mlinux/moal_sta_cfg80211.c b/mlinux/moal_sta_cfg80211.c
index 3883433..f30134c 100644
--- a/mlinux/moal_sta_cfg80211.c
+++ b/mlinux/moal_sta_cfg80211.c
@@ -3,7 +3,7 @@
* @brief This file contains the functions for STA CFG80211.
*
*
- * Copyright 2011-2024 NXP
+ * Copyright 2011-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -135,8 +135,8 @@ static int woal_cfg80211_dump_survey(struct wiphy *wiphy,
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
static int woal_cfg80211_get_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
unsigned int link_id,
#endif
struct cfg80211_chan_def *chandef);
@@ -2841,7 +2841,9 @@ void woal_host_mlme_process_assoc_timeout(moal_private *priv,
struct cfg80211_bss *bss)
{
/* Send Assoc Failure with Timeout to CFG80211 */
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
+#if (CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33 && \
+ CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 15, 74)))
struct cfg80211_assoc_failure data;
memset(&data, 0, sizeof(struct cfg80211_assoc_failure));
data.timeout = 1;
@@ -2877,7 +2879,8 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
struct cfg80211_rx_assoc_resp_data resp = {
.uapsd_queues = -1,
};
-#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
struct cfg80211_rx_assoc_resp resp = {
.uapsd_queues = -1,
};
@@ -2950,7 +2953,8 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
}
}
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
resp.links[0].bss = bss;
resp.buf = assoc_info->assoc_resp_buf;
resp.len = assoc_info->assoc_resp_len;
@@ -5021,7 +5025,9 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
scan_req->chan_list[num_chans].scan_time =
INIT_PASSIVE_SCAN_CHAN_TIME;
- else if (priv->bss_type == MLAN_BSS_TYPE_STA) {
+ else if (priv->bss_type == MLAN_BSS_TYPE_STA &&
+ scan_req->chan_list[num_chans].scan_type ==
+ MLAN_SCAN_TYPE_PASSIVE) {
/*
* Set passive scan time to 110ms to discover
* all nearby AP's, Current 40ms passive scan
@@ -5034,20 +5040,17 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
* 1. STA is in connected state
* 2. Scan type is passive
*/
- if (scan_req->chan_list[num_chans].scan_type ==
- MLAN_SCAN_TYPE_PASSIVE)
- scan_req->chan_list[num_chans]
- .scan_time =
- PASSIVE_SCAN_CHAN_TIME;
- } else
+ scan_req->chan_list[num_chans].scan_time =
+ PASSIVE_SCAN_CHAN_TIME;
+ } else {
scan_req->chan_list[num_chans].scan_time = MIN(
MIN_SPECIFIC_SCAN_CHAN_TIME,
scan_cfg.scan_time.specific_scan_time);
+ }
}
#endif
#ifdef UAP_CFG80211
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
- scan_req->scan_chan_gap = 0;
if (!woal_is_uap_scan_result_expired(priv))
scan_req->chan_list[num_chans].scan_time =
MIN_SPECIFIC_SCAN_CHAN_TIME;
@@ -5850,8 +5853,8 @@ static int woal_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
if (priv->media_connected == MFALSE) {
PRINTM(MMSG, " Already disconnected\n");
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
if (priv->wdev->connected &&
#else
if (priv->wdev->current_bss &&
@@ -6205,8 +6208,8 @@ done:
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
static int woal_cfg80211_get_channel(struct wiphy *wiphy,
struct wireless_dev *wdev,
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
unsigned int link_id,
#endif
struct cfg80211_chan_def *chandef)
@@ -9277,8 +9280,8 @@ int woal_cfg80211_update_ft_ies(struct wiphy *wiphy, struct net_device *dev,
passoc_rsp = (IEEEtypes_AssocRsp_t *)
assoc_rsp->assoc_resp_buf;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_13 || \
- IMX_ANDROID_14 || IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
roam_info.links[0].bssid = priv->cfg_bssid;
#else
roam_info.bssid = priv->cfg_bssid;
@@ -9757,8 +9760,8 @@ void woal_start_roaming(moal_private *priv)
}
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_13 || \
- IMX_ANDROID_14 || IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
roam_info.links[0].bssid = priv->cfg_bssid;
#else
roam_info.bssid = priv->cfg_bssid;
@@ -9839,7 +9842,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
if (params->ext_capab_len)
req_len += sizeof(MrvlIEtypesHeader_t) + params->ext_capab_len;
#endif
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.supported_rates_len)
req_len += sizeof(MrvlIEtypesHeader_t) +
params->link_sta_params.supported_rates_len;
@@ -9850,14 +9854,16 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
#endif
if (params->uapsd_queues || params->max_sp)
req_len += sizeof(MrvlIEtypesHeader_t) + sizeof(qosinfo);
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.ht_capa)
#else
if (params->ht_capa)
#endif
req_len += sizeof(MrvlIEtypesHeader_t) +
sizeof(struct ieee80211_ht_cap);
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.vht_capa)
#else
if (params->vht_capa)
@@ -9865,7 +9871,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
req_len += sizeof(MrvlIEtypesHeader_t) +
sizeof(struct ieee80211_vht_cap);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.opmode_notif_used)
req_len += sizeof(MrvlIEtypesHeader_t) + sizeof(u8);
#else
@@ -9875,7 +9882,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.he_capa_len)
req_len += sizeof(MrvlExtIEtypesHeader_t) +
params->link_sta_params.he_capa_len;
@@ -9931,20 +9939,23 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
}
#endif
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.supported_rates_len) {
#else
if (params->supported_rates_len) {
#endif
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = SUPPORTED_RATES;
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
tlv->header.len = params->link_sta_params.supported_rates_len;
#else
tlv->header.len = params->supported_rates_len;
#endif
moal_memcpy_ext(priv->phandle, tlv->data,
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
params->link_sta_params.supported_rates,
tlv->header.len,
#else
@@ -9968,7 +9979,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
sizeof(MrvlIEtypesHeader_t) + tlv->header.len;
tlv = (MrvlIEtypes_Data_t *)pos;
}
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.ht_capa) {
#else
if (params->ht_capa) {
@@ -9976,7 +9988,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = HT_CAPABILITY;
tlv->header.len = sizeof(struct ieee80211_ht_cap);
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
moal_memcpy_ext(priv->phandle, tlv->data,
params->link_sta_params.ht_capa,
#else
@@ -9988,7 +10001,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
sizeof(MrvlIEtypesHeader_t) + tlv->header.len;
tlv = (MrvlIEtypes_Data_t *)pos;
}
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.vht_capa) {
#else
if (params->vht_capa) {
@@ -9996,7 +10010,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = VHT_CAPABILITY;
tlv->header.len = sizeof(struct ieee80211_vht_cap);
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
moal_memcpy_ext(priv->phandle, tlv->data,
params->link_sta_params.vht_capa,
#else
@@ -10009,7 +10024,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.opmode_notif_used) {
#else
if (params->opmode_notif_used) {
@@ -10017,7 +10033,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = OPER_MODE_NTF;
tlv->header.len = sizeof(u8);
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
moal_memcpy_ext(priv->phandle, tlv->data,
&params->link_sta_params.opmode_notif,
#else
@@ -10030,7 +10047,8 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
}
#endif
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 34))
if (params->link_sta_params.he_capa_len) {
ext_tlv = (MrvlExtIEtypes_Data_t *)pos;
ext_tlv->header.type = EXTENSION;
diff --git a/mlinux/moal_uap_cfg80211.c b/mlinux/moal_uap_cfg80211.c
index 6c40a10..95aaaad 100644
--- a/mlinux/moal_uap_cfg80211.c
+++ b/mlinux/moal_uap_cfg80211.c
@@ -3,7 +3,7 @@
* @brief This file contains the functions for uAP CFG80211.
*
*
- * Copyright 2011-2024 NXP
+ * Copyright 2011-2025 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@@ -2780,8 +2780,8 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy,
}
}
if (vir_priv && vir_priv->bss_type == MLAN_BSS_TYPE_UAP) {
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
if (woal_cfg80211_del_beacon(wiphy, dev, 0))
#else
if (woal_cfg80211_del_beacon(wiphy, dev))
@@ -2789,15 +2789,15 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy,
PRINTM(MERROR, "%s: del_beacon failed\n",
__func__);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
vir_priv->wdev->links[0].ap.beacon_interval = 0;
#else
vir_priv->wdev->beacon_interval = 0;
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
memset(&vir_priv->wdev->links[0].ap.chandef, 0,
sizeof(vir_priv->wdev->links[0].ap.chandef));
#else
@@ -2806,8 +2806,8 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy,
#endif
#endif
#endif
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
vir_priv->wdev->u.ap.ssid_len = 0;
#else
vir_priv->wdev->ssid_len = 0;
@@ -3101,8 +3101,8 @@ done:
*
* @return 0 -- success, otherwise fail
*/
-#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || IMX_ANDROID_13 || \
- IMX_ANDROID_12_BACKPORT)
+#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev,
unsigned int link_id)
#else
@@ -3168,10 +3168,7 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
if (woal_11h_cancel_chan_report_ioctl(priv, MOAL_IOCTL_WAIT))
PRINTM(MERROR, "%s: cancel chan report failed \n",
__func__);
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev, &priv->phandle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED, GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev, &priv->phandle->dfs_channel,
NL80211_RADAR_CAC_ABORTED, GFP_KERNEL);
#else
@@ -3851,10 +3848,7 @@ void woal_cac_timer_func(void *context)
moal_private *priv = handle->priv[handle->cac_bss_index];
PRINTM(MEVENT, "cac_timer fired.\n");
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev, &handle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED, GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev, &handle->dfs_channel,
NL80211_RADAR_CAC_ABORTED, GFP_KERNEL);
#else
@@ -3957,11 +3951,11 @@ static void woal_switch_uap_channel(moal_private *priv, t_u8 wait_option)
CFG80211_VERSION_CODE < KERNEL_VERSION(6, 9, 0)
cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, 0);
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && \
- IMX_ANDROID_13)) && \
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33))) && \
CFG80211_VERSION_CODE < KERNEL_VERSION(6, 9, 0)
cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, 0);
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \
- IMX_ANDROID_13 || IMX_ANDROID_12_BACKPORT)
+ (defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 31))
cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0);
#else
cfg80211_ch_switch_notify(priv->netdev, &priv->chan);
@@ -4013,10 +4007,7 @@ void woal_process_cancel_chanrpt_event(moal_private *priv)
if (woal_11h_cancel_chan_report_ioctl(priv, MOAL_IOCTL_WAIT))
PRINTM(MERROR, "%s: cancel chan report failed \n",
__func__);
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
- cfg80211_cac_event(priv->netdev, &priv->phandle->dfs_channel,
- NL80211_RADAR_CAC_ABORTED, GFP_KERNEL, 0);
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
cfg80211_cac_event(priv->netdev, &priv->phandle->dfs_channel,
NL80211_RADAR_CAC_ABORTED, GFP_KERNEL);
#else
@@ -4030,22 +4021,7 @@ void woal_process_cancel_chanrpt_event(moal_private *priv)
}
#endif
-#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 12, 0)
-/**
- * @brief start radar detection
- *
- * @param wiphy A pointer to wiphy structure
- * @param dev A pointer to net_device structure
- * @param chandef A pointer to cfg80211_chan_def structure
- * @param cac_time_ms A cac dwell time
- * @param link_id valid link_id for MLO operation or 0 otherwise.
- * @return 0 -- success, otherwise fail
- */
-int woal_cfg80211_start_radar_detection(struct wiphy *wiphy,
- struct net_device *dev,
- struct cfg80211_chan_def *chandef,
- u32 cac_time_ms, int link_id)
-#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)
+#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)
/**
* @brief start radar detection
*