:orphan:

..
  See
  https://docs.zephyrproject.org/latest/releases/index.html#migration-guides
  for details of what is supposed to go into this document.

.. _migration_4.1:

Migration guide to Zephyr v4.1.0
################################

This document describes the changes required when migrating your application from Zephyr v4.0.0 to
Zephyr v4.1.0.

Any other changes (not directly related to migrating applications) can be found in
the :ref:`release notes<zephyr_4.1>`.

.. contents::
    :local:
    :depth: 2

Build System
************

* Support for the build type feature which was deprecated in Zephyr 3.6 has been removed,
  :ref:`application-file-suffixes`/:ref:`sysbuild_file_suffixes` has replaced this.

* Sysbuild

  * The Kconfig ``SB_CONFIG_MCUBOOT_MODE_SWAP_WITHOUT_SCRATCH`` has been deprecated and replaced
    with ``SB_CONFIG_MCUBOOT_MODE_SWAP_USING_MOVE``, applications should be updated to select this
    new symbol if they were selecting the old symbol.

BOSSA Runner
============

The ``bossac`` runner has been changed to no longer do a full erase by default when flashing. To
perform a full erase, pass the ``--erase`` option when executing ``west flash``.

Kernel
******


k_pipe API
==========

The k_pipe API has been reworked and the API used in ``CONFIG_PIPES`` is now deprecated.
The k_pipe API is enabled by default when ``CONFIG_MULTITHREADING`` is set.
Function renames and modifications:

.. list-table::
   :header-rows: 1

   * - Old API
     - New API
     - Changes
   * - ``k_pipe_put(..)``
     - ``k_pipe_write(..)``
     - Removed ``min_xfer`` parameter (partial transfers based on thresholds are no longer supported)
       ``bytes_written`` is now the return value
   * - ``k_pipe_get(..)``
     - ``k_pipe_read(..)``
     - Removed ``min_xfer`` parameter (partial transfers based on thresholds are no longer supported)
       ``bytes_read`` is now the return value
   * - ``k_pipe_flush(..)`` & ``k_pipe_buffer_flush(..)``
     - ``k_pipe_reset(..)``
     - Reset the pipe, discarding all data in the pipe, non blocking.
   * - ``k_pipe_alloc_init(..)``, ``k_pipe_cleanup(..)``
     - **Removed**
     - Dynamic allocation of pipes is no longer supported
   * - ``k_pipe_read_avail(..)``, ``k_pipe_write_avail(..)``
     - **Removed**
     - Querying the number of bytes in the pipe is no longer supported
   * - None
     - ``k_pipe_close(..)``
     - Close a pipe, waking up all pending readers and writers with an error code. No further
       reading or writing is allowed on the pipe. The pipe can be re-opened by calling
       ``k_pipe_init(..)`` again. **Note**, all data in the pipe is available to readers until the
       pipe is emptied.


Security
********

* New options for stack canaries have been added, providing users with finer control over stack
  protection. With this change, :kconfig:option:`CONFIG_STACK_CANARIES` no longer enables the
  compiler option ``-fstack-protector-all``. Users who wish to use this option must now enable
  :kconfig:option:`CONFIG_STACK_CANARIES_ALL`.

Boards
******

* Shield ``mikroe_weather_click`` now supports both I2C and SPI interfaces. Users should select
  the required configuration by using ``mikroe_weather_click_i2c`` or ``mikroe_weather_click_spi``
  instead of ``mikroe_weather_click``.

* All nRF52-based boards will now default to soft (system) reset
  instead of pin reset when flashing with ``west flash``. If you want to keep
  using pin reset on the nRF52 family of ICs you can use ``west flash --pinreset``.

* Erasing the external memory when programming a new firmware image with ``west
  flash`` on the nRF52 and nRF53 series now always correctly honors the
  ``--erase`` flag (and its absence) both when using the ``nrfjprog`` and
  ``nrfutil`` backends.  Prior to this release, the ``nrjfprog`` backend would
  always erase only the sectors of the external flash used by the new firmware,
  and the ``nrfutil`` one would always erase the whole external flash.

