From owner-p4-projects@FreeBSD.ORG Sat Sep 12 09:39:17 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B932D1065676; Sat, 12 Sep 2009 09:39:17 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7D88E1065670 for ; Sat, 12 Sep 2009 09:39:17 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 3D1118FC08 for ; Sat, 12 Sep 2009 09:39:17 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n8C9dHL1095740 for ; Sat, 12 Sep 2009 09:39:17 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n8C9dHsn095738 for perforce@freebsd.org; Sat, 12 Sep 2009 09:39:17 GMT (envelope-from hselasky@FreeBSD.org) Date: Sat, 12 Sep 2009 09:39:17 GMT Message-Id: <200909120939.n8C9dHsn095738@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 168457 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 12 Sep 2009 09:39:18 -0000 http://perforce.freebsd.org/chv.cgi?CH=168457 Change 168457 by hselasky@hselasky_laptop001 on 2009/09/12 09:38:54 USB network: - axe(4) performance fix - patch by Pyun YongHyeon This patch increases RX performance from 50Mbps to 220Mbps on PLANEX GU-1000T. This patch is not yet tested on the 100Mbps hardware. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/net/if_axe.c#16 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/net/if_axe.c#16 (text+ko) ==== @@ -205,10 +205,7 @@ .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 @@ 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 @@ 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); + err = uether_rxbuf(ue, pc, pos, len); - } else { - len = actlen; - adjust = 0; + pos += len + (len % 2); } - err = uether_rxbuf(ue, pc, pos, len); - if (err) - break; - - pos += len; - actlen -= len; - - if (actlen <= adjust) { - /* we are finished */ - goto tr_setup; - } - 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 @@ /* 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; }