From owner-svn-soc-all@freebsd.org Fri Jun 3 14:08:22 2016 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 53DC2B6804C for ; Fri, 3 Jun 2016 14:08:22 +0000 (UTC) (envelope-from vincenzo@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 47F291AB3 for ; Fri, 3 Jun 2016 14:08:22 +0000 (UTC) (envelope-from vincenzo@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id u53E8Mpl059331 for ; Fri, 3 Jun 2016 14:08:22 GMT (envelope-from vincenzo@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id u53E8LlY059320 for svn-soc-all@FreeBSD.org; Fri, 3 Jun 2016 14:08:21 GMT (envelope-from vincenzo@FreeBSD.org) Date: Fri, 3 Jun 2016 14:08:21 GMT Message-Id: <201606031408.u53E8LlY059320@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to vincenzo@FreeBSD.org using -f From: vincenzo@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r304514 - soc2016/vincenzo/head/sys/dev/netmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Jun 2016 14:08:22 -0000 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;