From bc89d422d4c78f6738f79eb20530b6279dcfef1c Mon Sep 17 00:00:00 2001 From: Abhinav Kulkarni Date: Tue, 24 Dec 2024 14:06:20 +0530 Subject: [PATCH 1/7] hal_nxp: zephyr: Enabling IW416 and IW612 NXP Wireless Controller SoCs. Added support for IW416 nd IW61x socs for WI-Fi and BT applications. Signed-off-by: Abhinav Kulkarni --- zephyr/src/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zephyr/src/CMakeLists.txt b/zephyr/src/CMakeLists.txt index 3bd43bdf6..91bd3e793 100644 --- a/zephyr/src/CMakeLists.txt +++ b/zephyr/src/CMakeLists.txt @@ -1 +1,2 @@ -add_subdirectory_ifdef(CONFIG_SOC_SERIES_RW6XX rw61x) \ No newline at end of file +add_subdirectory_ifdef(CONFIG_SOC_FAMILY_NXP_IMXRT rt) +add_subdirectory_ifdef(CONFIG_SOC_SERIES_RW6XX rw61x) From 11a5260b53ce93289aec5b3858c2f023d600851f Mon Sep 17 00:00:00 2001 From: Abhinav Kulkarni Date: Tue, 14 Jan 2025 18:28:10 +0530 Subject: [PATCH 2/7] hal_nxp: zephyr: src: rt: Added src for fw blobs. Added support for IW416 and NW61x firmware blobs supporting files. Signed-off-by: Abhinav Kulkarni --- zephyr/src/rt/8801/8801_cpu1.c | 17 ++++++++ zephyr/src/rt/8987/8987_cpu1.c | 17 ++++++++ zephyr/src/rt/8987/8987_cpu2.c | 17 ++++++++ zephyr/src/rt/CMakeLists.txt | 75 ++++++++++++++++++++++++++++++++ zephyr/src/rt/IW416/IW416_cpu1.c | 17 ++++++++ zephyr/src/rt/IW416/IW416_cpu2.c | 17 ++++++++ zephyr/src/rt/nw61x/nw61x_cpu1.c | 17 ++++++++ zephyr/src/rt/nw61x/nw61x_cpu2.c | 17 ++++++++ zephyr/src/rw61x/CMakeLists.txt | 4 +- 9 files changed, 196 insertions(+), 2 deletions(-) create mode 100644 zephyr/src/rt/8801/8801_cpu1.c create mode 100644 zephyr/src/rt/8987/8987_cpu1.c create mode 100644 zephyr/src/rt/8987/8987_cpu2.c create mode 100644 zephyr/src/rt/CMakeLists.txt create mode 100644 zephyr/src/rt/IW416/IW416_cpu1.c create mode 100644 zephyr/src/rt/IW416/IW416_cpu2.c create mode 100644 zephyr/src/rt/nw61x/nw61x_cpu1.c create mode 100644 zephyr/src/rt/nw61x/nw61x_cpu2.c diff --git a/zephyr/src/rt/8801/8801_cpu1.c b/zephyr/src/rt/8801/8801_cpu1.c new file mode 100644 index 000000000..eb0f33152 --- /dev/null +++ b/zephyr/src/rt/8801/8801_cpu1.c @@ -0,0 +1,17 @@ +/* + * Copyright 2023-2025 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#include + +const uint8_t fw_cpu1[] = { + #include <8801_wifi_fw.bin.inc> +}; + +const unsigned char *wlan_fw_bin = (const unsigned char *)(void *)&fw_cpu1[0]; +const unsigned int wlan_fw_bin_len = sizeof(fw_cpu1); diff --git a/zephyr/src/rt/8987/8987_cpu1.c b/zephyr/src/rt/8987/8987_cpu1.c new file mode 100644 index 000000000..ab77d6a57 --- /dev/null +++ b/zephyr/src/rt/8987/8987_cpu1.c @@ -0,0 +1,17 @@ +/* + * Copyright 2023-2025 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#include + +const uint8_t fw_cpu1[] = { + #include <8987_wifi_fw.bin.inc> +}; + +const unsigned char *wlan_fw_bin = (const unsigned char *)(void *)&fw_cpu1[0]; +const unsigned int wlan_fw_bin_len = sizeof(fw_cpu1); diff --git a/zephyr/src/rt/8987/8987_cpu2.c b/zephyr/src/rt/8987/8987_cpu2.c new file mode 100644 index 000000000..245ba49d5 --- /dev/null +++ b/zephyr/src/rt/8987/8987_cpu2.c @@ -0,0 +1,17 @@ +/* + * Copyright 2023-2025 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#include + +const uint8_t fw_cpu2_ble[] = { + #include <8987_ble_fw.bin.inc> +}; + +const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_ble[0]; +const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_ble); diff --git a/zephyr/src/rt/CMakeLists.txt b/zephyr/src/rt/CMakeLists.txt new file mode 100644 index 000000000..1d135d7fa --- /dev/null +++ b/zephyr/src/rt/CMakeLists.txt @@ -0,0 +1,75 @@ +if(CONFIG_NXP_MONOLITHIC_WIFI) + set(hal_blobs_dir ${ZEPHYR_HAL_NXP_MODULE_DIR}/zephyr/blobs) + set(wifi_bt_binary_blobs_list) + set(binary_blobs_list) + set(output_includes_list) + + if(CONFIG_WIFI_NXP) + if(CONFIG_NXP_IW61X) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/nw61x_wifi_fw.bin.se.inc) + set(wifi_binary_blob_name sduart_nw61x.bin.se) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/nw61x/nw61x_cpu1.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/nw61x/${wifi_binary_blob_name}) + elseif(CONFIG_NXP_88W8987) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/8987_wifi_fw.bin.inc) + set(wifi_binary_blob_name sd8987_wlan.bin) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/8987/8987_cpu1.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/8987/${wifi_binary_blob_name}) + elseif(CONFIG_NXP_IW416) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/iw416_wifi_fw.bin.inc) + set(wifi_binary_blob_name sdIW416_wlan.bin) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/IW416/IW416_cpu1.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/IW416/${wifi_binary_blob_name}) + elseif(CONFIG_NXP_88W8801) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/8801_wifi_fw.bin.inc) + set(wifi_binary_blob_name sd8801_wlan.bin) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/8801/8801_cpu1.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/8801/${wifi_binary_blob_name}) + else() + message(FATAL_ERROR "Couldn't determine soc revision") + endif() + endif() + + if(CONFIG_BT) + if(CONFIG_IW61X) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/nw61x_ble_fw.bin.inc) + set(bt_binary_blob_name uart_nw61x.bin.se) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/nw61x/nw61x_cpu2.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/nw61x/${bt_binary_blob_name}) + elseif(CONFIG_88W8987) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/8987_ble_fw.bin.inc) + set(wifi_binary_blob_name uart8987_bt.bin) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/8987/8987_cpu2.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/8987/${wifi_binary_blob_name}) + elseif(CONFIG_IW416) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/iw416_ble_fw.bin.inc) + set(wifi_binary_blob_name uartIW416_bt.bin) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/IW416/IW416_cpu2.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/IW416/${wifi_binary_blob_name}) + else() + message(FATAL_ERROR "Couldn't determine soc revision") + endif() + endif() + + list(LENGTH wifi_bt_binary_blobs_list count) + math(EXPR count "${count}-1") + foreach(i RANGE ${count}) + list(GET wifi_bt_binary_blobs_list ${i} wifi_bt_binary_blob) + if(EXISTS ${wifi_bt_binary_blob}) + set(binary_blob ${wifi_bt_binary_blob}) + else() + message(FATAL_ERROR "Couldn't find wifi/bt firmware ! ${wifi_bt_binary_blob}") + endif() + + list(APPEND binary_blobs_list ${binary_blob}) + endforeach() + + list(LENGTH binary_blobs_list count) + math(EXPR count "${count}-1") + foreach(i RANGE ${count}) + list(GET binary_blobs_list ${i} binary_blob) + list(GET output_includes_list ${i} output_include) + message(STATUS " generate include of binary blob: ${binary_blob}") + generate_inc_file_for_target(app ${binary_blob} ${output_include}) + endforeach() +endif() diff --git a/zephyr/src/rt/IW416/IW416_cpu1.c b/zephyr/src/rt/IW416/IW416_cpu1.c new file mode 100644 index 000000000..eca33c824 --- /dev/null +++ b/zephyr/src/rt/IW416/IW416_cpu1.c @@ -0,0 +1,17 @@ +/* + * Copyright 2023-2025 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#include + +const uint8_t fw_cpu1[] = { + #include +}; + +const unsigned char *wlan_fw_bin = (const unsigned char *)(void *)&fw_cpu1[0]; +const unsigned int wlan_fw_bin_len = sizeof(fw_cpu1); diff --git a/zephyr/src/rt/IW416/IW416_cpu2.c b/zephyr/src/rt/IW416/IW416_cpu2.c new file mode 100644 index 000000000..9413d2371 --- /dev/null +++ b/zephyr/src/rt/IW416/IW416_cpu2.c @@ -0,0 +1,17 @@ +/* + * Copyright 2023-2025 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#include + +const uint8_t fw_cpu2_ble[] = { + #include +}; + +const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_ble[0]; +const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_ble); diff --git a/zephyr/src/rt/nw61x/nw61x_cpu1.c b/zephyr/src/rt/nw61x/nw61x_cpu1.c new file mode 100644 index 000000000..8f0b8b524 --- /dev/null +++ b/zephyr/src/rt/nw61x/nw61x_cpu1.c @@ -0,0 +1,17 @@ +/* + * Copyright 2023-2025 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#include + +const uint8_t fw_cpu1[] = { + #include +}; + +const unsigned char *wlan_fw_bin = (const unsigned char *)(void *)&fw_cpu1[0]; +const unsigned int wlan_fw_bin_len = sizeof(fw_cpu1); diff --git a/zephyr/src/rt/nw61x/nw61x_cpu2.c b/zephyr/src/rt/nw61x/nw61x_cpu2.c new file mode 100644 index 000000000..cc4265a51 --- /dev/null +++ b/zephyr/src/rt/nw61x/nw61x_cpu2.c @@ -0,0 +1,17 @@ +/* + * Copyright 2023-2025 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + + +#include + +const uint8_t fw_cpu2_ble[] = { + #include +}; + +const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_ble[0]; +const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_ble); diff --git a/zephyr/src/rw61x/CMakeLists.txt b/zephyr/src/rw61x/CMakeLists.txt index 5e8fdf7f5..1b72e3056 100644 --- a/zephyr/src/rw61x/CMakeLists.txt +++ b/zephyr/src/rw61x/CMakeLists.txt @@ -10,7 +10,7 @@ if(CONFIG_NXP_MONOLITHIC_WIFI OR CONFIG_NXP_MONOLITHIC_NBU) set(signed_binary_blob_name rw61x_sb_wifi_a2.bin) - list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/${signed_binary_blob_name}) + list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/rw61x/${signed_binary_blob_name}) zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/rw61x_cpu1.c) endif() @@ -22,7 +22,7 @@ if(CONFIG_NXP_MONOLITHIC_WIFI OR CONFIG_NXP_MONOLITHIC_NBU) endif() list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/rw61x_cpu2_fw.bin.inc) - list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/${signed_binary_blob_name}) + list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/rw61x/${signed_binary_blob_name}) zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/rw61x_cpu2.c) endif() From bf00ba1f376535e594876bc743b4d1b6b61f7694 Mon Sep 17 00:00:00 2001 From: Abhinav Kulkarni Date: Thu, 13 Feb 2025 19:25:35 +0530 Subject: [PATCH 3/7] hal_nxp: zephyr: src: rt: Enabling IW416 and IW612 NXP Wireless SoCs. Added support for IW416 and NW61x socs for BT and Wi-Fi. Signed-off-by: Abhinav Kulkarni --- zephyr/src/rt/8987/8987_cpu2.c | 8 +++---- zephyr/src/rt/CMakeLists.txt | 41 +++++++++++++++----------------- zephyr/src/rt/IW416/IW416_cpu2.c | 8 +++---- zephyr/src/rt/nw61x/nw61x_cpu2.c | 8 +++---- 4 files changed, 31 insertions(+), 34 deletions(-) diff --git a/zephyr/src/rt/8987/8987_cpu2.c b/zephyr/src/rt/8987/8987_cpu2.c index 245ba49d5..9dd8e6d7f 100644 --- a/zephyr/src/rt/8987/8987_cpu2.c +++ b/zephyr/src/rt/8987/8987_cpu2.c @@ -9,9 +9,9 @@ #include -const uint8_t fw_cpu2_ble[] = { - #include <8987_ble_fw.bin.inc> +const uint8_t fw_cpu2_bt[] = { + #include <8987_bt_fw.bin.inc> }; -const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_ble[0]; -const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_ble); +const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_bt[0]; +const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_bt); diff --git a/zephyr/src/rt/CMakeLists.txt b/zephyr/src/rt/CMakeLists.txt index 1d135d7fa..fa62c4947 100644 --- a/zephyr/src/rt/CMakeLists.txt +++ b/zephyr/src/rt/CMakeLists.txt @@ -1,4 +1,4 @@ -if(CONFIG_NXP_MONOLITHIC_WIFI) +if(CONFIG_NXP_MONOLITHIC_WIFI OR CONFIG_BT_H4_NXP_CTLR) set(hal_blobs_dir ${ZEPHYR_HAL_NXP_MODULE_DIR}/zephyr/blobs) set(wifi_bt_binary_blobs_list) set(binary_blobs_list) @@ -30,28 +30,23 @@ if(CONFIG_NXP_MONOLITHIC_WIFI) endif() endif() - if(CONFIG_BT) - if(CONFIG_IW61X) - list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/nw61x_ble_fw.bin.inc) - set(bt_binary_blob_name uart_nw61x.bin.se) - zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/nw61x/nw61x_cpu2.c) - list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/nw61x/${bt_binary_blob_name}) - elseif(CONFIG_88W8987) - list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/8987_ble_fw.bin.inc) - set(wifi_binary_blob_name uart8987_bt.bin) - zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/8987/8987_cpu2.c) - list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/8987/${wifi_binary_blob_name}) - elseif(CONFIG_IW416) - list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/iw416_ble_fw.bin.inc) - set(wifi_binary_blob_name uartIW416_bt.bin) - zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/IW416/IW416_cpu2.c) - list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/IW416/${wifi_binary_blob_name}) - else() - message(FATAL_ERROR "Couldn't determine soc revision") - endif() - endif() + if (CONFIG_BT_H4_NXP_CTLR) + if(CONFIG_BT_NXP_NW612) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/nw61x_bt_fw.bin.inc) + set(bt_binary_blob_name uart_nw61x.bin.se) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/nw61x/nw61x_cpu2.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/nw61x/${bt_binary_blob_name}) + elseif(CONFIG_BT_NXP_IW416) + list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/iw416_bt_fw.bin.inc) + set(bt_binary_blob_name uartIW416_bt.bin) + zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/IW416/IW416_cpu2.c) + list(APPEND wifi_bt_binary_blobs_list ${hal_blobs_dir}/IW416/${bt_binary_blob_name}) + else() + message(FATAL_ERROR "Unsupported controller. Please select a BT conntroller, refer to ./driver/bluetooth/hci/Kconfig.nxp") + endif() + endif() - list(LENGTH wifi_bt_binary_blobs_list count) + list(LENGTH wifi_bt_binary_blobs_list count) math(EXPR count "${count}-1") foreach(i RANGE ${count}) list(GET wifi_bt_binary_blobs_list ${i} wifi_bt_binary_blob) @@ -69,7 +64,9 @@ if(CONFIG_NXP_MONOLITHIC_WIFI) foreach(i RANGE ${count}) list(GET binary_blobs_list ${i} binary_blob) list(GET output_includes_list ${i} output_include) + zephyr_blobs_verify(FILES ${binary_blob} REQUIRED) message(STATUS " generate include of binary blob: ${binary_blob}") generate_inc_file_for_target(app ${binary_blob} ${output_include}) endforeach() + endif() diff --git a/zephyr/src/rt/IW416/IW416_cpu2.c b/zephyr/src/rt/IW416/IW416_cpu2.c index 9413d2371..598c752bd 100644 --- a/zephyr/src/rt/IW416/IW416_cpu2.c +++ b/zephyr/src/rt/IW416/IW416_cpu2.c @@ -9,9 +9,9 @@ #include -const uint8_t fw_cpu2_ble[] = { - #include +const uint8_t fw_cpu2_bt[] = { + #include }; -const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_ble[0]; -const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_ble); +const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_bt[0]; +const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_bt); diff --git a/zephyr/src/rt/nw61x/nw61x_cpu2.c b/zephyr/src/rt/nw61x/nw61x_cpu2.c index cc4265a51..594d44c3b 100644 --- a/zephyr/src/rt/nw61x/nw61x_cpu2.c +++ b/zephyr/src/rt/nw61x/nw61x_cpu2.c @@ -9,9 +9,9 @@ #include -const uint8_t fw_cpu2_ble[] = { - #include +const uint8_t fw_cpu2_bt[] = { + #include }; -const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_ble[0]; -const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_ble); +const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_bt[0]; +const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_bt); From e53bc67cb8ccd297b98b66775a947ad863bc113b Mon Sep 17 00:00:00 2001 From: Abhinav Kulkarni Date: Thu, 13 Feb 2025 19:28:41 +0530 Subject: [PATCH 4/7] hal_nxp: zephyr: src: rt: remove zephyr_blobs_verify() since module.yml is not up to date no need of this function. Signed-off-by: Abhinav Kulkarni --- zephyr/src/rt/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/zephyr/src/rt/CMakeLists.txt b/zephyr/src/rt/CMakeLists.txt index fa62c4947..2b652e9c1 100644 --- a/zephyr/src/rt/CMakeLists.txt +++ b/zephyr/src/rt/CMakeLists.txt @@ -64,7 +64,6 @@ if(CONFIG_NXP_MONOLITHIC_WIFI OR CONFIG_BT_H4_NXP_CTLR) foreach(i RANGE ${count}) list(GET binary_blobs_list ${i} binary_blob) list(GET output_includes_list ${i} output_include) - zephyr_blobs_verify(FILES ${binary_blob} REQUIRED) message(STATUS " generate include of binary blob: ${binary_blob}") generate_inc_file_for_target(app ${binary_blob} ${output_include}) endforeach() From b5696eea0c0f437169cc34808fd6bccc2e052b46 Mon Sep 17 00:00:00 2001 From: Abhinav Kulkarni Date: Tue, 11 Feb 2025 11:29:26 +0530 Subject: [PATCH 5/7] hal_nxp: zephyr: src: rw61x Update of firmware location Updated path for rw61x firmware. Signed-off-by: Abhinav Kulkarni --- zephyr/src/rw61x/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zephyr/src/rw61x/CMakeLists.txt b/zephyr/src/rw61x/CMakeLists.txt index 1b72e3056..5e8fdf7f5 100644 --- a/zephyr/src/rw61x/CMakeLists.txt +++ b/zephyr/src/rw61x/CMakeLists.txt @@ -10,7 +10,7 @@ if(CONFIG_NXP_MONOLITHIC_WIFI OR CONFIG_NXP_MONOLITHIC_NBU) set(signed_binary_blob_name rw61x_sb_wifi_a2.bin) - list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/rw61x/${signed_binary_blob_name}) + list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/${signed_binary_blob_name}) zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/rw61x_cpu1.c) endif() @@ -22,7 +22,7 @@ if(CONFIG_NXP_MONOLITHIC_WIFI OR CONFIG_NXP_MONOLITHIC_NBU) endif() list(APPEND output_includes_list ${ZEPHYR_BINARY_DIR}/include/generated/rw61x_cpu2_fw.bin.inc) - list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/rw61x/${signed_binary_blob_name}) + list(APPEND signed_binary_blobs_list ${hal_blobs_dir}/${signed_binary_blob_name}) zephyr_library_sources(${CMAKE_CURRENT_LIST_DIR}/rw61x_cpu2.c) endif() From 5c7dd9390ff3ed993bb2a37778644dc3d4399c43 Mon Sep 17 00:00:00 2001 From: Abhinav Kulkarni Date: Tue, 11 Feb 2025 11:51:08 +0530 Subject: [PATCH 6/7] hal_nxp: zephyr: src: rt: Removed unwanted socs support Removed unwanted files. Signed-off-by: Abhinav Kulkarni --- zephyr/src/rt/8801/8801_cpu1.c | 17 ----------------- zephyr/src/rt/8987/8987_cpu1.c | 17 ----------------- zephyr/src/rt/8987/8987_cpu2.c | 17 ----------------- 3 files changed, 51 deletions(-) delete mode 100644 zephyr/src/rt/8801/8801_cpu1.c delete mode 100644 zephyr/src/rt/8987/8987_cpu1.c delete mode 100644 zephyr/src/rt/8987/8987_cpu2.c diff --git a/zephyr/src/rt/8801/8801_cpu1.c b/zephyr/src/rt/8801/8801_cpu1.c deleted file mode 100644 index eb0f33152..000000000 --- a/zephyr/src/rt/8801/8801_cpu1.c +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2023-2025 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - - -#include - -const uint8_t fw_cpu1[] = { - #include <8801_wifi_fw.bin.inc> -}; - -const unsigned char *wlan_fw_bin = (const unsigned char *)(void *)&fw_cpu1[0]; -const unsigned int wlan_fw_bin_len = sizeof(fw_cpu1); diff --git a/zephyr/src/rt/8987/8987_cpu1.c b/zephyr/src/rt/8987/8987_cpu1.c deleted file mode 100644 index ab77d6a57..000000000 --- a/zephyr/src/rt/8987/8987_cpu1.c +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2023-2025 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - - -#include - -const uint8_t fw_cpu1[] = { - #include <8987_wifi_fw.bin.inc> -}; - -const unsigned char *wlan_fw_bin = (const unsigned char *)(void *)&fw_cpu1[0]; -const unsigned int wlan_fw_bin_len = sizeof(fw_cpu1); diff --git a/zephyr/src/rt/8987/8987_cpu2.c b/zephyr/src/rt/8987/8987_cpu2.c deleted file mode 100644 index 9dd8e6d7f..000000000 --- a/zephyr/src/rt/8987/8987_cpu2.c +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2023-2025 NXP - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - - -#include - -const uint8_t fw_cpu2_bt[] = { - #include <8987_bt_fw.bin.inc> -}; - -const unsigned char *bt_fw_bin = (const unsigned char *)(void *)&fw_cpu2_bt[0]; -const unsigned int bt_fw_bin_len = sizeof(fw_cpu2_bt); From fc71e6d8aecf9624f7a489835535d7c6d05982a7 Mon Sep 17 00:00:00 2001 From: Maochen Wang Date: Mon, 17 Feb 2025 14:04:33 +0800 Subject: [PATCH 7/7] mcux: wifi_nxp: update wifi driver version to v1.3.r51.z_up.p1 Update wifi_nxp version to v1.3.r51.z_up.p1 to include bug fixes. Add embedded supplicant support for RSNO Add support for IW416 and IW61x. Latest SHA is 4d4d3ce88c. Signed-off-by: Maochen Wang --- mcux/middleware/wifi_nxp/CMakeLists.txt | 118 +++-- .../mbedtls/wpa_supp_els_pkc_mbedtls_config.h | 4 + .../wifi_nxp/incl/wifidriver/wifi.h | 9 +- mcux/middleware/wifi_nxp/incl/wlcmgr/wlan.h | 14 +- .../sdio_nxp_abs/incl/mlan_sdio_api.h | 2 +- .../wifi_nxp/sdio_nxp_abs/mlan_sdio.c | 5 +- .../wifi_nxp/wifidriver/incl/mlan_api.h | 3 +- .../wifi_nxp/wifidriver/incl/mlan_fw.h | 4 +- .../wifi_nxp/wifidriver/incl/mlan_ieee.h | 69 ++- .../wifi_nxp/wifidriver/incl/mlan_main.h | 10 +- .../middleware/wifi_nxp/wifidriver/mlan_11k.c | 27 +- .../wifi_nxp/wifidriver/mlan_glue.c | 435 ++++++++++++++---- .../wifi_nxp/wifidriver/mlan_join.c | 137 +++++- .../wifi_nxp/wifidriver/mlan_scan.c | 157 ++++++- .../wifi_nxp/wifidriver/wifi-sdio.c | 8 +- .../wifi_nxp/wifidriver/wifi-sdio.h | 5 + mcux/middleware/wifi_nxp/wifidriver/wifi.c | 20 +- mcux/middleware/wifi_nxp/wlcmgr/wlan.c | 86 ++-- .../wifi_nxp/wlcmgr/wlan_enhanced_tests.c | 9 +- mcux/middleware/wifi_nxp/wlcmgr/wlan_tests.c | 4 +- 20 files changed, 857 insertions(+), 269 deletions(-) diff --git a/mcux/middleware/wifi_nxp/CMakeLists.txt b/mcux/middleware/wifi_nxp/CMakeLists.txt index 2b5d1901a..0ae5dd393 100644 --- a/mcux/middleware/wifi_nxp/CMakeLists.txt +++ b/mcux/middleware/wifi_nxp/CMakeLists.txt @@ -24,120 +24,150 @@ zephyr_compile_definitions_ifdef(CONFIG_NXP_RW610 WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW_rw610.h" ) -zephyr_compile_definitions_ifdef(CONFIG_88W8987_AW_CM358_USD +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8987_AW_CM358_USD WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_USD_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_88W8987_AW_CM358MA_M2 +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8987_AW_CM358MA_M2 WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_M2_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_88W8987_MURATA_1ZM_USD +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8987_MURATA_1ZM_USD WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1ZM_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x06 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x06 WIFI_BT_USE_USD_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_88W8987_MURATA_1ZM_M2 +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8987_MURATA_1ZM_M2 WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1ZM_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x06 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x06 WIFI_BT_USE_M2_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM457_USD - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_AW_AM457_USD CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_USD_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM457MA_M2 - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_AW_AM457MA_M2 CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_M2_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM510_USD - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_AW_AM510_USD CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_USD_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM510MA_M2 - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_AW_AM510MA_M2 CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_M2_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW416_MURATA_1XK_USD - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_MURATA_1XK_USD CONFIG_NXP_WIFI_ED_OFFSET_2G=0x00 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_USD_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW416_MURATA_1XK_M2 - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_MURATA_1XK_M2 CONFIG_NXP_WIFI_ED_OFFSET_2G=0x00 CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C WIFI_BT_USE_M2_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW612_MURATA_2EL_USD - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_REGION_EU + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_EU.h" +) + +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_REGION_CA + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_CA.h" +) + +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_REGION_WW + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_WW.h" +) + +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_REGION_US + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_US.h" +) + +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_REGION_JP + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_JP.h" +) + +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW416_REGION_CA + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_1XK_CA.h" +) + +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW612_MURATA_2EL_USD CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A WIFI_BT_USE_USD_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW612_MURATA_2EL_M2 - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW612_MURATA_2EL_M2 CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A WIFI_BT_USE_M2_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW611_MURATA_2DL_USD - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW611_MURATA_2DL_USD CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A WIFI_BT_USE_USD_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_IW611_MURATA_2DL_M2 - WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_WW.h" +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW611_MURATA_2DL_M2 CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A WIFI_BT_USE_M2_INTERFACE ) -zephyr_compile_definitions_ifdef(CONFIG_88W8801_AW_NM191_USD +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW61X_REGION_US + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_US_RU_Tx_power.h" +) +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW61X_REGION_JP + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_JP_RU_Tx_power.h" +) +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW61X_REGION_CA + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_CA_RU_Tx_power.h" +) +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW61X_REGION_EU + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_EU_RU_Tx_power.h" +) +zephyr_compile_definitions_ifdef(CONFIG_NXP_IW61X_REGION_WW + WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2EL_WW.h" +) + +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8801_AW_NM191_USD WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x1B ) -zephyr_compile_definitions_ifdef(CONFIG_88W8801_AW_NM191MA_M2 +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8801_AW_NM191MA_M2 WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x1B ) -zephyr_compile_definitions_ifdef(CONFIG_88W8801_MURATA_2DS_USD +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8801_MURATA_2DS_USD WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2DS_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0E ) -zephyr_compile_definitions_ifdef(CONFIG_88W8801_MURATA_2DS_M2 +zephyr_compile_definitions_ifdef(CONFIG_NXP_88W8801_MURATA_2DS_M2 WIFI_BT_TX_PWR_LIMITS="wlan_txpwrlimit_cfg_murata_2DS_WW.h" CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0E ) @@ -253,6 +283,13 @@ zephyr_library_compile_definitions_ifdef(CONFIG_WIFI_NM_HOSTAPD_AP if(CONFIG_CODE_DATA_RELOCATION) if(CONFIG_SPEED_OPTIMIZATIONS OR CONFIG_SIZE_OPTIMIZATIONS) + +if(CONFIG_NXP_RW610) + set(QUICK_ACCESS_CODE_AREA RAM_TEXT) +else() + set(QUICK_ACCESS_CODE_AREA ITCM_TEXT) +endif() + # critical path code relocated to SRAM zephyr_code_relocate(FILES port/osa/osa.c @@ -263,13 +300,13 @@ zephyr_code_relocate(FILES wifidriver/mlan_11n_rxreorder.c wifidriver/mlan_wmm.c wifidriver/wifi.c - LOCATION RAM_TEXT) + LOCATION ${QUICK_ACCESS_CODE_AREA}) if(CONFIG_SDIO_STACK) zephyr_code_relocate(FILES sdio_nxp_abs/mlan_sdio.c wifidriver/wifi-sdio.c - LOCATION RAM_TEXT) + LOCATION ${QUICK_ACCESS_CODE_AREA}) endif() if(CONFIG_NXP_RW610) @@ -277,37 +314,40 @@ zephyr_code_relocate(FILES wifidriver/wifi-imu.c ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/drivers/imu/fsl_imu.c ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/rpmsg/fsl_adapter_rfimu.c - LOCATION RAM_TEXT) + LOCATION ${QUICK_ACCESS_CODE_AREA}) endif() zephyr_code_relocate(FILES ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/osa/fsl_os_abstraction_zephyr.c ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/utilities/misc_utilities/fsl_memcpy.S - LOCATION RAM_TEXT) + LOCATION ${QUICK_ACCESS_CODE_AREA}) file(GLOB ZPERF_SRC ${ZEPHYR_BASE}/subsys/net/lib/zperf/*.c) zephyr_code_relocate(FILES ${ZPERF_SRC} LOCATION RAM_TEXT) +zephyr_code_relocate(FILES + ${ZEPHYR_BASE}/subsys/net/ip/connection.c + ${ZEPHYR_BASE}/subsys/net/ip/ipv6.c + ${ZEPHYR_BASE}/subsys/net/ip/ipv6_fragment.c + ${ZEPHYR_BASE}/subsys/net/ip/packet_socket.c + ${ZEPHYR_BASE}/subsys/net/ip/utils.c + LOCATION RAM_TEXT) + zephyr_code_relocate(FILES ${ZEPHYR_BASE}/subsys/net/lib/sockets/sockets_packet.c ${ZEPHYR_BASE}/subsys/net/lib/sockets/sockets.c - ${ZEPHYR_BASE}/subsys/net/ip/connection.c ${ZEPHYR_BASE}/subsys/net/ip/ipv4.c ${ZEPHYR_BASE}/subsys/net/ip/ipv4_fragment.c - ${ZEPHYR_BASE}/subsys/net/ip/ipv6.c - ${ZEPHYR_BASE}/subsys/net/ip/ipv6_fragment.c ${ZEPHYR_BASE}/subsys/net/ip/net_context.c ${ZEPHYR_BASE}/subsys/net/ip/net_core.c ${ZEPHYR_BASE}/subsys/net/ip/net_if.c ${ZEPHYR_BASE}/subsys/net/ip/net_pkt.c ${ZEPHYR_BASE}/subsys/net/ip/net_tc.c - ${ZEPHYR_BASE}/subsys/net/ip/packet_socket.c ${ZEPHYR_BASE}/subsys/net/ip/tcp.c ${ZEPHYR_BASE}/subsys/net/ip/udp.c - ${ZEPHYR_BASE}/subsys/net/ip/utils.c ${ZEPHYR_BASE}/subsys/net/l2/ethernet/ethernet.c ${ZEPHYR_BASE}/lib/net_buf/buf.c - LOCATION RAM_TEXT) + LOCATION ${QUICK_ACCESS_CODE_AREA}) zephyr_code_relocate(FILES ${ZEPHYR_BASE}/kernel/mem_slab.c @@ -319,7 +359,7 @@ zephyr_code_relocate(FILES ${ZEPHYR_BASE}/kernel/sem.c ${ZEPHYR_BASE}/kernel/thread.c ${ZEPHYR_BASE}/kernel/work.c - LOCATION RAM_TEXT) + LOCATION ${QUICK_ACCESS_CODE_AREA}) endif() endif() diff --git a/mcux/middleware/wifi_nxp/incl/port/mbedtls/wpa_supp_els_pkc_mbedtls_config.h b/mcux/middleware/wifi_nxp/incl/port/mbedtls/wpa_supp_els_pkc_mbedtls_config.h index 6d6f27da8..282fc2fa8 100644 --- a/mcux/middleware/wifi_nxp/incl/port/mbedtls/wpa_supp_els_pkc_mbedtls_config.h +++ b/mcux/middleware/wifi_nxp/incl/port/mbedtls/wpa_supp_els_pkc_mbedtls_config.h @@ -1791,6 +1791,7 @@ */ #define MBEDTLS_SSL_SESSION_TICKETS +#ifndef MBEDTLS_SSL_EXPORT_KEYS /** * \def MBEDTLS_SSL_EXPORT_KEYS * @@ -1800,6 +1801,7 @@ * Comment this macro to disable support for key export */ #define MBEDTLS_SSL_EXPORT_KEYS +#endif /** * \def MBEDTLS_SSL_SERVER_NAME_INDICATION @@ -3750,6 +3752,8 @@ #undef MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES #endif /* CONFIG_BUILD_WITH_TFM */ +#undef MBEDTLS_PSA_P256M_DRIVER_ENABLED + /* * CBC-MAC is not yet supported via the PSA API in Mbed TLS. */ diff --git a/mcux/middleware/wifi_nxp/incl/wifidriver/wifi.h b/mcux/middleware/wifi_nxp/incl/wifidriver/wifi.h index 2f58954d7..8886598f7 100644 --- a/mcux/middleware/wifi_nxp/incl/wifidriver/wifi.h +++ b/mcux/middleware/wifi_nxp/incl/wifidriver/wifi.h @@ -1,5 +1,5 @@ /* - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -190,11 +190,13 @@ int wifi_init_fcc(const uint8_t *fw_start_addr, const size_t size); * */ void wifi_deinit(void); -#ifdef RW610 + /** * This API can be used to destroy all wifi driver tasks. */ void wifi_destroy_wifidriver_tasks(void); + +#ifdef RW610 /** * This API can be used to get IMU task lock. */ @@ -907,7 +909,8 @@ unsigned short wifi_get_listen_interval(); unsigned int wifi_get_delay_to_ps(); void wifi_configure_null_pkt_interval(unsigned int null_pkt_interval); int wrapper_wifi_assoc( - const unsigned char *bssid, int wlan_security, bool is_wpa_tkip, unsigned int owe_trans_mode, bool is_ft); + const unsigned char *bssid, int wlan_security, bool is_wpa_tkip, + unsigned int owe_trans_mode, bool is_ft, int key_mgmt); bool wifi_get_xfer_pending(void); void wifi_set_xfer_pending(bool xfer_val); int wrapper_wlan_cmd_11n_ba_stream_timeout(void *saved_event_buff); diff --git a/mcux/middleware/wifi_nxp/incl/wlcmgr/wlan.h b/mcux/middleware/wifi_nxp/incl/wlcmgr/wlan.h index 4a133ee79..f38f57d72 100644 --- a/mcux/middleware/wifi_nxp/incl/wlcmgr/wlan.h +++ b/mcux/middleware/wifi_nxp/incl/wlcmgr/wlan.h @@ -19,7 +19,7 @@ #include #include -#define WLAN_DRV_VERSION "v1.3.r50.z_up.p6" +#define WLAN_DRV_VERSION "v1.3.r51.z_up.p1" #if CONFIG_WPA2_ENTP #include @@ -2043,14 +2043,13 @@ struct wlan_tx_pert_info t_u16 tx_pert_check_num; }; #endif -#if defined(RW610) + typedef enum { CLI_DISABLE_WIFI, CLI_ENABLE_WIFI, CLI_RESET_WIFI, } cli_reset_option; -#endif enum wlan_mon_task_event { @@ -2349,12 +2348,13 @@ int wlan_get_prov_session(void); */ int wlan_remove_all_network_profiles(void); -#if defined(RW610) /** Reset the driver. * \param[in] ResetOption: Option including enable, disable or reset Wi-Fi driver * can be chosen. */ void wlan_reset(cli_reset_option ResetOption); + +#if defined(RW610) /** Stop and remove all Wi-Fi network (access point). * * \return WM_SUCCESS if successful. @@ -2365,13 +2365,13 @@ int wlan_remove_all_networks(void); * This API destroys all tasks. */ void wlan_destroy_all_tasks(void); + /** Retrieve the status information of if Wi-Fi started. * * \return TRUE if Wi-Fi network is started. * \return FALSE if not started. */ int wlan_is_started(void); - #endif // RW610 #if CONFIG_NCP_BRIDGE @@ -3520,7 +3520,7 @@ int wlan_set_ieeeps_cfg(struct wlan_ieeeps_config *ps_cfg); * periodically wakes up to check if the AP has any pending packets for it. A * longer listen interval implies that the Wi-Fi SoC stays in power save for a * longer duration at the cost of additional delays while receiving data. - * Note that choosing incorrect value for listen interval + * Note that choosing incorrect value for listen interval * causes poor response from device during data transfer. * Actual listen interval selected by firmware is equal to closest DTIM.\n * For example:\n @@ -5751,7 +5751,7 @@ int wlan_set_crypto_AES_WRAP_encrypt( int wlan_set_crypto_AES_WRAP_decrypt( const t_u8 *Key, const t_u16 KeyLength, const t_u8 *KeyIV, const t_u16 KeyIVLength, t_u8 *Data, t_u16 *DataLength); -/** Set crypto AES_CCMP (counter mode with cipher block chaining message authentication code protocol) +/** Set crypto AES_CCMP (counter mode with cipher block chaining message authentication code protocol) * algorithm encrypt command parameters. * * \param[in] Key: key diff --git a/mcux/middleware/wifi_nxp/sdio_nxp_abs/incl/mlan_sdio_api.h b/mcux/middleware/wifi_nxp/sdio_nxp_abs/incl/mlan_sdio_api.h index 27dfdd4bc..cd2b01bb9 100644 --- a/mcux/middleware/wifi_nxp/sdio_nxp_abs/incl/mlan_sdio_api.h +++ b/mcux/middleware/wifi_nxp/sdio_nxp_abs/incl/mlan_sdio_api.h @@ -49,7 +49,7 @@ #define SDIO_SET_REL_ADDR ((uint8_t)3) #define SDIO_SDIO_SEN_OP_COND ((uint8_t)5) #define SDIO_SEL_DESEL_CARD ((uint8_t)7) -#define SDIO_RW_DIRECT ((uint8_t)52) +//#define SDIO_RW_DIRECT ((uint8_t)52) #define SDIO_RW_DIRECT_EXTENDED ((uint8_t)53) /* Depends on DMA_BUFSZ */ diff --git a/mcux/middleware/wifi_nxp/sdio_nxp_abs/mlan_sdio.c b/mcux/middleware/wifi_nxp/sdio_nxp_abs/mlan_sdio.c index e3cb7c440..53eb90542 100644 --- a/mcux/middleware/wifi_nxp/sdio_nxp_abs/mlan_sdio.c +++ b/mcux/middleware/wifi_nxp/sdio_nxp_abs/mlan_sdio.c @@ -7,12 +7,11 @@ * SPDX-License-Identifier: BSD-3-Clause * */ -#include -#include -#include #include #include +#include +#include #include #define SDIO_CMD_TIMEOUT 2000 diff --git a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_api.h b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_api.h index 740d6df4b..6c9ed06b4 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_api.h +++ b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_api.h @@ -2,7 +2,7 @@ * * @brief MLAN Interface * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -15,6 +15,7 @@ #include #define MLAN_WMSDK_MAX_WPA_IE_LEN 64U +#define MLAN_RSN_MAX_IE_LEN 255U #define MLAN_MAX_MDIE_LEN 10U #define MLAN_MAX_VENDOR_IE_LEN 100U diff --git a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_fw.h b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_fw.h index 405187b98..29020accf 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_fw.h +++ b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_fw.h @@ -4,7 +4,7 @@ * structures and declares global function prototypes used * in MLAN module. * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -456,6 +456,8 @@ typedef enum _WLAN_802_11_WEP_STATUS #define TLV_TYPE_CSI_MONITOR_CFG (PROPRIETARY_TLV_BASE_ID + 354) /*0x0262*/ +#define TLV_TYPE_RSNO_IE (PROPRIETARY_TLV_BASE_ID + 0x167) /* 0x267 */ + /** ADDBA TID mask */ #define ADDBA_TID_MASK (MBIT(2) | MBIT(3) | MBIT(4) | MBIT(5)) /** DELBA TID mask */ diff --git a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_ieee.h b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_ieee.h index a7099d8fd..80d7e0fea 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_ieee.h +++ b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_ieee.h @@ -3,7 +3,7 @@ * @brief This file contains IEEE information element related * definitions used in MLAN and MOAL module. * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -660,6 +660,30 @@ typedef t_u8 WLAN_802_11_RATES[WLAN_SUPPORTED_RATES]; #define PMF_MASK 0x00c0 #endif +/** RSN Override IE to RSN IE offset of suite position + * RSN Override IE has 3 Bytes WFA OUI and 1 Byte OUI type + * more than RSN IE + */ +#define MLAN_RSNO_SUITE_OFFSET 4 + +/** Enumeration for RSN Override oui type */ +typedef enum _mlan_rsno_oui_type +{ + MLAN_OUI_TYPE_RSNO = 0x29, + MLAN_OUI_TYPE_RSNO2 = 0x2a, + MLAN_OUI_TYPE_RSNXO = 0x2b, + MLAN_OUI_TYPE_RSN_SEL = 0x2c +} mlan_rsno_oui_type; + +/** Enumeration for RSN Override Selector */ +typedef enum _mlan_rsn_selector +{ + MLAN_RSN_SELECTOR_RSN = 0, + MLAN_RSN_SELECTOR_RSNO, + MLAN_RSN_SELECTOR_RSNO2, + MLAN_RSN_SELECTOR_INVALID = 0xFF, +} mlan_rsn_selector; + /** wpa_suite_t */ typedef MLAN_PACK_START struct _wpa_suite_t { @@ -704,6 +728,32 @@ typedef MLAN_PACK_START struct _IEEEtypes_Rsnx_t t_u8 data[1]; } MLAN_PACK_END IEEEtypes_Rsnx_t, *pIEEEtypes_Rsnx_t; +/** IEEEtypes_Rsnxo_t */ +typedef MLAN_PACK_START struct _IEEEtypes_Rsnxo_t +{ + /** Generic IE header */ + IEEEtypes_Header_t ieee_hdr; + /** Rsnxo : wfa oui */ + t_u8 wfa_oui[3]; + /** Rsnxo : vendor type */ + t_u8 vendor_type; + /** Rsnxo : data */ + t_u8 data[1]; +} MLAN_PACK_END IEEEtypes_Rsnxo_t, *pIEEEtypes_Rsnxo_t; + +/** IEEEtypes_RsnSelector_t */ +typedef MLAN_PACK_START struct _IEEEtypes_RsnSelector_t +{ + /** Generic IE header */ + IEEEtypes_Header_t ieee_hdr; + /** RsnSelector : wfa oui */ + t_u8 wfa_oui[3]; + /** RsnSelector : vendor type */ + t_u8 vendor_type; + /** RsnSelector : Selector of RSN IEs, 0: RSNE, 1: RSNO, 2: RSNO2 */ + t_u8 selector; +} MLAN_PACK_END IEEEtypes_RsnSelector_t, *pIEEEtypes_RsnSelector_t; + /** IEEEtypes_Wpa_t */ typedef MLAN_PACK_START struct _IEEEtypes_Wpa_t { @@ -2461,8 +2511,10 @@ typedef struct _BSSDescriptor_t t_u16 wpa_offset; /** RSN IE */ IEEEtypes_Generic_t *prsn_ie; - /** RSN IE offset in the beacon buffer */ - t_u16 rsn_offset; + /** RSN Override IE */ + IEEEtypes_Generic_t *prsno_ie; + /** RSN Override 2 IE */ + IEEEtypes_Generic_t *prsno2_ie; #ifdef STA_SUPPORT /** WAPI IE */ IEEEtypes_Generic_t *pwapi_ie; @@ -2524,8 +2576,12 @@ typedef struct _BSSDescriptor_t */ unsigned char wpa_ie_buff[MLAN_WMSDK_MAX_WPA_IE_LEN]; size_t wpa_ie_buff_len; - unsigned char rsn_ie_buff[MLAN_WMSDK_MAX_WPA_IE_LEN]; + unsigned char rsn_ie_buff[MLAN_RSN_MAX_IE_LEN]; size_t rsn_ie_buff_len; + unsigned char rsno_ie_buff[MLAN_WMSDK_MAX_WPA_IE_LEN]; + size_t rsno_ie_buff_len; + unsigned char rsno2_ie_buff[MLAN_WMSDK_MAX_WPA_IE_LEN]; + size_t rsno2_ie_buff_len; bool wps_IE_exist; t_u16 wps_session; @@ -2534,8 +2590,9 @@ typedef struct _BSSDescriptor_t /** RSNX IE */ IEEEtypes_Rsnx_t *prsnx_ie; IEEEtypes_Rsnx_t rsnx_ie_saved; - /** RSNX IE offset in the beacon buffer */ - t_u16 rsnx_offset; + /** RSNX Override IE */ + IEEEtypes_Rsnxo_t *prsnxo_ie; + IEEEtypes_Rsnxo_t rsnxo_ie_saved; bool brcm_ie_exist; bool epigram_ie_exist; diff --git a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_main.h b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_main.h index 7a7a7a6e8..07d131719 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_main.h +++ b/mcux/middleware/wifi_nxp/wifidriver/incl/mlan_main.h @@ -4,7 +4,7 @@ * structures and declares global function prototypes used * in MLAN module. * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -1034,6 +1034,8 @@ typedef struct _wlan_802_11_security_t mlan_auth_mode authentication_mode; /** Encryption mode */ mlan_encryption_mode encryption_mode; + /** RSN Selector */ + mlan_rsn_selector rsn_selector; } wlan_802_11_security_t; /** Current Basic Service Set State Structure */ @@ -1293,7 +1295,6 @@ typedef MLAN_PACK_START struct _mlan_chan_info #define HOST_MLME_ASSOC_DONE MBIT(3) #endif -#ifdef RW610 /**Adapter_operations data structure*/ typedef struct _bus_operations { @@ -1302,7 +1303,6 @@ typedef struct _bus_operations /**Interface header length*/ t_u32 intf_header_len; } bus_operations; -#endif /** Private structure for MLAN */ struct _mlan_private @@ -1503,7 +1503,7 @@ struct _mlan_private /** EWPA query 0: disable, 1: enable */ bool ewpa_query; /** Encryption Key*/ - t_u8 wpa_ie[MLAN_WMSDK_MAX_WPA_IE_LEN]; + t_u8 wpa_ie[MLAN_RSN_MAX_IE_LEN]; /** WPA IE length */ t_u8 wpa_ie_len; #if CONFIG_11R @@ -2191,10 +2191,8 @@ struct _mlan_adapter mlan_callbacks callbacks; /** Init parameters */ mlan_init_para init_para; -#ifdef RW610 /** bus operations*/ bus_operations bus_ops; -#endif /** Country ie ignore */ t_u8 country_ie_ignore; /** In reset status now */ diff --git a/mcux/middleware/wifi_nxp/wifidriver/mlan_11k.c b/mcux/middleware/wifi_nxp/wifidriver/mlan_11k.c index 17ffb5921..8fb19f8ec 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/mlan_11k.c +++ b/mcux/middleware/wifi_nxp/wifidriver/mlan_11k.c @@ -2,7 +2,7 @@ * * @brief This file provides functions for process 11k(RRM) feature * - * Copyright 2022-2024 NXP + * Copyright 2022-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -607,6 +607,31 @@ void wlan_add_rm_beacon_report(wlan_rrm_beacon_report_data *rep_data, (void)memcpy((void *)pos, (const void *)&bss_entry->wmm_ie, sizeof(bss_entry->wmm_ie)); pos += sizeof(bss_entry->wmm_ie); } + + /* RSN Override */ + if (bss_entry->rsno_ie_buff_len > 0U) + { + if (pos + bss_entry->rsno_ie_buff_len - *buf_pos > remained_len) + { + goto part_subelem; + } + + (void)memcpy(pos, bss_entry->rsno_ie_buff, bss_entry->rsno_ie_buff_len); + pos += bss_entry->rsno_ie_buff_len; + } + + /* RSN Override 2 */ + if (bss_entry->rsno2_ie_buff_len > 0U) + { + if (pos + bss_entry->rsno2_ie_buff_len - *buf_pos > remained_len) + { + goto part_subelem; + } + + (void)memcpy(pos, bss_entry->rsno2_ie_buff, bss_entry->rsno2_ie_buff_len); + pos += bss_entry->rsno2_ie_buff_len; + } + /* Others */ if (bss_entry->vendor_ie_len > (t_u8)0U) { diff --git a/mcux/middleware/wifi_nxp/wifidriver/mlan_glue.c b/mcux/middleware/wifi_nxp/wifidriver/mlan_glue.c index cdc242780..18ba7852f 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/mlan_glue.c +++ b/mcux/middleware/wifi_nxp/wifidriver/mlan_glue.c @@ -3,7 +3,7 @@ * @brief This file acts as a glue between legacy wlan code and mlan based wlan * code * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -1820,17 +1820,280 @@ bool wrapper_wlan_11d_support_is_enabled(void) return wlan_11d_support_is_enabled(pmpriv); } +#define WLAN_RSN_AKM_UNSPEC_802_1X "\x00\x0f\xac\x01" +#define WLAN_RSN_AKM_PSK_OVER_802_1X "\x00\x0f\xac\x02" +#define WLAN_RSN_AKM_FT_802_1X "\x00\x0f\xac\x03" +#define WLAN_RSN_AKM_FT_PSK "\x00\x0f\xac\x04" +#define WLAN_RSN_AKM_802_1X_SHA256 "\x00\x0f\xac\x05" +#define WLAN_RSN_AKM_PSK_SHA256 "\x00\x0f\xac\x06" + +#define WLAN_RSN_AKM_SAE "\x00\x0f\xac\x08" +#define WLAN_RSN_AKM_FT_SAE "\x00\x0f\xac\x09" + +#define WLAN_RSN_AKM_802_1X_SUITE_B "\x00\x0f\xac\x0b" +#define WLAN_RSN_AKM_802_1X_SUITE_B_192 "\x00\x0f\xac\x0c" + +#define WLAN_RSN_AKM_OWE "\x00\x0f\xac\x12" + +#define WLAN_RSN_AKM_SAE_EXT_KEY "\x00\x0f\xac\x18" + +/* use WLAN_RSN_SUITE_LEN for memcmp as sizeof macro is 5 with 0 end */ +#define WLAN_RSN_SUITE_LEN 4 + +static t_u32 wifi_rsn_to_key_map(t_u8 *rsn_ie) +{ + t_u8 *pos = rsn_ie; + t_u16 count; + int i; + t_u32 val = 0; + + /* 2 bytes header + 2 bytes version + 4 bytes group_cipher_suite + + * 2 bytes pairwise_cipher_count + pairwise_cipher_count * + * PAIRWISE_CIPHER_SUITE_LEN (4) + 2 bytes akm_suite_count + + * akm_suite_count * AKM_SUITE_LEN (4) + */ + pos += 2 + 2 + WLAN_RSN_SUITE_LEN; + count = *(t_u16 *)(void *)pos; + count = wlan_le16_to_cpu(count); + + pos += 2 + (count * WLAN_RSN_SUITE_LEN); + count = *(t_u16 *)(void *)pos; + count = wlan_le16_to_cpu(count); + pos += 2; + + /* move to akm_suite list and parse to key mgmt bitfield */ + for (i = 0; i < count; i++) + { + /* most likely AKM suite PSK, SAE and SAE EXT KEY come first */ + if (!memcmp(pos, WLAN_RSN_AKM_PSK_OVER_802_1X, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_PSK; + else if (!memcmp(pos, WLAN_RSN_AKM_SAE, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_SAE; + else if (!memcmp(pos, WLAN_RSN_AKM_SAE_EXT_KEY, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_SAE_EXT_KEY; + else if (!memcmp(pos, WLAN_RSN_AKM_UNSPEC_802_1X, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_IEEE8021X; + else if (!memcmp(pos, WLAN_RSN_AKM_FT_802_1X, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_FT_IEEE8021X; + else if (!memcmp(pos, WLAN_RSN_AKM_FT_PSK, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_FT_PSK; + else if (!memcmp(pos, WLAN_RSN_AKM_802_1X_SHA256, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_IEEE8021X_SHA256; + else if (!memcmp(pos, WLAN_RSN_AKM_PSK_SHA256, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_PSK_SHA256; + else if (!memcmp(pos, WLAN_RSN_AKM_FT_SAE, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_FT_SAE; + else if (!memcmp(pos, WLAN_RSN_AKM_802_1X_SUITE_B, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_IEEE8021X_SUITE_B; + else if (!memcmp(pos, WLAN_RSN_AKM_802_1X_SUITE_B_192, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_IEEE8021X_SUITE_B_192; + else if (!memcmp(pos, WLAN_RSN_AKM_OWE, WLAN_RSN_SUITE_LEN)) + val |= WLAN_KEY_MGMT_OWE; + + pos += WLAN_RSN_SUITE_LEN; + } + + return val; +} + +static void wifi_assoc_clear_rsn_sae_suite(t_u8 *rsn_ie) +{ + /* Skip index to 1 byte (RSN information) + 1 byte (Tag length) + 2 byte (RSN version) + 4 byte (Group Cipher + * Suite)*/ + int index = 8; + /* Get pairwise count value from wpa_ie (2 Bytes LE) */ + uint16_t pairwise_count = rsn_ie[index + 1] << 8 | rsn_ie[index]; + /* Skip 2 bytes pairwise_count + all pairwise cipher suite in list (Each 4 bytes) */ + index = index + 2 + pairwise_count * 4; + /* Get AKM count value from wpa_ie (2 Bytes LE) */ + uint16_t akm_count = rsn_ie[index + 1] << 8 | rsn_ie[index]; + /* Skip 2 bytes akm_count */ + index = index + 2; + + /* Skip OUI */ + index = index + 3; + for (int i = 0; i < akm_count; i++) + { + /* Check AKM type field is SAE (0x8) */ + if (rsn_ie[index] == 0x8) + { + /* Replace AKM type to PSK (0x2) */ + rsn_ie[index] = 0x02; + } + /* Skip OUI (1 byte) + AKM type (1 byte) */ + index = index + 4; + } +} + +static void wifi_assoc_rsno_2_rsn(t_u8 *rsno_ie, size_t rsno_len, t_u8 *rsn_ie, t_u8 *rsn_len) +{ + t_u8 tag_len = (t_u8)(rsno_len - MLAN_RSNO_SUITE_OFFSET - sizeof(IEEEtypes_Header_t)); + + /* 1 Byte tag, 1 Byte len */ + rsn_ie[0] = RSN_IE; + rsn_ie[1] = tag_len; + (void)memcpy(rsn_ie + sizeof(IEEEtypes_Header_t), + rsno_ie + MLAN_RSNO_SUITE_OFFSET + sizeof(IEEEtypes_Header_t), tag_len); + (*rsn_len) = tag_len + sizeof(IEEEtypes_Header_t); +} + +/** + * Pick preferrence IE from RSNE, RSNO, RSNO2 and WPA IE to + * copy to dst IE buffer which we will use to associate. + * Convert RSNO or RSNO2 IE to RSN IE if we are using them to connect. + * + * The security profile is matched before in scan results. + * So the case that AP requires secure connection but we are in open mode will not happen. + */ +static int wifi_assoc_pick_security_ie(mlan_private *priv, BSSDescriptor_t *d, + int wlan_security, int wlan_key_mgmt, bool is_wpa_tkip) +{ + t_u32 key_mgmt_network = (t_u32)wlan_key_mgmt; + t_u32 key_mgmt_ie_rsno2 = 0; + t_u32 key_mgmt_ie_rsno = 0; + t_u32 key_mgmt_ie_rsn = 0; + + if (d->prsn_ie) + { + if (d->prsno2_ie && + d->rsno2_ie_buff_len > MLAN_RSNO_SUITE_OFFSET + sizeof(IEEEtypes_Header_t)) + { + /* skip 3 bytes WFA OUI and 1 byte RSNO2 OUI type */ + key_mgmt_ie_rsno2 = wifi_rsn_to_key_map((t_u8 *)d->prsno2_ie + MLAN_RSNO_SUITE_OFFSET); + if (key_mgmt_network & key_mgmt_ie_rsno2) + { + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_RSNO2; + if (d->rsno2_ie_buff_len <= MLAN_RSN_MAX_IE_LEN + MLAN_RSNO_SUITE_OFFSET) + { + wifi_assoc_rsno_2_rsn((t_u8 *)d->prsno2_ie, + d->rsno2_ie_buff_len, priv->wpa_ie, &priv->wpa_ie_len); + goto rsn_ie_picked; + } + else + { + wifi_e("Failed to copy RSNO2 IE len %d, fall through", d->rsno2_ie_buff_len); + } + } + } + + if (d->prsno_ie && + d->rsno_ie_buff_len > MLAN_RSNO_SUITE_OFFSET + sizeof(IEEEtypes_Header_t)) + { + /* skip 3 bytes WFA OUI and 1 byte RSNO OUI type */ + key_mgmt_ie_rsno = wifi_rsn_to_key_map((t_u8 *)d->prsno_ie + MLAN_RSNO_SUITE_OFFSET); + if (key_mgmt_network & key_mgmt_ie_rsno) + { + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_RSNO; + if (d->rsno_ie_buff_len <= MLAN_RSN_MAX_IE_LEN + MLAN_RSNO_SUITE_OFFSET) + { + wifi_assoc_rsno_2_rsn((t_u8 *)d->prsno_ie, + d->rsno_ie_buff_len, priv->wpa_ie, &priv->wpa_ie_len); + goto rsn_ie_picked; + } + else + { + wifi_e("Failed to copy RSNO IE len %d, fall through", d->rsno_ie_buff_len); + } + } + } + + key_mgmt_ie_rsn = wifi_rsn_to_key_map((t_u8 *)d->prsn_ie); + if (key_mgmt_network & key_mgmt_ie_rsn) + { + if (d->prsno_ie || d->prsno2_ie) + { + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_RSN; + } + else { + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_INVALID; + } + + if (d->rsn_ie_buff_len <= MLAN_RSN_MAX_IE_LEN) + { + (void)memcpy((void *)priv->wpa_ie, (const void *)d->rsn_ie_buff, + d->rsn_ie_buff_len); + priv->wpa_ie_len = (t_u8)d->rsn_ie_buff_len; + goto rsn_ie_picked; + } + else + { + wifi_e("Failed to copy RSN IE len %d, fall through", d->rsn_ie_buff_len); + } + } + } + + if (d->pwpa_ie && + ((wlan_security == WLAN_SECURITY_WPA || wlan_security == WLAN_SECURITY_WPA_WPA2_MIXED))) + { + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_INVALID; + goto wpa_ie_picked; + } + + wifi_w("wifi assoc selecting security profile failed, " + "key mgmt network 0x%x rsno2 0x%x rsno 0x%x rsn 0x%x", + key_mgmt_network, key_mgmt_ie_rsno2, key_mgmt_ie_rsno, key_mgmt_ie_rsn); + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_INVALID; + return WM_SUCCESS; + +wpa_ie_picked: + priv->sec_info.is_wpa_tkip = is_wpa_tkip; + priv->sec_info.wpa_enabled = true; + if (d->wpa_ie_buff_len <= sizeof(priv->wpa_ie)) + { + (void)memcpy((void *)priv->wpa_ie, (const void *)d->wpa_ie_buff, d->wpa_ie_buff_len); + priv->wpa_ie_len = (t_u8)d->wpa_ie_buff_len; + } + else + { + wifi_e("Failed to copy WPA IE"); + return -WM_FAIL; + } + + return WM_SUCCESS; + +rsn_ie_picked: + priv->sec_info.is_wpa_tkip = is_wpa_tkip; + priv->sec_info.wpa2_enabled = true; + + wifi_d("assoc_pick_rsn: " + "key mgmt network 0x%x rsno2 0x%x rsno 0x%x rsn 0x%x", + key_mgmt_network, key_mgmt_ie_rsno2, key_mgmt_ie_rsno, key_mgmt_ie_rsn); + +#if CONFIG_11R + if (wlan_security == WLAN_SECURITY_WPA2 || wlan_security == WLAN_SECURITY_WPA3_SAE || + wlan_security == WLAN_SECURITY_WPA2_WPA3_SAE_MIXED || wlan_security == WLAN_SECURITY_WPA2_FT) + { + if (d->md_ie_buff_len <= sizeof(priv->md_ie)) + { + (void)memcpy((void *)priv->md_ie, (const void *)d->md_ie_buff, (size_t)d->md_ie_buff_len); + priv->md_ie_len = d->md_ie_buff_len; + } + } +#endif + + /* In case of WPA3 SAE-PSK mixed mode AP, RSN IE processing sets the SAE AKM, + * but if the configured security is WPA2 PSK then AKM must be of PSK + * hence update the AKM to WPA2 PSK and reset the PMF capabilities + */ + if (wlan_security == WLAN_SECURITY_WPA2 || wlan_security == WLAN_SECURITY_WPA_WPA2_MIXED) + { + wifi_assoc_clear_rsn_sae_suite(priv->wpa_ie); + } + + return WM_SUCCESS; +} + /* * fixme: This function is temporarily present till the mlan transition is complete. */ int wrapper_wifi_assoc( - const unsigned char *bssid, int wlan_security, bool is_wpa_tkip, unsigned int owe_trans_mode, bool is_ft) + const unsigned char *bssid, int wlan_security, bool is_wpa_tkip, + unsigned int owe_trans_mode, bool is_ft, int key_mgmt) { -#if !CONFIG_11R - (void)is_ft; -#endif mlan_private *priv = (mlan_private *)mlan_adap->priv[0]; t_u8 country_code[COUNTRY_CODE_LEN]; + int ret; + /* BSSDescriptor_t *bssDesc = OSA_MemoryAllocate(sizeof(BSSDescriptor_t)); */ /* if (!bssDesc) */ /* return -WM_FAIL; */ @@ -1849,6 +2112,7 @@ int wrapper_wifi_assoc( priv->sec_info.ewpa_enabled = false; priv->sec_info.wpa_enabled = false; priv->sec_info.authentication_mode = MLAN_AUTH_MODE_AUTO; + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_INVALID; #if CONFIG_11K if (priv->assoc_req_size != 0U) @@ -1876,99 +2140,16 @@ int wrapper_wifi_assoc( * security part is yet not fully integrated into mlan. This will * not be necessary after the integration is complete. */ -#if CONFIG_WPA2_ENTP - if (d->prsn_ie && (wlan_security == WLAN_SECURITY_EAP_TLS || wlan_security == WLAN_SECURITY_EAP_PEAP_MSCHAPV2)) - { - priv->sec_info.wpa2_enabled = true; - if (d->rsn_ie_buff_len <= sizeof(priv->wpa_ie)) - { - (void)memcpy(priv->wpa_ie, d->rsn_ie_buff, d->rsn_ie_buff_len); - priv->wpa_ie_len = d->rsn_ie_buff_len; - } - else - { - wifi_e("Failed to copy RSN IE"); - return -WM_FAIL; - } - } - else -#endif - if ((d->pwpa_ie != MNULL) && (d->prsn_ie != MNULL) && (wlan_security == WLAN_SECURITY_WPA_WPA2_MIXED)) - { - priv->sec_info.is_wpa_tkip = is_wpa_tkip; - priv->sec_info.wpa2_enabled = true; - if (d->rsn_ie_buff_len <= sizeof(priv->wpa_ie)) - { - (void)memcpy((void *)priv->wpa_ie, (const void *)d->rsn_ie_buff, d->rsn_ie_buff_len); - priv->wpa_ie_len = (t_u8)d->rsn_ie_buff_len; - } - else - { - wifi_e("Failed to copy RSN IE"); - return -WM_FAIL; - } - } - else if ((d->pwpa_ie != MNULL) && - (wlan_security == WLAN_SECURITY_WPA || wlan_security == WLAN_SECURITY_WPA_WPA2_MIXED)) - { - priv->sec_info.is_wpa_tkip = is_wpa_tkip; - priv->sec_info.wpa_enabled = true; - if (d->wpa_ie_buff_len <= sizeof(priv->wpa_ie)) - { - (void)memcpy((void *)priv->wpa_ie, (const void *)d->wpa_ie_buff, d->wpa_ie_buff_len); - priv->wpa_ie_len = (t_u8)d->wpa_ie_buff_len; - } - else - { - wifi_e("Failed to copy WPA IE"); - return -WM_FAIL; - } - } - else if ((d->prsn_ie != MNULL) && #if CONFIG_11R - (!is_ft) && -#endif - (wlan_security == WLAN_SECURITY_WPA2 || wlan_security == WLAN_SECURITY_WPA_WPA2_MIXED || -#if CONFIG_DRIVER_OWE - owe_trans_mode == OWE_TRANS_MODE_OWE || wlan_security == WLAN_SECURITY_OWE_ONLY || + if (!is_ft) #endif - wlan_security == WLAN_SECURITY_WPA3_SAE || wlan_security == WLAN_SECURITY_WPA2_WPA3_SAE_MIXED)) { - if (wlan_security == WLAN_SECURITY_WPA2 || wlan_security == WLAN_SECURITY_WPA_WPA2_MIXED) - - { - priv->sec_info.authentication_mode = MLAN_AUTH_MODE_OPEN; - } - priv->sec_info.is_wpa_tkip = is_wpa_tkip; - priv->sec_info.wpa2_enabled = true; - if (d->rsn_ie_buff_len <= sizeof(priv->wpa_ie)) - { - (void)memcpy((void *)priv->wpa_ie, (const void *)d->rsn_ie_buff, d->rsn_ie_buff_len); - priv->wpa_ie_len = (t_u8)d->rsn_ie_buff_len; - } - else + ret = wifi_assoc_pick_security_ie(priv, d, wlan_security, key_mgmt, is_wpa_tkip); + if (ret != WM_SUCCESS) { - wifi_e("Failed to copy RSN IE."); + wifi_e("wifi_assoc_pick_security_ie failed ret %d", ret); return -WM_FAIL; } -#if CONFIG_11R - if ((!is_ft) && (wlan_security == WLAN_SECURITY_WPA2 || wlan_security == WLAN_SECURITY_WPA3_SAE || - wlan_security == WLAN_SECURITY_WPA2_WPA3_SAE_MIXED)) - { - if (d->md_ie_buff_len <= sizeof(priv->md_ie)) - { - (void)memcpy((void *)priv->md_ie, (const void *)d->md_ie_buff, (size_t)d->md_ie_buff_len); - priv->md_ie_len = d->md_ie_buff_len; - } - } -#endif - /* In case of WPA3 SAE-PSK mixed mode AP, RSN IE processing sets the SAE AKM, - * but if the configured security is WPA2 PSK then AKM must be of PSK - * hence update the AKM to WPA2 PSK and reset the PMF capabilities - */ - } - else - { /* Do Nothing */ } if ((MNULL != d) && (*d->country_info.country_code) && (d->country_info.len > COUNTRY_CODE_LEN) && @@ -2494,6 +2675,7 @@ int wifi_nxp_send_assoc(nxp_wifi_assoc_info_t *assoc_info) priv->sec_info.ewpa_enabled = MFALSE; priv->sec_info.wpa_enabled = MFALSE; priv->sec_info.authentication_mode = MLAN_AUTH_MODE_AUTO; + priv->sec_info.rsn_selector = MLAN_RSN_SELECTOR_INVALID; priv->sec_info.is_wpa_tkip = MFALSE; #if CONFIG_11R @@ -6367,6 +6549,7 @@ static void process_rsn_ie(t_u8 *rsn_ie, t_u8 rsn_ft_sae_oui[4] = {0x00, 0x0f, 0xac, 0x09}; t_u8 wpa3_oui0d[4] = {0x00, 0x0f, 0xac, 0x0d}; #endif + t_u8 wfa_oui[3] = {0x50, 0x6f, 0x9a}; ENTER(); @@ -6379,13 +6562,20 @@ static void process_rsn_ie(t_u8 *rsn_ie, /* Do nothing */ } - if (rsn_ie[0] != (t_u8)RSN_IE) + if (rsn_ie[0] == (t_u8)RSN_IE) { - goto done; + /* Do nothing */ + } + else if (rsn_ie[0] == (t_u8)VENDOR_SPECIFIC_221 && + !memcmp(&rsn_ie[2], wfa_oui, sizeof(wfa_oui)) && + (rsn_ie[5] == MLAN_OUI_TYPE_RSNO || rsn_ie[5] == MLAN_OUI_TYPE_RSNO2)) + { + /* This is RSN Override or RSN Override 2 IE, move ptr to adapt RSN case */ + rsn_ie += MLAN_RSNO_SUITE_OFFSET; } else { - /* Do nothing */ + goto done; } /* 2 bytes header + 2 bytes version + 4 bytes group_cipher_suite + * 2 bytes pairwise_cipher_count + pairwise_cipher_count * @@ -6522,8 +6712,8 @@ static void process_rsn_ie(t_u8 *rsn_ie, (int)pairwise_cipher_count * 4 + (int)sizeof(t_u16) + (int)akm_suite_count * 4); rsn_cap = (t_u16)wlan_le16_to_cpu(rsn_cap); - *ap_mfpc = ((rsn_cap & (0x1 << MFPC_BIT)) == (0x1 << MFPC_BIT)); - *ap_mfpr = ((rsn_cap & (0x1 << MFPR_BIT)) == (0x1 << MFPR_BIT)); + (*ap_mfpc) |= ((rsn_cap & (0x1 << MFPC_BIT)) == (0x1 << MFPC_BIT)); + (*ap_mfpr) &= ((rsn_cap & (0x1 << MFPR_BIT)) == (0x1 << MFPR_BIT)); done: LEAVE(); } @@ -6680,6 +6870,10 @@ int wrapper_bssdesc_first_set(int bss_index, t_u8 *ap_pwe) { uint8_t i = WLAN_SUPPORTED_RATES; + t_u8 pwe_rsnx = 0; + t_u8 pwe_rsnxo = 0; + t_u8 pwe_superset = 0; + if (bss_index >= (int)mlan_adap->num_in_scan_table) { wifi_w("Unable to find given entry %d in BSS table", bss_index); @@ -6725,7 +6919,18 @@ int wrapper_bssdesc_first_set(int bss_index, if (d->prsn_ie != MNULL) { + (*ap_mfpr) = 1; + /* use superset of RSNE, RSNO and RSNO2 to match with network security profile */ process_rsn_ie(d->rsn_ie_buff, rsn_mcstCipher, rsn_ucstCipher, ap_mfpc, ap_mfpr, WPA_WPA2_WEP); + + if (d->prsno_ie != MNULL) + { + process_rsn_ie(d->rsno_ie_buff, rsn_mcstCipher, rsn_ucstCipher, ap_mfpc, ap_mfpr, WPA_WPA2_WEP); + } + if (d->prsno2_ie != MNULL) + { + process_rsn_ie(d->rsno2_ie_buff, rsn_mcstCipher, rsn_ucstCipher, ap_mfpc, ap_mfpr, WPA_WPA2_WEP); + } } } else @@ -6737,19 +6942,51 @@ int wrapper_bssdesc_first_set(int bss_index, } } + /* use superset of RSNXE and RSNXO */ if ((d->prsnx_ie != MNULL) && (d->prsnx_ie->data[0] & (0x1 << SAE_H2E_BIT))) { - *ap_pwe = 2; + pwe_rsnx = MBIT(2); for (i = WLAN_SUPPORTED_RATES; i > 0; i--) { if (d->data_rates[i-1] == 0xFB) { - *ap_pwe = 1; + pwe_rsnx = MBIT(1); + break; + } + } + } + else + { + pwe_rsnx = MBIT(0); + } + + if ((d->prsnxo_ie != MNULL) && (d->prsnxo_ie->data[0] & (0x1 << SAE_H2E_BIT))) + { + pwe_rsnxo = MBIT(2); + for (i = WLAN_SUPPORTED_RATES; i > 0; i--) + { + if (d->data_rates[i - 1] == 0xFB) + { + pwe_rsnxo = MBIT(1); break; } } } else + { + pwe_rsnxo = MBIT(0); + } + + pwe_superset = (pwe_rsnx | pwe_rsnxo); + if (pwe_superset >= 3) + { + *ap_pwe = 2; + } + else if (pwe_superset == MBIT(1)) + { + *ap_pwe = 1; + } + else { *ap_pwe = 0; } diff --git a/mcux/middleware/wifi_nxp/wifidriver/mlan_join.c b/mcux/middleware/wifi_nxp/wifidriver/mlan_join.c index e19f78744..b67b94d72 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/mlan_join.c +++ b/mcux/middleware/wifi_nxp/wifidriver/mlan_join.c @@ -5,7 +5,7 @@ * and response routines for sending adhoc start, adhoc join, and * association commands to the firmware. * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -357,14 +357,21 @@ static int wlan_update_rsn_ie(mlan_private *pmpriv, */ t_u8 akm_type_selected; t_u8 akm_type_id = 0; -#if CONFIG_11R - t_u8 akm_preference[25] = {0, 7, 1, 9, 3, 8, 2, 0, 5, 6, 0, 10, 11, 12, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 13}; -#else +#if CONFIG_WPA_SUPP t_u8 akm_preference[25] = {0, 7, 1, 0, 0, 8, 2, 0, 5, 0, 0, 10, 11, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 13}; +#else + t_u8 akm_preference[25] = {0, 0, 1, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0}; #endif - int ap_mfpc = 0, ap_mfpr = 0, ret = MLAN_STATUS_SUCCESS; +#if CONFIG_11R + /* add FT akm types to preference list */ + akm_preference[3] = 9; + akm_preference[4] = 3; + akm_preference[9] = 6; + akm_preference[13] = 12; +#endif + pmf_mask = (((pmpriv->pmfcfg.mfpc << MFPC_BIT) | (pmpriv->pmfcfg.mfpr << MFPR_BIT)) | (~PMF_MASK)); /* prsn_cap = prsn_ie->rsn_ie + 2 bytes version + 4 bytes * group_cipher_suite + 2 bytes pairwise_cipher_count + @@ -786,6 +793,107 @@ static int wlan_cmd_append_pass_through_ie(mlan_private *priv, IEEEtypes_Generic } #endif +static void wlan_cmd_append_pwe_tlv(mlan_private *priv, BSSDescriptor_t *pbss_desc, t_u8 **ppbuffer) +{ + MrvlIEtypes_SAE_PWE_Mode_t *psae_pwe_mode_tlv = (MrvlIEtypes_SAE_PWE_Mode_t *)(void *)(*ppbuffer); + t_u8 pwe = 0; + + /* use RSNX or RSNXO */ + if (pbss_desc->prsnxo_ie && + (priv->sec_info.rsn_selector == MLAN_RSN_SELECTOR_RSNO || + priv->sec_info.rsn_selector == MLAN_RSN_SELECTOR_RSNO2)) + { + if (pbss_desc->prsnxo_ie->ieee_hdr.element_id == VENDOR_SPECIFIC_221 && + pbss_desc->prsnxo_ie->vendor_type == MLAN_OUI_TYPE_RSNXO) + { + pwe = pbss_desc->prsnxo_ie->data[0]; + } + } + else if (pbss_desc->prsnx_ie) + { + pwe = pbss_desc->prsnx_ie->data[0]; + } + else + { + return; + } + + if (pwe & (0x1 << SAE_H2E_BIT)) + { + psae_pwe_mode_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_WPA3_SAE_PWE_DERIVATION_MODE); + psae_pwe_mode_tlv->header.len = sizeof(psae_pwe_mode_tlv->pwe); + psae_pwe_mode_tlv->pwe[0] = pwe; + (*ppbuffer) += sizeof(psae_pwe_mode_tlv->header) + sizeof(psae_pwe_mode_tlv->pwe); + } +} + +static void wlan_cmd_append_rsno_tlv(mlan_private *priv, BSSDescriptor_t *pbss_desc, t_u8 **ppbuffer) +{ + t_u8 *pos = (*ppbuffer); + MrvlIEtypesHeader_t *tlv_hdr = (MrvlIEtypesHeader_t *)(void *)pos; + IEEEtypes_RsnSelector_t *rsn_selector = MNULL; + + tlv_hdr->type = wlan_cpu_to_le16(TLV_TYPE_RSNO_IE); + + pos += sizeof(MrvlIEtypesHeader_t); + + /* RSN Selector, 3 bytes WFA oui + 1 byte RSN Selector type + 1 byte selector */ + rsn_selector = (IEEEtypes_RsnSelector_t *)(void *)pos; + + rsn_selector->ieee_hdr.element_id = VENDOR_SPECIFIC_221; + rsn_selector->ieee_hdr.len = 5; + rsn_selector->wfa_oui[0] = 0x50; + rsn_selector->wfa_oui[1] = 0x6f; + rsn_selector->wfa_oui[2] = 0x9a; + rsn_selector->vendor_type = MLAN_OUI_TYPE_RSN_SEL; + rsn_selector->selector = (t_u8)priv->sec_info.rsn_selector; + pos += sizeof(IEEEtypes_RsnSelector_t); + + /* pass RSNE, RSNO, RSNO2, RSNX, RSNXO IEs to FW to check AP M3 EAPOL frame */ + if (pbss_desc->prsn_ie && pbss_desc->rsn_ie_buff_len && + pbss_desc->rsn_ie_buff_len < MLAN_RSN_MAX_IE_LEN) + { + (void)__memcpy(priv->adapter, pos, pbss_desc->prsn_ie, pbss_desc->rsn_ie_buff_len); + pos += pbss_desc->rsn_ie_buff_len; + } + + if (pbss_desc->prsno_ie && pbss_desc->rsno_ie_buff_len && + pbss_desc->rsno_ie_buff_len < MLAN_WMSDK_MAX_WPA_IE_LEN) + { + (void)__memcpy(priv->adapter, pos, pbss_desc->prsno_ie, pbss_desc->rsno_ie_buff_len); + pos += pbss_desc->rsno_ie_buff_len; + } + + if (pbss_desc->prsno2_ie && pbss_desc->rsno2_ie_buff_len && + pbss_desc->rsno2_ie_buff_len < MLAN_WMSDK_MAX_WPA_IE_LEN) + { + (void)__memcpy(priv->adapter, pos, pbss_desc->prsno2_ie, pbss_desc->rsno2_ie_buff_len); + pos += pbss_desc->rsno2_ie_buff_len; + } + + /* fixme: RSNX and RSNXO is not saved by IE tag len. + * static sizeof may be wrong len, so need to align rsnx buffer storage + * with rsne + */ + /* + if (pbss_desc->prsnx_ie) + { + (void)__memcpy(priv->adapter, pos, pbss_desc->prsnx_ie, sizeof(IEEEtypes_Rsnx_t)); + pos += sizeof(IEEEtypes_Rsnx_t); + } + + if (pbss_desc->prsnxo_ie) + { + (void)__memcpy(priv->adapter, pos, pbss_desc->prsnxo_ie, sizeof(IEEEtypes_Rsnxo_t)); + pos += sizeof(IEEEtypes_Rsnxo_t); + } + */ + + tlv_hdr->len = pos - (t_u8 *)(void *)tlv_hdr - sizeof(MrvlIEtypesHeader_t); + (*ppbuffer) += sizeof(MrvlIEtypesHeader_t) + tlv_hdr->len; + tlv_hdr->len = wlan_cpu_to_le16(tlv_hdr->len); +} + /******************************************************** Global Functions ********************************************************/ @@ -827,7 +935,6 @@ mlan_status wlan_cmd_802_11_associate(IN mlan_private *pmpriv, IN HostCmd_DS_COM #if CONFIG_DRIVER_MBO t_u8 oper_class = 1; #endif - #if CONFIG_HOST_MLME MrvlIEtypes_HostMlme_t *host_mlme_tlv = MNULL; #endif @@ -1074,18 +1181,7 @@ mlan_status wlan_cmd_802_11_associate(IN mlan_private *pmpriv, IN HostCmd_DS_COM if ((pauth_tlv != MNULL) && (pauth_tlv->auth_type == wlan_cpu_to_le16(AssocAgentAuth_Wpa3Sae))) { - if ((pbss_desc->prsnx_ie != MNULL) && pbss_desc->prsnx_ie->ieee_hdr.len && - (pbss_desc->prsnx_ie->data[0] & (0x1 << SAE_H2E_BIT))) - { - MrvlIEtypes_SAE_PWE_Mode_t *psae_pwe_mode_tlv; - - /* Setup the sae mode TLV in the association command */ - psae_pwe_mode_tlv = (MrvlIEtypes_SAE_PWE_Mode_t *)(void *)pos; - psae_pwe_mode_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_WPA3_SAE_PWE_DERIVATION_MODE); - psae_pwe_mode_tlv->header.len = sizeof(psae_pwe_mode_tlv->pwe); - psae_pwe_mode_tlv->pwe[0] = pbss_desc->prsnx_ie->data[0]; - pos += sizeof(psae_pwe_mode_tlv->header) + sizeof(psae_pwe_mode_tlv->pwe); - } + wlan_cmd_append_pwe_tlv(pmpriv, pbss_desc, &pos); } if (ISSUPP_11NENABLED(pmadapter->fw_cap_info) && (!pbss_desc->disable_11n) && @@ -1161,6 +1257,11 @@ mlan_status wlan_cmd_802_11_associate(IN mlan_private *pmpriv, IN HostCmd_DS_COM wlan_cmd_append_generic_ie(pmpriv, &pos); + if (pmpriv->sec_info.rsn_selector != MLAN_RSN_SELECTOR_INVALID) + { + wlan_cmd_append_rsno_tlv(pmpriv, pbss_desc, &pos); + } + cmd->size = wlan_cpu_to_le16((t_u16)(pos - (t_u8 *)passo) + S_DS_GEN); /* Set the Capability info at last */ diff --git a/mcux/middleware/wifi_nxp/wifidriver/mlan_scan.c b/mcux/middleware/wifi_nxp/wifidriver/mlan_scan.c index 6adbd17d9..656a89531 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/mlan_scan.c +++ b/mcux/middleware/wifi_nxp/wifidriver/mlan_scan.c @@ -2,7 +2,7 @@ * * @brief This file provides wlan scan IOCTL and firmware command APIs * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -195,6 +195,8 @@ static t_u8 search_oui_in_ie(mlan_adapter *pmadapter, IEBody *ie_body, t_u8 *oui * Check the pbss_desc for appropriate IE and then check if RSN IE has AES * OUI in it. If RSN IE does not have AES in PTK then return 0; * + * Add RSN Override and RSN Override 2 check. + * * @param pbss_desc A pointer to current BSS descriptor * @return 0 on failure to find AES OUI, 1 on success. */ @@ -203,6 +205,8 @@ static t_u8 is_rsn_oui_present(mlan_adapter *pmadapter, BSSDescriptor_t *pbss_de t_u8 *oui = MNULL; IEBody *ie_body = MNULL; t_u8 ret = MLAN_OUI_NOT_PRESENT; + IEEEtypes_VendorHeader_t *hdr = MNULL; + const t_u8 wfa_oui[3] = {0x50, 0x6f, 0x9a}; ENTER(); if (((pbss_desc->prsn_ie != MNULL) && ((*(pbss_desc->prsn_ie)).ieee_hdr.element_id == RSN_IE))) @@ -215,6 +219,41 @@ static t_u8 is_rsn_oui_present(mlan_adapter *pmadapter, BSSDescriptor_t *pbss_de return ret; } } + + if (pbss_desc->prsno_ie != MNULL) + { + hdr = (IEEEtypes_VendorHeader_t *)(void *)pbss_desc->prsno_ie; + if (hdr->element_id == (t_u8)VENDOR_SPECIFIC_221 && + !__memcmp(pmadapter, hdr->oui, wfa_oui, sizeof(wfa_oui)) && + hdr->oui_type == MLAN_OUI_TYPE_RSNO) + { + ie_body = (IEBody *)(void *)((t_u8 *)(&hdr->oui_subtype) + RSN_GTK_OUI_OFFSET); + oui = &rsn_oui[cipher][0]; + if ((ret = search_oui_in_ie(pmadapter, ie_body, oui)) != 0U) + { + LEAVE(); + return ret; + } + } + } + + if (pbss_desc->prsno2_ie != MNULL) + { + hdr = (IEEEtypes_VendorHeader_t *)(void *)pbss_desc->prsno2_ie; + if (hdr->element_id == (t_u8)VENDOR_SPECIFIC_221 && + !__memcmp(pmadapter, hdr->oui, wfa_oui, sizeof(wfa_oui)) && + hdr->oui_type == MLAN_OUI_TYPE_RSNO2) + { + ie_body = (IEBody *)(void *)((t_u8 *)(&hdr->oui_subtype) + RSN_GTK_OUI_OFFSET); + oui = &rsn_oui[cipher][0]; + if ((ret = search_oui_in_ie(pmadapter, ie_body, oui)) != 0U) + { + LEAVE(); + return ret; + } + } + } + LEAVE(); return ret; } @@ -1463,13 +1502,13 @@ static mlan_status wlan_interpret_bss_desc_with_ie(IN pmlan_adapter pmadapter, const t_u8 epigram_oui[3] = {0x00, 0x90, 0x4c}; const t_u8 epigram_type1[1] = {0x33}; const t_u8 epigram_type2[1] = {0x34}; + const t_u8 wfa_oui[3] = {0x50, 0x6f, 0x9a}; + const t_u8 rsno_type[3] = {0x29, 0x2a, 0x2b}; #if CONFIG_DRIVER_OWE - const t_u8 owe_oui[3] = {0x50, 0x6f, 0x9a}; const t_u8 owe_type[1] = {0x01c}; #endif #if CONFIG_DRIVER_MBO - const t_u8 scan_mbo_oui[3] = {0x50, 0x6f, 0x9a}; const t_u8 scan_mbo_type[1] = {0x016}; #endif @@ -1825,12 +1864,12 @@ static mlan_status wlan_interpret_bss_desc_with_ie(IN pmlan_adapter pmadapter, } #if CONFIG_DRIVER_OWE else if (IS_FW_SUPPORT_EMBEDDED_OWE(pmadapter) && - (!__memcmp(pmadapter, pvendor_ie->vend_hdr.oui, owe_oui, sizeof(owe_oui)) && + (!__memcmp(pmadapter, pvendor_ie->vend_hdr.oui, wfa_oui, sizeof(wfa_oui)) && (pvendor_ie->vend_hdr.oui_type == owe_type[0]))) { /* Current Format of OWE IE is element_id:element_len:oui:MAC Address:SSID length:SSID */ t_u8 trans_ssid_len = - *(pcurrent_ptr + sizeof(IEEEtypes_Header_t) + sizeof(owe_oui) + sizeof(owe_type) + MLAN_MAC_ADDR_LENGTH); + *(pcurrent_ptr + sizeof(IEEEtypes_Header_t) + sizeof(wfa_oui) + sizeof(owe_type) + MLAN_MAC_ADDR_LENGTH); if (!trans_ssid_len || trans_ssid_len > MRVDRV_MAX_SSID_LENGTH) { @@ -1847,10 +1886,10 @@ static mlan_status wlan_interpret_bss_desc_with_ie(IN pmlan_adapter pmadapter, } (void)__memcpy(pmadapter, pbss_entry->trans_mac_address, - (pcurrent_ptr + sizeof(IEEEtypes_Header_t) + sizeof(owe_oui) + sizeof(owe_type)), MLAN_MAC_ADDR_LENGTH); + (pcurrent_ptr + sizeof(IEEEtypes_Header_t) + sizeof(wfa_oui) + sizeof(owe_type)), MLAN_MAC_ADDR_LENGTH); pbss_entry->trans_ssid.ssid_len = trans_ssid_len; (void)__memcpy(pmadapter, pbss_entry->trans_ssid.ssid, - (pcurrent_ptr + sizeof(IEEEtypes_Header_t) + sizeof(owe_oui) + sizeof(owe_type) + MLAN_MAC_ADDR_LENGTH + + (pcurrent_ptr + sizeof(IEEEtypes_Header_t) + sizeof(wfa_oui) + sizeof(owe_type) + MLAN_MAC_ADDR_LENGTH + sizeof(t_u8)), trans_ssid_len); @@ -1860,7 +1899,7 @@ static mlan_status wlan_interpret_bss_desc_with_ie(IN pmlan_adapter pmadapter, } #endif #if CONFIG_DRIVER_MBO - else if (__memcmp(pmadapter, pvendor_ie->vend_hdr.oui, scan_mbo_oui, sizeof(scan_mbo_oui)) == 0 && + else if (__memcmp(pmadapter, pvendor_ie->vend_hdr.oui, wfa_oui, sizeof(wfa_oui)) == 0 && (pvendor_ie->vend_hdr.oui_type == scan_mbo_type[0])) { t_u8 *pcurrent_attr = pcurrent_ptr + MBO_IE_HEADER_LEN; @@ -1885,6 +1924,38 @@ static mlan_status wlan_interpret_bss_desc_with_ie(IN pmlan_adapter pmadapter, } } #endif + else if (__memcmp(pmadapter, pvendor_ie->vend_hdr.oui, wfa_oui, sizeof(wfa_oui)) == 0 && + (pvendor_ie->vend_hdr.oui_type == rsno_type[0] || + pvendor_ie->vend_hdr.oui_type == rsno_type[1] || + pvendor_ie->vend_hdr.oui_type == rsno_type[2])) + { + if (pvendor_ie->vend_hdr.oui_type == rsno_type[0]) + { + if (element_len + sizeof(IEEEtypes_Header_t) <= sizeof(pbss_entry->rsno_ie_buff)) + { + (void)__memcpy(pmadapter, pbss_entry->rsno_ie_buff, + pcurrent_ptr, element_len + sizeof(IEEEtypes_Header_t)); + pbss_entry->rsno_ie_buff_len = element_len + sizeof(IEEEtypes_Header_t); + pbss_entry->prsno_ie = (IEEEtypes_Generic_t *)(void *)pbss_entry->rsno_ie_buff; + } + } + else if (pvendor_ie->vend_hdr.oui_type == rsno_type[1]) + { + if (element_len + sizeof(IEEEtypes_Header_t) <= sizeof(pbss_entry->rsno2_ie_buff)) + { + (void)__memcpy(pmadapter, pbss_entry->rsno2_ie_buff, + pcurrent_ptr, element_len + sizeof(IEEEtypes_Header_t)); + pbss_entry->rsno2_ie_buff_len = element_len + sizeof(IEEEtypes_Header_t); + pbss_entry->prsno2_ie = (IEEEtypes_Generic_t *)(void *)pbss_entry->rsno2_ie_buff; + } + } + else if (pvendor_ie->vend_hdr.oui_type == rsno_type[2]) + { + (void)__memcpy(pmadapter, &pbss_entry->rsnxo_ie_saved, + pcurrent_ptr, sizeof(pbss_entry->rsnxo_ie_saved)); + pbss_entry->prsnxo_ie = &pbss_entry->rsnxo_ie_saved; + } + } #if CONFIG_11K /* Voice Enterprise Test Plan V1.2, test case 5.4, store other vendor specific ie */ else @@ -1933,9 +2004,6 @@ static mlan_status wlan_interpret_bss_desc_with_ie(IN pmlan_adapter pmadapter, wifi_e("Insufficient space to save RSN_IE size: %d", element_len); } - /* pbss_entry->prsn_ie = (IEEEtypes_Generic_t *) pcurrent_ptr; */ - /* pbss_entry->rsn_offset = */ - /* (t_u16) (pcurrent_ptr - pbss_entry->pbeacon_buf); */ HEXDUMP("InterpretIE: Resp RSN_IE", (t_u8 *)pbss_entry->prsn_ie, (*(pbss_entry->prsn_ie)).ieee_hdr.len + sizeof(IEEEtypes_Header_t)); break; @@ -2761,10 +2829,22 @@ static void adjust_pointers_to_internal_buffers(BSSDescriptor_t *pbss_entry, BSS { pbss_entry->prsn_ie = (IEEEtypes_Generic_t *)(void *)pbss_entry->rsn_ie_buff; } + if (pbss_entry->prsno_ie != NULL) + { + pbss_entry->prsno_ie = (IEEEtypes_Generic_t *)(void *)pbss_entry->rsno_ie_buff; + } + if (pbss_entry->prsno2_ie != NULL) + { + pbss_entry->prsno2_ie = (IEEEtypes_Generic_t *)(void *)pbss_entry->rsno2_ie_buff; + } if (pbss_entry->prsnx_ie != NULL) { pbss_entry->prsnx_ie = &pbss_entry->rsnx_ie_saved; } + if (pbss_entry->prsnxo_ie != NULL) + { + pbss_entry->prsnxo_ie = &pbss_entry->rsnxo_ie_saved; + } #if CONFIG_WPA_SUPP if (pbss_new_entry->ies != NULL) { @@ -3376,7 +3456,10 @@ static mlan_status wlan_update_ssid_in_beacon_buf(mlan_adapter *pmadapter, IEEEtypes_Ssid_t *pssid, IEEEtypes_ExtCap_t *pnew_extcap, IEEEtypes_Generic_t *pnew_rsnx, - IEEEtypes_Generic_t *pnew_rsn) + IEEEtypes_Generic_t *pnew_rsn, + IEEEtypes_Generic_t *pnew_rsno, + IEEEtypes_Generic_t *pnew_rsno2, + IEEEtypes_Generic_t *pnew_rsnxo) { #if CONFIG_WPA_SUPP mlan_callbacks *pcb = (pmlan_callbacks)&pmadapter->callbacks; @@ -3393,6 +3476,8 @@ static mlan_status wlan_update_ssid_in_beacon_buf(mlan_adapter *pmadapter, if (pnew_rsnx) beacon_buf_size += pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t); + if (pnew_rsnxo) + beacon_buf_size += pnew_rsnxo->ieee_hdr.len + sizeof(IEEEtypes_Header_t); #if CONFIG_WPA_SUPP ret = pcb->moal_malloc(pmadapter->pmoal_handle, beacon_buf_size, MLAN_MEM_DEF, (t_u8 **)&pbeacon_buf); if (ret != MLAN_STATUS_SUCCESS || !pbeacon_buf) @@ -3425,9 +3510,15 @@ static mlan_status wlan_update_ssid_in_beacon_buf(mlan_adapter *pmadapter, if (pnew_rsnx) { (void)__memcpy(pmadapter, &pnew_entry->rsnx_ie_saved, pnew_rsnx, - pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t)); + sizeof(pnew_entry->rsnx_ie_saved)); pnew_entry->prsnx_ie = &pnew_entry->rsnx_ie_saved; } + if (pnew_rsnxo) + { + (void)__memcpy(pmadapter, &pnew_entry->rsnxo_ie_saved, pnew_rsnxo, + sizeof(pnew_entry->rsnxo_ie_saved)); + pnew_entry->prsnxo_ie = &pnew_entry->rsnxo_ie_saved; + } if (pnew_rsn) { @@ -3436,6 +3527,20 @@ static mlan_status wlan_update_ssid_in_beacon_buf(mlan_adapter *pmadapter, pnew_entry->rsn_ie_buff_len = pnew_rsn->ieee_hdr.len + sizeof(IEEEtypes_Header_t); pnew_entry->prsn_ie = (IEEEtypes_Generic_t *)pnew_entry->rsn_ie_buff; } + if (pnew_rsno) + { + (void)__memcpy(pmadapter, pnew_entry->rsno_ie_buff, pnew_rsno, + pnew_rsno->ieee_hdr.len + sizeof(IEEEtypes_Header_t)); + pnew_entry->rsno_ie_buff_len = pnew_rsno->ieee_hdr.len + sizeof(IEEEtypes_Header_t); + pnew_entry->prsno_ie = (IEEEtypes_Generic_t *)pnew_entry->rsno_ie_buff; + } + if (pnew_rsno2) + { + (void)__memcpy(pmadapter, pnew_entry->rsno2_ie_buff, pnew_rsno2, + pnew_rsno2->ieee_hdr.len + sizeof(IEEEtypes_Header_t)); + pnew_entry->rsno2_ie_buff_len = pnew_rsno2->ieee_hdr.len + sizeof(IEEEtypes_Header_t); + pnew_entry->prsno2_ie = (IEEEtypes_Generic_t *)pnew_entry->rsno2_ie_buff; + } #if CONFIG_WPA_SUPP /** copy fixed IE */ @@ -3588,6 +3693,11 @@ static t_void wlan_parse_non_trans_bssid_profile(mlan_private *pmpriv, #endif IEEEtypes_ExtCap_t *pextcap = MNULL; IEEEtypes_Generic_t *prsnx = MNULL; + IEEEtypes_VendorHeader_t *pvdr = MNULL; + IEEEtypes_Generic_t *prsno = MNULL; + IEEEtypes_Generic_t *prsno2 = MNULL; + IEEEtypes_Generic_t *prsnxo = MNULL; + const t_u8 wfa_oui[3] = {0x50, 0x6f, 0x9a}; ENTER(); @@ -3640,6 +3750,24 @@ static t_void wlan_parse_non_trans_bssid_profile(mlan_private *pmpriv, prsn = (IEEEtypes_Generic_t *)pos; DBG_HEXDUMP(MCMD_D, "MBSSID RSN", pos, prsn->ieee_hdr.len + sizeof(IEEEtypes_Header_t)); break; + case VENDOR_SPECIFIC_221: + pvdr = (IEEEtypes_VendorHeader_t *)pos; + if (!__memcmp(pmadapter, pvdr->oui, wfa_oui, sizeof(wfa_oui))) + { + if (pvdr->oui_type == MLAN_OUI_TYPE_RSNO) + { + prsno = (IEEEtypes_Generic_t *)pos; + } + else if (pvdr->oui_type == MLAN_OUI_TYPE_RSNO2) + { + prsno2 = (IEEEtypes_Generic_t *)pos; + } + else if (pvdr->oui_type == MLAN_OUI_TYPE_RSNXO) + { + prsnxo = (IEEEtypes_Generic_t *)pos; + } + } + break; default: break; } @@ -3669,7 +3797,8 @@ static t_void wlan_parse_non_trans_bssid_profile(mlan_private *pmpriv, bss_new_entry->ssid.ssid_len = pssid->len; (void)__memcpy(pmadapter, bss_new_entry->ssid.ssid, pssid->ssid, MIN(pssid->len, MLAN_MAX_SSID_LENGTH)); if (MLAN_STATUS_SUCCESS != - wlan_update_ssid_in_beacon_buf(pmadapter, pbss_entry, bss_new_entry, pssid, pextcap, prsnx, prsn)) + wlan_update_ssid_in_beacon_buf(pmadapter, pbss_entry, bss_new_entry, pssid, pextcap, prsnx, prsn, + prsno, prsno2, prsnxo)) { PRINTM(MERROR, "Fail to update MBSSID beacon buf\n"); pcb->moal_mfree(pmadapter->pmoal_handle, (t_u8 *)bss_new_entry); diff --git a/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.c b/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.c index 69d8949ef..2b75af641 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.c +++ b/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.c @@ -2761,11 +2761,8 @@ void handle_cdint(int error) if (!error && g_txrx_flag) { g_txrx_flag = false; -#if CONFIG_ZEPHYR - (void)OSA_EventNotifyPost(wm_wifi.wifi_core_task_Handle); -#else - (void)OSA_EventSet((osa_event_handle_t)wm_wifi.wifi_event_Handle, WIFI_EVENT_SDIO); -#endif + + (void)OSA_TaskNotifyPost(wm_wifi.wifi_core_task_Handle); } } @@ -3057,6 +3054,7 @@ void sd_wifi_deinit(void) sdio_drv_deinit(); (void)mlan_subsys_deinit(); (void)wlan_deinit_struct(); + g_txrx_flag = false; } #if CONFIG_FW_VDLL diff --git a/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.h b/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.h index 33acdbe55..40feea652 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.h +++ b/mcux/middleware/wifi_nxp/wifidriver/wifi-sdio.h @@ -34,7 +34,12 @@ #define WLAN_MAGIC_NUM (('W' << 0) | ('L' << 8) | ('F' << 16) | ('W' << 24)) +#if CONFIG_RF_TEST_MODE +/* sizeof(HostCmd_DS_COMMAND) in worst case is 2828 where HostCmd_DS_MFG_CMD_OTP_CAL_DATA_T size is 2820 */ +#define WIFI_FW_CMDBUF_SIZE 2832U +#else #define WIFI_FW_CMDBUF_SIZE 2100U +#endif #define WIFI_RESP_WAIT_TIME 10 diff --git a/mcux/middleware/wifi_nxp/wifidriver/wifi.c b/mcux/middleware/wifi_nxp/wifidriver/wifi.c index 26a3b42bf..2ead1d6dd 100644 --- a/mcux/middleware/wifi_nxp/wifidriver/wifi.c +++ b/mcux/middleware/wifi_nxp/wifidriver/wifi.c @@ -151,7 +151,7 @@ typedef enum __mlan_status static void wifi_core_task(osa_task_param_t arg); /* OSA_TASKS: name, priority, instances, stackSz, useFloat */ -static OSA_TASK_DEFINE(wifi_core_task, OSA_PRIORITY_HIGH, 1, CONFIG_WIFI_CORE_STACK_SIZE, 0); +static OSA_TASK_DEFINE(wifi_core_task, OSA_PRIORITY_NORMAL, 1, CONFIG_WIFI_CORE_STACK_SIZE, 0); #endif static void wifi_scan_task(osa_task_param_t arg); @@ -1410,14 +1410,16 @@ static int add_mcast_ip(uint8_t *mac_addr) static int remove_mcast_ip(uint8_t *mac_addr) { mcast_filter *curr_node, *prev_node; + (void)wifi_get_mcastf_lock(); - curr_node = wm_wifi.start_list->next; prev_node = wm_wifi.start_list; - if (wm_wifi.start_list == NULL) + if (prev_node == NULL) { (void)wifi_put_mcastf_lock(); return -WM_FAIL; } + + curr_node = wm_wifi.start_list->next; if (curr_node == NULL && cmp_mac_addr(prev_node->mac_addr, mac_addr)) { #if !CONFIG_MEM_POOLS @@ -2142,7 +2144,7 @@ static void wifi_core_deinit(void) #endif (void)OSA_MutexDestroy((osa_mutex_handle_t)wm_wifi.command_lock); (void)OSA_EventDestroy((osa_event_handle_t)wm_wifi.wifi_event_Handle); -#ifndef RW610 +#if 0 (void)OSA_TaskDestroy((osa_task_handle_t)wm_wifi.wifi_drv_task_Handle); (void)OSA_TaskDestroy((osa_task_handle_t)wm_wifi.wifi_core_task_Handle); (void)OSA_TaskDestroy((osa_task_handle_t)wm_wifi.wifi_scan_task_Handle); @@ -2150,12 +2152,12 @@ static void wifi_core_deinit(void) #if CONFIG_WMM (void)OSA_TaskDestroy((osa_task_handle_t)wm_wifi.wifi_drv_tx_task_Handle); #endif -#else +#endif wm_wifi.cmd_resp_priv = NULL; wm_wifi.cmd_resp_ioctl = NULL; wm_wifi.cmd_resp_status = 0; memset(&wm_wifi, 0x00, sizeof(wm_wifi)); -#endif + #if CONFIG_CSI (void)OSA_SemaphoreDestroy((osa_semaphore_handle_t)csi_buff_stat.csi_data_sem); #endif @@ -2379,7 +2381,6 @@ void wifi_deinit(void) #endif } -#ifdef RW610 bool wifi_fw_is_hang(void) { if (mlan_adap && mlan_adap->bus_ops.fw_is_hang) @@ -2398,10 +2399,11 @@ void wifi_destroy_wifidriver_tasks(void) #endif (void)OSA_TaskDestroy((osa_task_handle_t)wm_wifi.wifi_scan_task_Handle); (void)OSA_TaskDestroy((osa_task_handle_t)wm_wifi.wifi_powersave_task_Handle); - +#ifdef RW610 imu_uninstall_callback(); -} #endif +} + void wifi_set_tx_status(t_u8 status) { wifi_tx_status = status; diff --git a/mcux/middleware/wifi_nxp/wlcmgr/wlan.c b/mcux/middleware/wifi_nxp/wlcmgr/wlan.c index 077565244..e0b81145b 100644 --- a/mcux/middleware/wifi_nxp/wlcmgr/wlan.c +++ b/mcux/middleware/wifi_nxp/wlcmgr/wlan.c @@ -2,7 +2,7 @@ * * @brief This file provides Core WLAN definition * - * Copyright 2008-2024 NXP + * Copyright 2008-2025 NXP * * SPDX-License-Identifier: BSD-3-Clause * @@ -151,9 +151,12 @@ extern const unsigned int wlan_fw_bin_len; const unsigned char *wlan_fw_bin = (const unsigned char *)(void *)0; const unsigned int wlan_fw_bin_len = 0; #endif /* CONFIG_NXP_MONOLITHIC_WIFI */ +#else +extern const unsigned char *wlan_fw_bin; +extern const unsigned int wlan_fw_bin_len; +#endif extern int nxp_wifi_wlan_event_callback(enum wlan_event_reason reason, void *data); #define wlan_event_callback nxp_wifi_wlan_event_callback -#endif static int wifi_wakeup_card_cb(osa_rw_lock_t *plock, unsigned int wait_time); @@ -245,8 +248,8 @@ extern WPS_DATA wps_global; (void)wlan.cb(r, data); \ } -#ifdef RW610 OSA_MUTEX_HANDLE_DEFINE(reset_lock); +#ifdef RW610 /* Mon thread */ static bool mon_thread_init = 0; #endif @@ -2152,8 +2155,10 @@ static int do_start(struct wlan_network *network) wpa_supp_set_ap_bw(netif, 1); } #else - wifi_get_active_channel_list(active_chan_list, &active_num_chans, - wlan.networks[wlan.cur_uap_network_idx].acs_band); + if (network->channel > MAX_CHANNELS_BG) + wifi_get_active_channel_list(active_chan_list, &active_num_chans, BAND_5GHZ); + else + wifi_get_active_channel_list(active_chan_list, &active_num_chans, BAND_2GHZ); for (i = 0; i < active_num_chans; i++) { @@ -2563,7 +2568,7 @@ static int start_association(struct wlan_network *network, struct wifi_scan_resu #endif ret = wrapper_wifi_assoc(res->bssid, (int)network->security.type, (bool)network->security.ucstCipher.tkip, - owe_trans_mode, is_ft); + owe_trans_mode, is_ft, network->security.key_mgmt); if (ret != WM_SUCCESS) { wlcm_d("association failed"); @@ -2792,7 +2797,6 @@ static void handle_scan_results(void) return; } -#ifdef RW610 /* If reset is in process, skip re-scan */ if (OSA_MutexLock((osa_mutex_handle_t)reset_lock, 0) != WM_SUCCESS) { @@ -2800,7 +2804,6 @@ static void handle_scan_results(void) return; } OSA_MutexUnlock((osa_mutex_handle_t)reset_lock); -#endif /* We didn't find our network in the scan results set: rescan if we * have rescan attempts remaining, otherwise give up. @@ -3056,7 +3059,7 @@ static void wlcm_process_scan_result_event(struct wifi_message *msg, enum cm_sta wifi_scan_done(msg); #if CONFIG_WIFI_NM_WPA_SUPPLICANT /* - * Subscribe EVENT_RSSI_LOW if roaming is enabled. + * Subscribe EVENT_RSSI_LOW if roaming is enabled. * Do this here in case roaming is not happened or failed in wpa_supplicant. */ #if CONFIG_ROAMING @@ -4570,7 +4573,7 @@ static int wlan_set_uap_ecsa_cfg( } else { - wlcm_e("uap isn't up"); + wlcm_e("uap isn't up OR station is connected"); return -WM_FAIL; } } @@ -6258,7 +6261,7 @@ static void wlcm_request_scan(struct wifi_message *msg, enum cm_sta_state *next) wlcm_d("initiating wlan-scan (return to %s)", dbg_sta_state_name(wlan.sta_state)); wlan.scan_cb = (int (*)(unsigned int count))(wlan_scan_param->cb); - + int ret = wifi_send_scan_cmd((t_u8)g_wifi_scan_params.bss_type, wlan_scan_param->bssid, ssid, ssid_num, wlan_scan_param->num_channels, wlan_scan_param->chan_list, wlan_scan_param->num_probes, @@ -7895,9 +7898,7 @@ static void wlan_wait_wlmgr_ready() int wlan_start(int (*cb)(enum wlan_event_reason reason, void *data)) { -#ifdef RW610 static bool reset_mutex_init = 0; -#endif int ret; osa_status_t status; @@ -8019,7 +8020,6 @@ int wlan_start(int (*cb)(enum wlan_event_reason reason, void *data)) } OSA_SemaphorePost((osa_semaphore_handle_t)wlan.scan_lock); -#ifdef RW610 if (!reset_mutex_init) { status = OSA_MutexCreate((osa_mutex_handle_t)reset_lock); @@ -8034,8 +8034,10 @@ int wlan_start(int (*cb)(enum wlan_event_reason reason, void *data)) } reset_mutex_init = 1; } +#ifdef RW610 if (!mon_thread_init) { + status = OSA_MsgQCreate((osa_msgq_handle_t)mon_thread_events, MAX_EVENTS, sizeof(struct wlan_message)); if (status != KOSA_StatusSuccess) { @@ -8392,31 +8394,6 @@ int wlan_stop(void) (void)OSA_SemaphoreDestroy((osa_semaphore_handle_t)wls_csi_sem); #endif -#ifndef RW610 - if (wlan.sta_state > CM_STA_ASSOCIATING) - { - (void)wifi_deauthenticate((uint8_t *)wlan.networks[wlan.cur_network_idx].bssid); - wlan.sta_return_to = CM_STA_IDLE; - } - if (wlan.uap_state > CM_UAP_CONFIGURED) - { - (void)wifi_uap_stop(); -// (void)dhcp_server_stop(); - } - - status = OSA_TaskDestroy((osa_task_handle_t)wlan.wlcmgr_task_Handle); - - if (status != KOSA_StatusSuccess) - { - wlcm_w("failed to terminate thread: %d", ret); - return WLAN_ERROR_STATE; - } - - (void)net_wlan_deinit(); - - wlan.status = WLCMGR_INIT_DONE; - wlcm_d("WLCMGR thread deleted\n\r"); -#else wlan.running = 0; wlan.status = WLCMGR_INACTIVE; memset(&wlan, 0x00, sizeof(wlan)); @@ -8424,7 +8401,6 @@ int wlan_stop(void) wifi_deinit(); OSA_RWLockDestroy(&sleep_rwlock); -#endif #if CONFIG_WMM_UAPSD OSA_SemaphoreDestroy((osa_semaphore_handle_t)uapsd_sem); @@ -10441,7 +10417,6 @@ int wlan_stop_network(const char *name) #endif /* UAP_SUPPORT */ } -#if defined(RW610) int wlan_remove_all_networks(void) { void *intrfc_handle = NULL; @@ -10454,33 +10429,32 @@ int wlan_remove_all_networks(void) wlan_remove_all_network_profiles(); intrfc_handle = net_get_sta_handle(); - net_interface_down(intrfc_handle); + net_if_down(((interface_t *)intrfc_handle)->netif); #if UAP_SUPPORT intrfc_handle = net_get_uap_handle(); - net_interface_down(intrfc_handle); + net_if_down(((interface_t *)intrfc_handle)->netif); +#endif /* wait for mgmt_event handled */ OSA_TimeDelay(500); -#endif return WM_SUCCESS; } -#if CONFIG_WIFI_NM_WPA_SUPPLICANT int wlan_enable_all_networks(void) { void *intrfc_handle = NULL; intrfc_handle = net_get_sta_handle(); - net_interface_up(intrfc_handle); + net_if_up(((interface_t *)intrfc_handle)->netif); #if UAP_SUPPORT intrfc_handle = net_get_uap_handle(); - net_interface_up(intrfc_handle); + net_if_up(((interface_t *)intrfc_handle)->netif); #endif return WM_SUCCESS; } -#endif + void wlan_destroy_all_tasks(void) { OSA_LockSchedule(); @@ -10500,6 +10474,7 @@ void wlan_destroy_all_tasks(void) OSA_UnlockSchedule(); } +#if defined(RW610) int wlan_imu_get_task_lock(void) { return wifi_imu_get_task_lock(); @@ -10509,6 +10484,7 @@ int wlan_imu_put_task_lock(void) { return wifi_imu_put_task_lock(); } +#endif void wlan_reset(cli_reset_option ResetOption) { @@ -10589,8 +10565,10 @@ void wlan_reset(cli_reset_option ResetOption) wifi_scan_stop(); mlan_adap->skip_dfs = false; +#if defined(RW610) if (!wifi_fw_is_hang()) wifi_send_shutdown_cmd(); +#endif #if CONFIG_WPA_SUPP wifi_supp_deinit(); @@ -10599,8 +10577,10 @@ void wlan_reset(cli_reset_option ResetOption) #endif #endif +#if defined(RW610) /* wait for imu task done */ wlan_imu_get_task_lock(); +#endif /* Destroy all tasks before touch the global vars */ wlan_destroy_all_tasks(); #if CONFIG_NCP_BRIDGE @@ -10615,11 +10595,15 @@ void wlan_reset(cli_reset_option ResetOption) wlan_free_entp_cert_files(); #endif +#if defined(RW610) wlan_imu_put_task_lock(); +#endif /* Clear wlcmgr */ wlan_stop(); } +#if defined(RW610) power_off_device(LOAD_WIFI_FIRMWARE); +#endif } if (ResetOption == CLI_ENABLE_WIFI || ResetOption == CLI_RESET_WIFI) @@ -10647,7 +10631,6 @@ void wlan_reset(cli_reset_option ResetOption) /* update the netif hwaddr after reset */ #if CONFIG_WIFI_NM_WPA_SUPPLICANT wlan_set_mac_addr(&wlan.sta_mac[0]); - wlan_enable_all_networks(); #else #if UAP_SUPPORT net_wlan_set_mac_address(&wlan.sta_mac[0], &wlan.uap_mac[0]); @@ -10655,6 +10638,8 @@ void wlan_reset(cli_reset_option ResetOption) net_wlan_set_mac_address(&wlan.sta_mac[0], NULL); #endif #endif + wlan_enable_all_networks(); + /* Unblock TX data */ wifi_set_tx_status(WIFI_DATA_RUNNING); /* Unblock RX data */ @@ -10673,11 +10658,12 @@ void wlan_reset(cli_reset_option ResetOption) } OSA_MutexUnlock((osa_mutex_handle_t)reset_lock); - + wlan_in_reset = false; PRINTF("--- Done ---\r\n"); } +#if defined(RW610) static void wlcmgr_mon_task(void * data) { #if CONFIG_HOST_SLEEP diff --git a/mcux/middleware/wifi_nxp/wlcmgr/wlan_enhanced_tests.c b/mcux/middleware/wifi_nxp/wlcmgr/wlan_enhanced_tests.c index 8727a7ff1..886cf2ecc 100644 --- a/mcux/middleware/wifi_nxp/wlcmgr/wlan_enhanced_tests.c +++ b/mcux/middleware/wifi_nxp/wlcmgr/wlan_enhanced_tests.c @@ -1374,9 +1374,10 @@ static void dump_wlan_set_txomi_usage() static void test_wlan_set_rutxpwrlimit(int argc, char **argv) { int rv; - uint32_t region_code = (t_u16)strtol(argv[1], NULL, 0); + #if CONFIG_COMPRESS_RU_TX_PWTBL #ifdef RW610 + uint32_t region_code = (t_u16)strtol(argv[1], NULL, 0); switch (region_code) { case RW610_PACKAGE_TYPE_WW: @@ -1660,16 +1661,16 @@ static void test_wlan_twt_report(int argc, char **argv) t_u16 mantissa= p[5] | p[6] << 8; t_u16 twt_info= p[7] | p[8] << 8; t_u8 btwt_id = (twt_info & 0xF8) >> 3; - + (void)PRINTF("Schedule-[%d]:\r\n", i); for (j = 0; j < WLAN_BTWT_REPORT_LEN; j++) { (void)PRINTF(" 0x%02x", info.data[i * WLAN_BTWT_REPORT_LEN + j]); } (void)PRINTF("\r\n"); - + (void)PRINTF(" ## Explain: Broadcast TWT ID = %2d; %s, %s; Interval Exponent = %2d, Mantissa = %2d; Wake Duration = %2d\r\n", - btwt_id, + btwt_id, (req_typ & BIT(4)) ? "Trigger":"No trigger", (req_typ & BIT(6)) ? "Unannounced":"Announced", (req_typ & 0x7C00) >> 10, //IntervalExponent diff --git a/mcux/middleware/wifi_nxp/wlcmgr/wlan_tests.c b/mcux/middleware/wifi_nxp/wlcmgr/wlan_tests.c index aa82e3337..55c724a6f 100644 --- a/mcux/middleware/wifi_nxp/wlcmgr/wlan_tests.c +++ b/mcux/middleware/wifi_nxp/wlcmgr/wlan_tests.c @@ -4101,7 +4101,7 @@ static void test_wlan_set_mac_address(int argc, char **argv) wlan_set_mac_addr(raw_mac); } -#if defined(RW610) && (CONFIG_WIFI_RESET) +#if CONFIG_WIFI_RESET static void test_wlan_reset(int argc, char **argv) { int option; @@ -8871,7 +8871,7 @@ static struct cli_command tests[] = { #if CONFIG_WMM {"wlan-wmm-stat", "", test_wlan_wmm_tx_stats}, #endif -#if defined(RW610) && (CONFIG_WIFI_RESET) +#if CONFIG_WIFI_RESET {"wlan-reset", NULL, test_wlan_reset}, #endif #if CONFIG_ECSA