[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