Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jun 2016 13:16:52 GMT
From:      vincenzo@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r305051 - soc2016/vincenzo/head/sys/dev/netmap
Message-ID:  <201606101316.u5ADGqR6013681@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vincenzo
Date: Fri Jun 10 13:16:52 2016
New Revision: 305051
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305051

Log:
   freebsd: ptnet: manage IFF_UP and IFF_DOWN flags

Modified:
  soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c

Modified: soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c
==============================================================================
--- soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Fri Jun 10 13:16:18 2016	(r305050)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Fri Jun 10 13:16:52 2016	(r305051)
@@ -154,8 +154,8 @@
 
 static void	ptnet_init(void *opaque);
 static int	ptnet_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data);
-static void	ptnet_init_locked(struct ptnet_softc *sc);
-static void	ptnet_stop(struct ptnet_softc *sc);
+static int	ptnet_init_locked(struct ptnet_softc *sc);
+static int	ptnet_stop(struct ptnet_softc *sc);
 static void	ptnet_start(struct ifnet *ifp);
 
 static int	ptnet_media_change(struct ifnet *ifp);
@@ -607,10 +607,10 @@
 			PTNET_CORE_LOCK(sc);
 			if (ifp->if_flags & IFF_UP) {
 				/* Network stack wants the iff to be up. */
-				ptnet_init_locked(sc);
+				err = ptnet_init_locked(sc);
 			} else {
 				/* Network stack wants the iff to be down. */
-				ptnet_stop(sc);
+				err = ptnet_stop(sc);
 			}
 			PTNET_CORE_UNLOCK(sc);
 
@@ -621,29 +621,91 @@
 	return err;
 }
 
-static void
+static int
 ptnet_init_locked(struct ptnet_softc *sc)
 {
 	struct ifnet *ifp = sc->ifp;
+	struct netmap_adapter *na_dr = &sc->ptna_dr.hwup.up;
+	int ret;
 
 	device_printf(sc->dev, "%s\n", __func__);
 
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
-		return; /* nothing to do */
+		return 0; /* nothing to do */
+	}
+
+	netmap_update_config(na_dr);
+
+	ret = netmap_mem_finalize(na_dr->nm_mem, na_dr);
+	if (ret) {
+		device_printf(sc->dev, "netmap_mem_finalize() failed\n");
+		return ret;
+	}
+
+	if (sc->backend_regifs == 0) {
+		ret = ptnet_nm_krings_create(na_dr);
+		if (ret) {
+			device_printf(sc->dev, "ptnet_nm_krings_create() "
+					       "failed\n");
+			goto err_mem_finalize;
+		}
+
+		ret = netmap_mem_rings_create(na_dr);
+		if (ret) {
+			device_printf(sc->dev, "netmap_mem_rings_create() "
+					       "failed\n");
+			goto err_rings_create;
+		}
+
+		ret = netmap_mem_get_lut(na_dr->nm_mem, &na_dr->na_lut);
+		if (ret) {
+			device_printf(sc->dev, "netmap_mem_get_lut() "
+					       "failed\n");
+			goto err_get_lut;
+		}
 	}
+
+	ret = ptnet_nm_register(na_dr, 1 /* on */);
+	if (ret) {
+		goto err_register;
+	}
+
+	return 0;
+
+err_register:
+	memset(&na_dr->na_lut, 0, sizeof(na_dr->na_lut));
+err_get_lut:
+	netmap_mem_rings_delete(na_dr);
+err_rings_create:
+	ptnet_nm_krings_delete(na_dr);
+err_mem_finalize:
+	netmap_mem_deref(na_dr->nm_mem, na_dr);
+
+	return ret;
 }
 
 /* To be called under core lock. */
-static void
+static int
 ptnet_stop(struct ptnet_softc *sc)
 {
 	struct ifnet *ifp = sc->ifp;
+	struct netmap_adapter *na_dr = &sc->ptna_dr.hwup.up;
 
 	device_printf(sc->dev, "%s\n", __func__);
 
 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
-		return; /* nothing to do */
+		return 0; /* nothing to do */
+	}
+
+	ptnet_nm_register(na_dr, 0 /* off */);
+
+	if (sc->backend_regifs == 0) {
+		netmap_mem_rings_delete(na_dr);
+		ptnet_nm_krings_delete(na_dr);
 	}
+	netmap_mem_deref(na_dr->nm_mem, na_dr);
+
+	return 0;
 }
 
 static void
@@ -709,6 +771,8 @@
 	return 0;
 }
 
+/* XXX krings create/delete and register functions should be shared
+ *     with the Linux driver. */
 static int
 ptnet_nm_krings_create(struct netmap_adapter *na)
 {



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