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>