* CAN1 and USART1 have been disabled on the ``stm32f4_disco``, because of
  conflicting pinctrl on I2C1, which is now used to control the audio codec
  connected to the audio jack output.

Devicetree
**********

* The :dtcompatible:`microchip,cap1203` driver has changed its compatible to
  :dtcompatible:`microchip,cap12xx` and has been updated to support multiple
  channels.
  The number of available channels is derived from the length of the devicetree
  array property ``input-codes``.
  The :kconfig:option:`CONFIG_INPUT_CAP1203_POLL` has been removed:
  If the devicetree property ``int-gpios`` is present, interrupt mode is used
  otherwise, polling is used.
  The :kconfig:option:`CONFIG_INPUT_CAP1203_PERIOD` has been replaced with
  the devicetree property ``poll-interval-ms``.
  In interrupt mode, the devicetree property ``repeat`` is supported.

Raspberry Pi
============

* ``CONFIG_SOC_SERIES_RP2XXX`` is renamed to :kconfig:option:`CONFIG_SOC_SERIES_RP2040`.

STM32
=====

* MCO clock source and prescaler are now exclusively configured by the DTS
  as it was introduced earlier.
  The Kconfig method for configuration is now removed.

* ADC properties ``st,adc-sequencer`` and ``st,adc-clock-source`` now uses
  string values instead of integer values.

Modules
*******

Mbed TLS
========

