[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