Skip to content

Commit 1e5f5af

Browse files
juickardanieldegrasse
authored andcommitted
drivers: ethernet: stm32: Fix the init call order
Fix the init call order for V2 API to be able to configure PTP as PTP initialization happens before iface initialization. Signed-off-by: Julien Racki <[email protected]>
1 parent ee29ea2 commit 1e5f5af

File tree

1 file changed

+70
-71
lines changed

1 file changed

+70
-71
lines changed

drivers/ethernet/eth_stm32_hal.c

Lines changed: 70 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,69 @@ static void RISAF_Config(void)
851851
}
852852
#endif
853853

854+
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
855+
static int eth_init_api_v2(const struct device *dev)
856+
{
857+
HAL_StatusTypeDef hal_ret = HAL_OK;
858+
struct eth_stm32_hal_dev_data *dev_data = dev->data;
859+
ETH_HandleTypeDef *heth = &dev_data->heth;
860+
861+
#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32n6_ethernet)
862+
for (int ch = 0; ch < ETH_DMA_CH_CNT; ch++) {
863+
heth->Init.TxDesc[ch] = dma_tx_desc_tab[ch];
864+
heth->Init.RxDesc[ch] = dma_rx_desc_tab[ch];
865+
}
866+
#else
867+
heth->Init.TxDesc = dma_tx_desc_tab;
868+
heth->Init.RxDesc = dma_rx_desc_tab;
869+
#endif
870+
heth->Init.RxBuffLen = ETH_STM32_RX_BUF_SIZE;
871+
872+
hal_ret = HAL_ETH_Init(heth);
873+
if (hal_ret == HAL_TIMEOUT) {
874+
/* HAL Init time out. This could be linked to
875+
* a recoverable error. Log the issue and continue
876+
* driver initialization.
877+
*/
878+
LOG_ERR("HAL_ETH_Init Timed out");
879+
} else if (hal_ret != HAL_OK) {
880+
LOG_ERR("HAL_ETH_Init failed: %d", hal_ret);
881+
return -EINVAL;
882+
}
883+
884+
#if defined(CONFIG_PTP_CLOCK_STM32_HAL)
885+
/* Enable timestamping of RX packets. We enable all packets to be
886+
* timestamped to cover both IEEE 1588 and gPTP.
887+
*/
888+
#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32h7_ethernet)
889+
heth->Instance->MACTSCR |= ETH_MACTSCR_TSENALL;
890+
#else
891+
heth->Instance->PTPTSCR |= ETH_PTPTSCR_TSSARFE;
892+
#endif /* DT_HAS_COMPAT_STATUS_OKAY(st_stm32h7_ethernet) */
893+
#endif /* CONFIG_PTP_CLOCK_STM32_HAL */
894+
895+
/* Initialize semaphores */
896+
k_mutex_init(&dev_data->tx_mutex);
897+
k_sem_init(&dev_data->rx_int_sem, 0, K_SEM_MAX_LIMIT);
898+
k_sem_init(&dev_data->tx_int_sem, 0, K_SEM_MAX_LIMIT);
899+
900+
/* Tx config init: */
901+
memset(&tx_config, 0, sizeof(ETH_TxPacketConfig));
902+
tx_config.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
903+
tx_config.ChecksumCtrl = IS_ENABLED(CONFIG_ETH_STM32_HW_CHECKSUM)
904+
? ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC
905+
: ETH_CHECKSUM_DISABLE;
906+
tx_config.CRCPadCtrl = ETH_CRC_PAD_INSERT;
907+
908+
/* prepare tx buffer header */
909+
for (uint16_t i = 0; i < ETH_TXBUFNB; ++i) {
910+
dma_tx_buffer_header[i].tx_buff.buffer = dma_tx_buffer[i];
911+
}
912+
913+
return 0;
914+
}
915+
#endif /* CONFIG_ETH_STM32_HAL_API_V2 */
916+
854917
static int eth_initialize(const struct device *dev)
855918
{
856919
struct eth_stm32_hal_dev_data *dev_data = dev->data;
@@ -930,7 +993,13 @@ static int eth_initialize(const struct device *dev)
930993
HAL_ETH_DMARxDescListInit(heth, dma_rx_desc_tab,
931994
&dma_rx_buffer[0][0], ETH_RXBUFNB);
932995

933-
#endif /* !CONFIG_ETH_STM32_HAL_API_V1 */
996+
#elif defined(CONFIG_ETH_STM32_HAL_API_V2)
997+
ret = eth_init_api_v2(dev);
998+
999+
if (ret != 0) {
1000+
return ret;
1001+
}
1002+
#endif /* CONFIG_ETH_STM32_HAL_API_V1 */
9341003

9351004
LOG_DBG("MAC %02x:%02x:%02x:%02x:%02x:%02x",
9361005
dev_data->mac_addr[0], dev_data->mac_addr[1],
@@ -988,68 +1057,6 @@ static void eth_stm32_mcast_filter(const struct device *dev, const struct ethern
9881057

9891058
#endif /* CONFIG_ETH_STM32_MULTICAST_FILTER */
9901059

991-
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
992-
static int eth_init_api_v2(const struct device *dev)
993-
{
994-
HAL_StatusTypeDef hal_ret = HAL_OK;
995-
struct eth_stm32_hal_dev_data *dev_data = dev->data;
996-
ETH_HandleTypeDef *heth = &dev_data->heth;
997-
998-
#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32n6_ethernet)
999-
for (int ch = 0; ch < ETH_DMA_CH_CNT; ch++) {
1000-
heth->Init.TxDesc[ch] = dma_tx_desc_tab[ch];
1001-
heth->Init.RxDesc[ch] = dma_rx_desc_tab[ch];
1002-
}
1003-
#else
1004-
heth->Init.TxDesc = dma_tx_desc_tab;
1005-
heth->Init.RxDesc = dma_rx_desc_tab;
1006-
#endif
1007-
heth->Init.RxBuffLen = ETH_STM32_RX_BUF_SIZE;
1008-
1009-
hal_ret = HAL_ETH_Init(heth);
1010-
if (hal_ret == HAL_TIMEOUT) {
1011-
/* HAL Init time out. This could be linked to */
1012-
/* a recoverable error. Log the issue and continue */
1013-
/* driver initialisation */
1014-
LOG_ERR("HAL_ETH_Init Timed out");
1015-
} else if (hal_ret != HAL_OK) {
1016-
LOG_ERR("HAL_ETH_Init failed: %d", hal_ret);
1017-
return -EINVAL;
1018-
}
1019-
1020-
#if defined(CONFIG_PTP_CLOCK_STM32_HAL)
1021-
/* Enable timestamping of RX packets. We enable all packets to be
1022-
* timestamped to cover both IEEE 1588 and gPTP.
1023-
*/
1024-
#if DT_HAS_COMPAT_STATUS_OKAY(st_stm32h7_ethernet)
1025-
heth->Instance->MACTSCR |= ETH_MACTSCR_TSENALL;
1026-
#else
1027-
heth->Instance->PTPTSCR |= ETH_PTPTSCR_TSSARFE;
1028-
#endif /* DT_HAS_COMPAT_STATUS_OKAY(st_stm32h7_ethernet) */
1029-
#endif /* CONFIG_PTP_CLOCK_STM32_HAL */
1030-
1031-
/* Initialize semaphores */
1032-
k_mutex_init(&dev_data->tx_mutex);
1033-
k_sem_init(&dev_data->rx_int_sem, 0, K_SEM_MAX_LIMIT);
1034-
k_sem_init(&dev_data->tx_int_sem, 0, K_SEM_MAX_LIMIT);
1035-
1036-
/* Tx config init: */
1037-
memset(&tx_config, 0, sizeof(ETH_TxPacketConfig));
1038-
tx_config.Attributes = ETH_TX_PACKETS_FEATURES_CSUM |
1039-
ETH_TX_PACKETS_FEATURES_CRCPAD;
1040-
tx_config.ChecksumCtrl = IS_ENABLED(CONFIG_ETH_STM32_HW_CHECKSUM) ?
1041-
ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC : ETH_CHECKSUM_DISABLE;
1042-
tx_config.CRCPadCtrl = ETH_CRC_PAD_INSERT;
1043-
1044-
/* prepare tx buffer header */
1045-
for (uint16_t i = 0; i < ETH_TXBUFNB; ++i) {
1046-
dma_tx_buffer_header[i].tx_buff.buffer = dma_tx_buffer[i];
1047-
}
1048-
1049-
return 0;
1050-
}
1051-
#endif /* CONFIG_ETH_STM32_HAL_API_V2 */
1052-
10531060
static void set_mac_config(const struct device *dev, struct phy_link_state *state)
10541061
{
10551062
struct eth_stm32_hal_dev_data *dev_data = dev->data;
@@ -1170,14 +1177,6 @@ static void eth_iface_init(struct net_if *iface)
11701177

11711178
ethernet_init(iface);
11721179

1173-
#if defined(CONFIG_ETH_STM32_HAL_API_V2)
1174-
/* This function requires the Ethernet interface to be
1175-
* properly initialized. In auto-negotiation mode, it reads the speed
1176-
* and duplex settings to configure the driver accordingly.
1177-
*/
1178-
eth_init_api_v2(dev);
1179-
#endif
1180-
11811180
setup_mac_filter(heth);
11821181

11831182
net_if_carrier_off(iface);

0 commit comments

Comments
 (0)