Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Feb 2015 18:22:25 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r279244 - head/sys/dev/cxgbe
Message-ID:  <201502241822.t1OIMPXi056778@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: np
Date: Tue Feb 24 18:22:24 2015
New Revision: 279244
URL: https://svnweb.freebsd.org/changeset/base/279244

Log:
  cxgbe(4): wait for the hardware to catch up before destroying a netmap txq.
  
  MFC after:	2 weeks

Modified:
  head/sys/dev/cxgbe/t4_netmap.c

Modified: head/sys/dev/cxgbe/t4_netmap.c
==============================================================================
--- head/sys/dev/cxgbe/t4_netmap.c	Tue Feb 24 18:19:25 2015	(r279243)
+++ head/sys/dev/cxgbe/t4_netmap.c	Tue Feb 24 18:22:24 2015	(r279244)
@@ -514,12 +514,17 @@ cxgbe_netmap_off(struct adapter *sc, str
 		if_printf(ifp, "netmap disable_vi failed: %d\n", rc);
 	nm_clear_native_flags(na);
 
-	/*
-	 * XXXNM: We need to make sure that the tx queues are quiet and won't
-	 * request any more SGE_EGR_UPDATEs.
-	 */
-
 	for_each_nm_txq(pi, i, nm_txq) {
+		struct sge_qstat *spg = (void *)&nm_txq->desc[nm_txq->sidx];
+
+		/* Wait for hw pidx to catch up ... */
+		while (be16toh(nm_txq->pidx) != spg->pidx)
+			pause("nmpidx", 1);
+
+		/* ... and then for the cidx. */
+		while (spg->pidx != spg->cidx)
+			pause("nmcidx", 1);
+
 		free_nm_txq_hwq(pi, nm_txq);
 	}
 	for_each_nm_rxq(pi, i, nm_rxq) {



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