diff --git a/drivers/ethernet/eth_w5500.c b/drivers/ethernet/eth_w5500.c index ecb2102b47f..c9cac3d660a 100644 --- a/drivers/ethernet/eth_w5500.c +++ b/drivers/ethernet/eth_w5500.c @@ -160,18 +160,17 @@ static int w5500_command(const struct device *dev, uint8_t cmd) uint64_t end = sys_clock_timeout_end_calc(K_MSEC(100)); w5500_spi_write(dev, W5500_S0_CR, &cmd, 1); - do { + while (1) { + w5500_spi_read(dev, W5500_S0_CR, ®, 1); + if (!reg) { + break; + } int64_t remaining = end - sys_clock_tick_get(); - if (remaining <= 0) { return -EIO; + } + k_busy_wait(W5500_PHY_ACCESS_DELAY); } - - w5500_spi_read(dev, W5500_S0_CR, ®, 1); - - k_msleep(1); - } while (reg != 0); - return 0; } diff --git a/drivers/ethernet/eth_w5500_priv.h b/drivers/ethernet/eth_w5500_priv.h index 8d64229b42c..aed1fe4adfa 100644 --- a/drivers/ethernet/eth_w5500_priv.h +++ b/drivers/ethernet/eth_w5500_priv.h @@ -76,6 +76,8 @@ #define W5500_Sn_RX_MEM_START 0x30000 #define W5500_RX_MEM_SIZE 0x04000 +/* Delay for PHY write/read operations (25.6 us) */ +#define W5500_PHY_ACCESS_DELAY 26U struct w5500_config { struct spi_dt_spec spi; struct gpio_dt_spec interrupt;