* If a platform has a CSPRNG source available (i.e. :kconfig:option:`CONFIG_CSPRNG_ENABLED`
  is set), then the Kconfig option :kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG`
  is the default choice for random number source instead of
  :kconfig:option:`CONFIG_MBEDTLS_PSA_CRYPTO_LEGACY_RNG`. This helps in reducing
  ROM/RAM footprint of the Mbed TLS library.

* The newly-added Kconfig option :kconfig:option:`CONFIG_MBEDTLS_PSA_KEY_SLOT_COUNT`
  allows to specify the number of key slots available in the PSA Crypto core.
  Previously this value was not explicitly set, so Mbed TLS's default value of
  32 was used. The new Kconfig option defaults to 16 instead in order to find
  a reasonable compromise between RAM consumption and most common use cases.
  It can be further trimmed down to reduce RAM consumption if the final
  application doesn't need that many key slots simultaneously.

Trusted Firmware-M
==================

LVGL
====

* The config option :kconfig:option:`CONFIG_LV_Z_FLUSH_THREAD_PRIO` is now called
  :kconfig:option:`CONFIG_LV_Z_FLUSH_THREAD_PRIORITY` and its value is now interpreted as an
  absolute priority instead of a cooperative one.

* The config option :kconfig:option:`CONFIG_LV_Z_VBD_CUSTOM_SECTION` is now called
  :kconfig:option:`CONFIG_LV_Z_VDB_CUSTOM_SECTION`.

Device Drivers and Devicetree
*****************************

* Device driver APIs are placed into iterable sections (:github:`71773` and :github:`82102`) to
  allow for runtime checking. See :ref:`device_driver_api` for more details.
  The :c:macro:`DEVICE_API()` macro should be used by out-of-tree driver implementations for
  all the upstream driver classes.

ADC
===

* Renamed the ``compatible`` from ``nxp,kinetis-adc12`` to :dtcompatible:`nxp,adc12`.

Clock
=====
* Renamed the devicetree property ``freqs_mhz`` to ``freqs-mhz``.
* Renamed the devicetree property ``cg_reg`` to ``cg-reg``.
* Renamed the devicetree property ``pll_ctrl_reg`` to ``pll-ctrl-reg``.

Counter
=======

* Renamed the devicetree property ``primary_source`` to ``primary-source``.
* Renamed the devicetree property ``secondary_source`` to ``secondary-source``.
* Renamed the devicetree property ``filter_count`` to ``filter-count``.
* Renamed the devicetree property ``filter_period`` to ``filter-period``.

Controller Area Network (CAN)
=============================

* Renamed the :dtcompatible:`infineon,xmc4xxx-can-node` devicetree property ``clock_div8`` to
  ``clock-div8`` (:github:`83782`).

Display
=======

* Displays using the MIPI DBI driver which set their MIPI DBI mode via the
  ``mipi-mode`` property in devicetree should now use a string property of
  the same name, like so:

  .. code-block:: devicetree

    /* Legacy display definition */

    st7735r: st7735r@0 {
        ...
        mipi-mode = <MIPI_DBI_MODE_SPI_4WIRE>;
        ...
    };

    /* New display definition */

    st7735r: st7735r@0 {
        ...
        mipi-mode = "MIPI_DBI_MODE_SPI_4WIRE";
        ...
    };

* Renamed the devicetree propertys ``pclk_pol`` and ``data_cmd-gpios``
  to ``pclk-pol`` and ``data-cmd-gpios``.

DAC
===

* Renamed the devicetree properties ``voltage_reference`` and ``power_down_mode``
  to ``voltage-reference`` and ``power-down-mode``.

Enhanced Serial Peripheral Interface (eSPI)
===========================================

Entropy
=======

* BT HCI based entropy driver now directly sends the HCI command to parse random
  data instead of waiting for BT connection to be ready. This is helpful on
  platforms where the BT controller owns the HW random generator and the application
  processor needs to get random data before BT is fully enabled.
  (:github:`79931`)

Ethernet
========

* Deprecated eth_mcux driver was removed.
* Silabs gecko ethernet changes:

  * Renamed the devicetree property ``location-phy_mdc`` to ``location-phy-mdc``.
  * Renamed the devicetree property ``location-phy_mdio`` to ``location-phy-mdio``.
  * Renamed the devicetree property ``location-rmii_refclk`` to ``location-phy-refclk``.
  * Renamed the devicetree property ``location-rmii_crs_dv`` to ``location-phy-crs-dv``.
  * Renamed the devicetree property ``location-rmii_txd0`` to ``location-phy-txd0``.
  * Renamed the devicetree property ``location-rmii_txd1`` to ``location-phy-txd1``.
  * Renamed the devicetree property ``location-rmii_tx_en`` to ``location-phy-tx-en``.
  * Renamed the devicetree property ``location-rmii_rxd0`` to ``location-phy-rxd0``.
  * Renamed the devicetree property ``location-rmii_rxd1`` to ``location-phy-rxd1``.
  * Renamed the devicetree property ``location-rmii_rx_er`` to ``location-phy-rx-er``.
  * Renamed the devicetree property ``location-phy_pwr_enable`` to ``location-phy-pwr-enable``.
  * Renamed the devicetree property ``location-phy_reset`` to ``location-phy-reset``.
  * Renamed the devicetree property ``location-phy_interrupt`` to ``location-phy-interrupt``.

GNSS
====

GPIO
====

* Renamed the device tree property ``pin_mask`` to ``pin-mask``.
* Renamed the device tree property ``pinmux_mask`` to ``pinmux-mask``.
* Renamed the device tree property ``vbatts_pins`` to ``vbatts-pins``.
* Renamed the device tree property ``bit_per_gpio`` to ``bit-per-gpio``.
* Renamed the device tree property ``off_val`` to ``off-val``.
* Renamed the device tree property ``on_val`` to ``on-val``.
* Renamed the ``compatible`` from ``ti,ads114s0x-gpio`` to :dtcompatible:`ti,ads1x4s0x-gpio`.

HWSPINLOCK
==========

* Renamed the DeviceTree property ``num_locks`` to ``num-locks``.

I2C
===

* Renamed the ``compatible`` from ``nxp,imx-lpi2c`` to :dtcompatible:`nxp,lpi2c`.
* Renamed the device tree property ``port_sel`` to ``port-sel```.

I2S
===

* Renamed the device tree property from ``fifo_depth`` to ``fifo-depth``.

Input
=====

LED
===

