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

