svn commit: r307262 - head/sys/dev/hyperv/netvsc

Sepherosa Ziehau sephe at FreeBSD.org
Fri Oct 14 05:41:53 UTC 2016


Author: sephe
Date: Fri Oct 14 05:41:51 2016
New Revision: 307262
URL: https://svnweb.freebsd.org/changeset/base/307262

Log:
  hyperv/hn: Management parts always need suspend and resume.
  
  MFC after:	3 days
  Sponsored by:	Microsoft

Modified:
  head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c

Modified: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c	Fri Oct 14 05:32:47 2016	(r307261)
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c	Fri Oct 14 05:41:51 2016	(r307262)
@@ -354,6 +354,8 @@ static void hn_suspend(struct hn_softc *
 static void hn_suspend_data(struct hn_softc *);
 static void hn_suspend_mgmt(struct hn_softc *);
 static void hn_resume(struct hn_softc *);
+static void hn_resume_data(struct hn_softc *);
+static void hn_resume_mgmt(struct hn_softc *);
 static void hn_rx_drain(struct vmbus_channel *);
 static void hn_tx_resume(struct hn_softc *, int);
 static void hn_tx_ring_qflush(struct hn_tx_ring *);
@@ -1689,8 +1691,11 @@ hn_ioctl(struct ifnet *ifp, u_long cmd, 
 			hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MIN(ifp));
 #endif
 
-		if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-			hn_suspend(sc);
+		/*
+		 * Suspend this interface before the synthetic parts
+		 * are ripped.
+		 */
+		hn_suspend(sc);
 
 		/*
 		 * Detach the synthetics parts, i.e. NVS and RNDIS.
@@ -1708,9 +1713,10 @@ hn_ioctl(struct ifnet *ifp, u_long cmd, 
 			hn_set_chim_size(sc, sc->hn_chim_szmax);
 		hn_set_tso_maxsize(sc, hn_tso_maxlen, ifr->ifr_mtu);
 
-		/* All done!  Resume now. */
-		if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-			hn_resume(sc);
+		/*
+		 * All done!  Resume the interface now.
+		 */
+		hn_resume(sc);
 
 		HN_UNLOCK(sc);
 		break;
@@ -3717,7 +3723,8 @@ static void
 hn_suspend(struct hn_softc *sc)
 {
 
-	hn_suspend_data(sc);
+	if (sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING)
+		hn_suspend_data(sc);
 	hn_suspend_mgmt(sc);
 }
 
@@ -3739,7 +3746,7 @@ hn_tx_resume(struct hn_softc *sc, int tx
 }
 
 static void
-hn_resume(struct hn_softc *sc)
+hn_resume_data(struct hn_softc *sc)
 {
 	int i;
 
@@ -3779,6 +3786,11 @@ hn_resume(struct hn_softc *sc)
 		 */
 		taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_txeof_task);
 	}
+}
+
+static void
+hn_resume_mgmt(struct hn_softc *sc)
+{
 
 	/*
 	 * Kick off link status check.
@@ -3788,6 +3800,15 @@ hn_resume(struct hn_softc *sc)
 }
 
 static void
+hn_resume(struct hn_softc *sc)
+{
+
+	if (sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING)
+		hn_resume_data(sc);
+	hn_resume_mgmt(sc);
+}
+
+static void
 hn_nvs_handle_notify(struct hn_softc *sc, const struct vmbus_chanpkt_hdr *pkt)
 {
 	const struct hn_nvs_hdr *hdr;


More information about the svn-src-all mailing list