[PATCH 5/6] usb: eth: asix88179: Refactor ax88179_eth_recv() to closer match Linux
Jonas Karlman
jonas at kwiboo.se
Fri Jan 30 01:29:30 CET 2026
Refactor ax88179_eth_recv() to closer match the Linux ASIX AX88xxx
driver variant.
This change has a minor intended functional change, e.g. it enforces
that packets flagged as DROP or CRC_ERR is fully skipped.
Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
---
drivers/usb/eth/asix88179.c | 33 ++++++++++++++++-----------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/drivers/usb/eth/asix88179.c b/drivers/usb/eth/asix88179.c
index a9dff23e83bb..1ce90eb794cd 100644
--- a/drivers/usb/eth/asix88179.c
+++ b/drivers/usb/eth/asix88179.c
@@ -547,6 +547,7 @@ static int ax88179_eth_recv(struct udevice *dev, int flags, uchar **packetp)
struct ueth_data *ueth = &priv->ueth;
int ret, len;
u16 pkt_len;
+ u32 pkt_hdr;
/* No packet left, get a new one */
if (priv->pkt_cnt == 0) {
@@ -570,34 +571,29 @@ static int ax88179_eth_recv(struct udevice *dev, int flags, uchar **packetp)
}
if (len < 4) {
- usb_ether_advance_rxbuf(ueth, -1);
- return -EMSGSIZE;
- }
-
- rx_hdr = *(u32 *)(ptr + len - 4);
- le32_to_cpus(&rx_hdr);
-
- pkt_cnt = (u16)rx_hdr;
- if (pkt_cnt == 0) {
usb_ether_advance_rxbuf(ueth, -1);
return 0;
}
+ rx_hdr = get_unaligned_le32(ptr + len - 4);
+ pkt_cnt = (u16)rx_hdr;
hdr_off = (u16)(rx_hdr >> 16);
- if (hdr_off > len - 4) {
+
+ if (pkt_cnt == 0 || pkt_cnt * 4 + hdr_off > len) {
usb_ether_advance_rxbuf(ueth, -1);
- return -EIO;
+ return 0;
}
priv->pkt_cnt = pkt_cnt;
priv->pkt_data = ptr;
priv->pkt_hdr = (u32 *)(ptr + hdr_off);
- debug("%s: %d packets received, pkt header at %d\n",
- __func__, (int)priv->pkt_cnt, (int)hdr_off);
+ debug("%s: %u packets received, pkt header at %u\n",
+ __func__, priv->pkt_cnt, hdr_off);
}
- le32_to_cpus(priv->pkt_hdr);
- pkt_len = (*priv->pkt_hdr >> 16) & 0x1fff;
+ pkt_hdr = *priv->pkt_hdr;
+ le32_to_cpus(&pkt_hdr);
+ pkt_len = (pkt_hdr >> 16) & 0x1fff;
*packetp = priv->pkt_data + 2;
@@ -605,8 +601,11 @@ static int ax88179_eth_recv(struct udevice *dev, int flags, uchar **packetp)
priv->pkt_cnt--;
priv->pkt_hdr++;
- debug("%s: return packet of %d bytes (%d packets left)\n",
- __func__, (int)pkt_len, priv->pkt_cnt);
+ if (pkt_hdr & (AX_RXHDR_DROP_ERR | AX_RXHDR_CRC_ERR))
+ pkt_len = 0;
+
+ debug("%s: return packet of %u bytes (%u packets left)\n",
+ __func__, pkt_len, priv->pkt_cnt);
return pkt_len;
}
--
2.52.0
More information about the U-Boot
mailing list