* Renamed the device tree property ``max_curr_opt`` to ``max-curr-opt``.`

PWM
===

* Renamed the ``compatible`` from ``renesas,ra8-pwm`` to :dtcompatible:`renesas,ra-pwm`.

Interrupt Controller
====================

LED Strip
=========

Misc
====

* All the functions in the ft8xx driver take an additional ``const struct *device`` parameter
  to allow for multiple instances of the driver.

  The exception to this is the functions and macros defined in the
  :zephyr_file:`include/zephyr/drivers/misc/ft8xx/ft8xx_reference_api.h` file, which translate the
  API to a single-instance model, compatible with the API defined in the FT8xx programming guide.
  These functions have not been modified.

* The :c:func:`ft8xx_register_int` function now takes an additional ``void *user_data`` parameter
  to allow user-defined data to be passed to the interrupt handler.
  Additionally, the signature of the ft8xx interrupt handler has changed to include the
  ``void *user_data`` parameter.

MMU/MPU
=======

* Renamed the ``compatible`` from ``nxp,kinetis-mpu`` to :dtcompatible:`nxp,sysmpu` and added
  its corresponding binding.
* Renamed the Kconfig option ``CPU_HAS_NXP_MPU`` to :kconfig:option:`CPU_HAS_NXP_SYSMPU`.

Pin Control
===========

  * Renamed the ``compatible`` from ``nxp,kinetis-pinctrl`` to :dtcompatible:`nxp,port-pinctrl`.
  * Renamed the ``compatible`` from ``nxp,kinetis-pinmux`` to :dtcompatible:`nxp,port-pinmux`.
  * Silabs Series 2 devices now use a new pinctrl driver selected by
    :dtcompatible:`silabs,dbus-pinctrl`. This driver allows the configuration of GPIO properties
    through device tree, rather than having them hard-coded for each supported signal. It also
    supports all possible digital bus signals by including a binding header such as
    :zephyr_file:`include/zephyr/dt-bindings/pinctrl/silabs/xg24-pinctrl.h`.

    Pinctrl should now be configured like this:

    .. code-block:: devicetree

      #include <dt-bindings/pinctrl/silabs/xg24-pinctrl.h>

      &pinctrl {
        i2c0_default: i2c0_default {
          group0 {
            /* Pin selection(s) using bindings included above */
            pins = <I2C0_SDA_PD2>, <I2C0_SCL_PD3>;
            /* Shared properties for the group of pins */
            drive-open-drain;
            bias-pull-up;
          };
        };
      };


PWM
===

* Renamed the ``compatible`` from ``nxp,kinetis-ftm-pwm`` to :dtcompatible:`nxp,ftm-pwm`.

SDHC
====

* Renamed the device tree property from ``power_delay_ms`` to ``power-delay-ms```
* Renamed the device tree property from ``max_current_330`` to ``max-current-330``

Sensors
=======

  * The :dtcompatible:`we,wsen-pads` driver has been renamed to
    :dtcompatible:`we,wsen-pads-2511020213301`.
    The Device Tree can be configured as follows:

    .. code-block:: devicetree

      &i2c0 {
        pads:pads-2511020213301@5d {
          compatible = "we,wsen-pads-2511020213301";
          reg = <0x5d>;
          odr = < 10 >;
          interrupt-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
        };
      };

  * The :dtcompatible:`we,wsen-pdus` driver has been renamed to
    :dtcompatible:`we,wsen-pdus-25131308XXXXX`.
    The Device Tree can be configured as follows:

    .. code-block:: devicetree

      &i2c0 {
        pdus:pdus-25131308XXXXX@78 {
          compatible = "we,wsen-pdus-25131308XXXXX";
          reg = < 0x78 >;
          sensor-type = < 4 >;
        };
      };

  * The :dtcompatible:`we,wsen-tids` driver has been renamed to
    :dtcompatible:`we,wsen-tids-2521020222501`.
    The Device Tree can be configured as follows:

    .. code-block:: devicetree

      &i2c0 {
        tids:tids-2521020222501@3F {
          compatible = "we,wsen-tids-2521020222501";
          reg = < 0x3F >;
          odr = < 25 >;
          interrupt-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
        };
      };

  * The :dtcompatible:`invensense,icp10125` driver has been renamed to
    :dtcompatible:`invensense,icp101xx`.
    The Device Tree can be configured as follows:

    .. code-block:: devicetree

      &i2c0 {
        icp101xx:icp101xx@63 {
           compatible = "invensense,icp101xx";
           reg = <0x63>;
        };
      };

