diff --git a/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c b/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c index 54666a7b1cdf88e1642a09882e5b41624d136480..0d72acbdd8f024021821fdef04ab4936f74f0efd 100644 --- a/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c +++ b/bsp/imxrt/Libraries/imxrt1050/drivers/drv_eth.c @@ -668,6 +668,10 @@ static void _enet_config(void) //config.interrupt = 0xFFFFFFFF; config.miiSpeed = imxrt_eth_device.speed; config.miiDuplex = imxrt_eth_device.duplex; +#ifdef RT_LWIP_USING_HW_CHECKSUM + config.rxAccelerConfig = ENET_RACC_PRODIS_MASK | ENET_RACC_IPDIS_MASK; + config.txAccelerConfig = ENET_TACC_IPCHK_MASK | ENET_TACC_PROCHK_MASK; +#endif /* Set SMI to get PHY link status. */ sysClock = CLOCK_GetFreq(kCLOCK_AhbClk); diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_eth.c b/bsp/stm32/libraries/HAL_Drivers/drv_eth.c index 315c1b989028d41a65aef8fd62f26898aa16935e..493f4190ad4f102f3edfb199487cd7b808798738 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_eth.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_eth.c @@ -44,10 +44,8 @@ struct rt_stm32_eth static ETH_DMADescTypeDef *DMARxDscrTab, *DMATxDscrTab; static rt_uint8_t *Rx_Buff, *Tx_Buff; -static rt_bool_t tx_is_waiting = RT_FALSE; static ETH_HandleTypeDef EthHandle; static struct rt_stm32_eth stm32_eth_device; -static struct rt_semaphore tx_wait; #if defined(ETH_RX_DUMP) || defined(ETH_TX_DUMP) #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') @@ -91,8 +89,12 @@ static rt_err_t rt_stm32_eth_init(rt_device_t dev) EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX; EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII; EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE; +#ifdef RT_LWIP_USING_HW_CHECKSUM + EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE; +#else EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE; - +#endif + HAL_ETH_DeInit(&EthHandle); /* configure ethernet peripheral (GPIOs, clocks, MAC, DMA) */ @@ -190,29 +192,13 @@ rt_err_t rt_stm32_eth_tx(rt_device_t dev, struct pbuf *p) DmaTxDesc = EthHandle.TxDesc; bufferoffset = 0; - /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ - while ((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET) - { - rt_err_t result; - rt_uint32_t level; - - level = rt_hw_interrupt_disable(); - tx_is_waiting = RT_TRUE; - rt_hw_interrupt_enable(level); - - /* it's own bit set, wait it */ - result = rt_sem_take(&tx_wait, RT_WAITING_FOREVER); - if (result == RT_EOK) break; - if (result == -RT_ERROR) return -RT_ERROR; - } - /* copy frame from pbufs to driver buffers */ for (q = p; q != NULL; q = q->next) { /* Is this buffer available? If not, goto error */ if ((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET) { - LOG_E("buffer not valid"); + LOG_D("buffer not valid"); ret = ERR_USE; goto error; } @@ -391,15 +377,6 @@ void ETH_IRQHandler(void) rt_interrupt_leave(); } -void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth) -{ - if (tx_is_waiting == RT_TRUE) - { - tx_is_waiting = RT_FALSE; - rt_sem_release(&tx_wait); - } -} - void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) { rt_err_t result; @@ -635,10 +612,6 @@ static int rt_hw_stm32_eth_init(void) stm32_eth_device.parent.eth_rx = rt_stm32_eth_rx; stm32_eth_device.parent.eth_tx = rt_stm32_eth_tx; - /* init tx semaphore */ - rt_sem_init(&tx_wait, "tx_wait", 0, RT_IPC_FLAG_FIFO); - LOG_D("initialize tx wait semaphore"); - /* register eth device */ state = eth_device_init(&(stm32_eth_device.parent), "e0"); if (RT_EOK == state) diff --git a/components/net/Kconfig b/components/net/Kconfig index cef3ceacd3ab0d7ddc1f85accde2a79423395cf2..cfeaca5a51be4184ffe60543bc584040720d0d22 100644 --- a/components/net/Kconfig +++ b/components/net/Kconfig @@ -261,6 +261,10 @@ config RT_USING_LWIP bool "Enable lwIP statistics" default n + config RT_LWIP_USING_HW_CHECKSUM + bool "Enable hardware checksum" + default n + menuconfig RT_LWIP_DEBUG bool "Enable lwIP Debugging Options" default n diff --git a/components/net/lwip-2.0.2/src/lwipopts.h b/components/net/lwip-2.0.2/src/lwipopts.h index 07901c3fa1850221605356e4cad44b0650dca546..f90ef1a8253ebc20ca4115c7caf10dc6efc9e005 100644 --- a/components/net/lwip-2.0.2/src/lwipopts.h +++ b/components/net/lwip-2.0.2/src/lwipopts.h @@ -383,6 +383,18 @@ #define ARP_TABLE_SIZE 10 #define ARP_QUEUEING 1 +/* ---------- Checksum options ---------- */ +#ifdef RT_LWIP_USING_HW_CHECKSUM +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_GEN_ICMP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 +#define CHECKSUM_CHECK_ICMP 0 +#endif + /* ---------- IP options ---------- */ /* Define IP_FORWARD to 1 if you wish to have the ability to forward IP packets across network interfaces. If you are going to run lwIP diff --git a/components/net/lwip-2.1.0/src/lwipopts.h b/components/net/lwip-2.1.0/src/lwipopts.h index 4e65fd65baf1353a54723a5b21760e780ef375bc..405e95ce6408efe7b1c6d3c6636f408611c7c8fd 100644 --- a/components/net/lwip-2.1.0/src/lwipopts.h +++ b/components/net/lwip-2.1.0/src/lwipopts.h @@ -390,6 +390,18 @@ #define ARP_TABLE_SIZE 10 #define ARP_QUEUEING 1 +/* ---------- Checksum options ---------- */ +#ifdef RT_LWIP_USING_HW_CHECKSUM +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_GEN_ICMP 0 +#define CHECKSUM_CHECK_IP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_TCP 0 +#define CHECKSUM_CHECK_ICMP 0 +#endif + /* ---------- IP options ---------- */ /* Define IP_FORWARD to 1 if you wish to have the ability to forward IP packets across network interfaces. If you are going to run lwIP