From 4eb1c35fe3df1d4e57687eafe91cf18978df1453 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Wed, 20 Nov 2024 18:17:22 +0100 Subject: [PATCH] cpu/sam0_eth: fix return values of sam0_eth_send() --- cpu/sam0_common/periph/eth.c | 43 +++++++++++++-------------- cpu/sam0_common/sam0_eth/eth-netdev.c | 9 +----- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/cpu/sam0_common/periph/eth.c b/cpu/sam0_common/periph/eth.c index 3993b988b1..f2f54982f5 100644 --- a/cpu/sam0_common/periph/eth.c +++ b/cpu/sam0_common/periph/eth.c @@ -217,45 +217,42 @@ void sam0_eth_get_mac(eui48_t *out) int sam0_eth_send(const struct iolist *iolist) { - unsigned len = iolist_size(iolist); unsigned tx_len = 0; tx_curr = &tx_desc[tx_idx]; if (_is_sleeping) { - return -ENOTSUP; + return -ENETDOWN; } /* load packet data into TX buffer */ for (const iolist_t *iol = iolist; iol; iol = iol->iol_next) { if (tx_len + iol->iol_len > ETHERNET_MAX_LEN) { - return -EBUSY; + return -EOVERFLOW; } if (iol->iol_len) { memcpy ((uint32_t*)(tx_curr->address + tx_len), iol->iol_base, iol->iol_len); tx_len += iol->iol_len; } } - if (len == tx_len) { - /* Clear and set the frame size */ - tx_curr->status = (len & DESC_TX_STATUS_LEN_MASK) - /* Indicate this is the last buffer and the frame is ready */ - | DESC_TX_STATUS_LAST_BUF; - /* Prepare next buffer index */ - if (++tx_idx == ETH_TX_BUFFER_COUNT) { - /* Set WRAP flag to indicate last buffer */ - tx_curr->status |= DESC_TX_STATUS_WRAP; - tx_idx = 0; - } - __DMB(); - /* Start transmission */ - GMAC->NCR.reg |= GMAC_NCR_TSTART; - /* Set the next buffer */ - tx_curr = &tx_desc[tx_idx]; + + /* Clear and set the frame size */ + tx_curr->status = (tx_len & DESC_TX_STATUS_LEN_MASK) + /* Indicate this is the last buffer and the frame is ready */ + | DESC_TX_STATUS_LAST_BUF; + /* Prepare next buffer index */ + if (++tx_idx == ETH_TX_BUFFER_COUNT) { + /* Set WRAP flag to indicate last buffer */ + tx_curr->status |= DESC_TX_STATUS_WRAP; + tx_idx = 0; } - else { - DEBUG("Mismatch TX len, abort send\n"); - } - return len; + __DMB(); + + /* Start transmission */ + GMAC->NCR.reg |= GMAC_NCR_TSTART; + /* Set the next buffer */ + tx_curr = &tx_desc[tx_idx]; + + return 0; } unsigned _sam0_eth_get_last_len(void) diff --git a/cpu/sam0_common/sam0_eth/eth-netdev.c b/cpu/sam0_common/sam0_eth/eth-netdev.c index d61bb19e94..77af15ee29 100644 --- a/cpu/sam0_common/sam0_eth/eth-netdev.c +++ b/cpu/sam0_common/sam0_eth/eth-netdev.c @@ -197,15 +197,8 @@ static int _sam0_eth_recv(netdev_t *netdev, void *buf, size_t len, void *info) static int _sam0_eth_send(netdev_t *netdev, const iolist_t *iolist) { - int ret; - netdev->event_callback(netdev, NETDEV_EVENT_TX_STARTED); - ret = sam0_eth_send(iolist); - if (ret == -EOVERFLOW) { - /* TODO: use a specific netdev callback here ? */ - return -EOVERFLOW; - } - return ret; + return sam0_eth_send(iolist); } static int _sam0_eth_confirm_send(netdev_t *netdev, void *info)