Serial
======

* Renamed the ``compatible`` from ``nxp,kinetis-lpuart`` to :dtcompatible:`nxp,lpuart`.
* Silabs Usart driver has been split for Series 2 :dtcompatible:`silabs,usart-uart`
  and  Series 0/1 ``silabs,gecko-usart``

Stepper
=======

  * Renamed the ``compatible`` from ``zephyr,gpio-steppers`` to :dtcompatible:`zephyr,gpio-stepper`.
  * Renamed the ``stepper_set_actual_position`` function to :c:func:`stepper_set_reference_position`.
  * Renamed the ``stepper_enable_constant_velocity_mode`` function to :c:func:`stepper_run`.
    The function does not take a velocity parameter anymore. Set the desired speed using the
    :c:func:`stepper_set_microstep_interval` function beforehand.
  * Renamed the ``stepper_move`` function to :c:func:`stepper_move_by`.
  * Renamed the ``stepper_set_target_position`` function to :c:func:`stepper_move_to`.
  * Renamed the ``stepper_set_max_velocity`` function to :c:func:`stepper_set_microstep_interval`.
    The function now takes the step interval in nanoseconds. This allows for a more precise control.
  * Deprecating setting max velocity via :c:func:`stepper_run`.
  * The :kconfig:option:`STEPPER_ADI_TMC_RAMP_GEN` is now deprecated and is replaced with the new
    :kconfig:option:`STEPPER_ADI_TMC50XX_RAMP_GEN` option.
  * Renamed tmc5041 stepper driver to tmc50xx.
  * To control the velocity for :dtcompatible:`adi,tmc50xx` stepper driver, use
    :c:func:`tmc50xx_stepper_set_max_velocity` or :c:func:`tmc50xx_stepper_set_ramp`.
  * Renamed the DeviceTree property ``en_spreadcycle`` to ``en-spreadcycle``.
  * Renamed the DeviceTree property ``i_scale_analog`` to ``i-scale-analog``.
  * Renamed the DeviceTree property ``index_optw`` to ``index-otpw``.
  * Renamed the DeviceTree property ``ìndex_step`` to ``index-step``.
  * Renamed the DeviceTree property ``internal_rsense`` to ``internal-rsense``.
  * Renamed the DeviceTree property ``lock_gconf`` to ``lock-gconf``.
  * Renamed the DeviceTree property ``mstep_reg_select`` to ``mstep-reg-select``.
  * Renamed the DeviceTree property ``pdn_disable`` to ``pdn-disable``.
  * Renamed the DeviceTree property ``poscmp_enable`` to ``poscmp-enable``.
  * Renamed the DeviceTree property ``test_mode`` to ``test-mode``.

SPI
===

* Renamed the ``compatible`` from ``nxp,imx-lpspi`` to :dtcompatible:`nxp,lpspi`.
* Renamed the ``compatible`` from ``nxp,kinetis-dspi`` to :dtcompatible:`nxp,dspi`.
* Renamed the ``compatible`` from ``silabs,gecko-spi-usart`` to :dtcompatible:`silabs,usart-spi`.
* Renamed the ``compatible`` from ``silabs,gecko-spi-eusart`` to :dtcompatible:`silabs,eusart-spi`.

Regulator
=========

RTC
===

* Renamed the ``compatible`` from ``nxp,kinetis-rtc`` to :dtcompatible:`nxp,rtc`.

Timer
=====

* Renamed the ``compatible`` from ``nxp,kinetis-ftm`` to :dtcompatible:`nxp,ftm` and relocate it
  under ``dts/bindings/timer``.
* Renamed the device tree property from ``ticks_us`` to ``ticks-us``.

USB
===

* Renamed the devicetree property names ``phy_handle`` to ``phy-handle``.

Video
=====

* The :file:`include/zephyr/drivers/video-controls.h` got updated to have video controls IDs (CIDs)
  matching the definitions in the Linux kernel file ``include/uapi/linux/v4l2-controls.h``.
  In most cases, removing the category prefix is enough: ``VIDEO_CID_CAMERA_GAIN`` becomes
  ``VIDEO_CID_GAIN``.
  The new ``video-controls.h`` source now contains description of each control ID to help
  disambiguating.

