Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Nov 2009 18:18:09 +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-7@freebsd.org
Subject:   svn commit: r198916 - stable/7/sys/dev/fxp
Message-ID:  <200911041818.nA4II9R2041608@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Wed Nov  4 18:18:09 2009
New Revision: 198916
URL: http://svn.freebsd.org/changeset/base/198916

Log:
  MFC r194572:
    Always check fxp(4) is running, see if it can accept frames from
    upper stack in fxp_start_body().
    fxp(4) drops driver lock in Rx path so check the fxp(4) is still
    running after reacquiring driver lock in Rx path. Also don't
    invoke fxp_intr_body if fxp(4) is not running. With this change
    there is no need to set suspend bit in device attach phase.

Modified:
  stable/7/sys/dev/fxp/if_fxp.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/dev/fxp/if_fxp.c
==============================================================================
--- stable/7/sys/dev/fxp/if_fxp.c	Wed Nov  4 18:14:19 2009	(r198915)
+++ stable/7/sys/dev/fxp/if_fxp.c	Wed Nov  4 18:18:09 2009	(r198916)
@@ -993,7 +993,6 @@ fxp_detach(device_t dev)
 #endif
 
 	FXP_LOCK(sc);
-	sc->suspended = 1;	/* Do same thing as we do for suspend */
 	/*
 	 * Stop DMA and drop transmit queue, but disable interrupts first.
 	 */
@@ -1320,6 +1319,10 @@ fxp_start_body(struct ifnet *ifp)
 	if (sc->need_mcsetup)
 		return;
 
+	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	    IFF_DRV_RUNNING)
+		return;
+
 	if (sc->tx_queued > FXP_NTXCB_HIWAT)
 		fxp_txeof(sc);
 	/*
@@ -1726,7 +1729,8 @@ fxp_intr(void *xsc)
 		 * First ACK all the interrupts in this pass.
 		 */
 		CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack);
-		fxp_intr_body(sc, ifp, statack, -1);
+		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+			fxp_intr_body(sc, ifp, statack, -1);
 	}
 	FXP_UNLOCK(sc);
 }
@@ -1982,6 +1986,8 @@ fxp_intr_body(struct fxp_softc *sc, stru
 			FXP_UNLOCK(sc);
 			(*ifp->if_input)(ifp, m);
 			FXP_LOCK(sc);
+			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+				return;
 		} else {
 			/* Reuse RFA and loaded DMA map. */
 			ifp->if_iqdrops++;
@@ -2064,7 +2070,8 @@ fxp_tick(void *xsc)
 	 */
 	if (sc->rx_idle_secs > FXP_MAX_RX_IDLE) {
 		sc->rx_idle_secs = 0;
-		fxp_mc_setup(sc);
+		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+			fxp_mc_setup(sc);
 	}
 	/*
 	 * If there is no pending command, start another stats



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