Name virtqueue index
This commit is contained in:
parent
856f67128b
commit
8434ebbe32
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: if_vioif.c,v 1.18 2015/10/27 15:56:21 christos Exp $ */
|
||||
/* $NetBSD: if_vioif.c,v 1.19 2015/10/29 02:09:02 ozaki-r Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2010 Minoura Makoto.
|
||||
@ -26,7 +26,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.18 2015/10/27 15:56:21 christos Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.19 2015/10/29 02:09:02 ozaki-r Exp $");
|
||||
|
||||
#ifdef _KERNEL_OPT
|
||||
#include "opt_net_mpsafe.h"
|
||||
@ -181,6 +181,9 @@ struct vioif_softc {
|
||||
|
||||
struct virtio_softc *sc_virtio;
|
||||
struct virtqueue sc_vq[3];
|
||||
#define VQ_RX 0
|
||||
#define VQ_TX 1
|
||||
#define VQ_CTRL 2
|
||||
|
||||
uint8_t sc_mac[ETHER_ADDR_LEN];
|
||||
struct ethercom sc_ethercom;
|
||||
@ -318,8 +321,8 @@ vioif_alloc_mems(struct vioif_softc *sc)
|
||||
intptr_t p;
|
||||
int rxqsize, txqsize;
|
||||
|
||||
rxqsize = vsc->sc_vqs[0].vq_num;
|
||||
txqsize = vsc->sc_vqs[1].vq_num;
|
||||
rxqsize = vsc->sc_vqs[VQ_RX].vq_num;
|
||||
txqsize = vsc->sc_vqs[VQ_TX].vq_num;
|
||||
|
||||
allocsize = sizeof(struct virtio_net_hdr) * rxqsize;
|
||||
allocsize += sizeof(struct virtio_net_hdr) * txqsize;
|
||||
@ -597,33 +600,33 @@ vioif_attach(device_t parent, device_t self, void *aux)
|
||||
/*
|
||||
* Allocating a virtqueue for Rx
|
||||
*/
|
||||
r = virtio_alloc_vq(vsc, &sc->sc_vq[0], 0,
|
||||
r = virtio_alloc_vq(vsc, &sc->sc_vq[VQ_RX], 0,
|
||||
MCLBYTES+sizeof(struct virtio_net_hdr), 2, "rx");
|
||||
if (r != 0)
|
||||
goto err;
|
||||
vsc->sc_nvqs = 1;
|
||||
sc->sc_vq[0].vq_done = vioif_rx_vq_done;
|
||||
sc->sc_vq[VQ_RX].vq_done = vioif_rx_vq_done;
|
||||
|
||||
/*
|
||||
* Allocating a virtqueue for Tx
|
||||
*/
|
||||
r = virtio_alloc_vq(vsc, &sc->sc_vq[1], 1,
|
||||
r = virtio_alloc_vq(vsc, &sc->sc_vq[VQ_TX], 1,
|
||||
(sizeof(struct virtio_net_hdr) + (ETHER_MAX_LEN - ETHER_HDR_LEN)),
|
||||
VIRTIO_NET_TX_MAXNSEGS + 1, "tx");
|
||||
if (r != 0)
|
||||
goto err;
|
||||
vsc->sc_nvqs = 2;
|
||||
sc->sc_vq[1].vq_done = vioif_tx_vq_done;
|
||||
sc->sc_vq[VQ_TX].vq_done = vioif_tx_vq_done;
|
||||
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[0]);
|
||||
virtio_stop_vq_intr(vsc, &sc->sc_vq[1]); /* not urgent; do it later */
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_RX]);
|
||||
virtio_stop_vq_intr(vsc, &sc->sc_vq[VQ_TX]); /* not urgent; do it later */
|
||||
|
||||
if ((features & VIRTIO_NET_F_CTRL_VQ) &&
|
||||
(features & VIRTIO_NET_F_CTRL_RX)) {
|
||||
/*
|
||||
* Allocating a virtqueue for control channel
|
||||
*/
|
||||
r = virtio_alloc_vq(vsc, &sc->sc_vq[2], 2,
|
||||
r = virtio_alloc_vq(vsc, &sc->sc_vq[VQ_CTRL], 2,
|
||||
NBPG, 1, "control");
|
||||
if (r != 0) {
|
||||
aprint_error_dev(self, "failed to allocate "
|
||||
@ -631,11 +634,11 @@ vioif_attach(device_t parent, device_t self, void *aux)
|
||||
goto skip;
|
||||
}
|
||||
|
||||
sc->sc_vq[2].vq_done = vioif_ctrl_vq_done;
|
||||
sc->sc_vq[VQ_CTRL].vq_done = vioif_ctrl_vq_done;
|
||||
cv_init(&sc->sc_ctrl_wait, "ctrl_vq");
|
||||
mutex_init(&sc->sc_ctrl_wait_lock, MUTEX_DEFAULT, IPL_NET);
|
||||
sc->sc_ctrl_inuse = FREE;
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[2]);
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_CTRL]);
|
||||
vsc->sc_nvqs = 3;
|
||||
}
|
||||
skip:
|
||||
@ -678,17 +681,17 @@ err:
|
||||
mutex_obj_free(sc->sc_rx_lock);
|
||||
|
||||
if (vsc->sc_nvqs == 3) {
|
||||
virtio_free_vq(vsc, &sc->sc_vq[2]);
|
||||
virtio_free_vq(vsc, &sc->sc_vq[VQ_CTRL]);
|
||||
cv_destroy(&sc->sc_ctrl_wait);
|
||||
mutex_destroy(&sc->sc_ctrl_wait_lock);
|
||||
vsc->sc_nvqs = 2;
|
||||
}
|
||||
if (vsc->sc_nvqs == 2) {
|
||||
virtio_free_vq(vsc, &sc->sc_vq[1]);
|
||||
virtio_free_vq(vsc, &sc->sc_vq[VQ_TX]);
|
||||
vsc->sc_nvqs = 1;
|
||||
}
|
||||
if (vsc->sc_nvqs == 1) {
|
||||
virtio_free_vq(vsc, &sc->sc_vq[0]);
|
||||
virtio_free_vq(vsc, &sc->sc_vq[VQ_RX]);
|
||||
vsc->sc_nvqs = 0;
|
||||
}
|
||||
vsc->sc_child = (void*)1;
|
||||
@ -767,10 +770,10 @@ vioif_stop(struct ifnet *ifp, int disable)
|
||||
|
||||
virtio_reinit_start(vsc);
|
||||
virtio_negotiate_features(vsc, vsc->sc_features);
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[0]);
|
||||
virtio_stop_vq_intr(vsc, &sc->sc_vq[1]);
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_RX]);
|
||||
virtio_stop_vq_intr(vsc, &sc->sc_vq[VQ_TX]);
|
||||
if (vsc->sc_nvqs >= 3)
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[2]);
|
||||
virtio_start_vq_intr(vsc, &sc->sc_vq[VQ_CTRL]);
|
||||
virtio_reinit_end(vsc);
|
||||
vioif_updown(sc, false);
|
||||
}
|
||||
@ -780,7 +783,7 @@ vioif_start(struct ifnet *ifp)
|
||||
{
|
||||
struct vioif_softc *sc = ifp->if_softc;
|
||||
struct virtio_softc *vsc = sc->sc_virtio;
|
||||
struct virtqueue *vq = &sc->sc_vq[1]; /* tx vq */
|
||||
struct virtqueue *vq = &sc->sc_vq[VQ_TX];
|
||||
struct mbuf *m;
|
||||
int queued = 0, retry = 0;
|
||||
|
||||
@ -892,7 +895,7 @@ vioif_watchdog(struct ifnet *ifp)
|
||||
struct vioif_softc *sc = ifp->if_softc;
|
||||
|
||||
if (ifp->if_flags & IFF_RUNNING)
|
||||
vioif_tx_vq_done(&sc->sc_vq[1]);
|
||||
vioif_tx_vq_done(&sc->sc_vq[VQ_TX]);
|
||||
}
|
||||
|
||||
|
||||
@ -951,7 +954,7 @@ vioif_populate_rx_mbufs_locked(struct vioif_softc *sc)
|
||||
{
|
||||
struct virtio_softc *vsc = sc->sc_virtio;
|
||||
int i, r, ndone = 0;
|
||||
struct virtqueue *vq = &sc->sc_vq[0]; /* rx vq */
|
||||
struct virtqueue *vq = &sc->sc_vq[VQ_RX];
|
||||
|
||||
KASSERT(VIOIF_RX_LOCKED(sc));
|
||||
|
||||
@ -1013,7 +1016,7 @@ static int
|
||||
vioif_rx_deq_locked(struct vioif_softc *sc)
|
||||
{
|
||||
struct virtio_softc *vsc = sc->sc_virtio;
|
||||
struct virtqueue *vq = &sc->sc_vq[0];
|
||||
struct virtqueue *vq = &sc->sc_vq[VQ_RX];
|
||||
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
|
||||
struct mbuf *m;
|
||||
int r = 0;
|
||||
@ -1094,7 +1097,7 @@ vioif_rx_softint(void *arg)
|
||||
static void
|
||||
vioif_rx_drain(struct vioif_softc *sc)
|
||||
{
|
||||
struct virtqueue *vq = &sc->sc_vq[0];
|
||||
struct virtqueue *vq = &sc->sc_vq[VQ_RX];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < vq->vq_num; i++) {
|
||||
@ -1171,7 +1174,7 @@ static void
|
||||
vioif_tx_drain(struct vioif_softc *sc)
|
||||
{
|
||||
struct virtio_softc *vsc = sc->sc_virtio;
|
||||
struct virtqueue *vq = &sc->sc_vq[1];
|
||||
struct virtqueue *vq = &sc->sc_vq[VQ_TX];
|
||||
int i;
|
||||
|
||||
KASSERT(sc->sc_stopping);
|
||||
@ -1193,7 +1196,7 @@ static int
|
||||
vioif_ctrl_rx(struct vioif_softc *sc, int cmd, bool onoff)
|
||||
{
|
||||
struct virtio_softc *vsc = sc->sc_virtio;
|
||||
struct virtqueue *vq = &sc->sc_vq[2];
|
||||
struct virtqueue *vq = &sc->sc_vq[VQ_CTRL];
|
||||
int r, slot;
|
||||
|
||||
if (vsc->sc_nvqs < 3)
|
||||
@ -1289,7 +1292,7 @@ vioif_set_rx_filter(struct vioif_softc *sc)
|
||||
{
|
||||
/* filter already set in sc_ctrl_mac_tbl */
|
||||
struct virtio_softc *vsc = sc->sc_virtio;
|
||||
struct virtqueue *vq = &sc->sc_vq[2];
|
||||
struct virtqueue *vq = &sc->sc_vq[VQ_CTRL];
|
||||
int r, slot;
|
||||
|
||||
if (vsc->sc_nvqs < 3)
|
||||
|
Loading…
Reference in New Issue
Block a user