1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

cpu/sam0_eth: fix return values of sam0_eth_send()

This commit is contained in:
Benjamin Valentin 2024-11-20 18:17:22 +01:00
parent a86411b81e
commit 4eb1c35fe3
2 changed files with 21 additions and 31 deletions

View File

@ -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)

View File

@ -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)