diff --git a/CMakeLists.txt b/CMakeLists.txt index dc6f8266d6778..eecbe70ed4929 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -214,24 +214,53 @@ endif() # 1) Using EXTRA_CFLAGS which is applied regardless of kconfig choice, or # 2) Rely on override support being implemented by your toolchain_cc_optimize_*() # -get_property(OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG TARGET compiler PROPERTY no_optimization) -get_property(OPTIMIZE_FOR_DEBUG_FLAG TARGET compiler PROPERTY optimization_debug) -get_property(OPTIMIZE_FOR_SPEED_FLAG TARGET compiler PROPERTY optimization_speed) -get_property(OPTIMIZE_FOR_SIZE_FLAG TARGET compiler PROPERTY optimization_size) -get_property(OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG TARGET compiler PROPERTY optimization_size_aggressive) +get_property(COMPILER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG TARGET compiler PROPERTY no_optimization) +get_property(COMPILER_OPTIMIZE_FOR_DEBUG_FLAG TARGET compiler PROPERTY optimization_debug) +get_property(COMPILER_OPTIMIZE_FOR_SPEED_FLAG TARGET compiler PROPERTY optimization_speed) +get_property(COMPILER_OPTIMIZE_FOR_SIZE_FLAG TARGET compiler PROPERTY optimization_size) +get_property(COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG TARGET compiler PROPERTY optimization_size_aggressive) + +get_property(ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG TARGET asm PROPERTY no_optimization) +get_property(ASM_OPTIMIZE_FOR_DEBUG_FLAG TARGET asm PROPERTY optimization_debug) +get_property(ASM_OPTIMIZE_FOR_SPEED_FLAG TARGET asm PROPERTY optimization_speed) +get_property(ASM_OPTIMIZE_FOR_SIZE_FLAG TARGET asm PROPERTY optimization_size) +get_property(ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG TARGET asm PROPERTY optimization_size_aggressive) + +# Let the assembler inherit the optimization flags of the compiler if it is +# not set explicitly. +if(NOT ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG) + set(ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG ${COMPILER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) +endif() +if(NOT ASM_OPTIMIZE_FOR_DEBUG_FLAG) + set(ASM_OPTIMIZE_FOR_DEBUG_FLAG ${COMPILER_OPTIMIZE_FOR_DEBUG_FLAG}) +endif() +if(NOT ASM_OPTIMIZE_FOR_SPEED_FLAG) + set(ASM_OPTIMIZE_FOR_SPEED_FLAG ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG}) +endif() +if(NOT ASM_OPTIMIZE_FOR_SIZE_FLAG) + set(ASM_OPTIMIZE_FOR_SIZE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_FLAG}) +endif() +if(NOT ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG) + set(ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) +endif() # From kconfig choice, pick the actual OPTIMIZATION_FLAG to use. # Kconfig choice ensures only one of these CONFIG_*_OPTIMIZATIONS is set. if(CONFIG_NO_OPTIMIZATIONS) - set(OPTIMIZATION_FLAG ${OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) + set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) + set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) elseif(CONFIG_DEBUG_OPTIMIZATIONS) - set(OPTIMIZATION_FLAG ${OPTIMIZE_FOR_DEBUG_FLAG}) + set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_DEBUG_FLAG}) + set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_DEBUG_FLAG}) elseif(CONFIG_SPEED_OPTIMIZATIONS) - set(OPTIMIZATION_FLAG ${OPTIMIZE_FOR_SPEED_FLAG}) + set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG}) + set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SPEED_FLAG}) elseif(CONFIG_SIZE_OPTIMIZATIONS) - set(OPTIMIZATION_FLAG ${OPTIMIZE_FOR_SIZE_FLAG}) # Default in kconfig + set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_FLAG}) # Default in kconfig + set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SIZE_FLAG}) elseif(CONFIG_SIZE_OPTIMIZATIONS_AGGRESSIVE) - set(OPTIMIZATION_FLAG ${OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) + set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) + set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) else() message(FATAL_ERROR "Unreachable code. Expected optimization level to have been chosen. See Kconfig.zephyr") @@ -245,9 +274,9 @@ SOC_* symbol.") endif() # Apply the final optimization flag(s) -zephyr_compile_options($<$:${OPTIMIZATION_FLAG}>) -zephyr_compile_options($<$:${OPTIMIZATION_FLAG}>) -zephyr_compile_options($<$:${OPTIMIZATION_FLAG}>) +zephyr_compile_options($<$:${ASM_OPTIMIZATION_FLAG}>) +zephyr_compile_options($<$:${COMPILER_OPTIMIZATION_FLAG}>) +zephyr_compile_options($<$:${COMPILER_OPTIMIZATION_FLAG}>) if(CONFIG_LTO) zephyr_compile_options($) diff --git a/arch/arm/core/cortex_m/thread.c b/arch/arm/core/cortex_m/thread.c index 733b4b8637fda..414eb865f93eb 100644 --- a/arch/arm/core/cortex_m/thread.c +++ b/arch/arm/core/cortex_m/thread.c @@ -560,7 +560,9 @@ void arch_switch_to_main_thread(struct k_thread *main_thread, char *stack_ptr, /* We don’t intend to return, so there is no need to link. */ "bx r4\n" /* Force a literal pool placement for the addresses referenced above */ +#ifndef __IAR_SYSTEMS_ICC__ ".ltorg\n" +#endif : : "r"(_main), "r"(stack_ptr) : "r0", "r1", "r2", "r3", "r4", "ip", "lr", "memory"); @@ -628,7 +630,9 @@ FUNC_NORETURN void z_arm_switch_to_main_no_multithreading(k_thread_entry_t main_ "blx r0\n" "loop: b loop\n\t" /* while (true); */ /* Force a literal pool placement for the addresses referenced above */ +#ifndef __IAR_SYSTEMS_ICC__ ".ltorg\n" +#endif : : [_p1] "r"(p1), [_p2] "r"(p2), [_p3] "r"(p3), [_psp] "r"(psp), [_main_entry] "r"(main_entry) diff --git a/boards/arduino/nicla_vision/arduino_nicla_vision_stm32h747xx_m7.dts b/boards/arduino/nicla_vision/arduino_nicla_vision_stm32h747xx_m7.dts index 0cc4ef217a189..3e1c0ddc33562 100644 --- a/boards/arduino/nicla_vision/arduino_nicla_vision_stm32h747xx_m7.dts +++ b/boards/arduino/nicla_vision/arduino_nicla_vision_stm32h747xx_m7.dts @@ -108,9 +108,9 @@ zephyr_i2c: &i2c1 { pinctrl-names = "default"; clock-frequency = ; - vl53l1x: vl53l1x@52 { + vl53l1x: vl53l1x@29 { compatible = "st,vl53l1x"; - reg = <0x52>; + reg = <0x29>; status = "okay"; xshut-gpios = <&gpiog 10 GPIO_ACTIVE_HIGH>; int-gpios = <&gpiod 8 GPIO_ACTIVE_HIGH>; diff --git a/boards/st/nucleo_u385rg_q/nucleo_u385rg_q.dts b/boards/st/nucleo_u385rg_q/nucleo_u385rg_q.dts index 42b8c67b3f35b..f4e48499301f2 100644 --- a/boards/st/nucleo_u385rg_q/nucleo_u385rg_q.dts +++ b/boards/st/nucleo_u385rg_q/nucleo_u385rg_q.dts @@ -110,6 +110,10 @@ status = "okay"; }; +&clk_msik { + status = "okay"; +}; + &clk_msis { status = "okay"; msi-pll-mode; @@ -160,6 +164,8 @@ }; &rng { + clocks = <&rcc STM32_CLOCK(AHB2, 18)>, + <&rcc STM32_SRC_MSIK RNG_SEL(1)>; status = "okay"; }; diff --git a/cmake/compiler/iar/compiler_flags.cmake b/cmake/compiler/iar/compiler_flags.cmake index 95e66e8cc4a5f..cb9b6f25bbf87 100644 --- a/cmake/compiler/iar/compiler_flags.cmake +++ b/cmake/compiler/iar/compiler_flags.cmake @@ -8,17 +8,20 @@ # This section covers flags related to optimization # ##################################################### set_compiler_property(PROPERTY no_optimization -On) - set_compiler_property(PROPERTY optimization_debug -Ol) - set_compiler_property(PROPERTY optimization_speed -Ohs) - set_compiler_property(PROPERTY optimization_size -Ohz) - set_compiler_property(PROPERTY optimization_size_aggressive -Ohz) - set_compiler_property(PROPERTY optimization_fast --no_size_constraints) +# IAR uses the GNU assembler so the options differ from the compiler +set_property(TARGET asm PROPERTY no_optimization -O0) +set_property(TARGET asm PROPERTY optimization_debug -Og) +set_property(TARGET asm PROPERTY optimization_speed -O2) +set_property(TARGET asm PROPERTY optimization_size -Os) +set_property(TARGET asm PROPERTY optimization_size_aggressive -Oz) +set_property(TARGET asm PROPERTY optimization_fast -Ofast) + ####################################################### # This section covers flags related to warning levels # ####################################################### diff --git a/cmake/toolchain/xcc/generic.cmake b/cmake/toolchain/xcc/generic.cmake index daf00acc16c01..8a6681c603af3 100644 --- a/cmake/toolchain/xcc/generic.cmake +++ b/cmake/toolchain/xcc/generic.cmake @@ -3,7 +3,7 @@ include(${ZEPHYR_BASE}/cmake/toolchain/xcc/common.cmake) set(COMPILER xcc) -set(OPTIMIZE_FOR_DEBUG_FLAG "-O0") +set(COMPILER_OPTIMIZE_FOR_DEBUG_FLAG "-O0") set(CC xcc) set(C++ xc++) set(LINKER xt-ld) diff --git a/doc/connectivity/networking/api/tftp.rst b/doc/connectivity/networking/api/tftp.rst index 6bb309e07917c..7a699160e947c 100644 --- a/doc/connectivity/networking/api/tftp.rst +++ b/doc/connectivity/networking/api/tftp.rst @@ -4,7 +4,7 @@ TFTP #### Zephyr provides a simple TFTP client library that can enabled with -:kconfig:option:`CONFIG_MQTT_SN_LIB` Kconfig option. +:kconfig:option:`CONFIG_TFTP_LIB` Kconfig option. See :zephyr:code-sample:`TFTP client sample application ` for more information about the library usage. diff --git a/doc/releases/release-notes-4.2.rst b/doc/releases/release-notes-4.2.rst index 22ad4cf762497..ea6f4541da0cc 100644 --- a/doc/releases/release-notes-4.2.rst +++ b/doc/releases/release-notes-4.2.rst @@ -317,6 +317,7 @@ New APIs and options * :kconfig:option:`CONFIG_LV_Z_COLOR_MONO_HW_INVERSION` * LoRaWAN + * :c:func:`lorawan_request_link_check` * Management diff --git a/drivers/can/can_nrf.c b/drivers/can/can_nrf.c index f8c037835a834..828c008780180 100644 --- a/drivers/can/can_nrf.c +++ b/drivers/can/can_nrf.c @@ -147,7 +147,7 @@ static int configure_hsfll(const struct device *dev, bool on) if (on) { int ret; - ret = clock_control_get_rate(dev, NULL, &spec.frequency); + ret = clock_control_get_rate(config->auxpll, NULL, &spec.frequency); if (ret < 0) { return ret; } diff --git a/drivers/console/posix_arch_console.c b/drivers/console/posix_arch_console.c index 7d2dab02faa63..1bd95cd0bc822 100644 --- a/drivers/console/posix_arch_console.c +++ b/drivers/console/posix_arch_console.c @@ -14,6 +14,7 @@ static char stdout_buff[_STDOUT_BUF_SIZE]; static int n_pend; /* Number of pending characters in buffer */ +#if defined(CONFIG_PRINTK) || defined(CONFIG_STDOUT_CONSOLE) static int print_char(int c) { int printnow = 0; @@ -36,6 +37,7 @@ static int print_char(int c) } return c; } +#endif /* defined(CONFIG_PRINTK) || defined(CONFIG_STDOUT_CONSOLE) */ /** * Ensure that whatever was written thru printk is displayed now diff --git a/drivers/ethernet/eth_stm32_hal.c b/drivers/ethernet/eth_stm32_hal.c index ee8b8ef506f98..fa0a9ad63fa58 100644 --- a/drivers/ethernet/eth_stm32_hal.c +++ b/drivers/ethernet/eth_stm32_hal.c @@ -815,6 +815,12 @@ static void generate_mac(uint8_t *mac_addr) result_mac_32_bits = crc32_ieee((uint8_t *)unique_device_ID_12_bytes, 12); memcpy(&mac_addr[3], &result_mac_32_bits, 3); + /** + * Set MAC address locally administered bit (LAA) as this is not assigned by the + * manufacturer + */ + mac_addr[0] |= 0x02; + #endif /* NODE_HAS_VALID_MAC_ADDR(DT_DRV_INST(0))) */ #endif } diff --git a/drivers/ethernet/nxp_imx_netc/eth_nxp_imx_netc_priv.h b/drivers/ethernet/nxp_imx_netc/eth_nxp_imx_netc_priv.h index 157f7e61bae47..e7dd8ff17ae3b 100644 --- a/drivers/ethernet/nxp_imx_netc/eth_nxp_imx_netc_priv.h +++ b/drivers/ethernet/nxp_imx_netc/eth_nxp_imx_netc_priv.h @@ -62,10 +62,10 @@ do { \ uint32_t id = 0x001100; \ \ - mac_addr[0] = FREESCALE_OUI_B0; \ - mac_addr[1] = FREESCALE_OUI_B1; \ /* Set MAC address locally administered bit (LAA) */ \ - mac_addr[2] = FREESCALE_OUI_B2 | 0x02; \ + mac_addr[0] = FREESCALE_OUI_B0 | 0x02; \ + mac_addr[1] = FREESCALE_OUI_B1; \ + mac_addr[2] = FREESCALE_OUI_B2; \ mac_addr[3] = (id >> 16) & 0xff; \ mac_addr[4] = (id >> 8) & 0xff; \ mac_addr[5] = (id + n) & 0xff; \ diff --git a/drivers/i3c/i3c_stm32.c b/drivers/i3c/i3c_stm32.c index 8c9f747273fe4..f304c8780e121 100644 --- a/drivers/i3c/i3c_stm32.c +++ b/drivers/i3c/i3c_stm32.c @@ -1047,6 +1047,7 @@ static int i3c_stm32_do_daa(const struct device *dev) const struct i3c_stm32_config *config = dev->config; struct i3c_stm32_data *data = dev->data; I3C_TypeDef *i3c = config->i3c; + int ret = 0; k_mutex_lock(&data->bus_mutex, K_FOREVER); @@ -1068,7 +1069,8 @@ static int i3c_stm32_do_daa(const struct device *dev) /* Wait for DAA to finish */ if (k_sem_take(&data->device_sync_sem, STM32_I3C_TRANSFER_TIMEOUT) != 0) { - return -ETIMEDOUT; + ret = -ETIMEDOUT; + goto i3c_stm32_do_daa_ending; } if (data->msg_state == STM32_I3C_MSG_ERR) { @@ -1076,12 +1078,14 @@ static int i3c_stm32_do_daa(const struct device *dev) /* Enable TXFNF interrupt in case an error occurred before it was enabled by RXFNE */ LL_I3C_EnableIT_TXFNF(i3c); - return -EIO; + ret = -EIO; + goto i3c_stm32_do_daa_ending; } +i3c_stm32_do_daa_ending: k_mutex_unlock(&data->bus_mutex); - return 0; + return ret; } #ifdef CONFIG_I3C_STM32_DMA diff --git a/drivers/misc/nxp_flexram/nxp_flexram.c b/drivers/misc/nxp_flexram/nxp_flexram.c index 3d0c4724dee79..0f0cb4641a48b 100644 --- a/drivers/misc/nxp_flexram/nxp_flexram.c +++ b/drivers/misc/nxp_flexram/nxp_flexram.c @@ -23,7 +23,7 @@ BUILD_ASSERT(DT_PROP(FLEXRAM_DT_NODE, flexram_has_magic_addr), #define BANK_SIZE (DT_PROP(FLEXRAM_DT_NODE, flexram_bank_size) * 1024) #define NUM_BANKS DT_PROP(FLEXRAM_DT_NODE, flexram_num_ram_banks) -#define IS_CHILD_RAM_TYPE(node_id, compat) DT_NODE_HAS_COMPAT(node_id, compat) +#define IS_CHILD_RAM_TYPE(node_id, compat) DT_NODE_HAS_COMPAT_STATUS(node_id, compat, okay) #define DOES_RAM_TYPE_EXIST(compat) \ DT_FOREACH_CHILD_SEP_VARGS(FLEXRAM_DT_NODE, IS_CHILD_RAM_TYPE, (+), compat) diff --git a/drivers/net/ppp.c b/drivers/net/ppp.c index 022e728e755bb..f12feb60db6c4 100644 --- a/drivers/net/ppp.c +++ b/drivers/net/ppp.c @@ -974,17 +974,9 @@ static int ppp_driver_init(const struct device *dev) return 0; } -static inline struct net_linkaddr *ppp_get_mac(struct ppp_driver_context *ppp) -{ - (void)net_linkaddr_set(&ppp->ll_addr, ppp->mac_addr, sizeof(ppp->mac_addr)); - - return &ppp->ll_addr; -} - static void ppp_iface_init(struct net_if *iface) { struct ppp_driver_context *ppp = net_if_get_device(iface)->data; - struct net_linkaddr *ll_addr; LOG_DBG("[%p] iface %p", ppp, iface); @@ -997,11 +989,6 @@ static void ppp_iface_init(struct net_if *iface) ppp->init_done = true; ppp->iface = iface; - /* The mac address is not really used but network interface expects - * to find one. - */ - ll_addr = ppp_get_mac(ppp); - if (CONFIG_PPP_MAC_ADDR[0] != 0) { if (net_bytes_from_str(ppp->mac_addr, sizeof(ppp->mac_addr), CONFIG_PPP_MAC_ADDR) < 0) { @@ -1018,7 +1005,10 @@ static void ppp_iface_init(struct net_if *iface) ppp->mac_addr[5] = sys_rand8_get(); } - net_if_set_link_addr(iface, ll_addr->addr, ll_addr->len, + /* The MAC address is not really used, but the network interface expects to find one. */ + (void)net_linkaddr_set(&ppp->ll_addr, ppp->mac_addr, sizeof(ppp->mac_addr)); + + net_if_set_link_addr(iface, ppp->ll_addr.addr, ppp->ll_addr.len, NET_LINK_ETHERNET); if (IS_ENABLED(CONFIG_NET_PPP_CAPTURE)) { diff --git a/drivers/regulator/regulator_shell.c b/drivers/regulator/regulator_shell.c index 5166f1af53682..88b909605056c 100644 --- a/drivers/regulator/regulator_shell.c +++ b/drivers/regulator/regulator_shell.c @@ -527,7 +527,12 @@ static bool device_is_regulator(const struct device *dev) return DEVICE_API_IS(regulator, dev); } -static void device_name_get(size_t idx, struct shell_static_entry *entry) +static bool device_is_regulator_parent(const struct device *dev) +{ + return DEVICE_API_IS(regulator_parent, dev); +} + +static void device_name_get_regulator(size_t idx, struct shell_static_entry *entry) { const struct device *dev = shell_device_filter(idx, device_is_regulator); @@ -537,7 +542,18 @@ static void device_name_get(size_t idx, struct shell_static_entry *entry) entry->subcmd = NULL; } -SHELL_DYNAMIC_CMD_CREATE(dsub_device_name, device_name_get); +static void device_name_get_regulator_parent(size_t idx, struct shell_static_entry *entry) +{ + const struct device *dev = shell_device_filter(idx, device_is_regulator_parent); + + entry->syntax = (dev != NULL) ? dev->name : NULL; + entry->handler = NULL; + entry->help = NULL; + entry->subcmd = NULL; +} + +SHELL_DYNAMIC_CMD_CREATE(dsub_device_name, device_name_get_regulator); +SHELL_DYNAMIC_CMD_CREATE(dsub_device_name_parent, device_name_get_regulator_parent); SHELL_STATIC_SUBCMD_SET_CREATE( sub_regulator_cmds, @@ -579,12 +595,12 @@ SHELL_STATIC_SUBCMD_SET_CREATE( 2, 0), SHELL_CMD_ARG(errors, &dsub_device_name, SHELL_HELP("Get active errors", ""), cmd_errors, 2, 0), - SHELL_CMD_ARG(dvsset, &dsub_device_name, + SHELL_CMD_ARG(dvsset, &dsub_device_name_parent, SHELL_HELP("Set dynamic voltage scaling state", " "), cmd_dvsset, 3, 0), - SHELL_CMD_ARG(shipmode, &dsub_device_name, SHELL_HELP("Enable ship mode", ""), - cmd_shipmode, 2, 0), + SHELL_CMD_ARG(shipmode, &dsub_device_name_parent, + SHELL_HELP("Enable ship mode", ""), cmd_shipmode, 2, 0), SHELL_SUBCMD_SET_END); SHELL_CMD_REGISTER(regulator, &sub_regulator_cmds, "Regulator playground", diff --git a/drivers/sensor/st/lis2dux12/lis2dux12.c b/drivers/sensor/st/lis2dux12/lis2dux12.c index 3d4e93eef6797..dbd1270310c52 100644 --- a/drivers/sensor/st/lis2dux12/lis2dux12.c +++ b/drivers/sensor/st/lis2dux12/lis2dux12.c @@ -55,6 +55,19 @@ static int lis2dux12_freq_to_odr_val(const struct device *dev, uint16_t freq) int odr; for (odr = LIS2DUX12_DT_ODR_OFF; odr < LIS2DUX12_DT_ODR_END; odr++) { + /* + * In case power-mode is HP, skip the ULP odrs in order to + * avoid to erroneously break the loop sooner than expected. + * In HP mode the correct ODRs must be found from + * LIS2DUX12_DT_ODR_6Hz on. + */ + if ((cfg->pm == LIS2DUX12_OPER_MODE_HIGH_PERFORMANCE) && + ((odr == LIS2DUX12_DT_ODR_1Hz_ULP) || + (odr == LIS2DUX12_DT_ODR_3Hz_ULP) || + (odr == LIS2DUX12_DT_ODR_25Hz_ULP))) { + continue; + } + if (freq <= lis2dux12_odr_map[odr]) { break; } @@ -69,15 +82,6 @@ static int lis2dux12_freq_to_odr_val(const struct device *dev, uint16_t freq) return LIS2DUX12_DT_ODR_OFF; } - /* handle high performance mode */ - if (cfg->pm == LIS2DUX12_OPER_MODE_HIGH_PERFORMANCE) { - if (odr < LIS2DUX12_DT_ODR_6Hz) { - odr = LIS2DUX12_DT_ODR_6Hz; - } - - odr |= 0x10; - } - return odr; } diff --git a/drivers/sensor/st/lis2dux12/lis2dux12_api.c b/drivers/sensor/st/lis2dux12/lis2dux12_api.c index 06468ab357f15..9f641b6cc85e3 100644 --- a/drivers/sensor/st/lis2dux12/lis2dux12_api.c +++ b/drivers/sensor/st/lis2dux12/lis2dux12_api.c @@ -17,7 +17,19 @@ static int32_t st_lis2dux12_set_odr_raw(const struct device *dev, uint8_t odr) struct lis2dux12_data *data = dev->data; const struct lis2dux12_config *cfg = dev->config; stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; - lis2dux12_md_t mode = {.odr = odr, .fs = data->range}; + lis2dux12_md_t mode; + + /* handle high performance mode */ + if (cfg->pm == LIS2DUX12_OPER_MODE_HIGH_PERFORMANCE) { + if (odr < LIS2DUX12_DT_ODR_6Hz) { + odr = LIS2DUX12_DT_ODR_6Hz; + } + + odr |= 0x10; + } + + mode.odr = odr; + mode.fs = data->range; data->odr = odr; return lis2dux12_mode_set(ctx, &mode); diff --git a/drivers/sensor/st/lis2dux12/lis2duxs12_api.c b/drivers/sensor/st/lis2dux12/lis2duxs12_api.c index c05086cc29ffd..c945982c72931 100644 --- a/drivers/sensor/st/lis2dux12/lis2duxs12_api.c +++ b/drivers/sensor/st/lis2dux12/lis2duxs12_api.c @@ -17,7 +17,19 @@ static int32_t st_lis2duxs12_set_odr_raw(const struct device *dev, uint8_t odr) struct lis2dux12_data *data = dev->data; const struct lis2dux12_config *cfg = dev->config; stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; - lis2duxs12_md_t mode = {.odr = odr, .fs = data->range}; + lis2duxs12_md_t mode; + + /* handle high performance mode */ + if (cfg->pm == LIS2DUX12_OPER_MODE_HIGH_PERFORMANCE) { + if (odr < LIS2DUX12_DT_ODR_6Hz) { + odr = LIS2DUX12_DT_ODR_6Hz; + } + + odr |= 0x10; + } + + mode.odr = odr; + mode.fs = data->range; data->odr = odr; return lis2duxs12_mode_set(ctx, &mode); diff --git a/drivers/spi/spi_max32.c b/drivers/spi/spi_max32.c index ae2fe9b45497b..18746e5c973c9 100644 --- a/drivers/spi/spi_max32.c +++ b/drivers/spi/spi_max32.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Analog Devices, Inc. + * Copyright (c) 2024-2025 Analog Devices, Inc. * * SPDX-License-Identifier: Apache-2.0 */ @@ -27,6 +27,9 @@ LOG_MODULE_REGISTER(spi_max32, CONFIG_SPI_LOG_LEVEL); #include "spi_context.h" +#define SPI_MAX32_MIN_WORD_BITS 2 +#define SPI_MAX32_MAX_WORD_BITS 16 + #ifdef CONFIG_SPI_MAX32_DMA struct max32_spi_dma_config { const struct device *dev; @@ -87,9 +90,11 @@ static int spi_configure(const struct device *dev, const struct spi_config *conf mxc_spi_regs_t *regs = cfg->regs; struct max32_spi_data *data = dev->data; +#ifndef CONFIG_SPI_RTIO if (spi_context_configured(&data->ctx, config)) { return 0; } +#endif if (SPI_OP_MODE_GET(config->operation) & SPI_OP_MODE_SLAVE) { return -ENOTSUP; @@ -103,7 +108,7 @@ static int spi_configure(const struct device *dev, const struct spi_config *conf ret = Wrap_MXC_SPI_Init(regs, master_mode, quad_mode, num_slaves, ss_polarity, spi_speed); if (ret) { - return ret; + return -EINVAL; } int cpol = (SPI_MODE_GET(config->operation) & SPI_MODE_CPOL) ? 1 : 0; @@ -119,12 +124,12 @@ static int spi_configure(const struct device *dev, const struct spi_config *conf ret = MXC_SPI_SetMode(regs, SPI_MODE_0); } if (ret) { - return ret; + return -EINVAL; } ret = MXC_SPI_SetDataSize(regs, SPI_WORD_SIZE_GET(config->operation)); if (ret) { - return ret; + return -ENOTSUP; } #if defined(CONFIG_SPI_EXTENDED_MODES) @@ -145,7 +150,7 @@ static int spi_configure(const struct device *dev, const struct spi_config *conf } if (ret) { - return ret; + return -EINVAL; } #endif @@ -163,7 +168,7 @@ static inline int spi_max32_get_dfs_shift(const struct spi_context *ctx) return 1; } -static void spi_max32_setup(mxc_spi_regs_t *spi, mxc_spi_req_t *req) +static void spi_max32_setup(mxc_spi_regs_t *spi, mxc_spi_req_t *req, uint8_t dfs_shift) { req->rxCnt = 0; req->txCnt = 0; @@ -172,9 +177,10 @@ static void spi_max32_setup(mxc_spi_regs_t *spi, mxc_spi_req_t *req) MXC_SPI_SetSlave(spi, req->ssIdx); } + /* SPI_CTRL1 holds the number of words so apply dfs_shift first */ if (req->rxData && req->rxLen) { MXC_SETFIELD(spi->ctrl1, MXC_F_SPI_CTRL1_RX_NUM_CHAR, - req->rxLen << MXC_F_SPI_CTRL1_RX_NUM_CHAR_POS); + (req->rxLen >> dfs_shift) << MXC_F_SPI_CTRL1_RX_NUM_CHAR_POS); spi->dma |= MXC_F_SPI_DMA_RX_FIFO_EN; } else { spi->ctrl1 &= ~MXC_F_SPI_CTRL1_RX_NUM_CHAR; @@ -183,7 +189,7 @@ static void spi_max32_setup(mxc_spi_regs_t *spi, mxc_spi_req_t *req) if (req->txLen) { MXC_SETFIELD(spi->ctrl1, MXC_F_SPI_CTRL1_TX_NUM_CHAR, - req->txLen << MXC_F_SPI_CTRL1_TX_NUM_CHAR_POS); + (req->txLen >> dfs_shift) << MXC_F_SPI_CTRL1_TX_NUM_CHAR_POS); spi->dma |= MXC_F_SPI_DMA_TX_FIFO_EN; } else { spi->ctrl1 &= ~MXC_F_SPI_CTRL1_TX_NUM_CHAR; @@ -206,8 +212,8 @@ static int spi_max32_transceive_sync(mxc_spi_regs_t *spi, struct max32_spi_data MXC_SPI_ClearTXFIFO(spi); MXC_SPI_ClearRXFIFO(spi); - tx_len = req->txLen << dfs_shift; - rx_len = req->rxLen << dfs_shift; + tx_len = req->txLen; + rx_len = req->rxLen; do { remain = tx_len - req->txCnt; if (remain > 0) { @@ -251,8 +257,6 @@ static int spi_max32_transceive(const struct device *dev) uint32_t len; uint8_t dfs_shift; - MXC_SPI_ClearTXFIFO(cfg->regs); - dfs_shift = spi_max32_get_dfs_shift(ctx); len = spi_context_max_continuous_chunk(ctx); @@ -263,48 +267,64 @@ static int spi_max32_transceive(const struct device *dev) len = sqe->rx.buf_len; data->req.rxData = sqe->rx.buf; data->req.rxLen = sqe->rx.buf_len; + if (data->req.rxData == NULL) { + data->req.rxData = data->dummy; + data->req.rxLen = 0; + } data->req.txData = NULL; - data->req.txLen = len >> dfs_shift; + data->req.txLen = len; break; case RTIO_OP_TX: len = sqe->tx.buf_len; data->req.rxLen = 0; data->req.rxData = data->dummy; data->req.txData = (uint8_t *)sqe->tx.buf; - data->req.txLen = len >> dfs_shift; + data->req.txLen = len; break; case RTIO_OP_TINY_TX: len = sqe->tiny_tx.buf_len; data->req.txData = (uint8_t *)sqe->tiny_tx.buf; data->req.rxData = data->dummy; - data->req.txLen = len >> dfs_shift; + data->req.txLen = len; data->req.rxLen = 0; break; case RTIO_OP_TXRX: len = sqe->txrx.buf_len; data->req.txData = (uint8_t *)sqe->txrx.tx_buf; data->req.rxData = sqe->txrx.rx_buf; - data->req.txLen = len >> dfs_shift; - data->req.rxLen = len >> dfs_shift; + data->req.txLen = len; + data->req.rxLen = len; + if (data->req.rxData == NULL) { + data->req.rxData = data->dummy; + data->req.rxLen = 0; + } break; default: break; } #else - data->req.txLen = len >> dfs_shift; + data->req.txLen = len; data->req.txData = (uint8_t *)ctx->tx_buf; - data->req.rxLen = len >> dfs_shift; + data->req.rxLen = len; data->req.rxData = ctx->rx_buf; - data->req.rxData = ctx->rx_buf; - - data->req.rxLen = len >> dfs_shift; if (!data->req.rxData) { /* Pass a dummy buffer to HAL if receive buffer is NULL, otherwise * corrupt data is read during subsequent transactions. */ data->req.rxData = data->dummy; data->req.rxLen = 0; + + if (!data->req.txData && !data->req.txLen) { + /* Both RX and TX are NULL, nothing to do */ + spi_context_update_tx(&data->ctx, dfs_shift ? 2 : 1, len); + spi_context_update_rx(&data->ctx, dfs_shift ? 2 : 1, len); + if (!spi_context_tx_on(ctx) && !spi_context_rx_on(ctx)) { + spi_context_complete(ctx, dev, 0); + } + + return 0; + } } #endif data->req.spi = cfg->regs; @@ -312,15 +332,17 @@ static int spi_max32_transceive(const struct device *dev) data->req.ssDeassert = 0; data->req.txCnt = 0; data->req.rxCnt = 0; - spi_max32_setup(cfg->regs, &data->req); + spi_max32_setup(cfg->regs, &data->req, dfs_shift); #ifdef CONFIG_SPI_MAX32_INTERRUPT - MXC_SPI_SetTXThreshold(cfg->regs, 1); + MXC_SPI_SetTXThreshold(cfg->regs, 1 << dfs_shift); if (data->req.rxLen) { - MXC_SPI_SetRXThreshold(cfg->regs, 2); + MXC_SPI_SetRXThreshold(cfg->regs, 2 << dfs_shift); MXC_SPI_EnableInt(cfg->regs, ADI_MAX32_SPI_INT_EN_RX_THD); } MXC_SPI_EnableInt(cfg->regs, ADI_MAX32_SPI_INT_EN_TX_THD | ADI_MAX32_SPI_INT_EN_MST_DONE); + MXC_SPI_ClearTXFIFO(cfg->regs); + MXC_SPI_ClearRXFIFO(cfg->regs); if (!data->req.txData) { data->req.txCnt = MXC_SPI_WriteTXFIFO(cfg->regs, data->dummy, MIN(len, sizeof(data->dummy))); @@ -334,8 +356,8 @@ static int spi_max32_transceive(const struct device *dev) if (ret) { ret = -EIO; } else { - spi_context_update_tx(ctx, 1, len); - spi_context_update_rx(ctx, 1, len); + spi_context_update_tx(ctx, dfs_shift ? 2 : 1, len); + spi_context_update_rx(ctx, dfs_shift ? 2 : 1, len); } #endif @@ -366,7 +388,7 @@ static int transceive(const struct device *dev, const struct spi_config *config, ret = spi_configure(dev, config); if (ret != 0) { spi_context_release(ctx, ret); - return -EIO; + return ret; } spi_context_buffers_setup(ctx, tx_bufs, rx_bufs, 1); @@ -418,9 +440,20 @@ static int transceive(const struct device *dev, const struct spi_config *config, } } #else - struct spi_rtio *rtio_ctx = data->rtio_ctx; + /* Guard against unsupported word lengths here, as spi_configure is + * called at a later stage + */ + if ((SPI_WORD_SIZE_GET(config->operation) < SPI_MAX32_MIN_WORD_BITS) || + (SPI_WORD_SIZE_GET(config->operation) > SPI_MAX32_MAX_WORD_BITS)) { + ret = -ENOTSUP; + } else { + if (tx_bufs || rx_bufs) { + struct spi_rtio *rtio_ctx = data->rtio_ctx; + + ret = spi_rtio_transceive(rtio_ctx, config, tx_bufs, rx_bufs); + } + } - ret = spi_rtio_transceive(rtio_ctx, config, tx_bufs, rx_bufs); #endif spi_context_release(ctx, ret); return ret; @@ -434,9 +467,10 @@ static void spi_max32_dma_callback(const struct device *dev, void *arg, uint32_t const struct device *spi_dev = data->dev; const struct max32_spi_config *config = spi_dev->config; uint32_t len; + uint8_t dfs = spi_max32_get_dfs_shift(&data->ctx) ? 2 : 1; if (status < 0) { - LOG_ERR("DMA callback error with channel %d.", channel); + LOG_ERR("DMA callback error for channel %u: %d", channel, status); } else { /* identify the origin of this callback */ if (channel == config->tx_dma.channel) { @@ -447,14 +481,14 @@ static void spi_max32_dma_callback(const struct device *dev, void *arg, uint32_t } if ((data->dma_stat & SPI_MAX32_DMA_DONE_FLAG) == SPI_MAX32_DMA_DONE_FLAG) { len = spi_context_max_continuous_chunk(&data->ctx); - spi_context_update_tx(&data->ctx, 1, len); - spi_context_update_rx(&data->ctx, 1, len); + spi_context_update_tx(&data->ctx, dfs, len); + spi_context_update_rx(&data->ctx, dfs, len); spi_context_complete(&data->ctx, spi_dev, status == 0 ? 0 : -EIO); } } static int spi_max32_tx_dma_load(const struct device *dev, const uint8_t *buf, uint32_t len, - uint8_t word_shift) + uint8_t dfs_shift) { int ret; const struct max32_spi_config *config = dev->config; @@ -467,9 +501,9 @@ static int spi_max32_tx_dma_load(const struct device *dev, const uint8_t *buf, u dma_cfg.user_data = (void *)data; dma_cfg.dma_slot = config->tx_dma.slot; dma_cfg.block_count = 1; - dma_cfg.source_data_size = 1U << word_shift; - dma_cfg.source_burst_length = 1U; - dma_cfg.dest_data_size = 1U << word_shift; + dma_cfg.source_data_size = 1U << dfs_shift; + dma_cfg.source_burst_length = 1U << dfs_shift; + dma_cfg.dest_data_size = 1U << dfs_shift; dma_cfg.head_block = &dma_blk; dma_blk.block_size = len; if (buf) { @@ -489,7 +523,7 @@ static int spi_max32_tx_dma_load(const struct device *dev, const uint8_t *buf, u } static int spi_max32_rx_dma_load(const struct device *dev, const uint8_t *buf, uint32_t len, - uint8_t word_shift) + uint8_t dfs_shift) { int ret; const struct max32_spi_config *config = dev->config; @@ -502,9 +536,9 @@ static int spi_max32_rx_dma_load(const struct device *dev, const uint8_t *buf, u dma_cfg.user_data = (void *)data; dma_cfg.dma_slot = config->rx_dma.slot; dma_cfg.block_count = 1; - dma_cfg.source_data_size = 1U << word_shift; - dma_cfg.source_burst_length = 1U; - dma_cfg.dest_data_size = 1U << word_shift; + dma_cfg.source_data_size = 1U << dfs_shift; + dma_cfg.source_burst_length = 1U << dfs_shift; + dma_cfg.dest_data_size = 1U << dfs_shift; dma_cfg.head_block = &dma_blk; dma_blk.block_size = len; if (buf) { @@ -540,6 +574,7 @@ static int transceive_dma(const struct device *dev, const struct spi_config *con spi_context_lock(ctx, async, cb, userdata, config); MXC_SPI_ClearTXFIFO(spi); + MXC_SPI_ClearRXFIFO(spi); ret = dma_get_status(cfg->tx_dma.dev, cfg->tx_dma.channel, &status); if (ret < 0 || status.busy) { @@ -553,9 +588,14 @@ static int transceive_dma(const struct device *dev, const struct spi_config *con goto unlock; } + /* Word sizes less than 8-bits are not supported in DMA mode */ + if (SPI_WORD_SIZE_GET(config->operation) < 8) { + ret = -ENOTSUP; + goto unlock; + } + ret = spi_configure(dev, config); if (ret != 0) { - ret = -EIO; goto unlock; } @@ -581,12 +621,17 @@ static int transceive_dma(const struct device *dev, const struct spi_config *con dfs_shift = spi_max32_get_dfs_shift(ctx); word_count = len >> dfs_shift; + if (word_count == 0) { + /* Nothing to do, continue */ + continue; + } + MXC_SETFIELD(spi->ctrl1, MXC_F_SPI_CTRL1_RX_NUM_CHAR, word_count << MXC_F_SPI_CTRL1_RX_NUM_CHAR_POS); spi->dma |= ADI_MAX32_SPI_DMA_RX_FIFO_CLEAR; spi->dma |= MXC_F_SPI_DMA_RX_FIFO_EN; spi->dma |= ADI_MAX32_SPI_DMA_RX_DMA_EN; - MXC_SPI_SetRXThreshold(spi, 0); + MXC_SPI_SetRXThreshold(spi, dfs_shift ? 1 : 0); ret = spi_max32_rx_dma_load(dev, ctx->rx_buf, len, dfs_shift); if (ret < 0) { @@ -598,7 +643,7 @@ static int transceive_dma(const struct device *dev, const struct spi_config *con spi->dma |= ADI_MAX32_SPI_DMA_TX_FIFO_CLEAR; spi->dma |= MXC_F_SPI_DMA_TX_FIFO_EN; spi->dma |= ADI_MAX32_SPI_DMA_TX_DMA_EN; - MXC_SPI_SetTXThreshold(spi, 1); + MXC_SPI_SetTXThreshold(spi, 2); ret = spi_max32_tx_dma_load(dev, ctx->tx_buf, len, dfs_shift); if (ret < 0) { @@ -754,6 +799,7 @@ static void spi_max32_callback(mxc_spi_req_t *req, int error) struct spi_context *ctx = &data->ctx; const struct device *dev = data->dev; uint32_t len; + uint8_t dfs; #ifdef CONFIG_SPI_RTIO struct spi_rtio *rtio_ctx = data->rtio_ctx; @@ -762,9 +808,10 @@ static void spi_max32_callback(mxc_spi_req_t *req, int error) spi_max32_iodev_complete(data->dev, 0); } #endif + dfs = spi_max32_get_dfs_shift(ctx) ? 2 : 1; len = spi_context_max_continuous_chunk(ctx); - spi_context_update_tx(ctx, 1, len); - spi_context_update_rx(ctx, 1, len); + spi_context_update_tx(ctx, dfs, len); + spi_context_update_rx(ctx, dfs, len); #ifdef CONFIG_SPI_ASYNC if (ctx->asynchronous && ((spi_context_tx_on(ctx) || spi_context_rx_on(ctx)))) { k_work_submit(&data->async_work); @@ -804,12 +851,11 @@ static void spi_max32_isr(const struct device *dev) mxc_spi_req_t *req = &data->req; mxc_spi_regs_t *spi = cfg->regs; uint32_t flags, remain; - uint8_t dfs_shift = spi_max32_get_dfs_shift(&data->ctx); flags = MXC_SPI_GetFlags(spi); MXC_SPI_ClearFlags(spi); - remain = (req->txLen << dfs_shift) - req->txCnt; + remain = req->txLen - req->txCnt; if (flags & ADI_MAX32_SPI_INT_FL_TX_THD) { if (remain) { if (!data->req.txData) { @@ -824,10 +870,10 @@ static void spi_max32_isr(const struct device *dev) } } - remain = (req->rxLen << dfs_shift) - req->rxCnt; + remain = req->rxLen - req->rxCnt; if (remain) { req->rxCnt += MXC_SPI_ReadRXFIFO(spi, &req->rxData[req->rxCnt], remain); - remain = (req->rxLen << dfs_shift) - req->rxCnt; + remain = req->rxLen - req->rxCnt; if (remain >= MXC_SPI_FIFO_DEPTH) { MXC_SPI_SetRXThreshold(spi, 2); } else { diff --git a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_common.c b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_common.c index 90b9eb1a041bb..dd954a956ed98 100644 --- a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_common.c +++ b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_common.c @@ -132,7 +132,10 @@ static uint8_t lpspi_calc_delay_scaler(uint32_t desired_delay_ns, delay_cycles = (uint64_t)prescaled_clock * desired_delay_ns; delay_cycles = DIV_ROUND_UP(delay_cycles, NSEC_PER_SEC); - /* what the min_cycles parameter is about is that + /* clamp to minimally possible cycles to avoid underflow */ + delay_cycles = MAX(delay_cycles, min_cycles); + + /* what the min_cycles parameter is about is that * PCSSCK and SCKPSC are +1 cycles of the programmed value, * while DBT is +2 cycles of the programmed value. * So this calculates the value to program to the register. diff --git a/drivers/usb/device/usb_dc_stm32.c b/drivers/usb/device/usb_dc_stm32.c index 48e2f1d49f39f..ea560ad751a4e 100644 --- a/drivers/usb/device/usb_dc_stm32.c +++ b/drivers/usb/device/usb_dc_stm32.c @@ -429,9 +429,6 @@ static int usb_dc_stm32_clock_enable(void) LL_AHB1_GRP1_DisableClockSleep(LL_AHB1_GRP1_PERIPH_USB1OTGHSULPI); #elif defined(CONFIG_SOC_SERIES_STM32U5X) LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_USBPHY); - /* Both OTG HS and USBPHY sleep clock MUST be disabled here at the same time */ - LL_AHB2_GRP1_DisableClockStopSleep(LL_AHB2_GRP1_PERIPH_OTG_HS | - LL_AHB2_GRP1_PERIPH_USBPHY); #elif DT_HAS_COMPAT_STATUS_OKAY(st_stm32n6_otghs) /* Reset specific configuration bits before setting new values */ USB1_HS_PHYC->USBPHYC_CR &= ~USB_USBPHYC_CR_FSEL_Msk; diff --git a/drivers/usb/udc/Kconfig.max32 b/drivers/usb/udc/Kconfig.max32 index 78c5444171b5b..6b20ca1512be4 100644 --- a/drivers/usb/udc/Kconfig.max32 +++ b/drivers/usb/udc/Kconfig.max32 @@ -5,6 +5,7 @@ config UDC_MAX32 bool "MAX32 USB device controller driver" default y depends on DT_HAS_ADI_MAX32_USBHS_ENABLED + select UDC_DRIVER_HAS_HIGH_SPEED_SUPPORT help MAX32 USB device controller driver. diff --git a/drivers/usb/udc/udc_stm32.c b/drivers/usb/udc/udc_stm32.c index 1d42a6fb5cdc4..53b9654ed14c1 100644 --- a/drivers/usb/udc/udc_stm32.c +++ b/drivers/usb/udc/udc_stm32.c @@ -1143,9 +1143,6 @@ static int priv_clock_enable(void) LL_AHB1_GRP1_DisableClockSleep(LL_AHB1_GRP1_PERIPH_USB1OTGHSULPI); #elif defined(CONFIG_SOC_SERIES_STM32U5X) LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_USBPHY); - /* Both OTG HS and USBPHY sleep clock MUST be disabled here at the same time */ - LL_AHB2_GRP1_DisableClockStopSleep(LL_AHB2_GRP1_PERIPH_OTG_HS | - LL_AHB2_GRP1_PERIPH_USBPHY); #elif DT_HAS_COMPAT_STATUS_OKAY(st_stm32n6_otghs) /* Reset specific configuration bits before setting new values */ USB1_HS_PHYC->USBPHYC_CR &= ~USB_USBPHYC_CR_FSEL_Msk; diff --git a/dts/arm/st/u0/stm32u0.dtsi b/dts/arm/st/u0/stm32u0.dtsi index 405baf00328b8..e6a1da4c299a6 100644 --- a/dts/arm/st/u0/stm32u0.dtsi +++ b/dts/arm/st/u0/stm32u0.dtsi @@ -252,7 +252,7 @@ reg = <0x40008000 0x400>; clocks = <&rcc STM32_CLOCK(APB1, 20U)>; resets = <&rctl STM32_RESET(APB1L, 20U)>; - interrupts = <28 0>; + interrupts = <29 0>; status = "disabled"; }; @@ -261,7 +261,7 @@ reg = <0x40008400 0x400>; clocks = <&rcc STM32_CLOCK(APB1, 7U)>; resets = <&rctl STM32_RESET(APB1L, 7U)>; - interrupts = <29 0>; + interrupts = <28 0>; status = "disabled"; }; diff --git a/modules/mbedtls/CMakeLists.txt b/modules/mbedtls/CMakeLists.txt index 61c7400017da0..83a8cb674a5e7 100644 --- a/modules/mbedtls/CMakeLists.txt +++ b/modules/mbedtls/CMakeLists.txt @@ -130,7 +130,7 @@ zephyr_interface_library_named(mbedTLS) # if address sanitizer is enabled, as such switch default optimization level # to speed set_property(SOURCE ${ZEPHYR_CURRENT_MODULE_DIR}/mbedtls/library/bignum.c APPEND PROPERTY COMPILE_OPTIONS - "${OPTIMIZE_FOR_SPEED_FLAG}") + "${COMPILER_OPTIMIZE_FOR_SPEED_FLAG}") endif () zephyr_library_link_libraries(mbedTLS) diff --git a/scripts/pylib/twister/twisterlib/coverage.py b/scripts/pylib/twister/twisterlib/coverage.py index ae37f15156144..341598a6251a9 100644 --- a/scripts/pylib/twister/twisterlib/coverage.py +++ b/scripts/pylib/twister/twisterlib/coverage.py @@ -518,7 +518,11 @@ def try_making_symlink(source: str, link: str): source (str): The path to the source file. link (str): The path where the symbolic link should be created. """ - if os.path.exists(link): + symlink_error = None + + try: + os.symlink(source, link) + except FileExistsError: if os.path.islink(link): if os.readlink(link) == source: # Link is already set up @@ -529,19 +533,24 @@ def try_making_symlink(source: str, link: str): # File contents are the same return - # link exists, but points to a different file, remove the link. We'll - # try to create a new one below - os.remove(link) - - # Create the symlink - try: - os.symlink(source, link) + # link exists, but points to a different file. We'll create a new link + # and replace it atomically with the old one + temp_filename = f"{link}.{os.urandom(8).hex()}" + try: + os.symlink(source, temp_filename) + os.replace(temp_filename, link) + except OSError as e: + symlink_error = e except OSError as e: + symlink_error = e + + if symlink_error: logger.error( - "Error creating symlink: %s, attempting to copy.", str(e) + "Error creating symlink: %s, attempting to copy.", str(symlink_error) ) - shutil.copy(source, link) - + temp_filename = f"{link}.{os.urandom(8).hex()}" + shutil.copy(source, temp_filename) + os.replace(temp_filename, link) def choose_gcov_tool(options, is_system_gcov): gcov_tool = None diff --git a/subsys/bluetooth/controller/CMakeLists.txt b/subsys/bluetooth/controller/CMakeLists.txt index d5a990b52a05c..8ddca86a278a1 100644 --- a/subsys/bluetooth/controller/CMakeLists.txt +++ b/subsys/bluetooth/controller/CMakeLists.txt @@ -221,10 +221,10 @@ add_subdirectory_ifdef( zephyr_library_compile_options_ifdef( CONFIG_BT_CTLR_OPTIMIZE_FOR_SIZE - ${OPTIMIZE_FOR_SIZE_FLAG} + ${COMPILER_OPTIMIZE_FOR_SIZE_FLAG} ) zephyr_library_compile_options_ifdef( CONFIG_BT_CTLR_OPTIMIZE_FOR_SPEED - ${OPTIMIZE_FOR_SPEED_FLAG} + ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG} ) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/CMakeLists.txt b/subsys/bluetooth/controller/ll_sw/nordic/CMakeLists.txt index 6d09e295e6968..d3f88017eef2d 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/CMakeLists.txt +++ b/subsys/bluetooth/controller/ll_sw/nordic/CMakeLists.txt @@ -122,5 +122,5 @@ zephyr_include_directories( zephyr_library_compile_options_ifdef( CONFIG_BT_CTLR_OPTIMIZE_FOR_SPEED - ${OPTIMIZE_FOR_SPEED_FLAG} + ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG} ) diff --git a/subsys/bluetooth/controller/ll_sw/openisa/CMakeLists.txt b/subsys/bluetooth/controller/ll_sw/openisa/CMakeLists.txt index 0ad12cf3c1ea0..2fb271a84ea07 100644 --- a/subsys/bluetooth/controller/ll_sw/openisa/CMakeLists.txt +++ b/subsys/bluetooth/controller/ll_sw/openisa/CMakeLists.txt @@ -55,5 +55,5 @@ zephyr_library_include_directories( zephyr_library_compile_options_ifdef( CONFIG_BT_CTLR_OPTIMIZE_FOR_SPEED - ${OPTIMIZE_FOR_SPEED_FLAG} + ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG} ) diff --git a/subsys/fs/ext2/ext2_ops.c b/subsys/fs/ext2/ext2_ops.c index 509a1c1b73d57..445cb3772aa1a 100644 --- a/subsys/fs/ext2/ext2_ops.c +++ b/subsys/fs/ext2/ext2_ops.c @@ -598,12 +598,11 @@ static int ext2_stat(struct fs_mount_t *mountp, const char *path, struct fs_dire } uint32_t offset = args.offset; - struct ext2_inode *parent = args.parent; - struct ext2_file dir = {.f_inode = parent, .f_off = offset}; + struct ext2_file dir = {.f_inode = args.parent ? args.parent : args.inode, .f_off = offset}; rc = ext2_get_direntry(&dir, entry); - ext2_inode_drop(parent); + ext2_inode_drop(args.parent); ext2_inode_drop(args.inode); return rc; } diff --git a/subsys/net/ip/tcp.c b/subsys/net/ip/tcp.c index 1496c3ef9cf5a..3a59190059ca0 100644 --- a/subsys/net/ip/tcp.c +++ b/subsys/net/ip/tcp.c @@ -2805,7 +2805,9 @@ static enum net_verdict tcp_in(struct tcp *conn, struct net_pkt *pkt) /* send ACK for non-RST packet */ if (FL(&fl, &, RST)) { net_stats_update_tcp_seg_rsterr(net_pkt_iface(pkt)); - } else if ((len > 0) || FL(&fl, &, FIN)) { + } else if ((len > 0) || FL(&fl, &, FIN) || + /* Keep-alive probe */ + ((len == 0) && FL(&fl, &, ACK))) { tcp_out(conn, ACK); } k_mutex_unlock(&conn->lock); diff --git a/subsys/net/lib/sockets/sockets_inet.c b/subsys/net/lib/sockets/sockets_inet.c index 34d8eabbb318c..431647ced45c2 100644 --- a/subsys/net/lib/sockets/sockets_inet.c +++ b/subsys/net/lib/sockets/sockets_inet.c @@ -2106,6 +2106,8 @@ int zsock_getsockopt_ctx(struct net_context *ctx, int level, int optname, return 0; } + break; + case IPV6_MULTICAST_HOPS: ret = net_context_get_option(ctx, NET_OPT_MCAST_HOP_LIMIT, diff --git a/tests/drivers/spi/spi_loopback/boards/max32666fthr_max32666_cpu0.overlay b/tests/drivers/spi/spi_loopback/boards/max32666fthr_max32666_cpu0.overlay index 68e5dc4b67d5b..1476eb395c653 100644 --- a/tests/drivers/spi/spi_loopback/boards/max32666fthr_max32666_cpu0.overlay +++ b/tests/drivers/spi/spi_loopback/boards/max32666fthr_max32666_cpu0.overlay @@ -11,7 +11,7 @@ slow@0 { compatible = "test-spi-loopback-slow"; reg = <0>; - spi-max-frequency = <128000>; + spi-max-frequency = <150000>; }; fast@0 { compatible = "test-spi-loopback-fast"; diff --git a/tests/drivers/spi/spi_loopback/boards/max32675evkit.overlay b/tests/drivers/spi/spi_loopback/boards/max32675evkit.overlay index f4b98d2b42747..4db7c6207e68c 100644 --- a/tests/drivers/spi/spi_loopback/boards/max32675evkit.overlay +++ b/tests/drivers/spi/spi_loopback/boards/max32675evkit.overlay @@ -11,7 +11,7 @@ slow@0 { compatible = "test-spi-loopback-slow"; reg = <0>; - spi-max-frequency = <128000>; + spi-max-frequency = <125000>; }; fast@0 { compatible = "test-spi-loopback-fast"; diff --git a/tests/drivers/spi/spi_loopback/boards/max32690evkit_max32690_m4.overlay b/tests/drivers/spi/spi_loopback/boards/max32690evkit_max32690_m4.overlay index af4605991da3c..23cb1f8b3e958 100644 --- a/tests/drivers/spi/spi_loopback/boards/max32690evkit_max32690_m4.overlay +++ b/tests/drivers/spi/spi_loopback/boards/max32690evkit_max32690_m4.overlay @@ -11,7 +11,7 @@ slow@0 { compatible = "test-spi-loopback-slow"; reg = <0>; - spi-max-frequency = <128000>; + spi-max-frequency = <125000>; }; fast@0 { compatible = "test-spi-loopback-fast"; diff --git a/tests/drivers/spi/spi_loopback/boards/max78002evkit_max78002_m4.overlay b/tests/drivers/spi/spi_loopback/boards/max78002evkit_max78002_m4.overlay index fa8cacb2dc5f4..0f0703b595de7 100644 --- a/tests/drivers/spi/spi_loopback/boards/max78002evkit_max78002_m4.overlay +++ b/tests/drivers/spi/spi_loopback/boards/max78002evkit_max78002_m4.overlay @@ -11,7 +11,7 @@ slow@0 { compatible = "test-spi-loopback-slow"; reg = <0>; - spi-max-frequency = <128000>; + spi-max-frequency = <125000>; }; fast@0 { compatible = "test-spi-loopback-fast"; diff --git a/tests/net/socket/tcp/src/main.c b/tests/net/socket/tcp/src/main.c index f46a0be15279a..d02dbafe8b810 100644 --- a/tests/net/socket/tcp/src/main.c +++ b/tests/net/socket/tcp/src/main.c @@ -2349,7 +2349,7 @@ ZTEST(net_socket_tcp, test_connect_and_wait_for_v4_poll) zassert_equal(ret, 0, "close failed, %d", errno); } -ZTEST(net_socket_tcp, test_so_keepalive) +ZTEST(net_socket_tcp, test_so_keepalive_opt) { struct sockaddr_in bind_addr4; int sock, ret; @@ -2430,55 +2430,92 @@ ZTEST(net_socket_tcp, test_so_keepalive) test_context_cleanup(); } -ZTEST(net_socket_tcp, test_keepalive_timeout) +static void test_prepare_keepalive_socks(int *c_sock, int *s_sock, int *new_sock) { struct sockaddr_in c_saddr, s_saddr; - int c_sock, s_sock, new_sock; - uint8_t rx_buf; int optval; int ret; - prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, &c_sock, &c_saddr); - prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, &s_sock, &s_saddr); + prepare_sock_tcp_v4(MY_IPV4_ADDR, ANY_PORT, c_sock, &c_saddr); + prepare_sock_tcp_v4(MY_IPV4_ADDR, SERVER_PORT, s_sock, &s_saddr); /* Enable keep-alive on both ends and set timeouts/retries to minimum */ optval = 1; - ret = zsock_setsockopt(c_sock, SOL_SOCKET, SO_KEEPALIVE, + ret = zsock_setsockopt(*c_sock, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); - ret = zsock_setsockopt(s_sock, SOL_SOCKET, SO_KEEPALIVE, + ret = zsock_setsockopt(*s_sock, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); optval = 1; - ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPIDLE, + ret = zsock_setsockopt(*c_sock, IPPROTO_TCP, TCP_KEEPIDLE, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); - ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPIDLE, + ret = zsock_setsockopt(*s_sock, IPPROTO_TCP, TCP_KEEPIDLE, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); optval = 1; - ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPINTVL, + ret = zsock_setsockopt(*c_sock, IPPROTO_TCP, TCP_KEEPINTVL, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); - ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPINTVL, + ret = zsock_setsockopt(*s_sock, IPPROTO_TCP, TCP_KEEPINTVL, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); optval = 1; - ret = zsock_setsockopt(c_sock, IPPROTO_TCP, TCP_KEEPCNT, + ret = zsock_setsockopt(*c_sock, IPPROTO_TCP, TCP_KEEPCNT, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); - ret = zsock_setsockopt(s_sock, IPPROTO_TCP, TCP_KEEPCNT, + ret = zsock_setsockopt(*s_sock, IPPROTO_TCP, TCP_KEEPCNT, &optval, sizeof(optval)); zassert_equal(ret, 0, "setsockopt failed (%d)", errno); /* Establish connection */ - test_bind(s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr)); - test_listen(s_sock); - test_connect(c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr)); - test_accept(s_sock, &new_sock, NULL, NULL); + test_bind(*s_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr)); + test_listen(*s_sock); + test_connect(*c_sock, (struct sockaddr *)&s_saddr, sizeof(s_saddr)); + test_accept(*s_sock, new_sock, NULL, NULL); +} + +ZTEST(net_socket_tcp, test_keepalive) +{ + int c_sock, s_sock, new_sock; + struct timeval optval = { + .tv_sec = 2, + .tv_usec = 500000, + }; + uint8_t rx_buf; + int ret; + + test_prepare_keepalive_socks(&c_sock, &s_sock, &new_sock); + + ret = zsock_setsockopt(c_sock, SOL_SOCKET, SO_RCVTIMEO, &optval, + sizeof(optval)); + zassert_equal(ret, 0, "setsockopt failed (%d)", errno); + + /* recv() should fail, but due to receive timeout (no data), not + * connection timeout (keepalive). + */ + ret = zsock_recv(c_sock, &rx_buf, sizeof(rx_buf), 0); + zassert_equal(ret, -1, "recv() should've failed"); + zassert_equal(errno, EAGAIN, "wrong errno value, %d", errno); + + test_close(c_sock); + test_close(new_sock); + test_close(s_sock); + + test_context_cleanup(); +} + +ZTEST(net_socket_tcp, test_keepalive_timeout) +{ + int c_sock, s_sock, new_sock; + uint8_t rx_buf; + int ret; + + test_prepare_keepalive_socks(&c_sock, &s_sock, &new_sock); /* Kill communication - expect that connection will be closed after * a timeout period. diff --git a/tests/subsys/llext/prj.conf b/tests/subsys/llext/prj.conf index 33f3a0208e460..d60cbaafa4d3c 100644 --- a/tests/subsys/llext/prj.conf +++ b/tests/subsys/llext/prj.conf @@ -4,7 +4,6 @@ CONFIG_LOG=y CONFIG_LLEXT=y CONFIG_LLEXT_HEAP_SIZE=64 CONFIG_LLEXT_EXPORT_DEVICES=y -CONFIG_LLEXT_LOG_LEVEL_DBG=y CONFIG_APPLICATION_DEFINED_SYSCALL=y diff --git a/west.yml b/west.yml index 21ead917837eb..79a59b09b15c0 100644 --- a/west.yml +++ b/west.yml @@ -343,7 +343,7 @@ manifest: - debug - name: picolibc path: modules/lib/picolibc - revision: 560946f26db075c296beea5b39d99e6de43c9010 + revision: ca8b6ebba5226a75545e57a140443168a26ba664 - name: segger revision: cf56b1d9c80f81a26e2ac5727c9cf177116a4692 path: modules/debug/segger