@@ -957,10 +957,78 @@ void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth_handle)
957
957
#if defined(CONFIG_ETH_STM32_HAL_API_V2 )
958
958
void HAL_ETH_ErrorCallback (ETH_HandleTypeDef * heth )
959
959
{
960
- /* Do nothing */
961
- /* Do not log errors. If errors are reported du to high traffic,
960
+ /* Do not log errors. If errors are reported due to high traffic,
962
961
* logging errors will only increase traffic issues
963
962
*/
963
+ #if defined(CONFIG_NET_STATISTICS_ETHERNET )
964
+ __ASSERT_NO_MSG (heth != NULL );
965
+
966
+ uint32_t dma_error ;
967
+ #if defined(CONFIG_SOC_SERIES_STM32H7X )
968
+ uint32_t mac_error ;
969
+ #endif /* CONFIG_SOC_SERIES_STM32H7X */
970
+ const uint32_t error_code = HAL_ETH_GetError (heth );
971
+
972
+ struct eth_stm32_hal_dev_data * dev_data =
973
+ CONTAINER_OF (heth , struct eth_stm32_hal_dev_data , heth );
974
+
975
+ switch (error_code ) {
976
+ case HAL_ETH_ERROR_DMA :
977
+ dma_error = HAL_ETH_GetDMAError (heth );
978
+
979
+ #if defined(CONFIG_SOC_SERIES_STM32H7X )
980
+ if ((dma_error & ETH_DMA_RX_WATCHDOG_TIMEOUT_FLAG ) ||
981
+ (dma_error & ETH_DMA_RX_PROCESS_STOPPED_FLAG ) ||
982
+ (dma_error & ETH_DMA_RX_BUFFER_UNAVAILABLE_FLAG )) {
983
+ eth_stats_update_errors_rx (dev_data -> iface );
984
+ }
985
+ if ((dma_error & ETH_DMA_EARLY_TX_IT_FLAG ) ||
986
+ (dma_error & ETH_DMA_TX_PROCESS_STOPPED_FLAG )) {
987
+ eth_stats_update_errors_tx (dev_data -> iface );
988
+ }
989
+ #else
990
+ if ((dma_error & ETH_DMASR_RWTS ) ||
991
+ (dma_error & ETH_DMASR_RPSS ) ||
992
+ (dma_error & ETH_DMASR_RBUS )) {
993
+ eth_stats_update_errors_rx (dev_data -> iface );
994
+ }
995
+ if ((dma_error & ETH_DMASR_ETS ) ||
996
+ (dma_error & ETH_DMASR_TPSS ) ||
997
+ (dma_error & ETH_DMASR_TJTS )) {
998
+ eth_stats_update_errors_tx (dev_data -> iface );
999
+ }
1000
+ #endif /* CONFIG_SOC_SERIES_STM32H7X */
1001
+ break ;
1002
+
1003
+ #if defined(CONFIG_SOC_SERIES_STM32H7X )
1004
+ case HAL_ETH_ERROR_MAC :
1005
+ mac_error = HAL_ETH_GetMACError (heth );
1006
+
1007
+ if (mac_error & ETH_RECEIVE_WATCHDOG_TIMEOUT ) {
1008
+ eth_stats_update_errors_rx (dev_data -> iface );
1009
+ }
1010
+
1011
+ if ((mac_error & ETH_EXECESSIVE_COLLISIONS ) ||
1012
+ (mac_error & ETH_LATE_COLLISIONS ) ||
1013
+ (mac_error & ETH_EXECESSIVE_DEFERRAL ) ||
1014
+ (mac_error & ETH_TRANSMIT_JABBR_TIMEOUT ) ||
1015
+ (mac_error & ETH_LOSS_OF_CARRIER ) ||
1016
+ (mac_error & ETH_NO_CARRIER )) {
1017
+ eth_stats_update_errors_tx (dev_data -> iface );
1018
+ }
1019
+ break ;
1020
+ #endif /* CONFIG_SOC_SERIES_STM32H7X */
1021
+ }
1022
+
1023
+ #if defined(CONFIG_SOC_SERIES_STM32H7X )
1024
+ dev_data -> stats .error_details .rx_crc_errors = heth -> Instance -> MMCRCRCEPR ;
1025
+ dev_data -> stats .error_details .rx_align_errors = heth -> Instance -> MMCRAEPR ;
1026
+ #else
1027
+ dev_data -> stats .error_details .rx_crc_errors = heth -> Instance -> MMCRFCECR ;
1028
+ dev_data -> stats .error_details .rx_align_errors = heth -> Instance -> MMCRFAECR ;
1029
+ #endif /* CONFIG_SOC_SERIES_STM32H7X */
1030
+
1031
+ #endif /* CONFIG_NET_STATISTICS_ETHERNET */
964
1032
}
965
1033
#elif defined(CONFIG_SOC_SERIES_STM32H7X )
966
1034
/* DMA and MAC errors callback only appear in H7 series */
@@ -1532,6 +1600,15 @@ static const struct device *eth_stm32_get_ptp_clock(const struct device *dev)
1532
1600
}
1533
1601
#endif /* CONFIG_PTP_CLOCK_STM32_HAL */
1534
1602
1603
+ #if defined(CONFIG_NET_STATISTICS_ETHERNET )
1604
+ static struct net_stats_eth * eth_stm32_hal_get_stats (const struct device * dev )
1605
+ {
1606
+ struct eth_stm32_hal_dev_data * dev_data = dev -> data ;
1607
+
1608
+ return & dev_data -> stats ;
1609
+ }
1610
+ #endif /* CONFIG_NET_STATISTICS_ETHERNET */
1611
+
1535
1612
static const struct ethernet_api eth_api = {
1536
1613
.iface_api .init = eth_iface_init ,
1537
1614
#if defined(CONFIG_PTP_CLOCK_STM32_HAL )
@@ -1540,6 +1617,9 @@ static const struct ethernet_api eth_api = {
1540
1617
.get_capabilities = eth_stm32_hal_get_capabilities ,
1541
1618
.set_config = eth_stm32_hal_set_config ,
1542
1619
.send = eth_tx ,
1620
+ #if defined(CONFIG_NET_STATISTICS_ETHERNET )
1621
+ .get_stats = eth_stm32_hal_get_stats ,
1622
+ #endif /* CONFIG_NET_STATISTICS_ETHERNET */
1543
1623
};
1544
1624
1545
1625
static void eth0_irq_config (void )
0 commit comments