Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Jun 2016 14:08:21 GMT
From:      vincenzo@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r304514 - soc2016/vincenzo/head/sys/dev/netmap
Message-ID:  <201606031408.u53E8LlY059320@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vincenzo
Date: Fri Jun  3 14:08:21 2016
New Revision: 304514
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=304514

Log:
   freebsd: ptnet: implement krings create/delete methods

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  3 14:08:03 2016	(r304513)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Fri Jun  3 14:08:21 2016	(r304514)
@@ -107,6 +107,10 @@
 	/* Mirror of PTFEAT register. */
 	uint32_t		ptfeatures;
 
+	/* Reference counter used to track the regif operations on the
+	 * passed-through netmap port. */
+	int backend_regifs;
+
 	/* PCI BARs support. */
 	struct resource		*iomem;
 	struct resource		*msix_mem;
@@ -117,6 +121,7 @@
 	struct ptnet_csb	*csb;
 
 	struct netmap_pt_guest_adapter *ptna_nm;
+	struct netmap_pt_guest_adapter ptna_dr;
 };
 
 #define PTNET_CORE_LOCK_INIT(_sc)	do {			\
@@ -153,6 +158,8 @@
 static uint32_t ptnet_nm_ptctl(struct ifnet *ifp, uint32_t cmd);
 static int	ptnet_nm_config(struct netmap_adapter *na, unsigned *txr,
 				unsigned *txd, unsigned *rxr, unsigned *rxd);
+static int	ptnet_nm_krings_create(struct netmap_adapter *na);
+static void	ptnet_nm_krings_delete(struct netmap_adapter *na);
 static int	ptnet_nm_txsync(struct netmap_kring *kring, int flags);
 static int	ptnet_nm_rxsync(struct netmap_kring *kring, int flags);
 
@@ -327,6 +334,8 @@
 
 	PTNET_CORE_LOCK_INIT(sc);
 
+	sc->backend_regifs = 0;
+
 	/* Prepare a netmap_adapter struct instance to do netmap_attach(). */
 	nifp_offset = bus_read_4(sc->iomem, PTNET_IO_NIFP_OFS);
 	na_arg.ifp = ifp;
@@ -335,6 +344,8 @@
 	na_arg.num_tx_rings = num_tx_rings;
 	na_arg.num_rx_rings = num_rx_rings;
 	na_arg.nm_config = ptnet_nm_config;
+	na_arg.nm_krings_create = ptnet_nm_krings_create;
+	na_arg.nm_krings_delete = ptnet_nm_krings_delete;
 	na_arg.nm_txsync = ptnet_nm_txsync;
 	na_arg.nm_rxsync = ptnet_nm_rxsync;
 
@@ -346,6 +357,8 @@
 	sc->ptna_nm = (struct netmap_pt_guest_adapter *)NA(ifp);
 	sc->ptna_nm->csb = sc->csb;
 
+	memset(&sc->ptna_dr, 0, sizeof(sc->ptna_dr));
+
 	return (0);
 
 err_path:
@@ -658,6 +671,50 @@
 }
 
 static int
+ptnet_nm_krings_create(struct netmap_adapter *na)
+{
+	/* Here (na == &sc->ptna_nm->hwup.up || na == &sc->ptna_dr.hwup.up). */
+	struct ptnet_softc *sc = na->ifp->if_softc;
+	struct netmap_adapter *na_nm = &sc->ptna_nm->hwup.up;
+	struct netmap_adapter *na_dr = &sc->ptna_dr.hwup.up;
+	int ret;
+
+	if (sc->backend_regifs) {
+		return 0;
+	}
+
+	/* Create krings on the public netmap adapter. */
+	ret = netmap_hw_krings_create(na_nm);
+	if (ret) {
+		return ret;
+	}
+
+	/* Copy krings into the netmap adapter private to the driver. */
+	na_dr->tx_rings = na_nm->tx_rings;
+	na_dr->rx_rings = na_nm->rx_rings;
+
+	return 0;
+}
+
+static void
+ptnet_nm_krings_delete(struct netmap_adapter *na)
+{
+	/* Here (na == &sc->ptna_nm->hwup.up || na == &sc->ptna_dr.hwup.up). */
+	struct ptnet_softc *sc = na->ifp->if_softc;
+	struct netmap_adapter *na_nm = &sc->ptna_nm->hwup.up;
+	struct netmap_adapter *na_dr = &sc->ptna_dr.hwup.up;
+
+	if (sc->backend_regifs) {
+		return;
+	}
+
+	na_dr->tx_rings = NULL;
+	na_dr->rx_rings = NULL;
+
+	netmap_hw_krings_delete(na_nm);
+}
+
+static int
 ptnet_nm_txsync(struct netmap_kring *kring, int flags)
 {
 	struct ptnet_softc *sc = kring->na->ifp->if_softc;



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