diff options
author | thompsa <thompsa@FreeBSD.org> | 2009-09-28 08:03:52 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2009-09-28 08:03:52 +0000 |
commit | 7c784df5df8c818e8b79ca2f15cc4bc02da4d7f2 (patch) | |
tree | 1e67e24846804dd75cafee8f3ebdbad06e29f81f /sys/dev/usb/net/if_axe.c | |
parent | 225d046f41f4145495aa717c5397fb124a4704d4 (diff) | |
download | FreeBSD-src-7c784df5df8c818e8b79ca2f15cc4bc02da4d7f2.zip FreeBSD-src-7c784df5df8c818e8b79ca2f15cc4bc02da4d7f2.tar.gz |
Increase the rx buffer size to 16384 bytes, this increases RX performance from
50Mbps to 220Mbps on PLANEX GU-1000T.
Submitted by: yongari
Diffstat (limited to 'sys/dev/usb/net/if_axe.c')
-rw-r--r-- | sys/dev/usb/net/if_axe.c | 55 |
1 files changed, 26 insertions, 29 deletions
diff --git a/sys/dev/usb/net/if_axe.c b/sys/dev/usb/net/if_axe.c index ae9d512..e94154a 100644 --- a/sys/dev/usb/net/if_axe.c +++ b/sys/dev/usb/net/if_axe.c @@ -205,10 +205,7 @@ static const struct usb_config axe_config[AXE_N_TRANSFER] = { .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 *xfer, usb_error_t error) 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 *xfer, usb_error_t error) 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; } |