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 <[email protected]>
---
 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

Reply via email to