# STM32 HAL Ethernet driver configuration options

# Copyright (c) 2017 Erwin Rol <erwin@erwinrol.com>
# Copyright (c) 2020 Alexander Kozhinov <AlexanderKozhinov@yandex.com>
# SPDX-License-Identifier: Apache-2.0

menuconfig ETH_STM32_HAL
	bool "STM32 HAL Ethernet driver"
	default y
	depends on DT_HAS_ST_STM32_ETHERNET_ENABLED
	select USE_STM32_HAL_ETH
	select NOCACHE_MEMORY if SOC_SERIES_STM32H7X && CPU_CORTEX_M7
	select HWINFO
	select ETH_DSA_SUPPORT
	select MDIO if SOC_SERIES_STM32H5X || SOC_SERIES_STM32H7X
	imply CRC
	help
	  Enable STM32 HAL based Ethernet driver. It is available for
	  all Ethernet enabled variants of the F2, F4, F7 and H7 series.

if ETH_STM32_HAL

choice ETH_STM32_HAL_API_VERSION
	prompt "STM32Cube HAL Ethernet version"

config ETH_STM32_HAL_API_V2
	bool "Use new HAL driver"
	depends on SOC_SERIES_STM32H7X || SOC_SERIES_STM32H5X || SOC_SERIES_STM32F4X || SOC_SERIES_STM32F7X
	help
	  Use the new HAL driver instead of the legacy one.

config ETH_STM32_HAL_API_V1
	bool "Use new HAL driver"
	depends on !SOC_SERIES_STM32H5X
	select DEPRECATED if SOC_SERIES_STM32H7X || SOC_SERIES_STM32F4X || SOC_SERIES_STM32F7X
	help
	  Driver version based on legacy HAL version. Deprecated unless using STM32F2 series.

endchoice

config ETH_STM32_HAL_RX_THREAD_STACK_SIZE
	int "RX thread stack size"
	default 1500
	help
	  RX thread stack size

config ETH_STM32_HAL_RX_THREAD_PRIO
	int "RX thread priority"
	default 2
	help
	  RX thread priority

config ETH_STM32_HAL_USE_DTCM_FOR_DMA_BUFFER
	bool "Use DTCM for DMA buffers"
	default y
	depends on SOC_SERIES_STM32F7X
	help
	  When this option is activated, the buffers for DMA transfer are
	  moved from SRAM to the DTCM (Data Tightly Coupled Memory).

config ETH_STM32_HAL_PHY_ADDRESS
	int "Phy address"
	default 0
	help
	  The phy address to use.

choice
	prompt "Mac address definition method"
	optional
	help
	  The driver supports 2 methods to define 3 last bytes of MAC address
	  1. Statically defined by user
	  2. Generated dynamically at each boot

	  Note: Configuring this methods using Kconfig is now deprecated in favor
	  of device tree based configuration.

config ETH_STM32_HAL_RANDOM_MAC
	bool "Random MAC address (DEPRECATED)"
	depends on ENTROPY_GENERATOR
	select DEPRECATED
	help
	  Generate a random MAC address dynamically.
	  Deprecated in favor of device tree property "zephyr,random-mac-address"

config ETH_STM32_HAL_USER_STATIC_MAC
	bool "User defined MAC address (DEPRECATED)"
	select DEPRECATED
	help
	  3 last bytes of MAC address are defined by user thanks to
	  ETH_STM32_HAL_MAC3, ETH_STM32_HAL_MAC4 and ETH_STM32_HAL_MAC5.
	  Deprecated in favor of device tree property "local-mac-address"

endchoice

if ETH_STM32_HAL_USER_STATIC_MAC

config ETH_STM32_HAL_MAC3
	hex "MAC Address Byte 3 (DEPRECATED)"
	default 0
	range 0 0xff
	help
	  This is the byte 3 of the MAC address.

config ETH_STM32_HAL_MAC4
	hex "MAC Address Byte 4 (DEPRECATED)"
	default 0
	range 0 0xff
	help
	  This is the byte 4 of the MAC address.