* The ``video_pix_fmt_bpp()`` function was returning a byte count, this got replaced by
  ``video_bits_per_pixel()`` which return a bit count. For instance, invocations such as
  ``pitch = width * video_pix_fmt_bpp(pixfmt)`` needs to be replaced by an equivalent
  ``pitch = width * video_bits_per_pixel(pixfmt) / BITS_PER_BYTE``.

* The :c:func:`video_buffer_alloc` and :c:func:`video_buffer_aligned_alloc` functions in the
  video API now take an additional timeout parameter.

* The :c:func:`video_stream_start` and :c:func:`video_stream_stop` driver APIs are now merged
  into the new :c:func:`video_set_stream` driver API. The user APIs are however unchanged to
  keep backward compatibility with downstream applications.

Watchdog
========

* Renamed the ``compatible`` from ``nxp,kinetis-wdog32`` to :dtcompatible:`nxp,wdog32`.

Wi-Fi
=====

* The config options :kconfig:option:`CONFIG_NXP_WIFI_BUILD_ONLY_MODE` and
  :kconfig:option:`CONFIG_NRF_WIFI_BUILD_ONLY_MODE` are now unified under
  :kconfig:option:`CONFIG_BUILD_ONLY_NO_BLOBS` making it a common entry point
  for any vendor to enable builds without blobs.

Bluetooth
*********

Bluetooth HCI
=============

* The :kconfig:option:`BT_CTLR` has been deprecated. A new :kconfig:option:`HAS_BT_CTLR` has been
  introduced which should be selected by the respective link layer Kconfig options (e.g. a
  HCI driver option, or the one for the upstream controller). It's recommended that all HCI drivers
  for local link layers select the new option, since that opens up the possibility of indicating
  build-time support for specific features, which e.g. the host stack can take advantage of.

Bluetooth Mesh
==============

* Following the beginnig of the deprecation process for the TinyCrypt crypto
  library, Kconfig symbol :kconfig:option:`CONFIG_BT_MESH_USES_TINYCRYPT` was
  set as deprecated. Default option for platforms that do not support TF-M
  is :kconfig:option:`CONFIG_BT_MESH_USES_MBEDTLS_PSA`.

* Mesh key representations are not backward compatible if images are built with TinyCrypt and
  crypto libraries based on the PSA API. Mesh no longer stores the key values for those crypto
  libraries. The crypto library stores the keys in the internal trusted storage.
  If a provisioned device is going to update its image that was built with
  the :kconfig:option:`CONFIG_BT_MESH_USES_TINYCRYPT` Kconfig option set on an image
  that was built with :kconfig:option:`CONFIG_BT_MESH_USES_MBEDTLS_PSA` or
  :kconfig:option:`CONFIG_BT_MESH_USES_TFM_PSA` without erasing the persistent area,
  it should be unprovisioned first and reprovisioned after update again.
  If the image is changed over Mesh DFU, use :c:enumerator:`BT_MESH_DFU_EFFECT_UNPROV`.

* Mesh explicitly depends on the Secure Storage subsystem if storing into
  non-volatile memory (:kconfig:option:`CONFIG_BT_SETTINGS`) is enabled and
  Mbed TLS library (:kconfig:option:`CONFIG_BT_MESH_USES_MBEDTLS_PSA`) is used.
  Applications should be built with :kconfig:option:`CONFIG_SECURE_STORAGE` enabled.

Bluetooth Audio
===============

* The following Kconfig options are not longer automatically enabled by the LE Audio Kconfig
  options and may need to be enabled manually (:github:`81328`):

    * :kconfig:option:`CONFIG_BT_GATT_CLIENT`
    * :kconfig:option:`CONFIG_BT_GATT_AUTO_DISCOVER_CCC`
    * :kconfig:option:`CONFIG_BT_GATT_AUTO_UPDATE_MTU`
    * :kconfig:option:`CONFIG_BT_EXT_ADV`
    * :kconfig:option:`CONFIG_BT_PER_ADV_SYNC`
    * :kconfig:option:`CONFIG_BT_ISO_BROADCASTER`
    * :kconfig:option:`CONFIG_BT_ISO_SYNC_RECEIVER`
    * :kconfig:option:`CONFIG_BT_PAC_SNK`
    * :kconfig:option:`CONFIG_BT_PAC_SRC`

