xref: /titanic_51/usr/src/uts/common/xen/io/xnf.c (revision bbf6f00c25b6a2bed23c35eac6d62998ecdb338c)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  *
29  * Copyright (c) 2004 Christian Limpach.
30  * All rights reserved.
31  *
32  * Redistribution and use in source and binary forms, with or without
33  * modification, are permitted provided that the following conditions
34  * are met:
35  * 1. Redistributions of source code must retain the above copyright
36  *    notice, this list of conditions and the following disclaimer.
37  * 2. Redistributions in binary form must reproduce the above copyright
38  *    notice, this list of conditions and the following disclaimer in the
39  *    documentation and/or other materials provided with the distribution.
40  * 3. This section intentionally left blank.
41  * 4. The name of the author may not be used to endorse or promote products
42  *    derived from this software without specific prior written permission.
43  *
44  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
45  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
46  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
47  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
48  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
49  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
53  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54  */
55 /*
56  * Section 3 of the above license was updated in response to bug 6379571.
57  */
58 
59 /*
60  * xnf.c - GLDv3 network driver for domU.
61  */
62 
63 /*
64  * This driver uses four per-instance locks:
65  *
66  * xnf_gref_lock:
67  *
68  *    Protects access to the grant reference list stored in
69  *    xnf_gref_head. Grant references should be acquired and released
70  *    using gref_get() and gref_put() respectively.
71  *
72  * xnf_schedlock:
73  *
74  *    Protects:
75  *    xnf_need_sched - used to record that a previous transmit attempt
76  *       failed (and consequently it will be necessary to call
77  *       mac_tx_update() when transmit resources are available).
78  *    xnf_pending_multicast - the number of multicast requests that
79  *       have been submitted to the backend for which we have not
80  *       processed responses.
81  *
82  * xnf_txlock:
83  *
84  *    Protects the transmit ring (xnf_tx_ring) and associated
85  *    structures (notably xnf_tx_pkt_id and xnf_tx_pkt_id_head).
86  *
87  * xnf_rxlock:
88  *
89  *    Protects the receive ring (xnf_rx_ring) and associated
90  *    structures (notably xnf_rx_pkt_info).
91  *
92  * If driver-global state that affects both the transmit and receive
93  * rings is manipulated, both xnf_txlock and xnf_rxlock should be
94  * held, in that order.
95  *
96  * xnf_schedlock is acquired both whilst holding xnf_txlock and
97  * without. It should always be acquired after xnf_txlock if both are
98  * held.
99  *
100  * Notes:
101  * - atomic_add_64() is used to manipulate counters where we require
102  *   accuracy. For counters intended only for observation by humans,
103  *   post increment/decrement are used instead.
104  */
105 
106 #include <sys/types.h>
107 #include <sys/errno.h>
108 #include <sys/param.h>
109 #include <sys/sysmacros.h>
110 #include <sys/systm.h>
111 #include <sys/stream.h>
112 #include <sys/strsubr.h>
113 #include <sys/strsun.h>
114 #include <sys/conf.h>
115 #include <sys/ddi.h>
116 #include <sys/devops.h>
117 #include <sys/sunddi.h>
118 #include <sys/sunndi.h>
119 #include <sys/dlpi.h>
120 #include <sys/ethernet.h>
121 #include <sys/strsun.h>
122 #include <sys/pattr.h>
123 #include <inet/ip.h>
124 #include <inet/ip_impl.h>
125 #include <sys/gld.h>
126 #include <sys/modctl.h>
127 #include <sys/mac_provider.h>
128 #include <sys/mac_ether.h>
129 #include <sys/bootinfo.h>
130 #include <sys/mach_mmu.h>
131 #ifdef	XPV_HVM_DRIVER
132 #include <sys/xpv_support.h>
133 #include <sys/hypervisor.h>
134 #else
135 #include <sys/hypervisor.h>
136 #include <sys/evtchn_impl.h>
137 #include <sys/balloon_impl.h>
138 #endif
139 #include <xen/public/io/netif.h>
140 #include <sys/gnttab.h>
141 #include <xen/sys/xendev.h>
142 #include <sys/sdt.h>
143 #include <sys/note.h>
144 #include <sys/debug.h>
145 
146 #include <io/xnf.h>
147 
148 #if defined(DEBUG) || defined(__lint)
149 #define	XNF_DEBUG
150 #endif
151 
152 #ifdef XNF_DEBUG
153 int xnf_debug = 0;
154 xnf_t *xnf_debug_instance = NULL;
155 #endif
156 
157 /*
158  * On a 32 bit PAE system physical and machine addresses are larger
159  * than 32 bits.  ddi_btop() on such systems take an unsigned long
160  * argument, and so addresses above 4G are truncated before ddi_btop()
161  * gets to see them.  To avoid this, code the shift operation here.
162  */
163 #define	xnf_btop(addr)	((addr) >> PAGESHIFT)
164 
165 unsigned int	xnf_max_tx_frags = 1;
166 
167 /*
168  * Should we use the multicast control feature if the backend provides
169  * it?
170  */
171 boolean_t xnf_multicast_control = B_TRUE;
172 
173 /*
174  * Received packets below this size are copied to a new streams buffer
175  * rather than being desballoc'ed.
176  *
177  * This value is chosen to accommodate traffic where there are a large
178  * number of small packets. For data showing a typical distribution,
179  * see:
180  *
181  * Sinha07a:
182  *	Rishi Sinha, Christos Papadopoulos, and John
183  *	Heidemann. Internet Packet Size Distributions: Some
184  *	Observations. Technical Report ISI-TR-2007-643,
185  *	USC/Information Sciences Institute, May, 2007. Orignally
186  *	released October 2005 as web page
187  *	http://netweb.usc.edu/~sinha/pkt-sizes/.
188  *	<http://www.isi.edu/~johnh/PAPERS/Sinha07a.html>.
189  */
190 size_t xnf_rx_copy_limit = 64;
191 
192 #define	INVALID_GRANT_HANDLE	((grant_handle_t)-1)
193 #define	INVALID_GRANT_REF	((grant_ref_t)-1)
194 #define	INVALID_TX_ID		((uint16_t)-1)
195 
196 #define	TX_ID_TO_TXID(p, id) (&((p)->xnf_tx_pkt_id[(id)]))
197 #define	TX_ID_VALID(i) (((i) != INVALID_TX_ID) && ((i) < NET_TX_RING_SIZE))
198 
199 /* Required system entry points */
200 static int	xnf_attach(dev_info_t *, ddi_attach_cmd_t);
201 static int	xnf_detach(dev_info_t *, ddi_detach_cmd_t);
202 
203 /* Required driver entry points for Nemo */
204 static int	xnf_start(void *);
205 static void	xnf_stop(void *);
206 static int	xnf_set_mac_addr(void *, const uint8_t *);
207 static int	xnf_set_multicast(void *, boolean_t, const uint8_t *);
208 static int	xnf_set_promiscuous(void *, boolean_t);
209 static mblk_t	*xnf_send(void *, mblk_t *);
210 static uint_t	xnf_intr(caddr_t);
211 static int	xnf_stat(void *, uint_t, uint64_t *);
212 static boolean_t xnf_getcapab(void *, mac_capab_t, void *);
213 
214 /* Driver private functions */
215 static int xnf_alloc_dma_resources(xnf_t *);
216 static void xnf_release_dma_resources(xnf_t *);
217 static void xnf_release_mblks(xnf_t *);
218 
219 static int xnf_buf_constructor(void *, void *, int);
220 static void xnf_buf_destructor(void *, void *);
221 static xnf_buf_t *xnf_buf_get(xnf_t *, int, boolean_t);
222 #pragma inline(xnf_buf_get)
223 static void xnf_buf_put(xnf_t *, xnf_buf_t *, boolean_t);
224 #pragma inline(xnf_buf_put)
225 static void xnf_buf_refresh(xnf_buf_t *);
226 #pragma inline(xnf_buf_refresh)
227 static void xnf_buf_recycle(xnf_buf_t *);
228 
229 static int xnf_tx_buf_constructor(void *, void *, int);
230 static void xnf_tx_buf_destructor(void *, void *);
231 
232 static grant_ref_t gref_get(xnf_t *);
233 #pragma inline(gref_get)
234 static void gref_put(xnf_t *, grant_ref_t);
235 #pragma inline(gref_put)
236 
237 static xnf_txid_t *txid_get(xnf_t *);
238 #pragma inline(txid_get)
239 static void txid_put(xnf_t *, xnf_txid_t *);
240 #pragma inline(txid_put)
241 
242 void xnf_send_driver_status(int, int);
243 static void xnf_rxbuf_hang(xnf_t *, xnf_buf_t *);
244 static int xnf_tx_clean_ring(xnf_t  *);
245 static void oe_state_change(dev_info_t *, ddi_eventcookie_t,
246     void *, void *);
247 static boolean_t xnf_kstat_init(xnf_t *);
248 static void xnf_rx_collect(xnf_t *);
249 
250 static mac_callbacks_t xnf_callbacks = {
251 	MC_GETCAPAB,
252 	xnf_stat,
253 	xnf_start,
254 	xnf_stop,
255 	xnf_set_promiscuous,
256 	xnf_set_multicast,
257 	xnf_set_mac_addr,
258 	xnf_send,
259 	NULL,
260 	xnf_getcapab
261 };
262 
263 /* DMA attributes for network ring buffer */
264 static ddi_dma_attr_t ringbuf_dma_attr = {
265 	DMA_ATTR_V0,		/* version of this structure */
266 	0,			/* lowest usable address */
267 	0xffffffffffffffffULL,	/* highest usable address */
268 	0x7fffffff,		/* maximum DMAable byte count */
269 	MMU_PAGESIZE,		/* alignment in bytes */
270 	0x7ff,			/* bitmap of burst sizes */
271 	1,			/* minimum transfer */
272 	0xffffffffU,		/* maximum transfer */
273 	0xffffffffffffffffULL,	/* maximum segment length */
274 	1,			/* maximum number of segments */
275 	1,			/* granularity */
276 	0,			/* flags (reserved) */
277 };
278 
279 /* DMA attributes for transmit and receive data */
280 static ddi_dma_attr_t buf_dma_attr = {
281 	DMA_ATTR_V0,		/* version of this structure */
282 	0,			/* lowest usable address */
283 	0xffffffffffffffffULL,	/* highest usable address */
284 	0x7fffffff,		/* maximum DMAable byte count */
285 	MMU_PAGESIZE,		/* alignment in bytes */
286 	0x7ff,			/* bitmap of burst sizes */
287 	1,			/* minimum transfer */
288 	0xffffffffU,		/* maximum transfer */
289 	0xffffffffffffffffULL,	/* maximum segment length */
290 	1,			/* maximum number of segments */
291 	1,			/* granularity */
292 	0,			/* flags (reserved) */
293 };
294 
295 /* DMA access attributes for registers and descriptors */
296 static ddi_device_acc_attr_t accattr = {
297 	DDI_DEVICE_ATTR_V0,
298 	DDI_STRUCTURE_LE_ACC,	/* This is a little-endian device */
299 	DDI_STRICTORDER_ACC
300 };
301 
302 /* DMA access attributes for data: NOT to be byte swapped. */
303 static ddi_device_acc_attr_t data_accattr = {
304 	DDI_DEVICE_ATTR_V0,
305 	DDI_NEVERSWAP_ACC,
306 	DDI_STRICTORDER_ACC
307 };
308 
309 DDI_DEFINE_STREAM_OPS(xnf_dev_ops, nulldev, nulldev, xnf_attach, xnf_detach,
310     nodev, NULL, D_MP, NULL, ddi_quiesce_not_supported);
311 
312 static struct modldrv xnf_modldrv = {
313 	&mod_driverops,
314 	"Virtual Ethernet driver",
315 	&xnf_dev_ops
316 };
317 
318 static struct modlinkage modlinkage = {
319 	MODREV_1, &xnf_modldrv, NULL
320 };
321 
322 int
323 _init(void)
324 {
325 	int r;
326 
327 	mac_init_ops(&xnf_dev_ops, "xnf");
328 	r = mod_install(&modlinkage);
329 	if (r != DDI_SUCCESS)
330 		mac_fini_ops(&xnf_dev_ops);
331 
332 	return (r);
333 }
334 
335 int
336 _fini(void)
337 {
338 	return (EBUSY); /* XXPV should be removable */
339 }
340 
341 int
342 _info(struct modinfo *modinfop)
343 {
344 	return (mod_info(&modlinkage, modinfop));
345 }
346 
347 /*
348  * Acquire a grant reference.
349  */
350 static grant_ref_t
351 gref_get(xnf_t *xnfp)
352 {
353 	grant_ref_t gref;
354 
355 	mutex_enter(&xnfp->xnf_gref_lock);
356 
357 	do {
358 		gref = gnttab_claim_grant_reference(&xnfp->xnf_gref_head);
359 
360 	} while ((gref == INVALID_GRANT_REF) &&
361 	    (gnttab_alloc_grant_references(16, &xnfp->xnf_gref_head) == 0));
362 
363 	mutex_exit(&xnfp->xnf_gref_lock);
364 
365 	if (gref == INVALID_GRANT_REF) {
366 		xnfp->xnf_stat_gref_failure++;
367 	} else {
368 		atomic_add_64(&xnfp->xnf_stat_gref_outstanding, 1);
369 		if (xnfp->xnf_stat_gref_outstanding > xnfp->xnf_stat_gref_peak)
370 			xnfp->xnf_stat_gref_peak =
371 			    xnfp->xnf_stat_gref_outstanding;
372 	}
373 
374 	return (gref);
375 }
376 
377 /*
378  * Release a grant reference.
379  */
380 static void
381 gref_put(xnf_t *xnfp, grant_ref_t gref)
382 {
383 	ASSERT(gref != INVALID_GRANT_REF);
384 
385 	mutex_enter(&xnfp->xnf_gref_lock);
386 	gnttab_release_grant_reference(&xnfp->xnf_gref_head, gref);
387 	mutex_exit(&xnfp->xnf_gref_lock);
388 
389 	atomic_add_64(&xnfp->xnf_stat_gref_outstanding, -1);
390 }
391 
392 /*
393  * Acquire a transmit id.
394  */
395 static xnf_txid_t *
396 txid_get(xnf_t *xnfp)
397 {
398 	xnf_txid_t *tidp;
399 
400 	ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
401 
402 	if (xnfp->xnf_tx_pkt_id_head == INVALID_TX_ID)
403 		return (NULL);
404 
405 	ASSERT(TX_ID_VALID(xnfp->xnf_tx_pkt_id_head));
406 
407 	tidp = TX_ID_TO_TXID(xnfp, xnfp->xnf_tx_pkt_id_head);
408 	xnfp->xnf_tx_pkt_id_head = tidp->next;
409 	tidp->next = INVALID_TX_ID;
410 
411 	ASSERT(tidp->txbuf == NULL);
412 
413 	return (tidp);
414 }
415 
416 /*
417  * Release a transmit id.
418  */
419 static void
420 txid_put(xnf_t *xnfp, xnf_txid_t *tidp)
421 {
422 	ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
423 	ASSERT(TX_ID_VALID(tidp->id));
424 	ASSERT(tidp->next == INVALID_TX_ID);
425 
426 	tidp->txbuf = NULL;
427 	tidp->next = xnfp->xnf_tx_pkt_id_head;
428 	xnfp->xnf_tx_pkt_id_head = tidp->id;
429 }
430 
431 /*
432  * Get `wanted' slots in the transmit ring, waiting for at least that
433  * number if `wait' is B_TRUE. Force the ring to be cleaned by setting
434  * `wanted' to zero.
435  *
436  * Return the number of slots available.
437  */
438 static int
439 tx_slots_get(xnf_t *xnfp, int wanted, boolean_t wait)
440 {
441 	int slotsfree;
442 	boolean_t forced_clean = (wanted == 0);
443 
444 	ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
445 
446 	/* LINTED: constant in conditional context */
447 	while (B_TRUE) {
448 		slotsfree = RING_FREE_REQUESTS(&xnfp->xnf_tx_ring);
449 
450 		if ((slotsfree < wanted) || forced_clean)
451 			slotsfree = xnf_tx_clean_ring(xnfp);
452 
453 		/*
454 		 * If there are more than we need free, tell other
455 		 * people to come looking again. We hold txlock, so we
456 		 * are able to take our slots before anyone else runs.
457 		 */
458 		if (slotsfree > wanted)
459 			cv_broadcast(&xnfp->xnf_cv_tx_slots);
460 
461 		if (slotsfree >= wanted)
462 			break;
463 
464 		if (!wait)
465 			break;
466 
467 		cv_wait(&xnfp->xnf_cv_tx_slots, &xnfp->xnf_txlock);
468 	}
469 
470 	ASSERT(slotsfree <= RING_SIZE(&(xnfp->xnf_tx_ring)));
471 
472 	return (slotsfree);
473 }
474 
475 static int
476 xnf_setup_rings(xnf_t *xnfp)
477 {
478 	domid_t			oeid;
479 	struct xenbus_device	*xsd;
480 	RING_IDX		i;
481 	int			err;
482 	xnf_txid_t		*tidp;
483 	xnf_buf_t **bdescp;
484 
485 	oeid = xvdi_get_oeid(xnfp->xnf_devinfo);
486 	xsd = xvdi_get_xsd(xnfp->xnf_devinfo);
487 
488 	if (xnfp->xnf_tx_ring_ref != INVALID_GRANT_REF)
489 		gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0);
490 
491 	err = gnttab_grant_foreign_access(oeid,
492 	    xnf_btop(pa_to_ma(xnfp->xnf_tx_ring_phys_addr)), 0);
493 	if (err <= 0) {
494 		err = -err;
495 		xenbus_dev_error(xsd, err, "granting access to tx ring page");
496 		goto out;
497 	}
498 	xnfp->xnf_tx_ring_ref = (grant_ref_t)err;
499 
500 	if (xnfp->xnf_rx_ring_ref != INVALID_GRANT_REF)
501 		gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0);
502 
503 	err = gnttab_grant_foreign_access(oeid,
504 	    xnf_btop(pa_to_ma(xnfp->xnf_rx_ring_phys_addr)), 0);
505 	if (err <= 0) {
506 		err = -err;
507 		xenbus_dev_error(xsd, err, "granting access to rx ring page");
508 		goto out;
509 	}
510 	xnfp->xnf_rx_ring_ref = (grant_ref_t)err;
511 
512 	mutex_enter(&xnfp->xnf_txlock);
513 
514 	/*
515 	 * Setup/cleanup the TX ring.  Note that this can lose packets
516 	 * after a resume, but we expect to stagger on.
517 	 */
518 	xnfp->xnf_tx_pkt_id_head = INVALID_TX_ID; /* I.e. emtpy list. */
519 	for (i = 0, tidp = &xnfp->xnf_tx_pkt_id[0];
520 	    i < NET_TX_RING_SIZE;
521 	    i++, tidp++) {
522 		xnf_txbuf_t *txp;
523 
524 		tidp->id = i;
525 
526 		txp = tidp->txbuf;
527 		if (txp == NULL) {
528 			tidp->next = INVALID_TX_ID; /* Appease txid_put(). */
529 			txid_put(xnfp, tidp);
530 			continue;
531 		}
532 
533 		ASSERT(txp->tx_txreq.gref != INVALID_GRANT_REF);
534 		ASSERT(txp->tx_mp != NULL);
535 
536 		switch (txp->tx_type) {
537 		case TX_DATA:
538 			VERIFY(gnttab_query_foreign_access(txp->tx_txreq.gref)
539 			    == 0);
540 
541 			if (txp->tx_bdesc == NULL) {
542 				(void) gnttab_end_foreign_access_ref(
543 				    txp->tx_txreq.gref, 1);
544 				gref_put(xnfp, txp->tx_txreq.gref);
545 				(void) ddi_dma_unbind_handle(
546 				    txp->tx_dma_handle);
547 			} else {
548 				xnf_buf_put(xnfp, txp->tx_bdesc, B_TRUE);
549 			}
550 
551 			freemsg(txp->tx_mp);
552 			txid_put(xnfp, tidp);
553 			kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
554 
555 			break;
556 
557 		case TX_MCAST_REQ:
558 			txp->tx_type = TX_MCAST_RSP;
559 			txp->tx_status = NETIF_RSP_DROPPED;
560 			cv_broadcast(&xnfp->xnf_cv_multicast);
561 
562 			/*
563 			 * The request consumed two slots in the ring,
564 			 * yet only a single xnf_txid_t is used. Step
565 			 * over the empty slot.
566 			 */
567 			i++;
568 			ASSERT(i < NET_TX_RING_SIZE);
569 
570 			break;
571 
572 		case TX_MCAST_RSP:
573 			break;
574 		}
575 	}
576 
577 	/* LINTED: constant in conditional context */
578 	SHARED_RING_INIT(xnfp->xnf_tx_ring.sring);
579 	/* LINTED: constant in conditional context */
580 	FRONT_RING_INIT(&xnfp->xnf_tx_ring,
581 	    xnfp->xnf_tx_ring.sring, PAGESIZE);
582 
583 	mutex_exit(&xnfp->xnf_txlock);
584 
585 	mutex_enter(&xnfp->xnf_rxlock);
586 
587 	/*
588 	 * Clean out any buffers currently posted to the receive ring
589 	 * before we reset it.
590 	 */
591 	for (i = 0, bdescp = &xnfp->xnf_rx_pkt_info[0];
592 	    i < NET_RX_RING_SIZE;
593 	    i++, bdescp++) {
594 		if (*bdescp != NULL) {
595 			xnf_buf_put(xnfp, *bdescp, B_FALSE);
596 			*bdescp = NULL;
597 		}
598 	}
599 
600 	/* LINTED: constant in conditional context */
601 	SHARED_RING_INIT(xnfp->xnf_rx_ring.sring);
602 	/* LINTED: constant in conditional context */
603 	FRONT_RING_INIT(&xnfp->xnf_rx_ring,
604 	    xnfp->xnf_rx_ring.sring, PAGESIZE);
605 
606 	/*
607 	 * Fill the ring with buffers.
608 	 */
609 	for (i = 0; i < NET_RX_RING_SIZE; i++) {
610 		xnf_buf_t *bdesc;
611 
612 		bdesc = xnf_buf_get(xnfp, KM_SLEEP, B_FALSE);
613 		VERIFY(bdesc != NULL);
614 		xnf_rxbuf_hang(xnfp, bdesc);
615 	}
616 
617 	/* LINTED: constant in conditional context */
618 	RING_PUSH_REQUESTS(&xnfp->xnf_rx_ring);
619 
620 	mutex_exit(&xnfp->xnf_rxlock);
621 
622 	return (0);
623 
624 out:
625 	if (xnfp->xnf_tx_ring_ref != INVALID_GRANT_REF)
626 		gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0);
627 	xnfp->xnf_tx_ring_ref = INVALID_GRANT_REF;
628 
629 	if (xnfp->xnf_rx_ring_ref != INVALID_GRANT_REF)
630 		gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0);
631 	xnfp->xnf_rx_ring_ref = INVALID_GRANT_REF;
632 
633 	return (err);
634 }
635 
636 /*
637  * Connect driver to back end, called to set up communication with
638  * back end driver both initially and on resume after restore/migrate.
639  */
640 void
641 xnf_be_connect(xnf_t *xnfp)
642 {
643 	const char	*message;
644 	xenbus_transaction_t xbt;
645 	struct		xenbus_device *xsd;
646 	char		*xsname;
647 	int		err;
648 
649 	ASSERT(!xnfp->xnf_connected);
650 
651 	xsd = xvdi_get_xsd(xnfp->xnf_devinfo);
652 	xsname = xvdi_get_xsname(xnfp->xnf_devinfo);
653 
654 	err = xnf_setup_rings(xnfp);
655 	if (err != 0) {
656 		cmn_err(CE_WARN, "failed to set up tx/rx rings");
657 		xenbus_dev_error(xsd, err, "setting up ring");
658 		return;
659 	}
660 
661 again:
662 	err = xenbus_transaction_start(&xbt);
663 	if (err != 0) {
664 		xenbus_dev_error(xsd, EIO, "starting transaction");
665 		return;
666 	}
667 
668 	err = xenbus_printf(xbt, xsname, "tx-ring-ref", "%u",
669 	    xnfp->xnf_tx_ring_ref);
670 	if (err != 0) {
671 		message = "writing tx ring-ref";
672 		goto abort_transaction;
673 	}
674 
675 	err = xenbus_printf(xbt, xsname, "rx-ring-ref", "%u",
676 	    xnfp->xnf_rx_ring_ref);
677 	if (err != 0) {
678 		message = "writing rx ring-ref";
679 		goto abort_transaction;
680 	}
681 
682 	err = xenbus_printf(xbt, xsname, "event-channel", "%u",
683 	    xnfp->xnf_evtchn);
684 	if (err != 0) {
685 		message = "writing event-channel";
686 		goto abort_transaction;
687 	}
688 
689 	err = xenbus_printf(xbt, xsname, "feature-rx-notify", "%d", 1);
690 	if (err != 0) {
691 		message = "writing feature-rx-notify";
692 		goto abort_transaction;
693 	}
694 
695 	err = xenbus_printf(xbt, xsname, "request-rx-copy", "%d", 1);
696 	if (err != 0) {
697 		message = "writing request-rx-copy";
698 		goto abort_transaction;
699 	}
700 
701 	if (xnfp->xnf_be_mcast_control) {
702 		err = xenbus_printf(xbt, xsname, "request-multicast-control",
703 		    "%d", 1);
704 		if (err != 0) {
705 			message = "writing request-multicast-control";
706 			goto abort_transaction;
707 		}
708 	}
709 
710 	err = xvdi_switch_state(xnfp->xnf_devinfo, xbt, XenbusStateConnected);
711 	if (err != 0) {
712 		message = "switching state to XenbusStateConnected";
713 		goto abort_transaction;
714 	}
715 
716 	err = xenbus_transaction_end(xbt, 0);
717 	if (err != 0) {
718 		if (err == EAGAIN)
719 			goto again;
720 		xenbus_dev_error(xsd, err, "completing transaction");
721 	}
722 
723 	return;
724 
725 abort_transaction:
726 	(void) xenbus_transaction_end(xbt, 1);
727 	xenbus_dev_error(xsd, err, "%s", message);
728 }
729 
730 /*
731  * Read configuration information from xenstore.
732  */
733 void
734 xnf_read_config(xnf_t *xnfp)
735 {
736 	int err, be_cap;
737 	char mac[ETHERADDRL * 3];
738 	char *oename = xvdi_get_oename(xnfp->xnf_devinfo);
739 
740 	err = xenbus_scanf(XBT_NULL, oename, "mac",
741 	    "%s", (char *)&mac[0]);
742 	if (err != 0) {
743 		/*
744 		 * bad: we're supposed to be set up with a proper mac
745 		 * addr. at this point
746 		 */
747 		cmn_err(CE_WARN, "%s%d: no mac address",
748 		    ddi_driver_name(xnfp->xnf_devinfo),
749 		    ddi_get_instance(xnfp->xnf_devinfo));
750 			return;
751 	}
752 	if (ether_aton(mac, xnfp->xnf_mac_addr) != ETHERADDRL) {
753 		err = ENOENT;
754 		xenbus_dev_error(xvdi_get_xsd(xnfp->xnf_devinfo), ENOENT,
755 		    "parsing %s/mac", xvdi_get_xsname(xnfp->xnf_devinfo));
756 		return;
757 	}
758 
759 	err = xenbus_scanf(XBT_NULL, oename,
760 	    "feature-rx-copy", "%d", &be_cap);
761 	/*
762 	 * If we fail to read the store we assume that the key is
763 	 * absent, implying an older domain at the far end.  Older
764 	 * domains cannot do HV copy.
765 	 */
766 	if (err != 0)
767 		be_cap = 0;
768 	xnfp->xnf_be_rx_copy = (be_cap != 0);
769 
770 	err = xenbus_scanf(XBT_NULL, oename,
771 	    "feature-multicast-control", "%d", &be_cap);
772 	/*
773 	 * If we fail to read the store we assume that the key is
774 	 * absent, implying an older domain at the far end.  Older
775 	 * domains do not support multicast control.
776 	 */
777 	if (err != 0)
778 		be_cap = 0;
779 	xnfp->xnf_be_mcast_control = (be_cap != 0) && xnf_multicast_control;
780 }
781 
782 /*
783  *  attach(9E) -- Attach a device to the system
784  */
785 static int
786 xnf_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
787 {
788 	mac_register_t *macp;
789 	xnf_t *xnfp;
790 	int err;
791 	char cachename[32];
792 
793 #ifdef XNF_DEBUG
794 	if (xnf_debug & XNF_DEBUG_DDI)
795 		printf("xnf%d: attach(0x%p)\n", ddi_get_instance(devinfo),
796 		    (void *)devinfo);
797 #endif
798 
799 	switch (cmd) {
800 	case DDI_RESUME:
801 		xnfp = ddi_get_driver_private(devinfo);
802 		xnfp->xnf_gen++;
803 
804 		(void) xvdi_resume(devinfo);
805 		(void) xvdi_alloc_evtchn(devinfo);
806 		xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo);
807 #ifdef XPV_HVM_DRIVER
808 		ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr,
809 		    xnfp);
810 #else
811 		(void) ddi_add_intr(devinfo, 0, NULL, NULL, xnf_intr,
812 		    (caddr_t)xnfp);
813 #endif
814 		return (DDI_SUCCESS);
815 
816 	case DDI_ATTACH:
817 		break;
818 
819 	default:
820 		return (DDI_FAILURE);
821 	}
822 
823 	/*
824 	 *  Allocate gld_mac_info_t and xnf_instance structures
825 	 */
826 	macp = mac_alloc(MAC_VERSION);
827 	if (macp == NULL)
828 		return (DDI_FAILURE);
829 	xnfp = kmem_zalloc(sizeof (*xnfp), KM_SLEEP);
830 
831 	macp->m_dip = devinfo;
832 	macp->m_driver = xnfp;
833 	xnfp->xnf_devinfo = devinfo;
834 
835 	macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
836 	macp->m_src_addr = xnfp->xnf_mac_addr;
837 	macp->m_callbacks = &xnf_callbacks;
838 	macp->m_min_sdu = 0;
839 	macp->m_max_sdu = XNF_MAXPKT;
840 
841 	xnfp->xnf_running = B_FALSE;
842 	xnfp->xnf_connected = B_FALSE;
843 	xnfp->xnf_be_rx_copy = B_FALSE;
844 	xnfp->xnf_be_mcast_control = B_FALSE;
845 	xnfp->xnf_need_sched = B_FALSE;
846 
847 	xnfp->xnf_rx_head = NULL;
848 	xnfp->xnf_rx_tail = NULL;
849 	xnfp->xnf_rx_new_buffers_posted = B_FALSE;
850 
851 #ifdef XPV_HVM_DRIVER
852 	/*
853 	 * Report our version to dom0.
854 	 */
855 	if (xenbus_printf(XBT_NULL, "guest/xnf", "version", "%d",
856 	    HVMPV_XNF_VERS))
857 		cmn_err(CE_WARN, "xnf: couldn't write version\n");
858 #endif
859 
860 	/*
861 	 * Get the iblock cookie with which to initialize the mutexes.
862 	 */
863 	if (ddi_get_iblock_cookie(devinfo, 0, &xnfp->xnf_icookie)
864 	    != DDI_SUCCESS)
865 		goto failure;
866 
867 	mutex_init(&xnfp->xnf_txlock,
868 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
869 	mutex_init(&xnfp->xnf_rxlock,
870 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
871 	mutex_init(&xnfp->xnf_schedlock,
872 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
873 	mutex_init(&xnfp->xnf_gref_lock,
874 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
875 
876 	cv_init(&xnfp->xnf_cv_state, NULL, CV_DEFAULT, NULL);
877 	cv_init(&xnfp->xnf_cv_multicast, NULL, CV_DEFAULT, NULL);
878 	cv_init(&xnfp->xnf_cv_tx_slots, NULL, CV_DEFAULT, NULL);
879 
880 	(void) sprintf(cachename, "xnf_buf_cache_%d",
881 	    ddi_get_instance(devinfo));
882 	xnfp->xnf_buf_cache = kmem_cache_create(cachename,
883 	    sizeof (xnf_buf_t), 0,
884 	    xnf_buf_constructor, xnf_buf_destructor,
885 	    NULL, xnfp, NULL, 0);
886 	if (xnfp->xnf_buf_cache == NULL)
887 		goto failure_0;
888 
889 	(void) sprintf(cachename, "xnf_tx_buf_cache_%d",
890 	    ddi_get_instance(devinfo));
891 	xnfp->xnf_tx_buf_cache = kmem_cache_create(cachename,
892 	    sizeof (xnf_txbuf_t), 0,
893 	    xnf_tx_buf_constructor, xnf_tx_buf_destructor,
894 	    NULL, xnfp, NULL, 0);
895 	if (xnfp->xnf_tx_buf_cache == NULL)
896 		goto failure_1;
897 
898 	xnfp->xnf_gref_head = INVALID_GRANT_REF;
899 
900 	if (xnf_alloc_dma_resources(xnfp) == DDI_FAILURE) {
901 		cmn_err(CE_WARN, "xnf%d: failed to allocate and initialize "
902 		    "driver data structures",
903 		    ddi_get_instance(xnfp->xnf_devinfo));
904 		goto failure_2;
905 	}
906 
907 	xnfp->xnf_rx_ring.sring->rsp_event =
908 	    xnfp->xnf_tx_ring.sring->rsp_event = 1;
909 
910 	xnfp->xnf_tx_ring_ref = INVALID_GRANT_REF;
911 	xnfp->xnf_rx_ring_ref = INVALID_GRANT_REF;
912 
913 	/* set driver private pointer now */
914 	ddi_set_driver_private(devinfo, xnfp);
915 
916 	if (!xnf_kstat_init(xnfp))
917 		goto failure_3;
918 
919 	/*
920 	 * Allocate an event channel, add the interrupt handler and
921 	 * bind it to the event channel.
922 	 */
923 	(void) xvdi_alloc_evtchn(devinfo);
924 	xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo);
925 #ifdef XPV_HVM_DRIVER
926 	ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr, xnfp);
927 #else
928 	(void) ddi_add_intr(devinfo, 0, NULL, NULL, xnf_intr, (caddr_t)xnfp);
929 #endif
930 
931 	err = mac_register(macp, &xnfp->xnf_mh);
932 	mac_free(macp);
933 	macp = NULL;
934 	if (err != 0)
935 		goto failure_4;
936 
937 	if (xvdi_add_event_handler(devinfo, XS_OE_STATE, oe_state_change, NULL)
938 	    != DDI_SUCCESS)
939 		goto failure_5;
940 
941 #ifdef XPV_HVM_DRIVER
942 	/*
943 	 * In the HVM case, this driver essentially replaces a driver for
944 	 * a 'real' PCI NIC. Without the "model" property set to
945 	 * "Ethernet controller", like the PCI code does, netbooting does
946 	 * not work correctly, as strplumb_get_netdev_path() will not find
947 	 * this interface.
948 	 */
949 	(void) ndi_prop_update_string(DDI_DEV_T_NONE, devinfo, "model",
950 	    "Ethernet controller");
951 #endif
952 
953 #ifdef XNF_DEBUG
954 	if (xnf_debug_instance == NULL)
955 		xnf_debug_instance = xnfp;
956 #endif
957 
958 	return (DDI_SUCCESS);
959 
960 failure_5:
961 	mac_unregister(xnfp->xnf_mh);
962 
963 failure_4:
964 #ifdef XPV_HVM_DRIVER
965 	ec_unbind_evtchn(xnfp->xnf_evtchn);
966 	xvdi_free_evtchn(devinfo);
967 #else
968 	ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
969 #endif
970 	xnfp->xnf_evtchn = INVALID_EVTCHN;
971 	kstat_delete(xnfp->xnf_kstat_aux);
972 
973 failure_3:
974 	xnf_release_dma_resources(xnfp);
975 
976 failure_2:
977 	kmem_cache_destroy(xnfp->xnf_tx_buf_cache);
978 
979 failure_1:
980 	kmem_cache_destroy(xnfp->xnf_buf_cache);
981 
982 failure_0:
983 	cv_destroy(&xnfp->xnf_cv_tx_slots);
984 	cv_destroy(&xnfp->xnf_cv_multicast);
985 	cv_destroy(&xnfp->xnf_cv_state);
986 
987 	mutex_destroy(&xnfp->xnf_gref_lock);
988 	mutex_destroy(&xnfp->xnf_schedlock);
989 	mutex_destroy(&xnfp->xnf_rxlock);
990 	mutex_destroy(&xnfp->xnf_txlock);
991 
992 failure:
993 	kmem_free(xnfp, sizeof (*xnfp));
994 	if (macp != NULL)
995 		mac_free(macp);
996 
997 	return (DDI_FAILURE);
998 }
999 
1000 /*  detach(9E) -- Detach a device from the system */
1001 static int
1002 xnf_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
1003 {
1004 	xnf_t *xnfp;		/* Our private device info */
1005 
1006 #ifdef XNF_DEBUG
1007 	if (xnf_debug & XNF_DEBUG_DDI)
1008 		printf("xnf_detach(0x%p)\n", (void *)devinfo);
1009 #endif
1010 
1011 	xnfp = ddi_get_driver_private(devinfo);
1012 
1013 	switch (cmd) {
1014 	case DDI_SUSPEND:
1015 #ifdef XPV_HVM_DRIVER
1016 		ec_unbind_evtchn(xnfp->xnf_evtchn);
1017 		xvdi_free_evtchn(devinfo);
1018 #else
1019 		ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
1020 #endif
1021 
1022 		xvdi_suspend(devinfo);
1023 
1024 		mutex_enter(&xnfp->xnf_rxlock);
1025 		mutex_enter(&xnfp->xnf_txlock);
1026 
1027 		xnfp->xnf_evtchn = INVALID_EVTCHN;
1028 		xnfp->xnf_connected = B_FALSE;
1029 		mutex_exit(&xnfp->xnf_txlock);
1030 		mutex_exit(&xnfp->xnf_rxlock);
1031 
1032 		/* claim link to be down after disconnect */
1033 		mac_link_update(xnfp->xnf_mh, LINK_STATE_DOWN);
1034 		return (DDI_SUCCESS);
1035 
1036 	case DDI_DETACH:
1037 		break;
1038 
1039 	default:
1040 		return (DDI_FAILURE);
1041 	}
1042 
1043 	if (xnfp->xnf_connected)
1044 		return (DDI_FAILURE);
1045 
1046 	/*
1047 	 * Cannot detach if we have xnf_buf_t outstanding.
1048 	 */
1049 	if (xnfp->xnf_stat_buf_allocated > 0)
1050 		return (DDI_FAILURE);
1051 
1052 	if (mac_unregister(xnfp->xnf_mh) != 0)
1053 		return (DDI_FAILURE);
1054 
1055 	kstat_delete(xnfp->xnf_kstat_aux);
1056 
1057 	/* Stop the receiver */
1058 	xnf_stop(xnfp);
1059 
1060 	xvdi_remove_event_handler(devinfo, XS_OE_STATE);
1061 
1062 	/* Remove the interrupt */
1063 #ifdef XPV_HVM_DRIVER
1064 	ec_unbind_evtchn(xnfp->xnf_evtchn);
1065 	xvdi_free_evtchn(devinfo);
1066 #else
1067 	ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
1068 #endif
1069 
1070 	/* Release any pending xmit mblks */
1071 	xnf_release_mblks(xnfp);
1072 
1073 	/* Release all DMA resources */
1074 	xnf_release_dma_resources(xnfp);
1075 
1076 	cv_destroy(&xnfp->xnf_cv_tx_slots);
1077 	cv_destroy(&xnfp->xnf_cv_multicast);
1078 	cv_destroy(&xnfp->xnf_cv_state);
1079 
1080 	kmem_cache_destroy(xnfp->xnf_tx_buf_cache);
1081 	kmem_cache_destroy(xnfp->xnf_buf_cache);
1082 
1083 	mutex_destroy(&xnfp->xnf_gref_lock);
1084 	mutex_destroy(&xnfp->xnf_schedlock);
1085 	mutex_destroy(&xnfp->xnf_rxlock);
1086 	mutex_destroy(&xnfp->xnf_txlock);
1087 
1088 	kmem_free(xnfp, sizeof (*xnfp));
1089 
1090 	return (DDI_SUCCESS);
1091 }
1092 
1093 /*
1094  *  xnf_set_mac_addr() -- set the physical network address on the board.
1095  */
1096 static int
1097 xnf_set_mac_addr(void *arg, const uint8_t *macaddr)
1098 {
1099 	_NOTE(ARGUNUSED(arg, macaddr));
1100 
1101 	/*
1102 	 * We can't set our macaddr.
1103 	 */
1104 	return (ENOTSUP);
1105 }
1106 
1107 /*
1108  *  xnf_set_multicast() -- set (enable) or disable a multicast address.
1109  *
1110  *  Program the hardware to enable/disable the multicast address
1111  *  in "mca".  Enable if "add" is true, disable if false.
1112  */
1113 static int
1114 xnf_set_multicast(void *arg, boolean_t add, const uint8_t *mca)
1115 {
1116 	xnf_t *xnfp = arg;
1117 	xnf_txbuf_t *txp;
1118 	int n_slots;
1119 	RING_IDX slot;
1120 	xnf_txid_t *tidp;
1121 	netif_tx_request_t *txrp;
1122 	struct netif_extra_info *erp;
1123 	boolean_t notify, result;
1124 
1125 	/*
1126 	 * If the backend does not support multicast control then we
1127 	 * must assume that the right packets will just arrive.
1128 	 */
1129 	if (!xnfp->xnf_be_mcast_control)
1130 		return (0);
1131 
1132 	txp = kmem_cache_alloc(xnfp->xnf_tx_buf_cache, KM_SLEEP);
1133 	if (txp == NULL)
1134 		return (1);
1135 
1136 	mutex_enter(&xnfp->xnf_txlock);
1137 
1138 	/*
1139 	 * If we're not yet connected then claim success. This is
1140 	 * acceptable because we refresh the entire set of multicast
1141 	 * addresses when we get connected.
1142 	 *
1143 	 * We can't wait around here because the MAC layer expects
1144 	 * this to be a non-blocking operation - waiting ends up
1145 	 * causing a deadlock during resume.
1146 	 */
1147 	if (!xnfp->xnf_connected) {
1148 		mutex_exit(&xnfp->xnf_txlock);
1149 		return (0);
1150 	}
1151 
1152 	/*
1153 	 * 1. Acquire two slots in the ring.
1154 	 * 2. Fill in the slots.
1155 	 * 3. Request notification when the operation is done.
1156 	 * 4. Kick the peer.
1157 	 * 5. Wait for the response via xnf_tx_clean_ring().
1158 	 */
1159 
1160 	n_slots = tx_slots_get(xnfp, 2, B_TRUE);
1161 	ASSERT(n_slots >= 2);
1162 
1163 	slot = xnfp->xnf_tx_ring.req_prod_pvt;
1164 	tidp = txid_get(xnfp);
1165 	VERIFY(tidp != NULL);
1166 
1167 	txp->tx_type = TX_MCAST_REQ;
1168 	txp->tx_slot = slot;
1169 
1170 	txrp = RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot);
1171 	erp = (struct netif_extra_info *)
1172 	    RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot + 1);
1173 
1174 	txrp->gref = 0;
1175 	txrp->size = 0;
1176 	txrp->offset = 0;
1177 	/* Set tx_txreq.id to appease xnf_tx_clean_ring(). */
1178 	txrp->id = txp->tx_txreq.id = tidp->id;
1179 	txrp->flags = NETTXF_extra_info;
1180 
1181 	erp->type = add ? XEN_NETIF_EXTRA_TYPE_MCAST_ADD :
1182 	    XEN_NETIF_EXTRA_TYPE_MCAST_DEL;
1183 	bcopy((void *)mca, &erp->u.mcast.addr, ETHERADDRL);
1184 
1185 	tidp->txbuf = txp;
1186 
1187 	xnfp->xnf_tx_ring.req_prod_pvt = slot + 2;
1188 
1189 	mutex_enter(&xnfp->xnf_schedlock);
1190 	xnfp->xnf_pending_multicast++;
1191 	mutex_exit(&xnfp->xnf_schedlock);
1192 
1193 	/* LINTED: constant in conditional context */
1194 	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_tx_ring,
1195 	    notify);
1196 	if (notify)
1197 		ec_notify_via_evtchn(xnfp->xnf_evtchn);
1198 
1199 	while (txp->tx_type == TX_MCAST_REQ)
1200 		cv_wait(&xnfp->xnf_cv_multicast,
1201 		    &xnfp->xnf_txlock);
1202 
1203 	ASSERT(txp->tx_type == TX_MCAST_RSP);
1204 
1205 	mutex_enter(&xnfp->xnf_schedlock);
1206 	xnfp->xnf_pending_multicast--;
1207 	mutex_exit(&xnfp->xnf_schedlock);
1208 
1209 	result = (txp->tx_status == NETIF_RSP_OKAY);
1210 
1211 	txid_put(xnfp, tidp);
1212 
1213 	mutex_exit(&xnfp->xnf_txlock);
1214 
1215 	kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1216 
1217 	return (result ? 0 : 1);
1218 }
1219 
1220 /*
1221  * xnf_set_promiscuous() -- set or reset promiscuous mode on the board
1222  *
1223  *  Program the hardware to enable/disable promiscuous mode.
1224  */
1225 static int
1226 xnf_set_promiscuous(void *arg, boolean_t on)
1227 {
1228 	_NOTE(ARGUNUSED(arg, on));
1229 
1230 	/*
1231 	 * We can't really do this, but we pretend that we can in
1232 	 * order that snoop will work.
1233 	 */
1234 	return (0);
1235 }
1236 
1237 /*
1238  * Clean buffers that we have responses for from the transmit ring.
1239  */
1240 static int
1241 xnf_tx_clean_ring(xnf_t *xnfp)
1242 {
1243 	boolean_t work_to_do;
1244 
1245 	ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
1246 
1247 loop:
1248 	while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_tx_ring)) {
1249 		RING_IDX cons, prod, i;
1250 
1251 		cons = xnfp->xnf_tx_ring.rsp_cons;
1252 		prod = xnfp->xnf_tx_ring.sring->rsp_prod;
1253 		membar_consumer();
1254 		/*
1255 		 * Clean tx requests from ring that we have responses
1256 		 * for.
1257 		 */
1258 		DTRACE_PROBE2(xnf_tx_clean_range, int, cons, int, prod);
1259 		for (i = cons; i != prod; i++) {
1260 			netif_tx_response_t *trp;
1261 			xnf_txid_t *tidp;
1262 			xnf_txbuf_t *txp;
1263 
1264 			trp = RING_GET_RESPONSE(&xnfp->xnf_tx_ring, i);
1265 			ASSERT(TX_ID_VALID(trp->id));
1266 
1267 			tidp = TX_ID_TO_TXID(xnfp, trp->id);
1268 			ASSERT(tidp->id == trp->id);
1269 			ASSERT(tidp->next == INVALID_TX_ID);
1270 
1271 			txp = tidp->txbuf;
1272 			ASSERT(txp != NULL);
1273 			ASSERT(txp->tx_txreq.id == trp->id);
1274 
1275 			switch (txp->tx_type) {
1276 			case TX_DATA:
1277 				if (gnttab_query_foreign_access(
1278 				    txp->tx_txreq.gref) != 0)
1279 					cmn_err(CE_PANIC,
1280 					    "tx grant %d still in use by "
1281 					    "backend domain",
1282 					    txp->tx_txreq.gref);
1283 
1284 				if (txp->tx_bdesc == NULL) {
1285 					(void) gnttab_end_foreign_access_ref(
1286 					    txp->tx_txreq.gref, 1);
1287 					gref_put(xnfp, txp->tx_txreq.gref);
1288 					(void) ddi_dma_unbind_handle(
1289 					    txp->tx_dma_handle);
1290 				} else {
1291 					xnf_buf_put(xnfp, txp->tx_bdesc,
1292 					    B_TRUE);
1293 				}
1294 
1295 				freemsg(txp->tx_mp);
1296 				txid_put(xnfp, tidp);
1297 				kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1298 
1299 				break;
1300 
1301 			case TX_MCAST_REQ:
1302 				txp->tx_type = TX_MCAST_RSP;
1303 				txp->tx_status = trp->status;
1304 				cv_broadcast(&xnfp->xnf_cv_multicast);
1305 
1306 				break;
1307 
1308 			case TX_MCAST_RSP:
1309 				break;
1310 
1311 			default:
1312 				cmn_err(CE_PANIC, "xnf_tx_clean_ring: "
1313 				    "invalid xnf_txbuf_t type: %d",
1314 				    txp->tx_type);
1315 				break;
1316 			}
1317 		}
1318 		/*
1319 		 * Record the last response we dealt with so that we
1320 		 * know where to start next time around.
1321 		 */
1322 		xnfp->xnf_tx_ring.rsp_cons = prod;
1323 		membar_enter();
1324 	}
1325 
1326 	/* LINTED: constant in conditional context */
1327 	RING_FINAL_CHECK_FOR_RESPONSES(&xnfp->xnf_tx_ring, work_to_do);
1328 	if (work_to_do)
1329 		goto loop;
1330 
1331 	return (RING_FREE_REQUESTS(&xnfp->xnf_tx_ring));
1332 }
1333 
1334 /*
1335  * Allocate and fill in a look-aside buffer for the packet `mp'. Used
1336  * to ensure that the packet is physically contiguous and contained
1337  * within a single page.
1338  */
1339 static xnf_buf_t *
1340 xnf_tx_pullup(xnf_t *xnfp, mblk_t *mp)
1341 {
1342 	xnf_buf_t *bd;
1343 	caddr_t bp;
1344 
1345 	bd = xnf_buf_get(xnfp, KM_SLEEP, B_TRUE);
1346 	if (bd == NULL)
1347 		return (NULL);
1348 
1349 	bp = bd->buf;
1350 	while (mp != NULL) {
1351 		size_t len = MBLKL(mp);
1352 
1353 		bcopy(mp->b_rptr, bp, len);
1354 		bp += len;
1355 
1356 		mp = mp->b_cont;
1357 	}
1358 
1359 	ASSERT((bp - bd->buf) <= PAGESIZE);
1360 
1361 	xnfp->xnf_stat_tx_pullup++;
1362 
1363 	return (bd);
1364 }
1365 
1366 /*
1367  * Insert the pseudo-header checksum into the packet `buf'.
1368  */
1369 void
1370 xnf_pseudo_cksum(caddr_t buf, int length)
1371 {
1372 	struct ether_header *ehp;
1373 	uint16_t sap, len, *stuff;
1374 	uint32_t cksum;
1375 	size_t offset;
1376 	ipha_t *ipha;
1377 	ipaddr_t src, dst;
1378 
1379 	ASSERT(length >= sizeof (*ehp));
1380 	ehp = (struct ether_header *)buf;
1381 
1382 	if (ntohs(ehp->ether_type) == VLAN_TPID) {
1383 		struct ether_vlan_header *evhp;
1384 
1385 		ASSERT(length >= sizeof (*evhp));
1386 		evhp = (struct ether_vlan_header *)buf;
1387 		sap = ntohs(evhp->ether_type);
1388 		offset = sizeof (*evhp);
1389 	} else {
1390 		sap = ntohs(ehp->ether_type);
1391 		offset = sizeof (*ehp);
1392 	}
1393 
1394 	ASSERT(sap == ETHERTYPE_IP);
1395 
1396 	/* Packet should have been pulled up by the caller. */
1397 	if ((offset + sizeof (ipha_t)) > length) {
1398 		cmn_err(CE_WARN, "xnf_pseudo_cksum: no room for checksum");
1399 		return;
1400 	}
1401 
1402 	ipha = (ipha_t *)(buf + offset);
1403 
1404 	ASSERT(IPH_HDR_LENGTH(ipha) == IP_SIMPLE_HDR_LENGTH);
1405 
1406 	len = ntohs(ipha->ipha_length) - IP_SIMPLE_HDR_LENGTH;
1407 
1408 	switch (ipha->ipha_protocol) {
1409 	case IPPROTO_TCP:
1410 		stuff = IPH_TCPH_CHECKSUMP(ipha, IP_SIMPLE_HDR_LENGTH);
1411 		cksum = IP_TCP_CSUM_COMP;
1412 		break;
1413 	case IPPROTO_UDP:
1414 		stuff = IPH_UDPH_CHECKSUMP(ipha, IP_SIMPLE_HDR_LENGTH);
1415 		cksum = IP_UDP_CSUM_COMP;
1416 		break;
1417 	default:
1418 		cmn_err(CE_WARN, "xnf_pseudo_cksum: unexpected protocol %d",
1419 		    ipha->ipha_protocol);
1420 		return;
1421 	}
1422 
1423 	src = ipha->ipha_src;
1424 	dst = ipha->ipha_dst;
1425 
1426 	cksum += (dst >> 16) + (dst & 0xFFFF);
1427 	cksum += (src >> 16) + (src & 0xFFFF);
1428 	cksum += htons(len);
1429 
1430 	cksum = (cksum >> 16) + (cksum & 0xFFFF);
1431 	cksum = (cksum >> 16) + (cksum & 0xFFFF);
1432 
1433 	ASSERT(cksum <= 0xFFFF);
1434 
1435 	*stuff = (uint16_t)(cksum ? cksum : ~cksum);
1436 }
1437 
1438 /*
1439  * Push a list of prepared packets (`txp') into the transmit ring.
1440  */
1441 static xnf_txbuf_t *
1442 tx_push_packets(xnf_t *xnfp, xnf_txbuf_t *txp)
1443 {
1444 	int slots_free;
1445 	RING_IDX slot;
1446 	boolean_t notify;
1447 
1448 	mutex_enter(&xnfp->xnf_txlock);
1449 
1450 	ASSERT(xnfp->xnf_running);
1451 
1452 	/*
1453 	 * Wait until we are connected to the backend.
1454 	 */
1455 	while (!xnfp->xnf_connected)
1456 		cv_wait(&xnfp->xnf_cv_state, &xnfp->xnf_txlock);
1457 
1458 	slots_free = tx_slots_get(xnfp, 1, B_FALSE);
1459 	DTRACE_PROBE1(xnf_send_slotsfree, int, slots_free);
1460 
1461 	slot = xnfp->xnf_tx_ring.req_prod_pvt;
1462 
1463 	while ((txp != NULL) && (slots_free > 0)) {
1464 		xnf_txid_t *tidp;
1465 		netif_tx_request_t *txrp;
1466 
1467 		tidp = txid_get(xnfp);
1468 		VERIFY(tidp != NULL);
1469 
1470 		txrp = RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot);
1471 
1472 		txp->tx_slot = slot;
1473 		txp->tx_txreq.id = tidp->id;
1474 		*txrp = txp->tx_txreq;
1475 
1476 		tidp->txbuf = txp;
1477 
1478 		xnfp->xnf_stat_opackets++;
1479 		xnfp->xnf_stat_obytes += txp->tx_txreq.size;
1480 
1481 		txp = txp->tx_next;
1482 		slots_free--;
1483 		slot++;
1484 
1485 	}
1486 
1487 	xnfp->xnf_tx_ring.req_prod_pvt = slot;
1488 
1489 	/*
1490 	 * Tell the peer that we sent something, if it cares.
1491 	 */
1492 	/* LINTED: constant in conditional context */
1493 	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_tx_ring,
1494 	    notify);
1495 	if (notify)
1496 		ec_notify_via_evtchn(xnfp->xnf_evtchn);
1497 
1498 	mutex_exit(&xnfp->xnf_txlock);
1499 
1500 	return (txp);
1501 }
1502 
1503 /*
1504  * Send the chain of packets `mp'. Called by the MAC framework.
1505  */
1506 static mblk_t *
1507 xnf_send(void *arg, mblk_t *mp)
1508 {
1509 	xnf_t *xnfp = arg;
1510 	domid_t oeid;
1511 	xnf_txbuf_t *head, *tail;
1512 	mblk_t *ml;
1513 	int prepared;
1514 
1515 	oeid = xvdi_get_oeid(xnfp->xnf_devinfo);
1516 
1517 	/*
1518 	 * Prepare packets for transmission.
1519 	 */
1520 	head = tail = NULL;
1521 	prepared = 0;
1522 	while (mp != NULL) {
1523 		xnf_txbuf_t *txp;
1524 		int n_chunks, length;
1525 		boolean_t page_oops;
1526 		uint32_t pflags;
1527 
1528 		for (ml = mp, n_chunks = length = 0, page_oops = B_FALSE;
1529 		    ml != NULL;
1530 		    ml = ml->b_cont, n_chunks++) {
1531 
1532 			/*
1533 			 * Test if this buffer includes a page
1534 			 * boundary. The test assumes that the range
1535 			 * b_rptr...b_wptr can include only a single
1536 			 * boundary.
1537 			 */
1538 			if (xnf_btop((size_t)ml->b_rptr) !=
1539 			    xnf_btop((size_t)ml->b_wptr)) {
1540 				xnfp->xnf_stat_tx_pagebndry++;
1541 				page_oops = B_TRUE;
1542 			}
1543 
1544 			length += MBLKL(ml);
1545 		}
1546 		DTRACE_PROBE1(xnf_send_b_cont, int, n_chunks);
1547 
1548 		/*
1549 		 * Make sure packet isn't too large.
1550 		 */
1551 		if (length > XNF_FRAMESIZE) {
1552 			cmn_err(CE_WARN,
1553 			    "xnf%d: oversized packet (%d bytes) dropped",
1554 			    ddi_get_instance(xnfp->xnf_devinfo), length);
1555 			freemsg(mp);
1556 			continue;
1557 		}
1558 
1559 		txp = kmem_cache_alloc(xnfp->xnf_tx_buf_cache, KM_SLEEP);
1560 		if (txp == NULL)
1561 			break;
1562 
1563 		txp->tx_type = TX_DATA;
1564 
1565 		if ((n_chunks > xnf_max_tx_frags) || page_oops) {
1566 			/*
1567 			 * Loan a side buffer rather than the mblk
1568 			 * itself.
1569 			 */
1570 			txp->tx_bdesc = xnf_tx_pullup(xnfp, mp);
1571 			if (txp->tx_bdesc == NULL) {
1572 				kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1573 				break;
1574 			}
1575 
1576 			txp->tx_bufp = txp->tx_bdesc->buf;
1577 			txp->tx_mfn = txp->tx_bdesc->buf_mfn;
1578 			txp->tx_txreq.gref = txp->tx_bdesc->grant_ref;
1579 
1580 		} else {
1581 			int rc;
1582 			ddi_dma_cookie_t dma_cookie;
1583 			uint_t ncookies;
1584 
1585 			rc = ddi_dma_addr_bind_handle(txp->tx_dma_handle,
1586 			    NULL, (char *)mp->b_rptr, length,
1587 			    DDI_DMA_WRITE | DDI_DMA_STREAMING,
1588 			    DDI_DMA_DONTWAIT, 0, &dma_cookie,
1589 			    &ncookies);
1590 			if (rc != DDI_DMA_MAPPED) {
1591 				ASSERT(rc != DDI_DMA_INUSE);
1592 				ASSERT(rc != DDI_DMA_PARTIAL_MAP);
1593 
1594 #ifdef XNF_DEBUG
1595 				if (rc != DDI_DMA_NORESOURCES)
1596 					cmn_err(CE_WARN,
1597 					    "xnf%d: bind_handle failed (%x)",
1598 					    ddi_get_instance(xnfp->xnf_devinfo),
1599 					    rc);
1600 #endif
1601 				kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1602 				break;
1603 			}
1604 			ASSERT(ncookies == 1);
1605 
1606 			txp->tx_bdesc = NULL;
1607 			txp->tx_bufp = (caddr_t)mp->b_rptr;
1608 			txp->tx_mfn =
1609 			    xnf_btop(pa_to_ma(dma_cookie.dmac_laddress));
1610 			txp->tx_txreq.gref = gref_get(xnfp);
1611 			if (txp->tx_txreq.gref == INVALID_GRANT_REF) {
1612 				(void) ddi_dma_unbind_handle(
1613 				    txp->tx_dma_handle);
1614 				kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1615 				break;
1616 			}
1617 			gnttab_grant_foreign_access_ref(txp->tx_txreq.gref,
1618 			    oeid, txp->tx_mfn, 1);
1619 		}
1620 
1621 		txp->tx_next = NULL;
1622 		txp->tx_mp = mp;
1623 		txp->tx_txreq.size = length;
1624 		txp->tx_txreq.offset = (uintptr_t)txp->tx_bufp & PAGEOFFSET;
1625 		txp->tx_txreq.flags = 0;
1626 		hcksum_retrieve(mp, NULL, NULL, NULL, NULL, NULL, NULL,
1627 		    &pflags);
1628 		if (pflags != 0) {
1629 			/*
1630 			 * If the local protocol stack requests checksum
1631 			 * offload we set the 'checksum blank' flag,
1632 			 * indicating to the peer that we need the checksum
1633 			 * calculated for us.
1634 			 *
1635 			 * We _don't_ set the validated flag, because we haven't
1636 			 * validated that the data and the checksum match.
1637 			 */
1638 			xnf_pseudo_cksum(txp->tx_bufp, length);
1639 			txp->tx_txreq.flags |= NETTXF_csum_blank;
1640 
1641 			xnfp->xnf_stat_tx_cksum_deferred++;
1642 		}
1643 
1644 		if (head == NULL) {
1645 			ASSERT(tail == NULL);
1646 
1647 			head = txp;
1648 		} else {
1649 			ASSERT(tail != NULL);
1650 
1651 			tail->tx_next = txp;
1652 		}
1653 		tail = txp;
1654 
1655 		mp = mp->b_next;
1656 		prepared++;
1657 
1658 		/*
1659 		 * There is no point in preparing more than
1660 		 * NET_TX_RING_SIZE, as we won't be able to push them
1661 		 * into the ring in one go and would hence have to
1662 		 * un-prepare the extra.
1663 		 */
1664 		if (prepared == NET_TX_RING_SIZE)
1665 			break;
1666 	}
1667 
1668 	DTRACE_PROBE1(xnf_send_prepared, int, prepared);
1669 
1670 	if (mp != NULL) {
1671 #ifdef XNF_DEBUG
1672 		int notprepared = 0;
1673 		mblk_t *l = mp;
1674 
1675 		while (l != NULL) {
1676 			notprepared++;
1677 			l = l->b_next;
1678 		}
1679 
1680 		DTRACE_PROBE1(xnf_send_notprepared, int, notprepared);
1681 #else /* !XNF_DEBUG */
1682 		DTRACE_PROBE1(xnf_send_notprepared, int, -1);
1683 #endif /* XNF_DEBUG */
1684 	}
1685 
1686 	/*
1687 	 * Push the packets we have prepared into the ring. They may
1688 	 * not all go.
1689 	 */
1690 	if (head != NULL)
1691 		head = tx_push_packets(xnfp, head);
1692 
1693 	/*
1694 	 * If some packets that we prepared were not sent, unprepare
1695 	 * them and add them back to the head of those we didn't
1696 	 * prepare.
1697 	 */
1698 	{
1699 		xnf_txbuf_t *loop;
1700 		mblk_t *mp_head, *mp_tail;
1701 		int unprepared = 0;
1702 
1703 		mp_head = mp_tail = NULL;
1704 		loop = head;
1705 
1706 		while (loop != NULL) {
1707 			xnf_txbuf_t *next = loop->tx_next;
1708 
1709 			if (loop->tx_bdesc == NULL) {
1710 				(void) gnttab_end_foreign_access_ref(
1711 				    loop->tx_txreq.gref, 1);
1712 				gref_put(xnfp, loop->tx_txreq.gref);
1713 				(void) ddi_dma_unbind_handle(
1714 				    loop->tx_dma_handle);
1715 			} else {
1716 				xnf_buf_put(xnfp, loop->tx_bdesc, B_TRUE);
1717 			}
1718 
1719 			ASSERT(loop->tx_mp != NULL);
1720 			if (mp_head == NULL)
1721 				mp_head = loop->tx_mp;
1722 			mp_tail = loop->tx_mp;
1723 
1724 			kmem_cache_free(xnfp->xnf_tx_buf_cache, loop);
1725 			loop = next;
1726 			unprepared++;
1727 		}
1728 
1729 		if (mp_tail == NULL) {
1730 			ASSERT(mp_head == NULL);
1731 		} else {
1732 			ASSERT(mp_head != NULL);
1733 
1734 			mp_tail->b_next = mp;
1735 			mp = mp_head;
1736 		}
1737 
1738 		DTRACE_PROBE1(xnf_send_unprepared, int, unprepared);
1739 	}
1740 
1741 	/*
1742 	 * If any mblks are left then we have deferred for some reason
1743 	 * and need to ask for a re-schedule later. This is typically
1744 	 * due to the ring filling.
1745 	 */
1746 	if (mp != NULL) {
1747 		mutex_enter(&xnfp->xnf_schedlock);
1748 		xnfp->xnf_need_sched = B_TRUE;
1749 		mutex_exit(&xnfp->xnf_schedlock);
1750 
1751 		xnfp->xnf_stat_tx_defer++;
1752 	}
1753 
1754 	return (mp);
1755 }
1756 
1757 /*
1758  * Notification of RX packets. Currently no TX-complete interrupt is
1759  * used, as we clean the TX ring lazily.
1760  */
1761 static uint_t
1762 xnf_intr(caddr_t arg)
1763 {
1764 	xnf_t *xnfp = (xnf_t *)arg;
1765 	mblk_t *mp;
1766 	boolean_t need_sched, clean_ring;
1767 
1768 	mutex_enter(&xnfp->xnf_rxlock);
1769 
1770 	/*
1771 	 * Interrupts before we are connected are spurious.
1772 	 */
1773 	if (!xnfp->xnf_connected) {
1774 		mutex_exit(&xnfp->xnf_rxlock);
1775 		xnfp->xnf_stat_unclaimed_interrupts++;
1776 		return (DDI_INTR_UNCLAIMED);
1777 	}
1778 
1779 	/*
1780 	 * Receive side processing.
1781 	 */
1782 	do {
1783 		/*
1784 		 * Collect buffers from the ring.
1785 		 */
1786 		xnf_rx_collect(xnfp);
1787 
1788 		/*
1789 		 * Interrupt me when the next receive buffer is consumed.
1790 		 */
1791 		xnfp->xnf_rx_ring.sring->rsp_event =
1792 		    xnfp->xnf_rx_ring.rsp_cons + 1;
1793 		xen_mb();
1794 
1795 	} while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring));
1796 
1797 	if (xnfp->xnf_rx_new_buffers_posted) {
1798 		boolean_t notify;
1799 
1800 		/*
1801 		 * Indicate to the peer that we have re-filled the
1802 		 * receive ring, if it cares.
1803 		 */
1804 		/* LINTED: constant in conditional context */
1805 		RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_rx_ring, notify);
1806 		if (notify)
1807 			ec_notify_via_evtchn(xnfp->xnf_evtchn);
1808 		xnfp->xnf_rx_new_buffers_posted = B_FALSE;
1809 	}
1810 
1811 	mp = xnfp->xnf_rx_head;
1812 	xnfp->xnf_rx_head = xnfp->xnf_rx_tail = NULL;
1813 
1814 	xnfp->xnf_stat_interrupts++;
1815 	mutex_exit(&xnfp->xnf_rxlock);
1816 
1817 	if (mp != NULL)
1818 		mac_rx(xnfp->xnf_mh, NULL, mp);
1819 
1820 	/*
1821 	 * Transmit side processing.
1822 	 *
1823 	 * If a previous transmit attempt failed or we have pending
1824 	 * multicast requests, clean the ring.
1825 	 *
1826 	 * If we previously stalled transmission and cleaning produces
1827 	 * some free slots, tell upstream to attempt sending again.
1828 	 *
1829 	 * The odd style is to avoid acquiring xnf_txlock unless we
1830 	 * will actually look inside the tx machinery.
1831 	 */
1832 	mutex_enter(&xnfp->xnf_schedlock);
1833 	need_sched = xnfp->xnf_need_sched;
1834 	clean_ring = need_sched || (xnfp->xnf_pending_multicast > 0);
1835 	mutex_exit(&xnfp->xnf_schedlock);
1836 
1837 	if (clean_ring) {
1838 		int free_slots;
1839 
1840 		mutex_enter(&xnfp->xnf_txlock);
1841 		free_slots = tx_slots_get(xnfp, 0, B_FALSE);
1842 
1843 		if (need_sched && (free_slots > 0)) {
1844 			mutex_enter(&xnfp->xnf_schedlock);
1845 			xnfp->xnf_need_sched = B_FALSE;
1846 			mutex_exit(&xnfp->xnf_schedlock);
1847 
1848 			mac_tx_update(xnfp->xnf_mh);
1849 		}
1850 		mutex_exit(&xnfp->xnf_txlock);
1851 	}
1852 
1853 	return (DDI_INTR_CLAIMED);
1854 }
1855 
1856 /*
1857  *  xnf_start() -- start the board receiving and enable interrupts.
1858  */
1859 static int
1860 xnf_start(void *arg)
1861 {
1862 	xnf_t *xnfp = arg;
1863 
1864 #ifdef XNF_DEBUG
1865 	if (xnf_debug & XNF_DEBUG_TRACE)
1866 		printf("xnf%d start(0x%p)\n",
1867 		    ddi_get_instance(xnfp->xnf_devinfo), (void *)xnfp);
1868 #endif
1869 
1870 	mutex_enter(&xnfp->xnf_rxlock);
1871 	mutex_enter(&xnfp->xnf_txlock);
1872 
1873 	/* Accept packets from above. */
1874 	xnfp->xnf_running = B_TRUE;
1875 
1876 	mutex_exit(&xnfp->xnf_txlock);
1877 	mutex_exit(&xnfp->xnf_rxlock);
1878 
1879 	return (0);
1880 }
1881 
1882 /* xnf_stop() - disable hardware */
1883 static void
1884 xnf_stop(void *arg)
1885 {
1886 	xnf_t *xnfp = arg;
1887 
1888 #ifdef XNF_DEBUG
1889 	if (xnf_debug & XNF_DEBUG_TRACE)
1890 		printf("xnf%d stop(0x%p)\n",
1891 		    ddi_get_instance(xnfp->xnf_devinfo), (void *)xnfp);
1892 #endif
1893 
1894 	mutex_enter(&xnfp->xnf_rxlock);
1895 	mutex_enter(&xnfp->xnf_txlock);
1896 
1897 	xnfp->xnf_running = B_FALSE;
1898 
1899 	mutex_exit(&xnfp->xnf_txlock);
1900 	mutex_exit(&xnfp->xnf_rxlock);
1901 }
1902 
1903 /*
1904  * Hang buffer `bdesc' on the RX ring.
1905  */
1906 static void
1907 xnf_rxbuf_hang(xnf_t *xnfp, xnf_buf_t *bdesc)
1908 {
1909 	netif_rx_request_t *reqp;
1910 	RING_IDX hang_ix;
1911 
1912 	ASSERT(MUTEX_HELD(&xnfp->xnf_rxlock));
1913 
1914 	reqp = RING_GET_REQUEST(&xnfp->xnf_rx_ring,
1915 	    xnfp->xnf_rx_ring.req_prod_pvt);
1916 	hang_ix = (RING_IDX) (reqp - RING_GET_REQUEST(&xnfp->xnf_rx_ring, 0));
1917 	ASSERT(xnfp->xnf_rx_pkt_info[hang_ix] == NULL);
1918 
1919 	reqp->id = bdesc->id = hang_ix;
1920 	reqp->gref = bdesc->grant_ref;
1921 
1922 	xnfp->xnf_rx_pkt_info[hang_ix] = bdesc;
1923 	xnfp->xnf_rx_ring.req_prod_pvt++;
1924 
1925 	xnfp->xnf_rx_new_buffers_posted = B_TRUE;
1926 }
1927 
1928 /*
1929  * Collect packets from the RX ring, storing them in `xnfp' for later
1930  * use.
1931  */
1932 static void
1933 xnf_rx_collect(xnf_t *xnfp)
1934 {
1935 	mblk_t *head, *tail;
1936 
1937 	ASSERT(MUTEX_HELD(&xnfp->xnf_rxlock));
1938 
1939 	/*
1940 	 * Loop over unconsumed responses:
1941 	 * 1. get a response
1942 	 * 2. take corresponding buffer off recv. ring
1943 	 * 3. indicate this by setting slot to NULL
1944 	 * 4. create a new message and
1945 	 * 5. copy data in, adjust ptr
1946 	 */
1947 
1948 	head = tail = NULL;
1949 
1950 	while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring)) {
1951 		netif_rx_response_t *rxpkt;
1952 		xnf_buf_t *bdesc;
1953 		ssize_t len;
1954 		size_t off;
1955 		mblk_t *mp = NULL;
1956 		boolean_t hwcsum = B_FALSE;
1957 		grant_ref_t ref;
1958 
1959 		/* 1. */
1960 		rxpkt = RING_GET_RESPONSE(&xnfp->xnf_rx_ring,
1961 		    xnfp->xnf_rx_ring.rsp_cons);
1962 
1963 		DTRACE_PROBE4(xnf_rx_got_rsp, int, (int)rxpkt->id,
1964 		    int, (int)rxpkt->offset,
1965 		    int, (int)rxpkt->flags,
1966 		    int, (int)rxpkt->status);
1967 
1968 		/*
1969 		 * 2.
1970 		 */
1971 		bdesc = xnfp->xnf_rx_pkt_info[rxpkt->id];
1972 
1973 		/*
1974 		 * 3.
1975 		 */
1976 		xnfp->xnf_rx_pkt_info[rxpkt->id] = NULL;
1977 		ASSERT(bdesc->id == rxpkt->id);
1978 
1979 		ref = bdesc->grant_ref;
1980 		off = rxpkt->offset;
1981 		len = rxpkt->status;
1982 
1983 		if (!xnfp->xnf_running) {
1984 			DTRACE_PROBE4(xnf_rx_not_running,
1985 			    int, rxpkt->status,
1986 			    char *, bdesc->buf, int, rxpkt->offset,
1987 			    char *, ((char *)bdesc->buf) + rxpkt->offset);
1988 
1989 			xnfp->xnf_stat_drop++;
1990 
1991 		} else if (len <= 0) {
1992 			DTRACE_PROBE4(xnf_rx_pkt_status_negative,
1993 			    int, rxpkt->status,
1994 			    char *, bdesc->buf, int, rxpkt->offset,
1995 			    char *, ((char *)bdesc->buf) + rxpkt->offset);
1996 
1997 			xnfp->xnf_stat_errrx++;
1998 
1999 			switch (len) {
2000 			case 0:
2001 				xnfp->xnf_stat_runt++;
2002 				break;
2003 			case NETIF_RSP_ERROR:
2004 				xnfp->xnf_stat_mac_rcv_error++;
2005 				break;
2006 			case NETIF_RSP_DROPPED:
2007 				xnfp->xnf_stat_norxbuf++;
2008 				break;
2009 			}
2010 
2011 		} else if (bdesc->grant_ref == INVALID_GRANT_REF) {
2012 			cmn_err(CE_WARN, "Bad rx grant reference %d "
2013 			    "from domain %d", ref,
2014 			    xvdi_get_oeid(xnfp->xnf_devinfo));
2015 
2016 		} else if ((off + len) > PAGESIZE) {
2017 			cmn_err(CE_WARN, "Rx packet overflows page "
2018 			    "(offset %ld, length %ld) from domain %d",
2019 			    off, len, xvdi_get_oeid(xnfp->xnf_devinfo));
2020 		} else {
2021 			xnf_buf_t *nbuf = NULL;
2022 
2023 			DTRACE_PROBE4(xnf_rx_packet, int, len,
2024 			    char *, bdesc->buf, int, off,
2025 			    char *, ((char *)bdesc->buf) + off);
2026 
2027 			ASSERT(off + len <= PAGEOFFSET);
2028 
2029 			if (rxpkt->flags & NETRXF_data_validated)
2030 				hwcsum = B_TRUE;
2031 
2032 			/*
2033 			 * If the packet is below a pre-determined
2034 			 * size we will copy data out rather than
2035 			 * replace it.
2036 			 */
2037 			if (len > xnf_rx_copy_limit)
2038 				nbuf = xnf_buf_get(xnfp, KM_NOSLEEP, B_FALSE);
2039 
2040 			/*
2041 			 * If we have a replacement buffer, attempt to
2042 			 * wrap the existing one with an mblk_t in
2043 			 * order that the upper layers of the stack
2044 			 * might use it directly.
2045 			 */
2046 			if (nbuf != NULL) {
2047 				mp = desballoc((unsigned char *)bdesc->buf,
2048 				    bdesc->len, 0, &bdesc->free_rtn);
2049 				if (mp == NULL) {
2050 					xnfp->xnf_stat_rx_desballoc_fail++;
2051 					xnfp->xnf_stat_norxbuf++;
2052 
2053 					xnf_buf_put(xnfp, nbuf, B_FALSE);
2054 					nbuf = NULL;
2055 				} else {
2056 					mp->b_rptr = mp->b_rptr + off;
2057 					mp->b_wptr = mp->b_rptr + len;
2058 
2059 					/*
2060 					 * Release the grant reference
2061 					 * associated with this buffer
2062 					 * - they are scarce and the
2063 					 * upper layers of the stack
2064 					 * don't need it.
2065 					 */
2066 					(void) gnttab_end_foreign_access_ref(
2067 					    bdesc->grant_ref, 0);
2068 					gref_put(xnfp, bdesc->grant_ref);
2069 					bdesc->grant_ref = INVALID_GRANT_REF;
2070 
2071 					bdesc = nbuf;
2072 				}
2073 			}
2074 
2075 			if (nbuf == NULL) {
2076 				/*
2077 				 * No replacement buffer allocated -
2078 				 * attempt to copy the data out and
2079 				 * re-hang the existing buffer.
2080 				 */
2081 
2082 				/* 4. */
2083 				mp = allocb(len, BPRI_MED);
2084 				if (mp == NULL) {
2085 					xnfp->xnf_stat_rx_allocb_fail++;
2086 					xnfp->xnf_stat_norxbuf++;
2087 				} else {
2088 					/* 5. */
2089 					bcopy(bdesc->buf + off, mp->b_wptr,
2090 					    len);
2091 					mp->b_wptr += len;
2092 				}
2093 			}
2094 		}
2095 
2096 		/* Re-hang the buffer. */
2097 		xnf_rxbuf_hang(xnfp, bdesc);
2098 
2099 		if (mp != NULL) {
2100 			if (hwcsum) {
2101 				/*
2102 				 * If the peer says that the data has
2103 				 * been validated then we declare that
2104 				 * the full checksum has been
2105 				 * verified.
2106 				 *
2107 				 * We don't look at the "checksum
2108 				 * blank" flag, and hence could have a
2109 				 * packet here that we are asserting
2110 				 * is good with a blank checksum.
2111 				 *
2112 				 * The hardware checksum offload
2113 				 * specification says that we must
2114 				 * provide the actual checksum as well
2115 				 * as an assertion that it is valid,
2116 				 * but the protocol stack doesn't
2117 				 * actually use it and some other
2118 				 * drivers don't bother, so we don't.
2119 				 * If it was necessary we could grovel
2120 				 * in the packet to find it.
2121 				 */
2122 				(void) hcksum_assoc(mp, NULL,
2123 				    NULL, 0, 0, 0, 0,
2124 				    HCK_FULLCKSUM |
2125 				    HCK_FULLCKSUM_OK, 0);
2126 				xnfp->xnf_stat_rx_cksum_no_need++;
2127 			}
2128 			if (head == NULL) {
2129 				ASSERT(tail == NULL);
2130 
2131 				head = mp;
2132 			} else {
2133 				ASSERT(tail != NULL);
2134 
2135 				tail->b_next = mp;
2136 			}
2137 			tail = mp;
2138 
2139 			ASSERT(mp->b_next == NULL);
2140 
2141 			xnfp->xnf_stat_ipackets++;
2142 			xnfp->xnf_stat_rbytes += len;
2143 		}
2144 
2145 		xnfp->xnf_rx_ring.rsp_cons++;
2146 	}
2147 
2148 	/*
2149 	 * Store the mblks we have collected.
2150 	 */
2151 	if (head != NULL) {
2152 		ASSERT(tail != NULL);
2153 
2154 		if (xnfp->xnf_rx_head == NULL) {
2155 			ASSERT(xnfp->xnf_rx_tail == NULL);
2156 
2157 			xnfp->xnf_rx_head = head;
2158 		} else {
2159 			ASSERT(xnfp->xnf_rx_tail != NULL);
2160 
2161 			xnfp->xnf_rx_tail->b_next = head;
2162 		}
2163 		xnfp->xnf_rx_tail = tail;
2164 	}
2165 }
2166 
2167 /*
2168  *  xnf_alloc_dma_resources() -- initialize the drivers structures
2169  */
2170 static int
2171 xnf_alloc_dma_resources(xnf_t *xnfp)
2172 {
2173 	dev_info_t 		*devinfo = xnfp->xnf_devinfo;
2174 	size_t			len;
2175 	ddi_dma_cookie_t	dma_cookie;
2176 	uint_t			ncookies;
2177 	int			rc;
2178 	caddr_t			rptr;
2179 
2180 	/*
2181 	 * The code below allocates all the DMA data structures that
2182 	 * need to be released when the driver is detached.
2183 	 *
2184 	 * Allocate page for the transmit descriptor ring.
2185 	 */
2186 	if (ddi_dma_alloc_handle(devinfo, &ringbuf_dma_attr,
2187 	    DDI_DMA_SLEEP, 0, &xnfp->xnf_tx_ring_dma_handle) != DDI_SUCCESS)
2188 		goto alloc_error;
2189 
2190 	if (ddi_dma_mem_alloc(xnfp->xnf_tx_ring_dma_handle,
2191 	    PAGESIZE, &accattr, DDI_DMA_CONSISTENT,
2192 	    DDI_DMA_SLEEP, 0, &rptr, &len,
2193 	    &xnfp->xnf_tx_ring_dma_acchandle) != DDI_SUCCESS) {
2194 		ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2195 		xnfp->xnf_tx_ring_dma_handle = NULL;
2196 		goto alloc_error;
2197 	}
2198 
2199 	if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_tx_ring_dma_handle, NULL,
2200 	    rptr, PAGESIZE, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2201 	    DDI_DMA_SLEEP, 0, &dma_cookie, &ncookies)) != DDI_DMA_MAPPED) {
2202 		ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle);
2203 		ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2204 		xnfp->xnf_tx_ring_dma_handle = NULL;
2205 		xnfp->xnf_tx_ring_dma_acchandle = NULL;
2206 		if (rc == DDI_DMA_NORESOURCES)
2207 			goto alloc_error;
2208 		else
2209 			goto error;
2210 	}
2211 
2212 	ASSERT(ncookies == 1);
2213 	bzero(rptr, PAGESIZE);
2214 	/* LINTED: constant in conditional context */
2215 	SHARED_RING_INIT((netif_tx_sring_t *)rptr);
2216 	/* LINTED: constant in conditional context */
2217 	FRONT_RING_INIT(&xnfp->xnf_tx_ring, (netif_tx_sring_t *)rptr, PAGESIZE);
2218 	xnfp->xnf_tx_ring_phys_addr = dma_cookie.dmac_laddress;
2219 
2220 	/*
2221 	 * Allocate page for the receive descriptor ring.
2222 	 */
2223 	if (ddi_dma_alloc_handle(devinfo, &ringbuf_dma_attr,
2224 	    DDI_DMA_SLEEP, 0, &xnfp->xnf_rx_ring_dma_handle) != DDI_SUCCESS)
2225 		goto alloc_error;
2226 
2227 	if (ddi_dma_mem_alloc(xnfp->xnf_rx_ring_dma_handle,
2228 	    PAGESIZE, &accattr, DDI_DMA_CONSISTENT,
2229 	    DDI_DMA_SLEEP, 0, &rptr, &len,
2230 	    &xnfp->xnf_rx_ring_dma_acchandle) != DDI_SUCCESS) {
2231 		ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2232 		xnfp->xnf_rx_ring_dma_handle = NULL;
2233 		goto alloc_error;
2234 	}
2235 
2236 	if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_rx_ring_dma_handle, NULL,
2237 	    rptr, PAGESIZE, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2238 	    DDI_DMA_SLEEP, 0, &dma_cookie, &ncookies)) != DDI_DMA_MAPPED) {
2239 		ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle);
2240 		ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2241 		xnfp->xnf_rx_ring_dma_handle = NULL;
2242 		xnfp->xnf_rx_ring_dma_acchandle = NULL;
2243 		if (rc == DDI_DMA_NORESOURCES)
2244 			goto alloc_error;
2245 		else
2246 			goto error;
2247 	}
2248 
2249 	ASSERT(ncookies == 1);
2250 	bzero(rptr, PAGESIZE);
2251 	/* LINTED: constant in conditional context */
2252 	SHARED_RING_INIT((netif_rx_sring_t *)rptr);
2253 	/* LINTED: constant in conditional context */
2254 	FRONT_RING_INIT(&xnfp->xnf_rx_ring, (netif_rx_sring_t *)rptr, PAGESIZE);
2255 	xnfp->xnf_rx_ring_phys_addr = dma_cookie.dmac_laddress;
2256 
2257 	return (DDI_SUCCESS);
2258 
2259 alloc_error:
2260 	cmn_err(CE_WARN, "xnf%d: could not allocate enough DMA memory",
2261 	    ddi_get_instance(xnfp->xnf_devinfo));
2262 error:
2263 	xnf_release_dma_resources(xnfp);
2264 	return (DDI_FAILURE);
2265 }
2266 
2267 /*
2268  * Release all DMA resources in the opposite order from acquisition
2269  */
2270 static void
2271 xnf_release_dma_resources(xnf_t *xnfp)
2272 {
2273 	int i;
2274 
2275 	/*
2276 	 * Free receive buffers which are currently associated with
2277 	 * descriptors.
2278 	 */
2279 	mutex_enter(&xnfp->xnf_rxlock);
2280 	for (i = 0; i < NET_RX_RING_SIZE; i++) {
2281 		xnf_buf_t *bp;
2282 
2283 		if ((bp = xnfp->xnf_rx_pkt_info[i]) == NULL)
2284 			continue;
2285 		xnfp->xnf_rx_pkt_info[i] = NULL;
2286 		xnf_buf_put(xnfp, bp, B_FALSE);
2287 	}
2288 	mutex_exit(&xnfp->xnf_rxlock);
2289 
2290 	/* Free the receive ring buffer. */
2291 	if (xnfp->xnf_rx_ring_dma_acchandle != NULL) {
2292 		(void) ddi_dma_unbind_handle(xnfp->xnf_rx_ring_dma_handle);
2293 		ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle);
2294 		ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2295 		xnfp->xnf_rx_ring_dma_acchandle = NULL;
2296 	}
2297 	/* Free the transmit ring buffer. */
2298 	if (xnfp->xnf_tx_ring_dma_acchandle != NULL) {
2299 		(void) ddi_dma_unbind_handle(xnfp->xnf_tx_ring_dma_handle);
2300 		ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle);
2301 		ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2302 		xnfp->xnf_tx_ring_dma_acchandle = NULL;
2303 	}
2304 
2305 }
2306 
2307 /*
2308  * Release any packets and associated structures used by the TX ring.
2309  */
2310 static void
2311 xnf_release_mblks(xnf_t *xnfp)
2312 {
2313 	RING_IDX i;
2314 	xnf_txid_t *tidp;
2315 
2316 	for (i = 0, tidp = &xnfp->xnf_tx_pkt_id[0];
2317 	    i < NET_TX_RING_SIZE;
2318 	    i++, tidp++) {
2319 		xnf_txbuf_t *txp = tidp->txbuf;
2320 
2321 		if (txp != NULL) {
2322 			ASSERT(txp->tx_mp != NULL);
2323 			freemsg(txp->tx_mp);
2324 
2325 			txid_put(xnfp, tidp);
2326 			kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
2327 		}
2328 	}
2329 }
2330 
2331 static int
2332 xnf_buf_constructor(void *buf, void *arg, int kmflag)
2333 {
2334 	int (*ddiflags)(caddr_t) = DDI_DMA_SLEEP;
2335 	xnf_buf_t *bdesc = buf;
2336 	xnf_t *xnfp = arg;
2337 	ddi_dma_cookie_t dma_cookie;
2338 	uint_t ncookies;
2339 	size_t len;
2340 
2341 	if (kmflag & KM_NOSLEEP)
2342 		ddiflags = DDI_DMA_DONTWAIT;
2343 
2344 	/* Allocate a DMA access handle for the buffer. */
2345 	if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &buf_dma_attr,
2346 	    ddiflags, 0, &bdesc->dma_handle) != DDI_SUCCESS)
2347 		goto failure;
2348 
2349 	/* Allocate DMA-able memory for buffer. */
2350 	if (ddi_dma_mem_alloc(bdesc->dma_handle,
2351 	    PAGESIZE, &data_accattr, DDI_DMA_STREAMING, ddiflags, 0,
2352 	    &bdesc->buf, &len, &bdesc->acc_handle) != DDI_SUCCESS)
2353 		goto failure_1;
2354 
2355 	/* Bind to virtual address of buffer to get physical address. */
2356 	if (ddi_dma_addr_bind_handle(bdesc->dma_handle, NULL,
2357 	    bdesc->buf, len, DDI_DMA_RDWR | DDI_DMA_STREAMING,
2358 	    ddiflags, 0, &dma_cookie, &ncookies) != DDI_DMA_MAPPED)
2359 		goto failure_2;
2360 	ASSERT(ncookies == 1);
2361 
2362 	bdesc->free_rtn.free_func = xnf_buf_recycle;
2363 	bdesc->free_rtn.free_arg = (caddr_t)bdesc;
2364 	bdesc->xnfp = xnfp;
2365 	bdesc->buf_phys = dma_cookie.dmac_laddress;
2366 	bdesc->buf_mfn = pfn_to_mfn(xnf_btop(bdesc->buf_phys));
2367 	bdesc->len = dma_cookie.dmac_size;
2368 	bdesc->grant_ref = INVALID_GRANT_REF;
2369 	bdesc->gen = xnfp->xnf_gen;
2370 
2371 	atomic_add_64(&xnfp->xnf_stat_buf_allocated, 1);
2372 
2373 	return (0);
2374 
2375 failure_2:
2376 	ddi_dma_mem_free(&bdesc->acc_handle);
2377 
2378 failure_1:
2379 	ddi_dma_free_handle(&bdesc->dma_handle);
2380 
2381 failure:
2382 
2383 	return (-1);
2384 }
2385 
2386 static void
2387 xnf_buf_destructor(void *buf, void *arg)
2388 {
2389 	xnf_buf_t *bdesc = buf;
2390 	xnf_t *xnfp = arg;
2391 
2392 	(void) ddi_dma_unbind_handle(bdesc->dma_handle);
2393 	ddi_dma_mem_free(&bdesc->acc_handle);
2394 	ddi_dma_free_handle(&bdesc->dma_handle);
2395 
2396 	atomic_add_64(&xnfp->xnf_stat_buf_allocated, -1);
2397 }
2398 
2399 static xnf_buf_t *
2400 xnf_buf_get(xnf_t *xnfp, int flags, boolean_t readonly)
2401 {
2402 	grant_ref_t gref;
2403 	xnf_buf_t *bufp;
2404 
2405 	/*
2406 	 * Usually grant references are more scarce than memory, so we
2407 	 * attempt to acquire a grant reference first.
2408 	 */
2409 	gref = gref_get(xnfp);
2410 	if (gref == INVALID_GRANT_REF)
2411 		return (NULL);
2412 
2413 	bufp = kmem_cache_alloc(xnfp->xnf_buf_cache, flags);
2414 	if (bufp == NULL) {
2415 		gref_put(xnfp, gref);
2416 		return (NULL);
2417 	}
2418 
2419 	ASSERT(bufp->grant_ref == INVALID_GRANT_REF);
2420 
2421 	bufp->grant_ref = gref;
2422 
2423 	if (bufp->gen != xnfp->xnf_gen)
2424 		xnf_buf_refresh(bufp);
2425 
2426 	gnttab_grant_foreign_access_ref(bufp->grant_ref,
2427 	    xvdi_get_oeid(bufp->xnfp->xnf_devinfo),
2428 	    bufp->buf_mfn, readonly ? 1 : 0);
2429 
2430 	atomic_add_64(&xnfp->xnf_stat_buf_outstanding, 1);
2431 
2432 	return (bufp);
2433 }
2434 
2435 static void
2436 xnf_buf_put(xnf_t *xnfp, xnf_buf_t *bufp, boolean_t readonly)
2437 {
2438 	if (bufp->grant_ref != INVALID_GRANT_REF) {
2439 		(void) gnttab_end_foreign_access_ref(
2440 		    bufp->grant_ref, readonly ? 1 : 0);
2441 		gref_put(xnfp, bufp->grant_ref);
2442 		bufp->grant_ref = INVALID_GRANT_REF;
2443 	}
2444 
2445 	kmem_cache_free(xnfp->xnf_buf_cache, bufp);
2446 
2447 	atomic_add_64(&xnfp->xnf_stat_buf_outstanding, -1);
2448 }
2449 
2450 /*
2451  * Refresh any cached data about a buffer after resume.
2452  */
2453 static void
2454 xnf_buf_refresh(xnf_buf_t *bdesc)
2455 {
2456 	bdesc->buf_mfn = pfn_to_mfn(xnf_btop(bdesc->buf_phys));
2457 	bdesc->gen = bdesc->xnfp->xnf_gen;
2458 }
2459 
2460 /*
2461  * Streams `freeb' routine for `xnf_buf_t' when used as transmit
2462  * look-aside buffers.
2463  */
2464 static void
2465 xnf_buf_recycle(xnf_buf_t *bdesc)
2466 {
2467 	xnf_t *xnfp = bdesc->xnfp;
2468 
2469 	xnf_buf_put(xnfp, bdesc, B_TRUE);
2470 }
2471 
2472 static int
2473 xnf_tx_buf_constructor(void *buf, void *arg, int kmflag)
2474 {
2475 	_NOTE(ARGUNUSED(kmflag));
2476 	xnf_txbuf_t *txp = buf;
2477 	xnf_t *xnfp = arg;
2478 
2479 	if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &buf_dma_attr,
2480 	    0, 0, &txp->tx_dma_handle) != DDI_SUCCESS)
2481 		return (-1);
2482 
2483 	return (0);
2484 }
2485 
2486 static void
2487 xnf_tx_buf_destructor(void *buf, void *arg)
2488 {
2489 	_NOTE(ARGUNUSED(arg));
2490 	xnf_txbuf_t *txp = buf;
2491 
2492 	ddi_dma_free_handle(&txp->tx_dma_handle);
2493 }
2494 
2495 /*
2496  * Statistics.
2497  */
2498 static char *xnf_aux_statistics[] = {
2499 	"tx_cksum_deferred",
2500 	"rx_cksum_no_need",
2501 	"interrupts",
2502 	"unclaimed_interrupts",
2503 	"tx_pullup",
2504 	"tx_pagebndry",
2505 	"tx_attempt",
2506 	"buf_allocated",
2507 	"buf_outstanding",
2508 	"gref_outstanding",
2509 	"gref_failure",
2510 	"gref_peak",
2511 	"rx_allocb_fail",
2512 	"rx_desballoc_fail",
2513 };
2514 
2515 static int
2516 xnf_kstat_aux_update(kstat_t *ksp, int flag)
2517 {
2518 	xnf_t *xnfp;
2519 	kstat_named_t *knp;
2520 
2521 	if (flag != KSTAT_READ)
2522 		return (EACCES);
2523 
2524 	xnfp = ksp->ks_private;
2525 	knp = ksp->ks_data;
2526 
2527 	/*
2528 	 * Assignment order must match that of the names in
2529 	 * xnf_aux_statistics.
2530 	 */
2531 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_cksum_deferred;
2532 	(knp++)->value.ui64 = xnfp->xnf_stat_rx_cksum_no_need;
2533 
2534 	(knp++)->value.ui64 = xnfp->xnf_stat_interrupts;
2535 	(knp++)->value.ui64 = xnfp->xnf_stat_unclaimed_interrupts;
2536 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_pullup;
2537 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_pagebndry;
2538 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_attempt;
2539 
2540 	(knp++)->value.ui64 = xnfp->xnf_stat_buf_allocated;
2541 	(knp++)->value.ui64 = xnfp->xnf_stat_buf_outstanding;
2542 	(knp++)->value.ui64 = xnfp->xnf_stat_gref_outstanding;
2543 	(knp++)->value.ui64 = xnfp->xnf_stat_gref_failure;
2544 	(knp++)->value.ui64 = xnfp->xnf_stat_gref_peak;
2545 	(knp++)->value.ui64 = xnfp->xnf_stat_rx_allocb_fail;
2546 	(knp++)->value.ui64 = xnfp->xnf_stat_rx_desballoc_fail;
2547 
2548 	return (0);
2549 }
2550 
2551 static boolean_t
2552 xnf_kstat_init(xnf_t *xnfp)
2553 {
2554 	int nstat = sizeof (xnf_aux_statistics) /
2555 	    sizeof (xnf_aux_statistics[0]);
2556 	char **cp = xnf_aux_statistics;
2557 	kstat_named_t *knp;
2558 
2559 	/*
2560 	 * Create and initialise kstats.
2561 	 */
2562 	if ((xnfp->xnf_kstat_aux = kstat_create("xnf",
2563 	    ddi_get_instance(xnfp->xnf_devinfo),
2564 	    "aux_statistics", "net", KSTAT_TYPE_NAMED,
2565 	    nstat, 0)) == NULL)
2566 		return (B_FALSE);
2567 
2568 	xnfp->xnf_kstat_aux->ks_private = xnfp;
2569 	xnfp->xnf_kstat_aux->ks_update = xnf_kstat_aux_update;
2570 
2571 	knp = xnfp->xnf_kstat_aux->ks_data;
2572 	while (nstat > 0) {
2573 		kstat_named_init(knp, *cp, KSTAT_DATA_UINT64);
2574 
2575 		knp++;
2576 		cp++;
2577 		nstat--;
2578 	}
2579 
2580 	kstat_install(xnfp->xnf_kstat_aux);
2581 
2582 	return (B_TRUE);
2583 }
2584 
2585 static int
2586 xnf_stat(void *arg, uint_t stat, uint64_t *val)
2587 {
2588 	xnf_t *xnfp = arg;
2589 
2590 	mutex_enter(&xnfp->xnf_rxlock);
2591 	mutex_enter(&xnfp->xnf_txlock);
2592 
2593 #define	mac_stat(q, r)				\
2594 	case (MAC_STAT_##q):			\
2595 		*val = xnfp->xnf_stat_##r;	\
2596 		break
2597 
2598 #define	ether_stat(q, r)			\
2599 	case (ETHER_STAT_##q):			\
2600 		*val = xnfp->xnf_stat_##r;	\
2601 		break
2602 
2603 	switch (stat) {
2604 
2605 	mac_stat(IPACKETS, ipackets);
2606 	mac_stat(OPACKETS, opackets);
2607 	mac_stat(RBYTES, rbytes);
2608 	mac_stat(OBYTES, obytes);
2609 	mac_stat(NORCVBUF, norxbuf);
2610 	mac_stat(IERRORS, errrx);
2611 	mac_stat(NOXMTBUF, tx_defer);
2612 
2613 	ether_stat(MACRCV_ERRORS, mac_rcv_error);
2614 	ether_stat(TOOSHORT_ERRORS, runt);
2615 
2616 	/* always claim to be in full duplex mode */
2617 	case ETHER_STAT_LINK_DUPLEX:
2618 		*val = LINK_DUPLEX_FULL;
2619 		break;
2620 
2621 	/* always claim to be at 1Gb/s link speed */
2622 	case MAC_STAT_IFSPEED:
2623 		*val = 1000000000ull;
2624 		break;
2625 
2626 	default:
2627 		mutex_exit(&xnfp->xnf_txlock);
2628 		mutex_exit(&xnfp->xnf_rxlock);
2629 
2630 		return (ENOTSUP);
2631 	}
2632 
2633 #undef mac_stat
2634 #undef ether_stat
2635 
2636 	mutex_exit(&xnfp->xnf_txlock);
2637 	mutex_exit(&xnfp->xnf_rxlock);
2638 
2639 	return (0);
2640 }
2641 
2642 static boolean_t
2643 xnf_getcapab(void *arg, mac_capab_t cap, void *cap_data)
2644 {
2645 	_NOTE(ARGUNUSED(arg));
2646 
2647 	switch (cap) {
2648 	case MAC_CAPAB_HCKSUM: {
2649 		uint32_t *capab = cap_data;
2650 
2651 		/*
2652 		 * Whilst the flag used to communicate with the IO
2653 		 * domain is called "NETTXF_csum_blank", the checksum
2654 		 * in the packet must contain the pseudo-header
2655 		 * checksum and not zero.
2656 		 *
2657 		 * To help out the IO domain, we might use
2658 		 * HCKSUM_INET_PARTIAL. Unfortunately our stack will
2659 		 * then use checksum offload for IPv6 packets, which
2660 		 * the IO domain can't handle.
2661 		 *
2662 		 * As a result, we declare outselves capable of
2663 		 * HCKSUM_INET_FULL_V4. This means that we receive
2664 		 * IPv4 packets from the stack with a blank checksum
2665 		 * field and must insert the pseudo-header checksum
2666 		 * before passing the packet to the IO domain.
2667 		 */
2668 		*capab = HCKSUM_INET_FULL_V4;
2669 		break;
2670 	}
2671 	default:
2672 		return (B_FALSE);
2673 	}
2674 
2675 	return (B_TRUE);
2676 }
2677 
2678 /*
2679  * The state of the peer has changed - react accordingly.
2680  */
2681 static void
2682 oe_state_change(dev_info_t *dip, ddi_eventcookie_t id,
2683     void *arg, void *impl_data)
2684 {
2685 	_NOTE(ARGUNUSED(id, arg));
2686 	xnf_t *xnfp = ddi_get_driver_private(dip);
2687 	XenbusState new_state = *(XenbusState *)impl_data;
2688 
2689 	ASSERT(xnfp != NULL);
2690 
2691 	switch (new_state) {
2692 	case XenbusStateUnknown:
2693 	case XenbusStateInitialising:
2694 	case XenbusStateInitialised:
2695 	case XenbusStateClosing:
2696 	case XenbusStateClosed:
2697 	case XenbusStateReconfiguring:
2698 	case XenbusStateReconfigured:
2699 		break;
2700 
2701 	case XenbusStateInitWait:
2702 		xnf_read_config(xnfp);
2703 
2704 		if (!xnfp->xnf_be_rx_copy) {
2705 			cmn_err(CE_WARN,
2706 			    "The xnf driver requires a dom0 that "
2707 			    "supports 'feature-rx-copy'.");
2708 			(void) xvdi_switch_state(xnfp->xnf_devinfo,
2709 			    XBT_NULL, XenbusStateClosed);
2710 			break;
2711 		}
2712 
2713 		/*
2714 		 * Connect to the backend.
2715 		 */
2716 		xnf_be_connect(xnfp);
2717 
2718 		/*
2719 		 * Our MAC address as discovered by xnf_read_config().
2720 		 */
2721 		mac_unicst_update(xnfp->xnf_mh, xnfp->xnf_mac_addr);
2722 
2723 		break;
2724 
2725 	case XenbusStateConnected:
2726 		mutex_enter(&xnfp->xnf_rxlock);
2727 		mutex_enter(&xnfp->xnf_txlock);
2728 
2729 		xnfp->xnf_connected = B_TRUE;
2730 		/*
2731 		 * Wake up any threads waiting to send data to
2732 		 * backend.
2733 		 */
2734 		cv_broadcast(&xnfp->xnf_cv_state);
2735 
2736 		mutex_exit(&xnfp->xnf_txlock);
2737 		mutex_exit(&xnfp->xnf_rxlock);
2738 
2739 		/*
2740 		 * Kick the peer in case it missed any transmits
2741 		 * request in the TX ring.
2742 		 */
2743 		ec_notify_via_evtchn(xnfp->xnf_evtchn);
2744 
2745 		/*
2746 		 * There may already be completed receive requests in
2747 		 * the ring sent by backend after it gets connected
2748 		 * but before we see its state change here, so we call
2749 		 * xnf_intr() to handle them, if any.
2750 		 */
2751 		(void) xnf_intr((caddr_t)xnfp);
2752 
2753 		/*
2754 		 * Mark the link up now that we are connected.
2755 		 */
2756 		mac_link_update(xnfp->xnf_mh, LINK_STATE_UP);
2757 
2758 		/*
2759 		 * Tell the backend about the multicast addresses in
2760 		 * which we are interested.
2761 		 */
2762 		mac_multicast_refresh(xnfp->xnf_mh, NULL, xnfp, B_TRUE);
2763 
2764 		break;
2765 
2766 	default:
2767 		break;
2768 	}
2769 }
2770