Author: bryanv
Date: Sun Aug 24 19:31:26 2014
New Revision: 270509
URL: http://svnweb.freebsd.org/changeset/base/270509

Log:
  MFC r270063 (vtnet)
  
  The vtnet changes were not originally merged in r270252 since
  r268480 and r268481 had not been MFC'ed.

Modified:
  stable/10/sys/dev/virtio/network/if_vtnet.c

Modified: stable/10/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- stable/10/sys/dev/virtio/network/if_vtnet.c Sun Aug 24 17:10:47 2014        
(r270508)
+++ stable/10/sys/dev/virtio/network/if_vtnet.c Sun Aug 24 19:31:26 2014        
(r270509)
@@ -287,6 +287,10 @@ static device_method_t vtnet_methods[] =
        DEVMETHOD_END
 };
 
+#ifdef DEV_NETMAP
+#include <dev/netmap/if_vtnet_netmap.h>
+#endif /* DEV_NETMAP */
+
 static driver_t vtnet_driver = {
        "vtnet",
        vtnet_methods,
@@ -393,6 +397,10 @@ vtnet_attach(device_t dev)
                goto fail;
        }
 
+#ifdef DEV_NETMAP
+       vtnet_netmap_attach(sc);
+#endif /* DEV_NETMAP */
+
        vtnet_start_taskqueues(sc);
 
 fail:
@@ -422,6 +430,10 @@ vtnet_detach(device_t dev)
                ether_ifdetach(ifp);
        }
 
+#ifdef DEV_NETMAP
+       netmap_detach(ifp);
+#endif /* DEV_NETMAP */
+
        vtnet_free_taskqueues(sc);
 
        if (sc->vtnet_vlan_attach != NULL) {
@@ -1733,6 +1745,12 @@ vtnet_rxq_eof(struct vtnet_rxq *rxq)
 
        VTNET_RXQ_LOCK_ASSERT(rxq);
 
+#ifdef DEV_NETMAP
+       if (netmap_rx_irq(ifp, 0, &deq)) {
+               return (FALSE);
+       }
+#endif /* DEV_NETMAP */
+
        while (count-- > 0) {
                m = virtqueue_dequeue(vq, &len);
                if (m == NULL)
@@ -2419,6 +2437,13 @@ vtnet_txq_eof(struct vtnet_txq *txq)
        deq = 0;
        VTNET_TXQ_LOCK_ASSERT(txq);
 
+#ifdef DEV_NETMAP
+       if (netmap_tx_irq(txq->vtntx_sc->vtnet_ifp, txq->vtntx_id)) {
+               virtqueue_disable_intr(vq); // XXX luigi
+               return 0; // XXX or 1 ?
+       }
+#endif /* DEV_NETMAP */
+
        while ((txhdr = virtqueue_dequeue(vq, NULL)) != NULL) {
                m = txhdr->vth_mbuf;
                deq++;
@@ -2893,6 +2918,11 @@ vtnet_init_rx_queues(struct vtnet_softc 
            ("%s: too many rx mbufs %d for %d segments", __func__,
            sc->vtnet_rx_nmbufs, sc->vtnet_rx_nsegs));
 
+#ifdef DEV_NETMAP
+       if (vtnet_netmap_init_rx_buffers(sc))
+               return 0;
+#endif /* DEV_NETMAP */
+
        for (i = 0; i < sc->vtnet_act_vq_pairs; i++) {
                rxq = &sc->vtnet_rxqs[i];
 
@@ -3045,6 +3075,13 @@ vtnet_init(void *xsc)
 
        sc = xsc;
 
+#ifdef DEV_NETMAP
+       if (!NA(sc->vtnet_ifp)) {
+               D("try to attach again");
+               vtnet_netmap_attach(sc);
+       }
+#endif /* DEV_NETMAP */
+
        VTNET_CORE_LOCK(sc);
        vtnet_init_locked(sc);
        VTNET_CORE_UNLOCK(sc);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to