Date: Fri, 17 Jun 2016 16:22:28 GMT From: vincenzo@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r305290 - soc2016/vincenzo/head/sys/dev/netmap Message-ID: <201606171622.u5HGMS9C022442@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: vincenzo Date: Fri Jun 17 16:22:28 2016 New Revision: 305290 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305290 Log: freebsd: ptnet_tx_intr: update hwcur/hwtail from host 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 17 16:22:19 2016 (r305289) +++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c Fri Jun 17 16:22:28 2016 (r305290) @@ -105,8 +105,8 @@ char lock_name[16]; }; -#define PTNET_Q_LOCK(_pq) mtx_lock(&(_pq_->lock) -#define PTNET_Q_UNLOCK(_pq) mtx_unlock(&(_pq_->lock) +#define PTNET_Q_LOCK(_pq) mtx_lock(&(_pq)->lock) +#define PTNET_Q_UNLOCK(_pq) mtx_unlock(&(_pq)->lock) struct ptnet_softc { device_t dev; @@ -743,14 +743,18 @@ pq = sc->queues + 0; ptring = pq->ptring; - kring = na->tx_rings + 0; + kring = na->tx_rings + pq->kring_id; ring = kring->ring; lim = kring->nkr_num_slots - 1; + PTNET_Q_LOCK(pq); + /* Update hwcur and hwtail (completed TX slots) as known by the host, * by reading from CSB. */ ptnet_sync_tail(ptring, kring); + PTNET_Q_UNLOCK(pq); + head = ring->head; slot = ring->slot + head; nmbuf = NMB(na, slot); @@ -1100,12 +1104,21 @@ { struct ptnet_queue *pq = opaque; struct ptnet_softc *sc = pq->sc; + struct netmap_adapter *na_dr = &sc->ptna_dr.hwup.up; DBG(device_printf(sc->dev, "Tx interrupt #%d\n", pq->kring_id)); + if (!(sc->ifp->if_drv_flags & IFF_DRV_RUNNING)) { + return; + } + if (netmap_tx_irq(sc->ifp, pq->kring_id) != NM_IRQ_PASS) { return; } + + PTNET_Q_LOCK(pq); + ptnet_sync_tail(pq->ptring, na_dr->tx_rings + pq->kring_id); + PTNET_Q_UNLOCK(pq); } static void @@ -1117,6 +1130,10 @@ DBG(device_printf(sc->dev, "Rx interrupt #%d\n", pq->kring_id)); + if (!(sc->ifp->if_drv_flags & IFF_DRV_RUNNING)) { + return; + } + if (netmap_rx_irq(sc->ifp, pq->kring_id, &unused) != NM_IRQ_PASS) { return; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606171622.u5HGMS9C022442>