* PACS have been changed to support dynamic, runtime configuration. This means that PACS now has
  to be registered with :c:func:`bt_pacs_register` before it can be used. In addition,
  :c:func:`bt_pacs_register` also have to be called before :c:func:`bt_ascs_register` can be
  be called. All Kconfig options still remain. Runtime configuration cannot override a disabled
  Kconfig option. (:github:`83730`)

* Several services and service client (AICS, ASCS, CSIP, HAS, MCS, PACS, TBS, VCP and VOCS) now
  depend on :kconfig:option:`CONFIG_BT_SMP` and may need to be explicitly enabled.
  (:github:`84994``)

Bluetooth Classic
=================

Bluetooth Host
==============

* :kconfig:option:`CONFIG_BT_BUF_ACL_RX_COUNT` has been deprecated. The number of ACL RX buffers is
  now computed internally and is equal to :kconfig:option:`CONFIG_BT_MAX_CONN` + 1. If an application
  needs more buffers, it can use the new :kconfig:option:`CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA` to add
  additional ones.

  e.g. if :kconfig:option:`CONFIG_BT_MAX_CONN` was ``3`` and
  :kconfig:option:`CONFIG_BT_BUF_ACL_RX_COUNT` was ``7`` then
  :kconfig:option:`CONFIG_BT_BUF_ACL_RX_COUNT_EXTRA` should be set to ``7 - (3 + 1) = 3``.

  .. warning::

   The default value of :kconfig:option:`CONFIG_BT_BUF_ACL_RX_COUNT` has been set to 0.

* LE legacy pairing is no longer enabled by default since it's not secure. Leaving it enabled
  makes a device vulnerable for downgrade attacks. If an application still needs to use LE legacy
  pairing, it should disable :kconfig:option:`CONFIG_BT_SMP_SC_PAIR_ONLY` manually.

* The prompt for :kconfig:option:`CONFIG_BT_ECC` has been removed, since it only offers an internal
  API, meaning internal users should explicitly select it in their respective Kconfig options.

Bluetooth Crypto
================

Bluetooth Services
==================

* The :kconfig:option:`CONFIG_BT_DIS_MODEL` and :kconfig:option:`CONFIG_BT_DIS_MANUF` have been
  deprecated. Application developers should now use the
  :kconfig:option:`CONFIG_BT_DIS_MODEL_NUMBER_STR` and
  :kconfig:option:`CONFIG_BT_DIS_MANUF_NAME_STR` Kconfig options to set the string values in the
  Model Number String and Manufacturer Name String characteristics that are part of the Device
  Information Service (DIS).

Networking
**********

* The Prometheus metric creation has changed as user does not need to have a separate
  struct :c:struct:`prometheus_metric` any more. This means that the Prometheus macros
  :c:macro:`PROMETHEUS_COUNTER_DEFINE`, :c:macro:`PROMETHEUS_GAUGE_DEFINE`,
  :c:macro:`PROMETHEUS_HISTOGRAM_DEFINE` and :c:macro:`PROMETHEUS_SUMMARY_DEFINE`
  prototypes have changed. (:github:`81712`)

* The default subnet mask on newly added IPv4 addresses is now specified with
  :kconfig:option:`CONFIG_NET_IPV4_DEFAULT_NETMASK` option instead of being left
  empty. Applications can still specify a custom netmask for an address with
  :c:func:`net_if_ipv4_set_netmask_by_addr` function if needed.

* The HTTP server public API function signature for the :c:type:`http_resource_dynamic_cb_t` has
  changed, the data is now passed in a :c:struct:`http_request_ctx` which holds the data, data
  length and request header information. Request headers should be accessed via this parameter
  rather than directly in the :c:struct:`http_client_ctx` to correctly handle concurrent requests
  on different HTTP/2 streams.

* The HTTP server public API function signature for the :c:type:`http_resource_websocket_cb_t` has
  changed, a :c:struct:`http_request_ctx` parameter has been added. The application may use this to
  access the request headers of the HTTP upgrade request, which may be useful in deciding whether
  to accept or reject a websocket connection.

* An additional ``_res_fallback`` parameter has been added to the :c:macro:`HTTP_SERVICE_DEFINE`
  and :c:macro:`HTTPS_SERVICE_DEFINE` macros, allowing a fallback resource to be served if no other
  resources match the requested path. To retain the existing behaviour, ``NULL`` can be passed as the
  additional parameter.

* The :kconfig:option:`CONFIG_NET_L2_OPENTHREAD` symbol no longer implies the
  :kconfig:option:`CONFIG_NVS` Kconfig option. Platforms using OpenThread must explicitly enable
  either the :kconfig:option:`CONFIG_NVS` or :kconfig:option:`CONFIG_ZMS` Kconfig option.

* ``CONFIG_NET_TC_SKIP_FOR_HIGH_PRIO`` was deprecated in favour of
  :kconfig:option:`CONFIG_NET_TC_TX_SKIP_FOR_HIGH_PRIO` to avoid naming ambiguity.

Other Subsystems
****************

Flash map
=========

Filesystem
==========

* The EXT2 Kconfig symbol ``CONFIG_MAX_FILES`` has been renamed to
  :kconfig:option:`CONFIG_EXT2_MAX_FILES`.

hawkBit
=======

* The Kconfig symbols :kconfig:option:`CONFIG_SMF` and
  :kconfig:option:`CONFIG_SMF_ANCESTOR_SUPPORT` are now required to be enabled to use the
  hawkBit subsystem.

MCUmgr
======

* The Kconfig :kconfig:option:`CONFIG_MCUBOOT_BOOTLOADER_MODE_SWAP_WITHOUT_SCRATCH` has been
  deprecated and replaced with :kconfig:option:`CONFIG_MCUBOOT_BOOTLOADER_MODE_SWAP_USING_MOVE`,
  applications should be updated to select this new symbol if they were selecting the old symbol.

* The deprecated macro ``MGMT_CB_ERROR_RET`` has been removed.

Modem
=====

LoRa
====

* The function :c:func:`lora_recv_async` and callback ``lora_recv_cb`` now include an
  additional ``user_data`` parameter, which is a void pointer. This parameter can be used to reference
  any user-defined data structure. To maintain the current behavior, set this parameter to ``NULL``.

Secure Storage
==============

* Store backends no longer automatically enable their dependencies through ``select`` or ``imply``.
  Users must ensure that the depencies are enabled in their applications.
  :kconfig:option:`CONFIG_SECURE_STORAGE_ITS_STORE_IMPLEMENTATION_SETTINGS` previously enabled NVS
  and settings, which means the NVS settings backend would get used by default if ZMS wasn't
  enabled. (:github:`86181`)

Stream Flash
============

* The function :c:func:`stream_flash_init` no longer does auto-detection of device size
  when ``size`` parameter is set to 0 and will return error in such case. User is now
  required to explicitly provide device size. Issue :github:`71042` provides rationale
  for the change.

Architectures
*************

* native/POSIX

  * :kconfig:option:`CONFIG_NATIVE_APPLICATION` has been deprecated. Out-of-tree boards using this
    option should migrate to the native_simulator runner (:github:`81232`).
    For an example of how this was done with a board in-tree check :github:`61481`.
  * For the native_sim target :kconfig:option:`CONFIG_NATIVE_SIM_NATIVE_POSIX_COMPAT` has been
    switched to ``n`` by default, and this option has been deprecated. Ensure your code does not
    use the :kconfig:option:`CONFIG_BOARD_NATIVE_POSIX` option anymore (:github:`81232`).

* x86

  * Kconfigs ``CONFIG_DISABLE_SSBD`` and ``CONFIG_ENABLE_EXTENDED_IBRS`` have been deprecated
    since v3.7. These were removed.  Use :kconfig:option:`CONFIG_X86_DISABLE_SSBD` and
    :kconfig:option:`CONFIG_X86_ENABLE_EXTENDED_IBRS` instead.
