Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Oct 2010 21:23:27 +0000 (UTC)
From:      Pyun YongHyeon <yongari@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r214298 - stable/8/sys/dev/usb/net
Message-ID:  <201010242123.o9OLNRnt040556@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Sun Oct 24 21:23:27 2010
New Revision: 214298
URL: http://svn.freebsd.org/changeset/base/214298

Log:
  MFC r213424:
    Make upper stack know driver's output status. This change increased
    TX performance from 221kpps to 231kpps.

Modified:
  stable/8/sys/dev/usb/net/if_axe.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/usb/net/if_axe.c
==============================================================================
--- stable/8/sys/dev/usb/net/if_axe.c	Sun Oct 24 21:22:00 2010	(r214297)
+++ stable/8/sys/dev/usb/net/if_axe.c	Sun Oct 24 21:23:27 2010	(r214298)
@@ -862,12 +862,15 @@ axe_bulk_write_callback(struct usb_xfer 
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_TRANSFERRED:
 		DPRINTFN(11, "transfer complete\n");
+		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
-		if ((sc->sc_flags & AXE_FLAG_LINK) == 0) {
+		if ((sc->sc_flags & AXE_FLAG_LINK) == 0 ||
+		    (ifp->if_drv_flags & IFF_DRV_OACTIVE) != 0) {
 			/*
-			 * don't send anything if there is no link !
+			 * Don't send anything if there is no link or
+			 * controller is busy.
 			 */
 			return;
 		}
@@ -938,6 +941,7 @@ tr_setup:
 
 		usbd_xfer_set_frame_len(xfer, 0, pos);
 		usbd_transfer_submit(xfer);
+		ifp->if_drv_flags |= IFF_DRV_OACTIVE;
 		return;
 
 	default:			/* Error */
@@ -945,6 +949,7 @@ tr_setup:
 		    usbd_errstr(error));
 
 		ifp->if_oerrors++;
+		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 
 		if (error != USB_ERR_CANCELLED) {
 			/* try to clear stall first */
@@ -1077,7 +1082,7 @@ axe_stop(struct usb_ether *ue)
 
 	AXE_LOCK_ASSERT(sc, MA_OWNED);
 
-	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
 	sc->sc_flags &= ~AXE_FLAG_LINK;
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010242123.o9OLNRnt040556>