[PATCH 2/6] usb: eth: asix88179: Use a fixed URB buffer size of 16 KiB
Jonas Karlman
jonas at kwiboo.se
Fri Jan 30 01:29:27 CET 2026
The commit 05278af8b3df ("eth: asix88179: packet drop when receiving
large fragmented packets") adjusted the URB buffer size to allow large
fragmented packets. However, this change result in use of a large URB
buffer size for slow speed connections, e.g. 10/100M use 26 KiB.
Using a ASIX AX88179B USB 3.0 or ASIX AX88772E USB 2.0 Ethernet adapter
on a Rockchip RK3528 with a DWC2 USB controller this large URB buffer
size result in invalid rx_hdr and result in unusable Ethernet.
The data read back from AX_RX_BULKIN_QCTRL after being configured also
does not match the values in the AX88179_BULKIN_SIZE array.
Change to use a fixed URB buffer size of 16 KiB to fix use of Ethernet,
anything larger seem to result in unusable Ethernet. With the 16 KiB URB
buffer size use of TFTP_BLOCKSIZE=15360 seem to work okay.
Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
---
Please note that the vendor driver 3.5.0 seems to use a different
BULKIN_SIZE array for the AX88179A/88772D variants, see [1].
[1] https://github.com/mmoya/asix-usb-nic-linux-driver/blob/main/ax88179a_772d.c#L24-L30
---
drivers/usb/eth/asix88179.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/usb/eth/asix88179.c b/drivers/usb/eth/asix88179.c
index 8915ef1fdc36..6da509175480 100644
--- a/drivers/usb/eth/asix88179.c
+++ b/drivers/usb/eth/asix88179.c
@@ -173,7 +173,7 @@
#define USB_BULK_SEND_TIMEOUT 5000
#define USB_BULK_RECV_TIMEOUT 5000
-#define AX_RX_URB_SIZE 1024 * 0x1a
+#define AX_RX_URB_SIZE 16384
#define BLK_FRAME_SIZE 0x200
#define PHY_CONNECT_TIMEOUT 5000
#define PHY_RESET_TIMEOUT 500
@@ -206,7 +206,6 @@ struct asix_private {
uint8_t *pkt_data;
uint32_t *pkt_hdr;
int flags;
- int rx_urb_size;
int maxpacketsize;
};
@@ -333,8 +332,6 @@ static int asix_basic_reset(struct ueth_data *dev,
memcpy(tmp, &AX88179_BULKIN_SIZE[0], 5);
asix_write_cmd(dev, AX_ACCESS_MAC, AX_RX_BULKIN_QCTRL, 5, 5, tmp);
- dev_priv->rx_urb_size = 1024 * 20;
-
/* Water Level configuration */
*tmp = 0x34;
asix_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_LOW, 1, 1, tmp);
@@ -476,7 +473,6 @@ static int asix_init_common(struct ueth_data *dev,
/* RX bulk configuration */
asix_write_cmd(dev, AX_ACCESS_MAC, AX_RX_BULKIN_QCTRL, 5, 5, tmp);
- dev_priv->rx_urb_size = (1024 * (tmp[3] + 2));
if (*tmp16 & GMII_PHY_PHYSR_FULL)
mode |= AX_MEDIUM_FULL_DUPLEX;
asix_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
@@ -574,7 +570,7 @@ int ax88179_eth_recv(struct udevice *dev, int flags, uchar **packetp)
if (!(flags & ETH_RECV_CHECK_DEVICE))
return -EAGAIN;
- ret = usb_ether_receive(ueth, priv->rx_urb_size);
+ ret = usb_ether_receive(ueth, AX_RX_URB_SIZE);
if (ret < 0)
return ret;
--
2.52.0
More information about the U-Boot
mailing list