xref: /netbsd-src/sys/dev/pci/if_vioif.c (revision 6a493d6bc668897c91594964a732d38505b70cbb)
1 /*	$NetBSD: if_vioif.c,v 1.4 2013/05/09 12:23:17 minoura Exp $	*/
2 
3 /*
4  * Copyright (c) 2010 Minoura Makoto.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include <sys/cdefs.h>
29 __KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.4 2013/05/09 12:23:17 minoura Exp $");
30 
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/kernel.h>
34 #include <sys/bus.h>
35 #include <sys/condvar.h>
36 #include <sys/device.h>
37 #include <sys/intr.h>
38 #include <sys/kmem.h>
39 #include <sys/mbuf.h>
40 #include <sys/mutex.h>
41 #include <sys/sockio.h>
42 
43 #include <dev/pci/pcidevs.h>
44 #include <dev/pci/pcireg.h>
45 #include <dev/pci/pcivar.h>
46 #include <dev/pci/virtioreg.h>
47 #include <dev/pci/virtiovar.h>
48 
49 #include <net/if.h>
50 #include <net/if_media.h>
51 #include <net/if_ether.h>
52 
53 #include <net/bpf.h>
54 
55 
56 /*
57  * if_vioifreg.h:
58  */
59 /* Configuration registers */
60 #define VIRTIO_NET_CONFIG_MAC		0 /* 8bit x 6byte */
61 #define VIRTIO_NET_CONFIG_STATUS	6 /* 16bit */
62 
63 /* Feature bits */
64 #define VIRTIO_NET_F_CSUM	(1<<0)
65 #define VIRTIO_NET_F_GUEST_CSUM	(1<<1)
66 #define VIRTIO_NET_F_MAC	(1<<5)
67 #define VIRTIO_NET_F_GSO	(1<<6)
68 #define VIRTIO_NET_F_GUEST_TSO4	(1<<7)
69 #define VIRTIO_NET_F_GUEST_TSO6	(1<<8)
70 #define VIRTIO_NET_F_GUEST_ECN	(1<<9)
71 #define VIRTIO_NET_F_GUEST_UFO	(1<<10)
72 #define VIRTIO_NET_F_HOST_TSO4	(1<<11)
73 #define VIRTIO_NET_F_HOST_TSO6	(1<<12)
74 #define VIRTIO_NET_F_HOST_ECN	(1<<13)
75 #define VIRTIO_NET_F_HOST_UFO	(1<<14)
76 #define VIRTIO_NET_F_MRG_RXBUF	(1<<15)
77 #define VIRTIO_NET_F_STATUS	(1<<16)
78 #define VIRTIO_NET_F_CTRL_VQ	(1<<17)
79 #define VIRTIO_NET_F_CTRL_RX	(1<<18)
80 #define VIRTIO_NET_F_CTRL_VLAN	(1<<19)
81 
82 /* Status */
83 #define VIRTIO_NET_S_LINK_UP	1
84 
85 /* Packet header structure */
86 struct virtio_net_hdr {
87 	uint8_t		flags;
88 	uint8_t		gso_type;
89 	uint16_t	hdr_len;
90 	uint16_t	gso_size;
91 	uint16_t	csum_start;
92 	uint16_t	csum_offset;
93 #if 0
94 	uint16_t	num_buffers; /* if VIRTIO_NET_F_MRG_RXBUF enabled */
95 #endif
96 } __packed;
97 
98 #define VIRTIO_NET_HDR_F_NEEDS_CSUM	1 /* flags */
99 #define VIRTIO_NET_HDR_GSO_NONE		0 /* gso_type */
100 #define VIRTIO_NET_HDR_GSO_TCPV4	1 /* gso_type */
101 #define VIRTIO_NET_HDR_GSO_UDP		3 /* gso_type */
102 #define VIRTIO_NET_HDR_GSO_TCPV6	4 /* gso_type */
103 #define VIRTIO_NET_HDR_GSO_ECN		0x80 /* gso_type, |'ed */
104 
105 #define VIRTIO_NET_MAX_GSO_LEN		(65536+ETHER_HDR_LEN)
106 
107 /* Control virtqueue */
108 struct virtio_net_ctrl_cmd {
109 	uint8_t	class;
110 	uint8_t	command;
111 } __packed;
112 #define VIRTIO_NET_CTRL_RX		0
113 # define VIRTIO_NET_CTRL_RX_PROMISC	0
114 # define VIRTIO_NET_CTRL_RX_ALLMULTI	1
115 
116 #define VIRTIO_NET_CTRL_MAC		1
117 # define VIRTIO_NET_CTRL_MAC_TABLE_SET	0
118 
119 #define VIRTIO_NET_CTRL_VLAN		2
120 # define VIRTIO_NET_CTRL_VLAN_ADD	0
121 # define VIRTIO_NET_CTRL_VLAN_DEL	1
122 
123 struct virtio_net_ctrl_status {
124 	uint8_t	ack;
125 } __packed;
126 #define VIRTIO_NET_OK			0
127 #define VIRTIO_NET_ERR			1
128 
129 struct virtio_net_ctrl_rx {
130 	uint8_t	onoff;
131 } __packed;
132 
133 struct virtio_net_ctrl_mac_tbl {
134 	uint32_t nentries;
135 	uint8_t macs[][ETHER_ADDR_LEN];
136 } __packed;
137 
138 struct virtio_net_ctrl_vlan {
139 	uint16_t id;
140 } __packed;
141 
142 
143 /*
144  * if_vioifvar.h:
145  */
146 struct vioif_softc {
147 	device_t		sc_dev;
148 
149 	struct virtio_softc	*sc_virtio;
150 	struct virtqueue	sc_vq[3];
151 
152 	uint8_t			sc_mac[ETHER_ADDR_LEN];
153 	struct ethercom		sc_ethercom;
154 	short			sc_ifflags;
155 
156 	/* bus_dmamem */
157 	bus_dma_segment_t	sc_hdr_segs[1];
158 	struct virtio_net_hdr	*sc_hdrs;
159 #define sc_rx_hdrs	sc_hdrs
160 	struct virtio_net_hdr	*sc_tx_hdrs;
161 	struct virtio_net_ctrl_cmd *sc_ctrl_cmd;
162 	struct virtio_net_ctrl_status *sc_ctrl_status;
163 	struct virtio_net_ctrl_rx *sc_ctrl_rx;
164 	struct virtio_net_ctrl_mac_tbl *sc_ctrl_mac_tbl_uc;
165 	struct virtio_net_ctrl_mac_tbl *sc_ctrl_mac_tbl_mc;
166 
167 	/* kmem */
168 	bus_dmamap_t		*sc_arrays;
169 #define sc_rxhdr_dmamaps sc_arrays
170 	bus_dmamap_t		*sc_txhdr_dmamaps;
171 	bus_dmamap_t		*sc_rx_dmamaps;
172 	bus_dmamap_t		*sc_tx_dmamaps;
173 	struct mbuf		**sc_rx_mbufs;
174 	struct mbuf		**sc_tx_mbufs;
175 
176 	bus_dmamap_t		sc_ctrl_cmd_dmamap;
177 	bus_dmamap_t		sc_ctrl_status_dmamap;
178 	bus_dmamap_t		sc_ctrl_rx_dmamap;
179 	bus_dmamap_t		sc_ctrl_tbl_uc_dmamap;
180 	bus_dmamap_t		sc_ctrl_tbl_mc_dmamap;
181 
182 	void			*sc_rx_softint;
183 
184 	enum {
185 		FREE, INUSE, DONE
186 	}			sc_ctrl_inuse;
187 	kcondvar_t		sc_ctrl_wait;
188 	kmutex_t		sc_ctrl_wait_lock;
189 };
190 #define VIRTIO_NET_TX_MAXNSEGS		(16) /* XXX */
191 #define VIRTIO_NET_CTRL_MAC_MAXENTRIES	(64) /* XXX */
192 
193 /* cfattach interface functions */
194 static int	vioif_match(device_t, cfdata_t, void *);
195 static void	vioif_attach(device_t, device_t, void *);
196 static void	vioif_deferred_init(device_t);
197 
198 /* ifnet interface functions */
199 static int	vioif_init(struct ifnet *);
200 static void	vioif_stop(struct ifnet *, int);
201 static void	vioif_start(struct ifnet *);
202 static int	vioif_ioctl(struct ifnet *, u_long, void *);
203 static void	vioif_watchdog(struct ifnet *);
204 
205 /* rx */
206 static int	vioif_add_rx_mbuf(struct vioif_softc *, int);
207 static void	vioif_free_rx_mbuf(struct vioif_softc *, int);
208 static void	vioif_populate_rx_mbufs(struct vioif_softc *);
209 static int	vioif_rx_deq(struct vioif_softc *);
210 static int	vioif_rx_vq_done(struct virtqueue *);
211 static void	vioif_rx_softint(void *);
212 static void	vioif_rx_drain(struct vioif_softc *);
213 
214 /* tx */
215 static int	vioif_tx_vq_done(struct virtqueue *);
216 static void	vioif_tx_drain(struct vioif_softc *);
217 
218 /* other control */
219 static int	vioif_updown(struct vioif_softc *, bool);
220 static int	vioif_ctrl_rx(struct vioif_softc *, int, bool);
221 static int	vioif_set_promisc(struct vioif_softc *, bool);
222 static int	vioif_set_allmulti(struct vioif_softc *, bool);
223 static int	vioif_set_rx_filter(struct vioif_softc *);
224 static int	vioif_rx_filter(struct vioif_softc *);
225 static int	vioif_ctrl_vq_done(struct virtqueue *);
226 
227 CFATTACH_DECL_NEW(vioif, sizeof(struct vioif_softc),
228 		  vioif_match, vioif_attach, NULL, NULL);
229 
230 static int
231 vioif_match(device_t parent, cfdata_t match, void *aux)
232 {
233 	struct virtio_softc *va = aux;
234 
235 	if (va->sc_childdevid == PCI_PRODUCT_VIRTIO_NETWORK)
236 		return 1;
237 
238 	return 0;
239 }
240 
241 /* allocate memory */
242 /*
243  * dma memory is used for:
244  *   sc_rx_hdrs[slot]:	 metadata array for recieved frames (READ)
245  *   sc_tx_hdrs[slot]:	 metadata array for frames to be sent (WRITE)
246  *   sc_ctrl_cmd:	 command to be sent via ctrl vq (WRITE)
247  *   sc_ctrl_status:	 return value for a command via ctrl vq (READ)
248  *   sc_ctrl_rx:	 parameter for a VIRTIO_NET_CTRL_RX class command
249  *			 (WRITE)
250  *   sc_ctrl_mac_tbl_uc: unicast MAC address filter for a VIRTIO_NET_CTRL_MAC
251  *			 class command (WRITE)
252  *   sc_ctrl_mac_tbl_mc: multicast MAC address filter for a VIRTIO_NET_CTRL_MAC
253  *			 class command (WRITE)
254  * sc_ctrl_* structures are allocated only one each; they are protected by
255  * sc_ctrl_inuse variable and sc_ctrl_wait condvar.
256  */
257 /*
258  * dynamically allocated memory is used for:
259  *   sc_rxhdr_dmamaps[slot]:	bus_dmamap_t array for sc_rx_hdrs[slot]
260  *   sc_txhdr_dmamaps[slot]:	bus_dmamap_t array for sc_tx_hdrs[slot]
261  *   sc_rx_dmamaps[slot]:	bus_dmamap_t array for recieved payload
262  *   sc_tx_dmamaps[slot]:	bus_dmamap_t array for sent payload
263  *   sc_rx_mbufs[slot]:		mbuf pointer array for recieved frames
264  *   sc_tx_mbufs[slot]:		mbuf pointer array for sent frames
265  */
266 static int
267 vioif_alloc_mems(struct vioif_softc *sc)
268 {
269 	struct virtio_softc *vsc = sc->sc_virtio;
270 	int allocsize, allocsize2, r, rsegs, i;
271 	void *vaddr;
272 	intptr_t p;
273 	int rxqsize, txqsize;
274 
275 	rxqsize = vsc->sc_vqs[0].vq_num;
276 	txqsize = vsc->sc_vqs[1].vq_num;
277 
278 	allocsize = sizeof(struct virtio_net_hdr) * rxqsize;
279 	allocsize += sizeof(struct virtio_net_hdr) * txqsize;
280 	if (vsc->sc_nvqs == 3) {
281 		allocsize += sizeof(struct virtio_net_ctrl_cmd) * 1;
282 		allocsize += sizeof(struct virtio_net_ctrl_status) * 1;
283 		allocsize += sizeof(struct virtio_net_ctrl_rx) * 1;
284 		allocsize += sizeof(struct virtio_net_ctrl_mac_tbl)
285 			+ sizeof(struct virtio_net_ctrl_mac_tbl)
286 			+ ETHER_ADDR_LEN * VIRTIO_NET_CTRL_MAC_MAXENTRIES;
287 	}
288 	r = bus_dmamem_alloc(vsc->sc_dmat, allocsize, 0, 0,
289 			     &sc->sc_hdr_segs[0], 1, &rsegs, BUS_DMA_NOWAIT);
290 	if (r != 0) {
291 		aprint_error_dev(sc->sc_dev,
292 				 "DMA memory allocation failed, size %d, "
293 				 "error code %d\n", allocsize, r);
294 		goto err_none;
295 	}
296 	r = bus_dmamem_map(vsc->sc_dmat,
297 			   &sc->sc_hdr_segs[0], 1, allocsize,
298 			   &vaddr, BUS_DMA_NOWAIT);
299 	if (r != 0) {
300 		aprint_error_dev(sc->sc_dev,
301 				 "DMA memory map failed, "
302 				 "error code %d\n", r);
303 		goto err_dmamem_alloc;
304 	}
305 	sc->sc_hdrs = vaddr;
306 	memset(vaddr, 0, allocsize);
307 	p = (intptr_t) vaddr;
308 	p += sizeof(struct virtio_net_hdr) * rxqsize;
309 #define P(name,size)	do { sc->sc_ ##name = (void*) p;	\
310 			     p += size; } while (0)
311 	P(tx_hdrs, sizeof(struct virtio_net_hdr) * txqsize);
312 	if (vsc->sc_nvqs == 3) {
313 		P(ctrl_cmd, sizeof(struct virtio_net_ctrl_cmd));
314 		P(ctrl_status, sizeof(struct virtio_net_ctrl_status));
315 		P(ctrl_rx, sizeof(struct virtio_net_ctrl_rx));
316 		P(ctrl_mac_tbl_uc, sizeof(struct virtio_net_ctrl_mac_tbl));
317 		P(ctrl_mac_tbl_mc,
318 		  (sizeof(struct virtio_net_ctrl_mac_tbl)
319 		   + ETHER_ADDR_LEN * VIRTIO_NET_CTRL_MAC_MAXENTRIES));
320 	}
321 #undef P
322 
323 	allocsize2 = sizeof(bus_dmamap_t) * (rxqsize + txqsize);
324 	allocsize2 += sizeof(bus_dmamap_t) * (rxqsize + txqsize);
325 	allocsize2 += sizeof(struct mbuf*) * (rxqsize + txqsize);
326 	sc->sc_arrays = kmem_zalloc(allocsize2, KM_SLEEP);
327 	if (sc->sc_arrays == NULL)
328 		goto err_dmamem_map;
329 	sc->sc_txhdr_dmamaps = sc->sc_arrays + rxqsize;
330 	sc->sc_rx_dmamaps = sc->sc_txhdr_dmamaps + txqsize;
331 	sc->sc_tx_dmamaps = sc->sc_rx_dmamaps + rxqsize;
332 	sc->sc_rx_mbufs = (void*) (sc->sc_tx_dmamaps + txqsize);
333 	sc->sc_tx_mbufs = sc->sc_rx_mbufs + rxqsize;
334 
335 #define C(map, buf, size, nsegs, rw, usage)				\
336 	do {								\
337 		r = bus_dmamap_create(vsc->sc_dmat, size, nsegs, size, 0, \
338 				      BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW,	\
339 				      &sc->sc_ ##map);			\
340 		if (r != 0) {						\
341 			aprint_error_dev(sc->sc_dev,			\
342 					 usage " dmamap creation failed, " \
343 					 "error code %d\n", r);		\
344 					 goto err_reqs;			\
345 		}							\
346 	} while (0)
347 #define C_L1(map, buf, size, nsegs, rw, usage)				\
348 	C(map, buf, size, nsegs, rw, usage);				\
349 	do {								\
350 		r = bus_dmamap_load(vsc->sc_dmat, sc->sc_ ##map,	\
351 				    &sc->sc_ ##buf, size, NULL,		\
352 				    BUS_DMA_ ##rw | BUS_DMA_NOWAIT);	\
353 		if (r != 0) {						\
354 			aprint_error_dev(sc->sc_dev,			\
355 					 usage " dmamap load failed, "	\
356 					 "error code %d\n", r);		\
357 			goto err_reqs;					\
358 		}							\
359 	} while (0)
360 #define C_L2(map, buf, size, nsegs, rw, usage)				\
361 	C(map, buf, size, nsegs, rw, usage);				\
362 	do {								\
363 		r = bus_dmamap_load(vsc->sc_dmat, sc->sc_ ##map,	\
364 				    sc->sc_ ##buf, size, NULL,		\
365 				    BUS_DMA_ ##rw | BUS_DMA_NOWAIT);	\
366 		if (r != 0) {						\
367 			aprint_error_dev(sc->sc_dev,			\
368 					 usage " dmamap load failed, "	\
369 					 "error code %d\n", r);		\
370 			goto err_reqs;					\
371 		}							\
372 	} while (0)
373 	for (i = 0; i < rxqsize; i++) {
374 		C_L1(rxhdr_dmamaps[i], rx_hdrs[i],
375 		    sizeof(struct virtio_net_hdr), 1,
376 		    READ, "rx header");
377 		C(rx_dmamaps[i], NULL, MCLBYTES, 1, 0, "rx payload");
378 	}
379 
380 	for (i = 0; i < txqsize; i++) {
381 		C_L1(txhdr_dmamaps[i], rx_hdrs[i],
382 		    sizeof(struct virtio_net_hdr), 1,
383 		    WRITE, "tx header");
384 		C(tx_dmamaps[i], NULL, ETHER_MAX_LEN, 256 /* XXX */, 0,
385 		  "tx payload");
386 	}
387 
388 	if (vsc->sc_nvqs == 3) {
389 		/* control vq class & command */
390 		C_L2(ctrl_cmd_dmamap, ctrl_cmd,
391 		    sizeof(struct virtio_net_ctrl_cmd), 1, WRITE,
392 		    "control command");
393 
394 		/* control vq status */
395 		C_L2(ctrl_status_dmamap, ctrl_status,
396 		    sizeof(struct virtio_net_ctrl_status), 1, READ,
397 		    "control status");
398 
399 		/* control vq rx mode command parameter */
400 		C_L2(ctrl_rx_dmamap, ctrl_rx,
401 		    sizeof(struct virtio_net_ctrl_rx), 1, WRITE,
402 		    "rx mode control command");
403 
404 		/* control vq MAC filter table for unicast */
405 		/* do not load now since its length is variable */
406 		C(ctrl_tbl_uc_dmamap, NULL,
407 		  sizeof(struct virtio_net_ctrl_mac_tbl) + 0, 1, WRITE,
408 		  "unicast MAC address filter command");
409 
410 		/* control vq MAC filter table for multicast */
411 		C(ctrl_tbl_mc_dmamap, NULL,
412 		  (sizeof(struct virtio_net_ctrl_mac_tbl)
413 		   + ETHER_ADDR_LEN * VIRTIO_NET_CTRL_MAC_MAXENTRIES),
414 		  1, WRITE, "multicast MAC address filter command");
415 	}
416 #undef C_L2
417 #undef C_L1
418 #undef C
419 
420 	return 0;
421 
422 err_reqs:
423 #define D(map)								\
424 	do {								\
425 		if (sc->sc_ ##map) {					\
426 			bus_dmamap_destroy(vsc->sc_dmat, sc->sc_ ##map); \
427 			sc->sc_ ##map = NULL;				\
428 		}							\
429 	} while (0)
430 	D(ctrl_tbl_mc_dmamap);
431 	D(ctrl_tbl_uc_dmamap);
432 	D(ctrl_rx_dmamap);
433 	D(ctrl_status_dmamap);
434 	D(ctrl_cmd_dmamap);
435 	for (i = 0; i < txqsize; i++) {
436 		D(tx_dmamaps[i]);
437 		D(txhdr_dmamaps[i]);
438 	}
439 	for (i = 0; i < rxqsize; i++) {
440 		D(rx_dmamaps[i]);
441 		D(rxhdr_dmamaps[i]);
442 	}
443 #undef D
444 	if (sc->sc_arrays) {
445 		kmem_free(sc->sc_arrays, allocsize2);
446 		sc->sc_arrays = 0;
447 	}
448 err_dmamem_map:
449 	bus_dmamem_unmap(vsc->sc_dmat, sc->sc_hdrs, allocsize);
450 err_dmamem_alloc:
451 	bus_dmamem_free(vsc->sc_dmat, &sc->sc_hdr_segs[0], 1);
452 err_none:
453 	return -1;
454 }
455 
456 static void
457 vioif_attach(device_t parent, device_t self, void *aux)
458 {
459 	struct vioif_softc *sc = device_private(self);
460 	struct virtio_softc *vsc = device_private(parent);
461 	uint32_t features;
462 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
463 
464 	if (vsc->sc_child != NULL) {
465 		aprint_normal(": child already attached for %s; "
466 			      "something wrong...\n",
467 			      device_xname(parent));
468 		return;
469 	}
470 
471 	sc->sc_dev = self;
472 	sc->sc_virtio = vsc;
473 
474 	vsc->sc_child = self;
475 	vsc->sc_ipl = IPL_NET;
476 	vsc->sc_vqs = &sc->sc_vq[0];
477 	vsc->sc_config_change = 0;
478 	vsc->sc_intrhand = virtio_vq_intr;
479 
480 	features = virtio_negotiate_features(vsc,
481 					     (VIRTIO_NET_F_MAC |
482 					      VIRTIO_NET_F_STATUS |
483 					      VIRTIO_NET_F_CTRL_VQ |
484 					      VIRTIO_NET_F_CTRL_RX |
485 					      VIRTIO_F_NOTIFY_ON_EMPTY));
486 	if (features & VIRTIO_NET_F_MAC) {
487 		sc->sc_mac[0] = virtio_read_device_config_1(vsc,
488 						    VIRTIO_NET_CONFIG_MAC+0);
489 		sc->sc_mac[1] = virtio_read_device_config_1(vsc,
490 						    VIRTIO_NET_CONFIG_MAC+1);
491 		sc->sc_mac[2] = virtio_read_device_config_1(vsc,
492 						    VIRTIO_NET_CONFIG_MAC+2);
493 		sc->sc_mac[3] = virtio_read_device_config_1(vsc,
494 						    VIRTIO_NET_CONFIG_MAC+3);
495 		sc->sc_mac[4] = virtio_read_device_config_1(vsc,
496 						    VIRTIO_NET_CONFIG_MAC+4);
497 		sc->sc_mac[5] = virtio_read_device_config_1(vsc,
498 						    VIRTIO_NET_CONFIG_MAC+5);
499 	} else {
500 		/* code stolen from sys/net/if_tap.c */
501 		struct timeval tv;
502 		uint32_t ui;
503 		getmicrouptime(&tv);
504 		ui = (tv.tv_sec ^ tv.tv_usec) & 0xffffff;
505 		memcpy(sc->sc_mac+3, (uint8_t *)&ui, 3);
506 		virtio_write_device_config_1(vsc,
507 					     VIRTIO_NET_CONFIG_MAC+0,
508 					     sc->sc_mac[0]);
509 		virtio_write_device_config_1(vsc,
510 					     VIRTIO_NET_CONFIG_MAC+1,
511 					     sc->sc_mac[1]);
512 		virtio_write_device_config_1(vsc,
513 					     VIRTIO_NET_CONFIG_MAC+2,
514 					     sc->sc_mac[2]);
515 		virtio_write_device_config_1(vsc,
516 					     VIRTIO_NET_CONFIG_MAC+3,
517 					     sc->sc_mac[3]);
518 		virtio_write_device_config_1(vsc,
519 					     VIRTIO_NET_CONFIG_MAC+4,
520 					     sc->sc_mac[4]);
521 		virtio_write_device_config_1(vsc,
522 					     VIRTIO_NET_CONFIG_MAC+5,
523 					     sc->sc_mac[5]);
524 	}
525 	aprint_normal(": Ethernet address %s\n", ether_sprintf(sc->sc_mac));
526 	aprint_naive("\n");
527 
528 	if (virtio_alloc_vq(vsc, &sc->sc_vq[0], 0,
529 			    MCLBYTES+sizeof(struct virtio_net_hdr), 2,
530 			    "rx") != 0) {
531 		goto err;
532 	}
533 	vsc->sc_nvqs = 1;
534 	sc->sc_vq[0].vq_done = vioif_rx_vq_done;
535 	if (virtio_alloc_vq(vsc, &sc->sc_vq[1], 1,
536 			    (sizeof(struct virtio_net_hdr)
537 			     + (ETHER_MAX_LEN - ETHER_HDR_LEN)),
538 			    VIRTIO_NET_TX_MAXNSEGS + 1,
539 			    "tx") != 0) {
540 		goto err;
541 	}
542 	vsc->sc_nvqs = 2;
543 	sc->sc_vq[1].vq_done = vioif_tx_vq_done;
544 	virtio_start_vq_intr(vsc, &sc->sc_vq[0]);
545 	virtio_stop_vq_intr(vsc, &sc->sc_vq[1]); /* not urgent; do it later */
546 	if ((features & VIRTIO_NET_F_CTRL_VQ)
547 	    && (features & VIRTIO_NET_F_CTRL_RX)) {
548 		if (virtio_alloc_vq(vsc, &sc->sc_vq[2], 2,
549 				    NBPG, 1, "control") == 0) {
550 			sc->sc_vq[2].vq_done = vioif_ctrl_vq_done;
551 			cv_init(&sc->sc_ctrl_wait, "ctrl_vq");
552 			mutex_init(&sc->sc_ctrl_wait_lock,
553 				   MUTEX_DEFAULT, IPL_NET);
554 			sc->sc_ctrl_inuse = FREE;
555 			virtio_start_vq_intr(vsc, &sc->sc_vq[2]);
556 			vsc->sc_nvqs = 3;
557 		}
558 	}
559 
560 	sc->sc_rx_softint = softint_establish(SOFTINT_NET|SOFTINT_MPSAFE,
561 					      vioif_rx_softint, sc);
562 	if (sc->sc_rx_softint == NULL) {
563 		aprint_error_dev(self, "cannot establish softint\n");
564 		goto err;
565 	}
566 
567 	if (vioif_alloc_mems(sc) < 0)
568 		goto err;
569 	if (vsc->sc_nvqs == 3)
570 		config_interrupts(self, vioif_deferred_init);
571 
572 	strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
573 	ifp->if_softc = sc;
574 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
575 	ifp->if_start = vioif_start;
576 	ifp->if_ioctl = vioif_ioctl;
577 	ifp->if_init = vioif_init;
578 	ifp->if_stop = vioif_stop;
579 	ifp->if_capabilities = 0;
580 	ifp->if_watchdog = vioif_watchdog;
581 
582 	if_attach(ifp);
583 	ether_ifattach(ifp, sc->sc_mac);
584 
585 	return;
586 
587 err:
588 	if (vsc->sc_nvqs == 3) {
589 		virtio_free_vq(vsc, &sc->sc_vq[2]);
590 		cv_destroy(&sc->sc_ctrl_wait);
591 		mutex_destroy(&sc->sc_ctrl_wait_lock);
592 		vsc->sc_nvqs = 2;
593 	}
594 	if (vsc->sc_nvqs == 2) {
595 		virtio_free_vq(vsc, &sc->sc_vq[1]);
596 		vsc->sc_nvqs = 1;
597 	}
598 	if (vsc->sc_nvqs == 1) {
599 		virtio_free_vq(vsc, &sc->sc_vq[0]);
600 		vsc->sc_nvqs = 0;
601 	}
602 	vsc->sc_child = (void*)1;
603 	return;
604 }
605 
606 /* we need interrupts to make promiscuous mode off */
607 static void
608 vioif_deferred_init(device_t self)
609 {
610 	struct vioif_softc *sc = device_private(self);
611 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
612 	int r;
613 
614 	r =  vioif_set_promisc(sc, false);
615 	if (r != 0)
616 		aprint_error_dev(self, "resetting promisc mode failed, "
617 				 "errror code %d\n", r);
618 	else
619 		ifp->if_flags &= ~IFF_PROMISC;
620 }
621 
622 /*
623  * Interface functions for ifnet
624  */
625 static int
626 vioif_init(struct ifnet *ifp)
627 {
628 	struct vioif_softc *sc = ifp->if_softc;
629 
630 	vioif_stop(ifp, 0);
631 	vioif_populate_rx_mbufs(sc);
632 	vioif_updown(sc, true);
633 	ifp->if_flags |= IFF_RUNNING;
634 	ifp->if_flags &= ~IFF_OACTIVE;
635 	vioif_rx_filter(sc);
636 
637 	return 0;
638 }
639 
640 static void
641 vioif_stop(struct ifnet *ifp, int disable)
642 {
643 	struct vioif_softc *sc = ifp->if_softc;
644 	struct virtio_softc *vsc = sc->sc_virtio;
645 
646 	/* only way to stop I/O and DMA is resetting... */
647 	virtio_reset(vsc);
648 	vioif_rx_deq(sc);
649 	vioif_tx_drain(sc);
650 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
651 
652 	if (disable)
653 		vioif_rx_drain(sc);
654 
655 	virtio_reinit_start(vsc);
656 	virtio_negotiate_features(vsc, vsc->sc_features);
657 	virtio_start_vq_intr(vsc, &sc->sc_vq[0]);
658 	virtio_stop_vq_intr(vsc, &sc->sc_vq[1]);
659 	if (vsc->sc_nvqs >= 3)
660 		virtio_start_vq_intr(vsc, &sc->sc_vq[2]);
661 	virtio_reinit_end(vsc);
662 	vioif_updown(sc, false);
663 }
664 
665 static void
666 vioif_start(struct ifnet *ifp)
667 {
668 	struct vioif_softc *sc = ifp->if_softc;
669 	struct virtio_softc *vsc = sc->sc_virtio;
670 	struct virtqueue *vq = &sc->sc_vq[1]; /* tx vq */
671 	struct mbuf *m;
672 	int queued = 0, retry = 0;
673 
674 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
675 		return;
676 
677 	for (;;) {
678 		int slot, r;
679 
680 		IFQ_POLL(&ifp->if_snd, m);
681 		if (m == NULL)
682 			break;
683 
684 		r = virtio_enqueue_prep(vsc, vq, &slot);
685 		if (r == EAGAIN) {
686 			ifp->if_flags |= IFF_OACTIVE;
687 			vioif_tx_vq_done(vq);
688 			if (retry++ == 0)
689 				continue;
690 			else
691 				break;
692 		}
693 		if (r != 0)
694 			panic("enqueue_prep for a tx buffer");
695 		r = bus_dmamap_load_mbuf(vsc->sc_dmat,
696 					 sc->sc_tx_dmamaps[slot],
697 					 m, BUS_DMA_WRITE|BUS_DMA_NOWAIT);
698 		if (r != 0) {
699 			virtio_enqueue_abort(vsc, vq, slot);
700 			printf("%s: tx dmamap load failed, error code %d\n",
701 			       device_xname(sc->sc_dev), r);
702 			break;
703 		}
704 		r = virtio_enqueue_reserve(vsc, vq, slot,
705 					sc->sc_tx_dmamaps[slot]->dm_nsegs + 1);
706 		if (r != 0) {
707 			bus_dmamap_unload(vsc->sc_dmat,
708 					  sc->sc_tx_dmamaps[slot]);
709 			ifp->if_flags |= IFF_OACTIVE;
710 			vioif_tx_vq_done(vq);
711 			if (retry++ == 0)
712 				continue;
713 			else
714 				break;
715 		}
716 		IFQ_DEQUEUE(&ifp->if_snd, m);
717 		sc->sc_tx_mbufs[slot] = m;
718 
719 		memset(&sc->sc_tx_hdrs[slot], 0, sizeof(struct virtio_net_hdr));
720 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_tx_dmamaps[slot],
721 				0, sc->sc_tx_dmamaps[slot]->dm_mapsize,
722 				BUS_DMASYNC_PREWRITE);
723 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_txhdr_dmamaps[slot],
724 				0, sc->sc_txhdr_dmamaps[slot]->dm_mapsize,
725 				BUS_DMASYNC_PREWRITE);
726 		virtio_enqueue(vsc, vq, slot, sc->sc_txhdr_dmamaps[slot], true);
727 		virtio_enqueue(vsc, vq, slot, sc->sc_tx_dmamaps[slot], true);
728 		virtio_enqueue_commit(vsc, vq, slot, false);
729 		queued++;
730 		bpf_mtap(ifp, m);
731 	}
732 
733 	if (queued > 0) {
734 		virtio_enqueue_commit(vsc, vq, -1, true);
735 		ifp->if_timer = 5;
736 	}
737 }
738 
739 static int
740 vioif_ioctl(struct ifnet *ifp, u_long cmd, void *data)
741 {
742 	int s, r;
743 
744 	s = splnet();
745 
746 	r = ether_ioctl(ifp, cmd, data);
747 	if ((r == 0 && cmd == SIOCSIFFLAGS) ||
748 	    (r == ENETRESET && (cmd == SIOCADDMULTI || cmd == SIOCDELMULTI))) {
749 		if (ifp->if_flags & IFF_RUNNING)
750 			r = vioif_rx_filter(ifp->if_softc);
751 		else
752 			r = 0;
753 	}
754 
755 	splx(s);
756 
757 	return r;
758 }
759 
760 void
761 vioif_watchdog(struct ifnet *ifp)
762 {
763 	struct vioif_softc *sc = ifp->if_softc;
764 
765 	if (ifp->if_flags & IFF_RUNNING)
766 		vioif_tx_vq_done(&sc->sc_vq[1]);
767 }
768 
769 
770 /*
771  * Recieve implementation
772  */
773 /* allocate and initialize a mbuf for recieve */
774 static int
775 vioif_add_rx_mbuf(struct vioif_softc *sc, int i)
776 {
777 	struct mbuf *m;
778 	int r;
779 
780 	MGETHDR(m, M_DONTWAIT, MT_DATA);
781 	if (m == NULL)
782 		return ENOBUFS;
783 	MCLGET(m, M_DONTWAIT);
784 	if ((m->m_flags & M_EXT) == 0) {
785 		m_freem(m);
786 		return ENOBUFS;
787 	}
788 	sc->sc_rx_mbufs[i] = m;
789 	m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
790 	r = bus_dmamap_load_mbuf(sc->sc_virtio->sc_dmat,
791 				 sc->sc_rx_dmamaps[i],
792 				 m, BUS_DMA_READ|BUS_DMA_NOWAIT);
793 	if (r) {
794 		m_freem(m);
795 		sc->sc_rx_mbufs[i] = 0;
796 		return r;
797 	}
798 
799 	return 0;
800 }
801 
802 /* free a mbuf for recieve */
803 static void
804 vioif_free_rx_mbuf(struct vioif_softc *sc, int i)
805 {
806 	bus_dmamap_unload(sc->sc_virtio->sc_dmat, sc->sc_rx_dmamaps[i]);
807 	m_freem(sc->sc_rx_mbufs[i]);
808 	sc->sc_rx_mbufs[i] = NULL;
809 }
810 
811 /* add mbufs for all the empty recieve slots */
812 static void
813 vioif_populate_rx_mbufs(struct vioif_softc *sc)
814 {
815 	struct virtio_softc *vsc = sc->sc_virtio;
816 	int i, r, ndone = 0;
817 	struct virtqueue *vq = &sc->sc_vq[0]; /* rx vq */
818 
819 	for (i = 0; i < vq->vq_num; i++) {
820 		int slot;
821 		r = virtio_enqueue_prep(vsc, vq, &slot);
822 		if (r == EAGAIN)
823 			break;
824 		if (r != 0)
825 			panic("enqueue_prep for rx buffers");
826 		if (sc->sc_rx_mbufs[slot] == NULL) {
827 			r = vioif_add_rx_mbuf(sc, slot);
828 			if (r != 0) {
829 				printf("%s: rx mbuf allocation failed, "
830 				       "error code %d\n",
831 				       device_xname(sc->sc_dev), r);
832 				break;
833 			}
834 		}
835 		r = virtio_enqueue_reserve(vsc, vq, slot,
836 					sc->sc_rx_dmamaps[slot]->dm_nsegs + 1);
837 		if (r != 0) {
838 			vioif_free_rx_mbuf(sc, slot);
839 			break;
840 		}
841 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_rxhdr_dmamaps[slot],
842 			0, sizeof(struct virtio_net_hdr), BUS_DMASYNC_PREREAD);
843 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_rx_dmamaps[slot],
844 			0, MCLBYTES, BUS_DMASYNC_PREREAD);
845 		virtio_enqueue(vsc, vq, slot, sc->sc_rxhdr_dmamaps[slot], false);
846 		virtio_enqueue(vsc, vq, slot, sc->sc_rx_dmamaps[slot], false);
847 		virtio_enqueue_commit(vsc, vq, slot, false);
848 		ndone++;
849 	}
850 	if (ndone > 0)
851 		virtio_enqueue_commit(vsc, vq, -1, true);
852 }
853 
854 /* dequeue recieved packets */
855 static int
856 vioif_rx_deq(struct vioif_softc *sc)
857 {
858 	struct virtio_softc *vsc = sc->sc_virtio;
859 	struct virtqueue *vq = &sc->sc_vq[0];
860 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
861 	struct mbuf *m;
862 	int r = 0;
863 	int slot, len;
864 
865 	while (virtio_dequeue(vsc, vq, &slot, &len) == 0) {
866 		len -= sizeof(struct virtio_net_hdr);
867 		r = 1;
868 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_rxhdr_dmamaps[slot],
869 				0, sizeof(struct virtio_net_hdr),
870 				BUS_DMASYNC_POSTREAD);
871 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_rx_dmamaps[slot],
872 				0, MCLBYTES,
873 				BUS_DMASYNC_POSTREAD);
874 		m = sc->sc_rx_mbufs[slot];
875 		KASSERT(m != NULL);
876 		bus_dmamap_unload(vsc->sc_dmat, sc->sc_rx_dmamaps[slot]);
877 		sc->sc_rx_mbufs[slot] = 0;
878 		virtio_dequeue_commit(vsc, vq, slot);
879 		m->m_pkthdr.rcvif = ifp;
880 		m->m_len = m->m_pkthdr.len = len;
881 		ifp->if_ipackets++;
882 		bpf_mtap(ifp, m);
883 		(*ifp->if_input)(ifp, m);
884 	}
885 
886 	return r;
887 }
888 
889 /* rx interrupt; call _dequeue above and schedule a softint */
890 static int
891 vioif_rx_vq_done(struct virtqueue *vq)
892 {
893 	struct virtio_softc *vsc = vq->vq_owner;
894 	struct vioif_softc *sc = device_private(vsc->sc_child);
895 	int r;
896 
897 	r = vioif_rx_deq(sc);
898 	if (r)
899 		softint_schedule(sc->sc_rx_softint);
900 
901 	return r;
902 }
903 
904 /* softint: enqueue recieve requests for new incoming packets */
905 static void
906 vioif_rx_softint(void *arg)
907 {
908 	struct vioif_softc *sc = arg;
909 
910 	vioif_populate_rx_mbufs(sc);
911 }
912 
913 /* free all the mbufs; called from if_stop(disable) */
914 static void
915 vioif_rx_drain(struct vioif_softc *sc)
916 {
917 	struct virtqueue *vq = &sc->sc_vq[0];
918 	int i;
919 
920 	for (i = 0; i < vq->vq_num; i++) {
921 		if (sc->sc_rx_mbufs[i] == NULL)
922 			continue;
923 		vioif_free_rx_mbuf(sc, i);
924 	}
925 }
926 
927 
928 /*
929  * Transmition implementation
930  */
931 /* actual transmission is done in if_start */
932 /* tx interrupt; dequeue and free mbufs */
933 /*
934  * tx interrupt is actually disabled; this should be called upon
935  * tx vq full and watchdog
936  */
937 static int
938 vioif_tx_vq_done(struct virtqueue *vq)
939 {
940 	struct virtio_softc *vsc = vq->vq_owner;
941 	struct vioif_softc *sc = device_private(vsc->sc_child);
942 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
943 	struct mbuf *m;
944 	int r = 0;
945 	int slot, len;
946 
947 	while (virtio_dequeue(vsc, vq, &slot, &len) == 0) {
948 		r++;
949 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_txhdr_dmamaps[slot],
950 				0, sizeof(struct virtio_net_hdr),
951 				BUS_DMASYNC_POSTWRITE);
952 		bus_dmamap_sync(vsc->sc_dmat, sc->sc_tx_dmamaps[slot],
953 				0, sc->sc_tx_dmamaps[slot]->dm_mapsize,
954 				BUS_DMASYNC_POSTWRITE);
955 		m = sc->sc_tx_mbufs[slot];
956 		bus_dmamap_unload(vsc->sc_dmat, sc->sc_tx_dmamaps[slot]);
957 		sc->sc_tx_mbufs[slot] = 0;
958 		virtio_dequeue_commit(vsc, vq, slot);
959 		ifp->if_opackets++;
960 		m_freem(m);
961 	}
962 
963 	if (r)
964 		ifp->if_flags &= ~IFF_OACTIVE;
965 	return r;
966 }
967 
968 /* free all the mbufs already put on vq; called from if_stop(disable) */
969 static void
970 vioif_tx_drain(struct vioif_softc *sc)
971 {
972 	struct virtio_softc *vsc = sc->sc_virtio;
973 	struct virtqueue *vq = &sc->sc_vq[1];
974 	int i;
975 
976 	for (i = 0; i < vq->vq_num; i++) {
977 		if (sc->sc_tx_mbufs[i] == NULL)
978 			continue;
979 		bus_dmamap_unload(vsc->sc_dmat, sc->sc_tx_dmamaps[i]);
980 		m_freem(sc->sc_tx_mbufs[i]);
981 		sc->sc_tx_mbufs[i] = NULL;
982 	}
983 }
984 
985 /*
986  * Control vq
987  */
988 /* issue a VIRTIO_NET_CTRL_RX class command and wait for completion */
989 static int
990 vioif_ctrl_rx(struct vioif_softc *sc, int cmd, bool onoff)
991 {
992 	struct virtio_softc *vsc = sc->sc_virtio;
993 	struct virtqueue *vq = &sc->sc_vq[2];
994 	int r, slot;
995 
996 	if (vsc->sc_nvqs < 3)
997 		return ENOTSUP;
998 
999 	mutex_enter(&sc->sc_ctrl_wait_lock);
1000 	while (sc->sc_ctrl_inuse != FREE)
1001 		cv_wait(&sc->sc_ctrl_wait, &sc->sc_ctrl_wait_lock);
1002 	sc->sc_ctrl_inuse = INUSE;
1003 	mutex_exit(&sc->sc_ctrl_wait_lock);
1004 
1005 	sc->sc_ctrl_cmd->class = VIRTIO_NET_CTRL_RX;
1006 	sc->sc_ctrl_cmd->command = cmd;
1007 	sc->sc_ctrl_rx->onoff = onoff;
1008 
1009 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_cmd_dmamap,
1010 			0, sizeof(struct virtio_net_ctrl_cmd),
1011 			BUS_DMASYNC_PREWRITE);
1012 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_rx_dmamap,
1013 			0, sizeof(struct virtio_net_ctrl_rx),
1014 			BUS_DMASYNC_PREWRITE);
1015 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_status_dmamap,
1016 			0, sizeof(struct virtio_net_ctrl_status),
1017 			BUS_DMASYNC_PREREAD);
1018 
1019 	r = virtio_enqueue_prep(vsc, vq, &slot);
1020 	if (r != 0)
1021 		panic("%s: control vq busy!?", device_xname(sc->sc_dev));
1022 	r = virtio_enqueue_reserve(vsc, vq, slot, 3);
1023 	if (r != 0)
1024 		panic("%s: control vq busy!?", device_xname(sc->sc_dev));
1025 	virtio_enqueue(vsc, vq, slot, sc->sc_ctrl_cmd_dmamap, true);
1026 	virtio_enqueue(vsc, vq, slot, sc->sc_ctrl_rx_dmamap, true);
1027 	virtio_enqueue(vsc, vq, slot, sc->sc_ctrl_status_dmamap, false);
1028 	virtio_enqueue_commit(vsc, vq, slot, true);
1029 
1030 	/* wait for done */
1031 	mutex_enter(&sc->sc_ctrl_wait_lock);
1032 	while (sc->sc_ctrl_inuse != DONE)
1033 		cv_wait(&sc->sc_ctrl_wait, &sc->sc_ctrl_wait_lock);
1034 	mutex_exit(&sc->sc_ctrl_wait_lock);
1035 	/* already dequeueued */
1036 
1037 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_cmd_dmamap, 0,
1038 			sizeof(struct virtio_net_ctrl_cmd),
1039 			BUS_DMASYNC_POSTWRITE);
1040 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_rx_dmamap, 0,
1041 			sizeof(struct virtio_net_ctrl_rx),
1042 			BUS_DMASYNC_POSTWRITE);
1043 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_status_dmamap, 0,
1044 			sizeof(struct virtio_net_ctrl_status),
1045 			BUS_DMASYNC_POSTREAD);
1046 
1047 	if (sc->sc_ctrl_status->ack == VIRTIO_NET_OK)
1048 		r = 0;
1049 	else {
1050 		printf("%s: failed setting rx mode\n",
1051 		       device_xname(sc->sc_dev));
1052 		r = EIO;
1053 	}
1054 
1055 	mutex_enter(&sc->sc_ctrl_wait_lock);
1056 	sc->sc_ctrl_inuse = FREE;
1057 	cv_signal(&sc->sc_ctrl_wait);
1058 	mutex_exit(&sc->sc_ctrl_wait_lock);
1059 
1060 	return r;
1061 }
1062 
1063 static int
1064 vioif_set_promisc(struct vioif_softc *sc, bool onoff)
1065 {
1066 	int r;
1067 
1068 	r = vioif_ctrl_rx(sc, VIRTIO_NET_CTRL_RX_PROMISC, onoff);
1069 
1070 	return r;
1071 }
1072 
1073 static int
1074 vioif_set_allmulti(struct vioif_softc *sc, bool onoff)
1075 {
1076 	int r;
1077 
1078 	r = vioif_ctrl_rx(sc, VIRTIO_NET_CTRL_RX_ALLMULTI, onoff);
1079 
1080 	return r;
1081 }
1082 
1083 /* issue VIRTIO_NET_CTRL_MAC_TABLE_SET command and wait for completion */
1084 static int
1085 vioif_set_rx_filter(struct vioif_softc *sc)
1086 {
1087 	/* filter already set in sc_ctrl_mac_tbl */
1088 	struct virtio_softc *vsc = sc->sc_virtio;
1089 	struct virtqueue *vq = &sc->sc_vq[2];
1090 	int r, slot;
1091 
1092 	if (vsc->sc_nvqs < 3)
1093 		return ENOTSUP;
1094 
1095 	mutex_enter(&sc->sc_ctrl_wait_lock);
1096 	while (sc->sc_ctrl_inuse != FREE)
1097 		cv_wait(&sc->sc_ctrl_wait, &sc->sc_ctrl_wait_lock);
1098 	sc->sc_ctrl_inuse = INUSE;
1099 	mutex_exit(&sc->sc_ctrl_wait_lock);
1100 
1101 	sc->sc_ctrl_cmd->class = VIRTIO_NET_CTRL_MAC;
1102 	sc->sc_ctrl_cmd->command = VIRTIO_NET_CTRL_MAC_TABLE_SET;
1103 
1104 	r = bus_dmamap_load(vsc->sc_dmat, sc->sc_ctrl_tbl_uc_dmamap,
1105 			    sc->sc_ctrl_mac_tbl_uc,
1106 			    (sizeof(struct virtio_net_ctrl_mac_tbl)
1107 			  + ETHER_ADDR_LEN * sc->sc_ctrl_mac_tbl_uc->nentries),
1108 			    NULL, BUS_DMA_WRITE|BUS_DMA_NOWAIT);
1109 	if (r) {
1110 		printf("%s: control command dmamap load failed, "
1111 		       "error code %d\n", device_xname(sc->sc_dev), r);
1112 		goto out;
1113 	}
1114 	r = bus_dmamap_load(vsc->sc_dmat, sc->sc_ctrl_tbl_mc_dmamap,
1115 			    sc->sc_ctrl_mac_tbl_mc,
1116 			    (sizeof(struct virtio_net_ctrl_mac_tbl)
1117 			  + ETHER_ADDR_LEN * sc->sc_ctrl_mac_tbl_mc->nentries),
1118 			    NULL, BUS_DMA_WRITE|BUS_DMA_NOWAIT);
1119 	if (r) {
1120 		printf("%s: control command dmamap load failed, "
1121 		       "error code %d\n", device_xname(sc->sc_dev), r);
1122 		bus_dmamap_unload(vsc->sc_dmat, sc->sc_ctrl_tbl_uc_dmamap);
1123 		goto out;
1124 	}
1125 
1126 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_cmd_dmamap,
1127 			0, sizeof(struct virtio_net_ctrl_cmd),
1128 			BUS_DMASYNC_PREWRITE);
1129 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_tbl_uc_dmamap, 0,
1130 			(sizeof(struct virtio_net_ctrl_mac_tbl)
1131 			 + ETHER_ADDR_LEN * sc->sc_ctrl_mac_tbl_uc->nentries),
1132 			BUS_DMASYNC_PREWRITE);
1133 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_tbl_mc_dmamap, 0,
1134 			(sizeof(struct virtio_net_ctrl_mac_tbl)
1135 			 + ETHER_ADDR_LEN * sc->sc_ctrl_mac_tbl_mc->nentries),
1136 			BUS_DMASYNC_PREWRITE);
1137 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_status_dmamap,
1138 			0, sizeof(struct virtio_net_ctrl_status),
1139 			BUS_DMASYNC_PREREAD);
1140 
1141 	r = virtio_enqueue_prep(vsc, vq, &slot);
1142 	if (r != 0)
1143 		panic("%s: control vq busy!?", device_xname(sc->sc_dev));
1144 	r = virtio_enqueue_reserve(vsc, vq, slot, 4);
1145 	if (r != 0)
1146 		panic("%s: control vq busy!?", device_xname(sc->sc_dev));
1147 	virtio_enqueue(vsc, vq, slot, sc->sc_ctrl_cmd_dmamap, true);
1148 	virtio_enqueue(vsc, vq, slot, sc->sc_ctrl_tbl_uc_dmamap, true);
1149 	virtio_enqueue(vsc, vq, slot, sc->sc_ctrl_tbl_mc_dmamap, true);
1150 	virtio_enqueue(vsc, vq, slot, sc->sc_ctrl_status_dmamap, false);
1151 	virtio_enqueue_commit(vsc, vq, slot, true);
1152 
1153 	/* wait for done */
1154 	mutex_enter(&sc->sc_ctrl_wait_lock);
1155 	while (sc->sc_ctrl_inuse != DONE)
1156 		cv_wait(&sc->sc_ctrl_wait, &sc->sc_ctrl_wait_lock);
1157 	mutex_exit(&sc->sc_ctrl_wait_lock);
1158 	/* already dequeueued */
1159 
1160 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_cmd_dmamap, 0,
1161 			sizeof(struct virtio_net_ctrl_cmd),
1162 			BUS_DMASYNC_POSTWRITE);
1163 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_tbl_uc_dmamap, 0,
1164 			(sizeof(struct virtio_net_ctrl_mac_tbl)
1165 			 + ETHER_ADDR_LEN * sc->sc_ctrl_mac_tbl_uc->nentries),
1166 			BUS_DMASYNC_POSTWRITE);
1167 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_tbl_mc_dmamap, 0,
1168 			(sizeof(struct virtio_net_ctrl_mac_tbl)
1169 			 + ETHER_ADDR_LEN * sc->sc_ctrl_mac_tbl_mc->nentries),
1170 			BUS_DMASYNC_POSTWRITE);
1171 	bus_dmamap_sync(vsc->sc_dmat, sc->sc_ctrl_status_dmamap, 0,
1172 			sizeof(struct virtio_net_ctrl_status),
1173 			BUS_DMASYNC_POSTREAD);
1174 	bus_dmamap_unload(vsc->sc_dmat, sc->sc_ctrl_tbl_uc_dmamap);
1175 	bus_dmamap_unload(vsc->sc_dmat, sc->sc_ctrl_tbl_mc_dmamap);
1176 
1177 	if (sc->sc_ctrl_status->ack == VIRTIO_NET_OK)
1178 		r = 0;
1179 	else {
1180 		printf("%s: failed setting rx filter\n",
1181 		       device_xname(sc->sc_dev));
1182 		r = EIO;
1183 	}
1184 
1185 out:
1186 	mutex_enter(&sc->sc_ctrl_wait_lock);
1187 	sc->sc_ctrl_inuse = FREE;
1188 	cv_signal(&sc->sc_ctrl_wait);
1189 	mutex_exit(&sc->sc_ctrl_wait_lock);
1190 
1191 	return r;
1192 }
1193 
1194 /* ctrl vq interrupt; wake up the command issuer */
1195 static int
1196 vioif_ctrl_vq_done(struct virtqueue *vq)
1197 {
1198 	struct virtio_softc *vsc = vq->vq_owner;
1199 	struct vioif_softc *sc = device_private(vsc->sc_child);
1200 	int r, slot;
1201 
1202 	r = virtio_dequeue(vsc, vq, &slot, NULL);
1203 	if (r == ENOENT)
1204 		return 0;
1205 	virtio_dequeue_commit(vsc, vq, slot);
1206 
1207 	mutex_enter(&sc->sc_ctrl_wait_lock);
1208 	sc->sc_ctrl_inuse = DONE;
1209 	cv_signal(&sc->sc_ctrl_wait);
1210 	mutex_exit(&sc->sc_ctrl_wait_lock);
1211 
1212 	return 1;
1213 }
1214 
1215 /*
1216  * If IFF_PROMISC requested,  set promiscuous
1217  * If multicast filter small enough (<=MAXENTRIES) set rx filter
1218  * If large multicast filter exist use ALLMULTI
1219  */
1220 /*
1221  * If setting rx filter fails fall back to ALLMULTI
1222  * If ALLMULTI fails fall back to PROMISC
1223  */
1224 static int
1225 vioif_rx_filter(struct vioif_softc *sc)
1226 {
1227 	struct virtio_softc *vsc = sc->sc_virtio;
1228 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1229 	struct ether_multi *enm;
1230 	struct ether_multistep step;
1231 	int nentries;
1232 	int promisc = 0, allmulti = 0, rxfilter = 0;
1233 	int r;
1234 
1235 	if (vsc->sc_nvqs < 3) {	/* no ctrl vq; always promisc */
1236 		ifp->if_flags |= IFF_PROMISC;
1237 		return 0;
1238 	}
1239 
1240 	if (ifp->if_flags & IFF_PROMISC) {
1241 		promisc = 1;
1242 		goto set;
1243 	}
1244 
1245 	nentries = -1;
1246 	ETHER_FIRST_MULTI(step, &sc->sc_ethercom, enm);
1247 	while (nentries++, enm != NULL) {
1248 		if (nentries >= VIRTIO_NET_CTRL_MAC_MAXENTRIES) {
1249 			allmulti = 1;
1250 			goto set;
1251 		}
1252 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
1253 			   ETHER_ADDR_LEN)) {
1254 			allmulti = 1;
1255 			goto set;
1256 		}
1257 		memcpy(sc->sc_ctrl_mac_tbl_mc->macs[nentries],
1258 		       enm->enm_addrlo, ETHER_ADDR_LEN);
1259 		ETHER_NEXT_MULTI(step, enm);
1260 	}
1261 	rxfilter = 1;
1262 
1263 set:
1264 	if (rxfilter) {
1265 		sc->sc_ctrl_mac_tbl_uc->nentries = 0;
1266 		sc->sc_ctrl_mac_tbl_mc->nentries = nentries;
1267 		r = vioif_set_rx_filter(sc);
1268 		if (r != 0) {
1269 			rxfilter = 0;
1270 			allmulti = 1; /* fallback */
1271 		}
1272 	} else {
1273 		/* remove rx filter */
1274 		sc->sc_ctrl_mac_tbl_uc->nentries = 0;
1275 		sc->sc_ctrl_mac_tbl_mc->nentries = 0;
1276 		r = vioif_set_rx_filter(sc);
1277 		/* what to do on failure? */
1278 	}
1279 	if (allmulti) {
1280 		r = vioif_set_allmulti(sc, true);
1281 		if (r != 0) {
1282 			allmulti = 0;
1283 			promisc = 1; /* fallback */
1284 		}
1285 	} else {
1286 		r = vioif_set_allmulti(sc, false);
1287 		/* what to do on failure? */
1288 	}
1289 	if (promisc) {
1290 		r = vioif_set_promisc(sc, true);
1291 	} else {
1292 		r = vioif_set_promisc(sc, false);
1293 	}
1294 
1295 	return r;
1296 }
1297 
1298 /* change link status */
1299 static int
1300 vioif_updown(struct vioif_softc *sc, bool isup)
1301 {
1302 	struct virtio_softc *vsc = sc->sc_virtio;
1303 
1304 	if (!(vsc->sc_features & VIRTIO_NET_F_STATUS))
1305 		return ENODEV;
1306 	virtio_write_device_config_1(vsc,
1307 				     VIRTIO_NET_CONFIG_STATUS,
1308 				     isup?VIRTIO_NET_S_LINK_UP:0);
1309 	return 0;
1310 }
1311