config ETH_STM32_HAL_MAC5
	hex "MAC Address Byte 5 (DEPRECATED)"
	default 0
	range 0 0xff
	help
	  This is the byte 5 of the MAC address.

endif # ETH_STM32_HAL_USER_STATIC_MAC

config ETH_STM32_HAL_MII
	bool "Use MII interface"
	help
	  Use the MII physical interface instead of RMII.

config ETH_STM32_CARRIER_CHECK_RX_IDLE_TIMEOUT_MS
	int "Carrier check timeout period (ms)"
	default 500
	range 100 30000
	help
	  Set the RX idle timeout period in milliseconds after which the
	  PHY's carrier status is re-evaluated.

config ETH_STM32_AUTO_NEGOTIATION_ENABLE
	bool "Autonegotiation mode"
	default y
	help
	  Enable this if using autonegotiation

config ETH_STM32_HW_CHECKSUM
	bool "Use TX and RX hardware checksum"
	depends on !SOC_SERIES_STM32H5X
	help
	  Enable receive and transmit checksum offload to enhance throughput
	  performances.
	  See reference manual for more information on this feature.

if !ETH_STM32_AUTO_NEGOTIATION_ENABLE

config ETH_STM32_SPEED_10M
	bool "Set speed to 10 Mbps when autonegotiation is disabled"
	help
	  Set this if using 10 Mbps and when autonegotiation is disabled, otherwise speed
	  is 100 Mbps

config ETH_STM32_MODE_HALFDUPLEX
	bool "Half duplex mode"
	help
	  Set this if using half duplex when autonegotiation is disabled otherwise
	  duplex mode is full duplex

endif # !ETH_STM32_AUTO_NEGOTIATION_ENABLE

if SOC_SERIES_STM32F7X || SOC_SERIES_STM32H7X || SOC_SERIES_STM32H5X

config PTP_CLOCK_STM32_HAL
	bool "STM32 HAL PTP clock driver support"
	default y
	depends on PTP_CLOCK || NET_L2_PTP
	help
	  Enable STM32 PTP clock support.

config ETH_STM32_HAL_PTP_CLOCK_SRC_HZ
	int "Frequency of the clock source for the PTP timer"
	default 50000000
	depends on PTP_CLOCK_STM32_HAL
	help
	  Set the frequency in Hz sourced to the PTP timer.
	  If the value is set properly, the timer will be accurate.

config ETH_STM32_HAL_PTP_CLOCK_ADJ_MIN_PCT
	int "Lower bound of clock frequency adjustment (in percent)"
	default 90
	depends on PTP_CLOCK_STM32_HAL
	help
	  Specifies lower bound of PTP clock rate adjustment.

config ETH_STM32_HAL_PTP_CLOCK_ADJ_MAX_PCT
	int "Upper bound of clock frequency adjustment (in percent)"
	default 110
	depends on PTP_CLOCK_STM32_HAL
	help
	  Specifies upper bound of PTP clock rate adjustment.

config ETH_STM32_HAL_PTP_CLOCK_INIT_PRIO
	int
	default 85
	depends on PTP_CLOCK_STM32_HAL
	help
	  STM32 PTP Clock initialization priority level. There is
	  a dependency from the network stack that this device
	  initializes before network stack (NET_INIT_PRIO).

endif # SOC_SERIES_STM32F7X || SOC_SERIES_STM32H7X || SOC_SERIES_STM32H5X

config ETH_STM32_MULTICAST_FILTER
	bool "Multicast hash filter support"
	help
	  Enable support for multicast hash filtering in the MAC.
	  Once enabled the ethernet MAC performs imperfect filtering
	  based on a computed hash of the destination MAC address of
	  the multicast address. Only multicast with the computed
	  hash set in the multicast table will be received and all
	  other multicast is dropped by the MAC. If disabled then all
	  multicast is received by the MAC.

endif # ETH_STM32_HAL
