From 8534799d6692a86de59adeb5d089fbcb61f0bb09 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 7 Apr 2021 21:15:24 +0200 Subject: [PATCH] esp_eth: Fix w5500 to correctly read registers on -Os Reading SPI data may come in 4-byte units and thus result in unwanted overwrites if smaller size registers read, especially if multiple placed one after another. Fixed by using direct reads to `trans` structure for sizes smaller or equal to 4. Closes https://github.com/espressif/esp-idf/issues/6579 --- components/esp_eth/src/esp_eth_mac_w5500.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/esp_eth/src/esp_eth_mac_w5500.c b/components/esp_eth/src/esp_eth_mac_w5500.c index ce69385a83..e713da9e74 100644 --- a/components/esp_eth/src/esp_eth_mac_w5500.c +++ b/components/esp_eth/src/esp_eth_mac_w5500.c @@ -93,6 +93,7 @@ static esp_err_t w5500_read(emac_w5500_t *emac, uint32_t address, void *value, u esp_err_t ret = ESP_OK; spi_transaction_t trans = { + .flags = len <= 4 ? SPI_TRANS_USE_RXDATA : 0, // use direct reads for registers to prevent overwrites by 4-byte boundary writes .cmd = (address >> W5500_ADDR_OFFSET), .addr = ((address & 0xFFFF) | (W5500_ACCESS_MODE_READ << W5500_RWB_OFFSET) | W5500_SPI_OP_MODE_VDM), .length = 8 * len, @@ -107,6 +108,9 @@ static esp_err_t w5500_read(emac_w5500_t *emac, uint32_t address, void *value, u } else { ret = ESP_ERR_TIMEOUT; } + if ((trans.flags&SPI_TRANS_USE_RXDATA) && len <= 4) { + memcpy(value, trans.rx_data, len); // copy register values to output + } return ret; }