svn commit: r197566 - head/sys/dev/usb/net

Andrew Thompson thompsa at FreeBSD.org
Mon Sep 28 08:03:52 UTC 2009


Author: thompsa
Date: Mon Sep 28 08:03:52 2009
New Revision: 197566
URL: http://svn.freebsd.org/changeset/base/197566

Log:
  Increase the rx buffer size to 16384 bytes, this increases RX performance from
  50Mbps to 220Mbps on PLANEX GU-1000T.
  
  Submitted by:	yongari

Modified:
  head/sys/dev/usb/net/if_axe.c

Modified: head/sys/dev/usb/net/if_axe.c
==============================================================================
--- head/sys/dev/usb/net/if_axe.c	Mon Sep 28 08:00:17 2009	(r197565)
+++ head/sys/dev/usb/net/if_axe.c	Mon Sep 28 08:03:52 2009	(r197566)
@@ -205,10 +205,7 @@ static const struct usb_config axe_confi
 		.type = UE_BULK,
 		.endpoint = UE_ADDR_ANY,
 		.direction = UE_DIR_IN,
-#if (MCLBYTES < 2048)
-#error "(MCLBYTES < 2048)"
-#endif
-		.bufsize = MCLBYTES,
+		.bufsize = 16384,	/* bytes */
 		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
 		.callback = axe_bulk_read_callback,
 		.timeout = 0,	/* no timeout */
@@ -777,7 +774,7 @@ axe_bulk_read_callback(struct usb_xfer *
 	struct ifnet *ifp = uether_getifp(ue);
 	struct axe_sframe_hdr hdr;
 	struct usb_page_cache *pc;
-	int err, pos, len, adjust;
+	int err, pos, len;
 	int actlen;
 
 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
@@ -785,50 +782,42 @@ axe_bulk_read_callback(struct usb_xfer *
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_TRANSFERRED:
 		pos = 0;
+		len = 0;
+		err = 0;
+
 		pc = usbd_xfer_get_frame(xfer, 0);
-		while (1) {
-			if (sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) {
-				if (actlen < sizeof(hdr)) {
+		if (sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) {
+			while (pos < actlen) {
+				if ((pos + sizeof(hdr)) > actlen) {
 					/* too little data */
+					err = EINVAL;
 					break;
 				}
 				usbd_copy_out(pc, pos, &hdr, sizeof(hdr));
 
 				if ((hdr.len ^ hdr.ilen) != 0xFFFF) {
 					/* we lost sync */
+					err = EINVAL;
 					break;
 				}
-				actlen -= sizeof(hdr);
 				pos += sizeof(hdr);
 
 				len = le16toh(hdr.len);
-				if (len > actlen) {
+				if ((pos + len) > actlen) {
 					/* invalid length */
+					err = EINVAL;
 					break;
 				}
-				adjust = (len & 1);
-
-			} else {
-				len = actlen;
-				adjust = 0;
-			}
-			err = uether_rxbuf(ue, pc, pos, len);
-			if (err)
-				break;
-
-			pos += len;
-			actlen -= len;
+				err = uether_rxbuf(ue, pc, pos, len);
 
-			if (actlen <= adjust) {
-				/* we are finished */
-				goto tr_setup;
+				pos += len + (len % 2);
 			}
-			pos += adjust;
-			actlen -= adjust;
+		} else {
+			err = uether_rxbuf(ue, pc, 0, actlen);
 		}
 
-		/* count an error */
-		ifp->if_ierrors++;
+		if (err != 0)
+			ifp->if_ierrors++;
 
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
@@ -1011,7 +1000,15 @@ axe_init(struct usb_ether *ue)
 	/* Enable receiver, set RX mode */
 	rxmode = (AXE_RXCMD_MULTICAST | AXE_RXCMD_ENABLE);
 	if (sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) {
+#if 0
 		rxmode |= AXE_178_RXCMD_MFB_2048;	/* chip default */
+#else
+		/*
+		 * Default Rx buffer size is too small to get
+		 * maximum performance.
+		 */
+		rxmode |= AXE_178_RXCMD_MFB_16384;
+#endif
 	} else {
 		rxmode |= AXE_172_RXCMD_UNICAST;
 	}


More information about the svn-src-head mailing list