xref: /illumos-gate/usr/src/uts/common/xen/io/xnf.c (revision 2f0fcb93196badcdd803715656c809058d9f3114)
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 2008 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 - Nemo-based network driver for domU
61  */
62 
63 #include <sys/types.h>
64 #include <sys/errno.h>
65 #include <sys/param.h>
66 #include <sys/sysmacros.h>
67 #include <sys/systm.h>
68 #include <sys/stream.h>
69 #include <sys/strsubr.h>
70 #include <sys/conf.h>
71 #include <sys/ddi.h>
72 #include <sys/devops.h>
73 #include <sys/sunddi.h>
74 #include <sys/sunndi.h>
75 #include <sys/dlpi.h>
76 #include <sys/ethernet.h>
77 #include <sys/strsun.h>
78 #include <sys/pattr.h>
79 #include <inet/ip.h>
80 #include <inet/ip_impl.h>
81 #include <sys/gld.h>
82 #include <sys/modctl.h>
83 #include <sys/mac.h>
84 #include <sys/mac_ether.h>
85 #include <sys/bootinfo.h>
86 #include <sys/mach_mmu.h>
87 #ifdef	XPV_HVM_DRIVER
88 #include <sys/xpv_support.h>
89 #include <sys/hypervisor.h>
90 #else
91 #include <sys/hypervisor.h>
92 #include <sys/evtchn_impl.h>
93 #include <sys/balloon_impl.h>
94 #endif
95 #include <xen/public/io/netif.h>
96 #include <sys/gnttab.h>
97 #include <xen/sys/xendev.h>
98 #include <sys/sdt.h>
99 
100 #include <io/xnf.h>
101 
102 
103 /*
104  *  Declarations and Module Linkage
105  */
106 
107 #if defined(DEBUG) || defined(__lint)
108 #define	XNF_DEBUG
109 int	xnfdebug = 0;
110 #endif
111 
112 /*
113  * On a 32 bit PAE system physical and machine addresses are larger
114  * than 32 bits.  ddi_btop() on such systems take an unsigned long
115  * argument, and so addresses above 4G are truncated before ddi_btop()
116  * gets to see them.  To avoid this, code the shift operation here.
117  */
118 #define	xnf_btop(addr)	((addr) >> PAGESHIFT)
119 
120 boolean_t	xnf_cksum_offload = B_TRUE;
121 
122 /* Default value for hypervisor-based copy operations */
123 boolean_t	xnf_rx_hvcopy = B_TRUE;
124 
125 /*
126  * Should pages used for transmit be readonly for the peer?
127  */
128 boolean_t	xnf_tx_pages_readonly = B_FALSE;
129 /*
130  * Packets under this size are bcopied instead of using desballoc.
131  * Choose a value > XNF_FRAMESIZE (1514) to force the receive path to
132  * always copy.
133  */
134 unsigned int	xnf_rx_bcopy_thresh = 64;
135 
136 unsigned int	xnf_max_tx_frags = 1;
137 
138 /* Required system entry points */
139 static int	xnf_attach(dev_info_t *, ddi_attach_cmd_t);
140 static int	xnf_detach(dev_info_t *, ddi_detach_cmd_t);
141 
142 /* Required driver entry points for Nemo */
143 static int	xnf_start(void *);
144 static void	xnf_stop(void *);
145 static int	xnf_set_mac_addr(void *, const uint8_t *);
146 static int	xnf_set_multicast(void *, boolean_t, const uint8_t *);
147 static int	xnf_set_promiscuous(void *, boolean_t);
148 static mblk_t	*xnf_send(void *, mblk_t *);
149 static uint_t	xnf_intr(caddr_t);
150 static int	xnf_stat(void *, uint_t, uint64_t *);
151 static void	xnf_blank(void *, time_t, uint_t);
152 static void	xnf_resources(void *);
153 static void	xnf_ioctl(void *, queue_t *, mblk_t *);
154 static boolean_t xnf_getcapab(void *, mac_capab_t, void *);
155 
156 /* Driver private functions */
157 static int xnf_alloc_dma_resources(xnf_t *);
158 static void xnf_release_dma_resources(xnf_t *);
159 static mblk_t *xnf_process_recv(xnf_t *);
160 static void xnf_rcv_complete(struct xnf_buffer_desc *);
161 static void xnf_release_mblks(xnf_t *);
162 static struct xnf_buffer_desc *xnf_alloc_tx_buffer(xnf_t *);
163 static struct xnf_buffer_desc *xnf_alloc_buffer(xnf_t *);
164 static struct xnf_buffer_desc *xnf_get_tx_buffer(xnf_t *);
165 static struct xnf_buffer_desc *xnf_get_buffer(xnf_t *);
166 static void xnf_free_buffer(struct xnf_buffer_desc *);
167 static void xnf_free_tx_buffer(struct xnf_buffer_desc *);
168 void xnf_send_driver_status(int, int);
169 static void rx_buffer_hang(xnf_t *, struct xnf_buffer_desc *);
170 static int xnf_clean_tx_ring(xnf_t  *);
171 static void oe_state_change(dev_info_t *, ddi_eventcookie_t,
172     void *, void *);
173 static mblk_t *xnf_process_hvcopy_recv(xnf_t *xnfp);
174 static boolean_t xnf_hvcopy_peer_status(dev_info_t *devinfo);
175 static boolean_t xnf_kstat_init(xnf_t *xnfp);
176 
177 /*
178  * XXPV dme: remove MC_IOCTL?
179  */
180 static mac_callbacks_t xnf_callbacks = {
181 	MC_RESOURCES | MC_IOCTL | MC_GETCAPAB,
182 	xnf_stat,
183 	xnf_start,
184 	xnf_stop,
185 	xnf_set_promiscuous,
186 	xnf_set_multicast,
187 	xnf_set_mac_addr,
188 	xnf_send,
189 	xnf_resources,
190 	xnf_ioctl,
191 	xnf_getcapab
192 };
193 
194 #define	GRANT_INVALID_REF	0
195 const int xnf_rx_bufs_lowat = 4 * NET_RX_RING_SIZE;
196 const int xnf_rx_bufs_hiwat = 8 * NET_RX_RING_SIZE; /* default max */
197 
198 /* DMA attributes for network ring buffer */
199 static ddi_dma_attr_t ringbuf_dma_attr = {
200 	DMA_ATTR_V0,		/* version of this structure */
201 	0,			/* lowest usable address */
202 	0xffffffffffffffffULL,	/* highest usable address */
203 	0x7fffffff,		/* maximum DMAable byte count */
204 	MMU_PAGESIZE,		/* alignment in bytes */
205 	0x7ff,			/* bitmap of burst sizes */
206 	1,			/* minimum transfer */
207 	0xffffffffU,		/* maximum transfer */
208 	0xffffffffffffffffULL,	/* maximum segment length */
209 	1,			/* maximum number of segments */
210 	1,			/* granularity */
211 	0,			/* flags (reserved) */
212 };
213 
214 /* DMA attributes for transmit data */
215 static ddi_dma_attr_t tx_buffer_dma_attr = {
216 	DMA_ATTR_V0,		/* version of this structure */
217 	0,			/* lowest usable address */
218 	0xffffffffffffffffULL,	/* highest usable address */
219 	0x7fffffff,		/* maximum DMAable byte count */
220 	MMU_PAGESIZE,		/* alignment in bytes */
221 	0x7ff,			/* bitmap of burst sizes */
222 	1,			/* minimum transfer */
223 	0xffffffffU,		/* maximum transfer */
224 	0xffffffffffffffffULL,	/* maximum segment length */
225 	1,			/* maximum number of segments */
226 	1,			/* granularity */
227 	0,			/* flags (reserved) */
228 };
229 
230 /* DMA attributes for a receive buffer */
231 static ddi_dma_attr_t rx_buffer_dma_attr = {
232 	DMA_ATTR_V0,		/* version of this structure */
233 	0,			/* lowest usable address */
234 	0xffffffffffffffffULL,	/* highest usable address */
235 	0x7fffffff,		/* maximum DMAable byte count */
236 	MMU_PAGESIZE,		/* alignment in bytes */
237 	0x7ff,			/* bitmap of burst sizes */
238 	1,			/* minimum transfer */
239 	0xffffffffU,		/* maximum transfer */
240 	0xffffffffffffffffULL,	/* maximum segment length */
241 	1,			/* maximum number of segments */
242 	1,			/* granularity */
243 	0,			/* flags (reserved) */
244 };
245 
246 /* DMA access attributes for registers and descriptors */
247 static ddi_device_acc_attr_t accattr = {
248 	DDI_DEVICE_ATTR_V0,
249 	DDI_STRUCTURE_LE_ACC,	/* This is a little-endian device */
250 	DDI_STRICTORDER_ACC
251 };
252 
253 /* DMA access attributes for data: NOT to be byte swapped. */
254 static ddi_device_acc_attr_t data_accattr = {
255 	DDI_DEVICE_ATTR_V0,
256 	DDI_NEVERSWAP_ACC,
257 	DDI_STRICTORDER_ACC
258 };
259 
260 unsigned char xnf_broadcastaddr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
261 int xnf_diagnose = 0; /* Patchable global for diagnostic purposes */
262 
263 DDI_DEFINE_STREAM_OPS(xnf_dev_ops, nulldev, nulldev, xnf_attach, xnf_detach,
264     nodev, NULL, D_MP, NULL, ddi_quiesce_not_supported);
265 
266 static struct modldrv xnf_modldrv = {
267 	&mod_driverops,
268 	"Virtual Ethernet driver",
269 	&xnf_dev_ops
270 };
271 
272 static struct modlinkage modlinkage = {
273 	MODREV_1, &xnf_modldrv, NULL
274 };
275 
276 int
277 _init(void)
278 {
279 	int r;
280 
281 	mac_init_ops(&xnf_dev_ops, "xnf");
282 	r = mod_install(&modlinkage);
283 	if (r != DDI_SUCCESS)
284 		mac_fini_ops(&xnf_dev_ops);
285 
286 	return (r);
287 }
288 
289 int
290 _fini(void)
291 {
292 	return (EBUSY); /* XXPV dme: should be removable */
293 }
294 
295 int
296 _info(struct modinfo *modinfop)
297 {
298 	return (mod_info(&modlinkage, modinfop));
299 }
300 
301 static int
302 xnf_setup_rings(xnf_t *xnfp)
303 {
304 	int			ix, err;
305 	RING_IDX		i;
306 	struct xnf_buffer_desc	*bdesc, *rbp;
307 	struct xenbus_device	*xsd;
308 	domid_t			oeid;
309 
310 	oeid = xvdi_get_oeid(xnfp->xnf_devinfo);
311 	xsd = xvdi_get_xsd(xnfp->xnf_devinfo);
312 
313 	if (xnfp->xnf_tx_ring_ref != GRANT_INVALID_REF)
314 		gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0);
315 
316 	err = gnttab_grant_foreign_access(oeid,
317 	    xnf_btop(pa_to_ma(xnfp->xnf_tx_ring_phys_addr)), 0);
318 	if (err <= 0) {
319 		err = -err;
320 		xenbus_dev_error(xsd, err, "granting access to tx ring page");
321 		goto out;
322 	}
323 	xnfp->xnf_tx_ring_ref = (grant_ref_t)err;
324 
325 	if (xnfp->xnf_rx_ring_ref != GRANT_INVALID_REF)
326 		gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0);
327 
328 	err = gnttab_grant_foreign_access(oeid,
329 	    xnf_btop(pa_to_ma(xnfp->xnf_rx_ring_phys_addr)), 0);
330 	if (err <= 0) {
331 		err = -err;
332 		xenbus_dev_error(xsd, err, "granting access to rx ring page");
333 		goto out;
334 	}
335 	xnfp->xnf_rx_ring_ref = (grant_ref_t)err;
336 
337 
338 	mutex_enter(&xnfp->xnf_intrlock);
339 
340 	/*
341 	 * Cleanup the TX ring.  We just clean up any valid tx_pktinfo structs
342 	 * and reset the ring.  Note that this can lose packets after a resume,
343 	 * but we expect to stagger on.
344 	 */
345 	mutex_enter(&xnfp->xnf_txlock);
346 
347 	for (i = 0; i < xnfp->xnf_n_tx; i++) {
348 		struct tx_pktinfo *txp = &xnfp->xnf_tx_pkt_info[i];
349 
350 		txp->id = i + 1;
351 
352 		if (txp->grant_ref == GRANT_INVALID_REF) {
353 			ASSERT(txp->mp == NULL);
354 			ASSERT(txp->bdesc == NULL);
355 			continue;
356 		}
357 
358 		if (gnttab_query_foreign_access(txp->grant_ref) != 0)
359 			panic("tx grant still in use by backend domain");
360 
361 		freemsg(txp->mp);
362 		txp->mp = NULL;
363 
364 		(void) ddi_dma_unbind_handle(txp->dma_handle);
365 
366 		if (txp->bdesc != NULL) {
367 			xnf_free_tx_buffer(txp->bdesc);
368 			txp->bdesc = NULL;
369 		}
370 
371 		(void) gnttab_end_foreign_access_ref(txp->grant_ref,
372 		    xnfp->xnf_tx_pages_readonly);
373 		gnttab_release_grant_reference(&xnfp->xnf_gref_tx_head,
374 		    txp->grant_ref);
375 		txp->grant_ref = GRANT_INVALID_REF;
376 	}
377 
378 	xnfp->xnf_tx_pkt_id_list = 0;
379 	xnfp->xnf_tx_ring.rsp_cons = 0;
380 	xnfp->xnf_tx_ring.req_prod_pvt = 0;
381 
382 	/* LINTED: constant in conditional context */
383 	SHARED_RING_INIT(xnfp->xnf_tx_ring.sring);
384 
385 	mutex_exit(&xnfp->xnf_txlock);
386 
387 	/*
388 	 * Rebuild the RX ring.  We have to rebuild the RX ring because some of
389 	 * our pages are currently flipped out/granted so we can't just free
390 	 * the RX buffers.  Reclaim any unprocessed recv buffers, they won't be
391 	 * useable anyway since the mfn's they refer to are no longer valid.
392 	 * Grant the backend domain access to each hung rx buffer.
393 	 */
394 	i = xnfp->xnf_rx_ring.rsp_cons;
395 	while (i++ != xnfp->xnf_rx_ring.sring->req_prod) {
396 		volatile netif_rx_request_t	*rxrp;
397 
398 		rxrp = RING_GET_REQUEST(&xnfp->xnf_rx_ring, i);
399 		ix = rxrp - RING_GET_REQUEST(&xnfp->xnf_rx_ring, 0);
400 		rbp = xnfp->xnf_rxpkt_bufptr[ix];
401 		if (rbp != NULL) {
402 			grant_ref_t	ref = rbp->grant_ref;
403 
404 			ASSERT(ref != GRANT_INVALID_REF);
405 			if (xnfp->xnf_rx_hvcopy) {
406 				pfn_t pfn = xnf_btop(rbp->buf_phys);
407 				mfn_t mfn = pfn_to_mfn(pfn);
408 
409 				gnttab_grant_foreign_access_ref(ref, oeid,
410 				    mfn, 0);
411 			} else {
412 				gnttab_grant_foreign_transfer_ref(ref,
413 				    oeid, 0);
414 			}
415 			rxrp->id = ix;
416 			rxrp->gref = ref;
417 		}
418 	}
419 
420 	/*
421 	 * Reset the ring pointers to initial state.
422 	 * Hang buffers for any empty ring slots.
423 	 */
424 	xnfp->xnf_rx_ring.rsp_cons = 0;
425 	xnfp->xnf_rx_ring.req_prod_pvt = 0;
426 
427 	/* LINTED: constant in conditional context */
428 	SHARED_RING_INIT(xnfp->xnf_rx_ring.sring);
429 
430 	for (i = 0; i < NET_RX_RING_SIZE; i++) {
431 		xnfp->xnf_rx_ring.req_prod_pvt = i;
432 		if (xnfp->xnf_rxpkt_bufptr[i] != NULL)
433 			continue;
434 		if ((bdesc = xnf_get_buffer(xnfp)) == NULL)
435 			break;
436 		rx_buffer_hang(xnfp, bdesc);
437 	}
438 	xnfp->xnf_rx_ring.req_prod_pvt = i;
439 	/* LINTED: constant in conditional context */
440 	RING_PUSH_REQUESTS(&xnfp->xnf_rx_ring);
441 
442 	mutex_exit(&xnfp->xnf_intrlock);
443 
444 	return (0);
445 
446 out:
447 	if (xnfp->xnf_tx_ring_ref != GRANT_INVALID_REF)
448 		gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0);
449 	xnfp->xnf_tx_ring_ref = GRANT_INVALID_REF;
450 
451 	if (xnfp->xnf_rx_ring_ref != GRANT_INVALID_REF)
452 		gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0);
453 	xnfp->xnf_rx_ring_ref = GRANT_INVALID_REF;
454 
455 	return (err);
456 }
457 
458 
459 /* Called when the upper layers free a message we passed upstream */
460 static void
461 xnf_copy_rcv_complete(struct xnf_buffer_desc *bdesc)
462 {
463 	(void) ddi_dma_unbind_handle(bdesc->dma_handle);
464 	ddi_dma_mem_free(&bdesc->acc_handle);
465 	ddi_dma_free_handle(&bdesc->dma_handle);
466 	kmem_free(bdesc, sizeof (*bdesc));
467 }
468 
469 
470 /*
471  * Connect driver to back end, called to set up communication with
472  * back end driver both initially and on resume after restore/migrate.
473  */
474 void
475 xnf_be_connect(xnf_t *xnfp)
476 {
477 	const char	*message;
478 	xenbus_transaction_t xbt;
479 	struct		xenbus_device *xsd;
480 	char		*xsname;
481 	int		err;
482 
483 	ASSERT(!xnfp->xnf_connected);
484 
485 	xsd = xvdi_get_xsd(xnfp->xnf_devinfo);
486 	xsname = xvdi_get_xsname(xnfp->xnf_devinfo);
487 
488 	err = xnf_setup_rings(xnfp);
489 	if (err != 0) {
490 		cmn_err(CE_WARN, "failed to set up tx/rx rings");
491 		xenbus_dev_error(xsd, err, "setting up ring");
492 		return;
493 	}
494 
495 again:
496 	err = xenbus_transaction_start(&xbt);
497 	if (err != 0) {
498 		xenbus_dev_error(xsd, EIO, "starting transaction");
499 		return;
500 	}
501 
502 	err = xenbus_printf(xbt, xsname, "tx-ring-ref", "%u",
503 	    xnfp->xnf_tx_ring_ref);
504 	if (err != 0) {
505 		message = "writing tx ring-ref";
506 		goto abort_transaction;
507 	}
508 
509 	err = xenbus_printf(xbt, xsname, "rx-ring-ref", "%u",
510 	    xnfp->xnf_rx_ring_ref);
511 	if (err != 0) {
512 		message = "writing rx ring-ref";
513 		goto abort_transaction;
514 	}
515 
516 	err = xenbus_printf(xbt, xsname, "event-channel", "%u",
517 	    xnfp->xnf_evtchn);
518 	if (err != 0) {
519 		message = "writing event-channel";
520 		goto abort_transaction;
521 	}
522 
523 	err = xenbus_printf(xbt, xsname, "feature-rx-notify", "%d", 1);
524 	if (err != 0) {
525 		message = "writing feature-rx-notify";
526 		goto abort_transaction;
527 	}
528 
529 	if (!xnfp->xnf_tx_pages_readonly) {
530 		err = xenbus_printf(xbt, xsname, "feature-tx-writable",
531 		    "%d", 1);
532 		if (err != 0) {
533 			message = "writing feature-tx-writable";
534 			goto abort_transaction;
535 		}
536 	}
537 
538 	err = xenbus_printf(xbt, xsname, "feature-no-csum-offload", "%d",
539 	    xnfp->xnf_cksum_offload ? 0 : 1);
540 	if (err != 0) {
541 		message = "writing feature-no-csum-offload";
542 		goto abort_transaction;
543 	}
544 	err = xenbus_printf(xbt, xsname, "request-rx-copy", "%d",
545 	    xnfp->xnf_rx_hvcopy ? 1 : 0);
546 	if (err != 0) {
547 		message = "writing request-rx-copy";
548 		goto abort_transaction;
549 	}
550 
551 	err = xenbus_printf(xbt, xsname, "state", "%d", XenbusStateConnected);
552 	if (err != 0) {
553 		message = "writing frontend XenbusStateConnected";
554 		goto abort_transaction;
555 	}
556 
557 	err = xenbus_transaction_end(xbt, 0);
558 	if (err != 0) {
559 		if (err == EAGAIN)
560 			goto again;
561 		xenbus_dev_error(xsd, err, "completing transaction");
562 	}
563 
564 	return;
565 
566 abort_transaction:
567 	(void) xenbus_transaction_end(xbt, 1);
568 	xenbus_dev_error(xsd, err, "%s", message);
569 }
570 
571 /*
572  * Read config info from xenstore
573  */
574 void
575 xnf_read_config(xnf_t *xnfp)
576 {
577 	char		mac[ETHERADDRL * 3];
578 	int		err, be_no_cksum_offload;
579 
580 	err = xenbus_scanf(XBT_NULL, xvdi_get_oename(xnfp->xnf_devinfo), "mac",
581 	    "%s", (char *)&mac[0]);
582 	if (err != 0) {
583 		/*
584 		 * bad: we're supposed to be set up with a proper mac
585 		 * addr. at this point
586 		 */
587 		cmn_err(CE_WARN, "%s%d: no mac address",
588 		    ddi_driver_name(xnfp->xnf_devinfo),
589 		    ddi_get_instance(xnfp->xnf_devinfo));
590 			return;
591 	}
592 	if (ether_aton(mac, xnfp->xnf_mac_addr) != ETHERADDRL) {
593 		err = ENOENT;
594 		xenbus_dev_error(xvdi_get_xsd(xnfp->xnf_devinfo), ENOENT,
595 		    "parsing %s/mac", xvdi_get_xsname(xnfp->xnf_devinfo));
596 		return;
597 	}
598 
599 	err = xenbus_scanf(XBT_NULL, xvdi_get_oename(xnfp->xnf_devinfo),
600 	    "feature-no-csum-offload", "%d", &be_no_cksum_offload);
601 	/*
602 	 * If we fail to read the store we assume that the key is
603 	 * absent, implying an older domain at the far end.  Older
604 	 * domains always support checksum offload.
605 	 */
606 	if (err != 0)
607 		be_no_cksum_offload = 0;
608 	/*
609 	 * If the far end cannot do checksum offload or we do not wish
610 	 * to do it, disable it.
611 	 */
612 	if ((be_no_cksum_offload == 1) || !xnfp->xnf_cksum_offload)
613 		xnfp->xnf_cksum_offload = B_FALSE;
614 }
615 
616 /*
617  *  attach(9E) -- Attach a device to the system
618  *
619  *  Called once for each board successfully probed.
620  */
621 static int
622 xnf_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
623 {
624 	mac_register_t *macp;
625 	xnf_t *xnfp;
626 	int err;
627 
628 #ifdef XNF_DEBUG
629 	if (xnfdebug & XNF_DEBUG_DDI)
630 		printf("xnf%d: attach(0x%p)\n", ddi_get_instance(devinfo),
631 		    (void *)devinfo);
632 #endif
633 
634 	switch (cmd) {
635 	case DDI_RESUME:
636 		xnfp = ddi_get_driver_private(devinfo);
637 
638 		(void) xvdi_resume(devinfo);
639 		(void) xvdi_alloc_evtchn(devinfo);
640 		xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo);
641 #ifdef XPV_HVM_DRIVER
642 		ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr,
643 		    xnfp);
644 #else
645 		(void) ddi_add_intr(devinfo, 0, NULL, NULL, xnf_intr,
646 		    (caddr_t)xnfp);
647 #endif
648 		xnf_be_connect(xnfp);
649 		/*
650 		 * Our MAC address may have changed if we're resuming:
651 		 * - on a different host
652 		 * - on the same one and got a different MAC address
653 		 *   because we didn't specify one of our own.
654 		 * so it's useful to claim that it changed in order that
655 		 * IP send out a gratuitous ARP.
656 		 */
657 		mac_unicst_update(xnfp->xnf_mh, xnfp->xnf_mac_addr);
658 		return (DDI_SUCCESS);
659 
660 	case DDI_ATTACH:
661 		break;
662 
663 	default:
664 		return (DDI_FAILURE);
665 	}
666 
667 	/*
668 	 *  Allocate gld_mac_info_t and xnf_instance structures
669 	 */
670 	macp = mac_alloc(MAC_VERSION);
671 	if (macp == NULL)
672 		return (DDI_FAILURE);
673 	xnfp = kmem_zalloc(sizeof (*xnfp), KM_SLEEP);
674 
675 	macp->m_dip = devinfo;
676 	macp->m_driver = xnfp;
677 	xnfp->xnf_devinfo = devinfo;
678 
679 	macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
680 	macp->m_src_addr = xnfp->xnf_mac_addr;
681 	macp->m_callbacks = &xnf_callbacks;
682 	macp->m_min_sdu = 0;
683 	macp->m_max_sdu = XNF_MAXPKT;
684 
685 	xnfp->xnf_running = B_FALSE;
686 	xnfp->xnf_connected = B_FALSE;
687 	xnfp->xnf_cksum_offload = xnf_cksum_offload;
688 	xnfp->xnf_tx_pages_readonly = xnf_tx_pages_readonly;
689 	xnfp->xnf_need_sched = B_FALSE;
690 
691 	xnfp->xnf_rx_hvcopy = xnf_hvcopy_peer_status(devinfo) && xnf_rx_hvcopy;
692 #ifdef XPV_HVM_DRIVER
693 	/*
694 	 * Report our version to dom0.
695 	 */
696 	if (xenbus_printf(XBT_NULL, "hvmpv/xnf", "version", "%d",
697 	    HVMPV_XNF_VERS))
698 		cmn_err(CE_WARN, "xnf: couldn't write version\n");
699 
700 	if (!xnfp->xnf_rx_hvcopy) {
701 		cmn_err(CE_WARN, "The xnf driver requires a dom0 that "
702 		    "supports 'feature-rx-copy'");
703 		goto failure;
704 	}
705 #endif
706 
707 	/*
708 	 * Get the iblock cookie with which to initialize the mutexes.
709 	 */
710 	if (ddi_get_iblock_cookie(devinfo, 0, &xnfp->xnf_icookie)
711 	    != DDI_SUCCESS)
712 		goto failure;
713 	/*
714 	 * Driver locking strategy: the txlock protects all paths
715 	 * through the driver, except the interrupt thread.
716 	 * If the interrupt thread needs to do something which could
717 	 * affect the operation of any other part of the driver,
718 	 * it needs to acquire the txlock mutex.
719 	 */
720 	mutex_init(&xnfp->xnf_tx_buf_mutex,
721 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
722 	mutex_init(&xnfp->xnf_rx_buf_mutex,
723 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
724 	mutex_init(&xnfp->xnf_txlock,
725 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
726 	mutex_init(&xnfp->xnf_intrlock,
727 	    NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
728 	cv_init(&xnfp->xnf_cv, NULL, CV_DEFAULT, NULL);
729 
730 	xnfp->xnf_gref_tx_head = (grant_ref_t)-1;
731 	xnfp->xnf_gref_rx_head = (grant_ref_t)-1;
732 	if (gnttab_alloc_grant_references(NET_TX_RING_SIZE,
733 	    &xnfp->xnf_gref_tx_head) < 0) {
734 		cmn_err(CE_WARN, "xnf%d: can't alloc tx grant refs",
735 		    ddi_get_instance(xnfp->xnf_devinfo));
736 		goto failure_1;
737 	}
738 	if (gnttab_alloc_grant_references(NET_RX_RING_SIZE,
739 	    &xnfp->xnf_gref_rx_head) < 0) {
740 		cmn_err(CE_WARN, "xnf%d: can't alloc rx grant refs",
741 		    ddi_get_instance(xnfp->xnf_devinfo));
742 		goto failure_1;
743 	}
744 	if (xnf_alloc_dma_resources(xnfp) == DDI_FAILURE) {
745 		cmn_err(CE_WARN, "xnf%d: failed to allocate and initialize "
746 		    "driver data structures",
747 		    ddi_get_instance(xnfp->xnf_devinfo));
748 		goto failure_1;
749 	}
750 
751 	xnfp->xnf_rx_ring.sring->rsp_event =
752 	    xnfp->xnf_tx_ring.sring->rsp_event = 1;
753 
754 	xnfp->xnf_tx_ring_ref = GRANT_INVALID_REF;
755 	xnfp->xnf_rx_ring_ref = GRANT_INVALID_REF;
756 
757 	/* set driver private pointer now */
758 	ddi_set_driver_private(devinfo, xnfp);
759 
760 	if (xvdi_add_event_handler(devinfo, XS_OE_STATE, oe_state_change)
761 	    != DDI_SUCCESS)
762 		goto failure_1;
763 
764 	if (!xnf_kstat_init(xnfp))
765 		goto failure_2;
766 
767 	/*
768 	 * Allocate an event channel, add the interrupt handler and
769 	 * bind it to the event channel.
770 	 */
771 	(void) xvdi_alloc_evtchn(devinfo);
772 	xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo);
773 #ifdef XPV_HVM_DRIVER
774 	ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr, xnfp);
775 #else
776 	(void) ddi_add_intr(devinfo, 0, NULL, NULL, xnf_intr, (caddr_t)xnfp);
777 #endif
778 
779 	xnf_read_config(xnfp);
780 	err = mac_register(macp, &xnfp->xnf_mh);
781 	mac_free(macp);
782 	macp = NULL;
783 	if (err != 0)
784 		goto failure_3;
785 
786 #ifdef XPV_HVM_DRIVER
787 	/*
788 	 * In the HVM case, this driver essentially replaces a driver for
789 	 * a 'real' PCI NIC. Without the "model" property set to
790 	 * "Ethernet controller", like the PCI code does, netbooting does
791 	 * not work correctly, as strplumb_get_netdev_path() will not find
792 	 * this interface.
793 	 */
794 	(void) ndi_prop_update_string(DDI_DEV_T_NONE, devinfo, "model",
795 	    "Ethernet controller");
796 #endif
797 
798 	/*
799 	 * connect to the backend
800 	 */
801 	xnf_be_connect(xnfp);
802 
803 	return (DDI_SUCCESS);
804 
805 failure_3:
806 	kstat_delete(xnfp->xnf_kstat_aux);
807 #ifdef XPV_HVM_DRIVER
808 	ec_unbind_evtchn(xnfp->xnf_evtchn);
809 	xvdi_free_evtchn(devinfo);
810 #else
811 	ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
812 #endif
813 	xnfp->xnf_evtchn = INVALID_EVTCHN;
814 
815 failure_2:
816 	xvdi_remove_event_handler(devinfo, XS_OE_STATE);
817 
818 failure_1:
819 	if (xnfp->xnf_gref_tx_head != (grant_ref_t)-1)
820 		gnttab_free_grant_references(xnfp->xnf_gref_tx_head);
821 	if (xnfp->xnf_gref_rx_head != (grant_ref_t)-1)
822 		gnttab_free_grant_references(xnfp->xnf_gref_rx_head);
823 	xnf_release_dma_resources(xnfp);
824 	cv_destroy(&xnfp->xnf_cv);
825 	mutex_destroy(&xnfp->xnf_rx_buf_mutex);
826 	mutex_destroy(&xnfp->xnf_txlock);
827 	mutex_destroy(&xnfp->xnf_intrlock);
828 
829 failure:
830 	kmem_free(xnfp, sizeof (*xnfp));
831 	if (macp != NULL)
832 		mac_free(macp);
833 
834 	return (DDI_FAILURE);
835 }
836 
837 /*  detach(9E) -- Detach a device from the system */
838 static int
839 xnf_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
840 {
841 	xnf_t *xnfp;		/* Our private device info */
842 	int i;
843 
844 #ifdef XNF_DEBUG
845 	if (xnfdebug & XNF_DEBUG_DDI)
846 		printf("xnf_detach(0x%p)\n", (void *)devinfo);
847 #endif
848 
849 	xnfp = ddi_get_driver_private(devinfo);
850 
851 	switch (cmd) {
852 	case DDI_SUSPEND:
853 #ifdef XPV_HVM_DRIVER
854 		ec_unbind_evtchn(xnfp->xnf_evtchn);
855 		xvdi_free_evtchn(devinfo);
856 #else
857 		ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
858 #endif
859 
860 		xvdi_suspend(devinfo);
861 
862 		mutex_enter(&xnfp->xnf_intrlock);
863 		mutex_enter(&xnfp->xnf_txlock);
864 
865 		xnfp->xnf_evtchn = INVALID_EVTCHN;
866 		xnfp->xnf_connected = B_FALSE;
867 		mutex_exit(&xnfp->xnf_txlock);
868 		mutex_exit(&xnfp->xnf_intrlock);
869 
870 		/* claim link to be down after disconnect */
871 		mac_link_update(xnfp->xnf_mh, LINK_STATE_DOWN);
872 		return (DDI_SUCCESS);
873 
874 	case DDI_DETACH:
875 		break;
876 
877 	default:
878 		return (DDI_FAILURE);
879 	}
880 
881 	if (xnfp->xnf_connected)
882 		return (DDI_FAILURE);
883 
884 	/* Wait for receive buffers to be returned; give up after 5 seconds */
885 	i = 50;
886 
887 	mutex_enter(&xnfp->xnf_rx_buf_mutex);
888 	while (xnfp->xnf_rx_bufs_outstanding > 0) {
889 		mutex_exit(&xnfp->xnf_rx_buf_mutex);
890 		delay(drv_usectohz(100000));
891 		if (--i == 0) {
892 			cmn_err(CE_WARN,
893 			    "xnf%d: never reclaimed all the "
894 			    "receive buffers.  Still have %d "
895 			    "buffers outstanding.",
896 			    ddi_get_instance(xnfp->xnf_devinfo),
897 			    xnfp->xnf_rx_bufs_outstanding);
898 			return (DDI_FAILURE);
899 		}
900 		mutex_enter(&xnfp->xnf_rx_buf_mutex);
901 	}
902 	mutex_exit(&xnfp->xnf_rx_buf_mutex);
903 
904 	if (mac_unregister(xnfp->xnf_mh) != 0)
905 		return (DDI_FAILURE);
906 
907 	kstat_delete(xnfp->xnf_kstat_aux);
908 
909 	/* Stop the receiver */
910 	xnf_stop(xnfp);
911 
912 	xvdi_remove_event_handler(devinfo, XS_OE_STATE);
913 
914 	/* Remove the interrupt */
915 #ifdef XPV_HVM_DRIVER
916 	ec_unbind_evtchn(xnfp->xnf_evtchn);
917 	xvdi_free_evtchn(devinfo);
918 #else
919 	ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
920 #endif
921 
922 	/* Release any pending xmit mblks */
923 	xnf_release_mblks(xnfp);
924 
925 	/* Release all DMA resources */
926 	xnf_release_dma_resources(xnfp);
927 
928 	cv_destroy(&xnfp->xnf_cv);
929 	mutex_destroy(&xnfp->xnf_rx_buf_mutex);
930 	mutex_destroy(&xnfp->xnf_txlock);
931 	mutex_destroy(&xnfp->xnf_intrlock);
932 
933 	kmem_free(xnfp, sizeof (*xnfp));
934 
935 	return (DDI_SUCCESS);
936 }
937 
938 /*
939  *  xnf_set_mac_addr() -- set the physical network address on the board.
940  */
941 /*ARGSUSED*/
942 static int
943 xnf_set_mac_addr(void *arg, const uint8_t *macaddr)
944 {
945 	xnf_t *xnfp = arg;
946 
947 #ifdef XNF_DEBUG
948 	if (xnfdebug & XNF_DEBUG_TRACE)
949 		printf("xnf%d: set_mac_addr(0x%p): "
950 		    "%02x:%02x:%02x:%02x:%02x:%02x\n",
951 		    ddi_get_instance(xnfp->xnf_devinfo),
952 		    (void *)xnfp, macaddr[0], macaddr[1], macaddr[2],
953 		    macaddr[3], macaddr[4], macaddr[5]);
954 #endif
955 	/*
956 	 * We can't set our macaddr.
957 	 *
958 	 * XXPV dme: Why not?
959 	 */
960 	return (ENOTSUP);
961 }
962 
963 /*
964  *  xnf_set_multicast() -- set (enable) or disable a multicast address.
965  *
966  *  Program the hardware to enable/disable the multicast address
967  *  in "mcast".  Enable if "add" is true, disable if false.
968  */
969 /*ARGSUSED*/
970 static int
971 xnf_set_multicast(void *arg, boolean_t add, const uint8_t *mca)
972 {
973 	xnf_t *xnfp = arg;
974 
975 #ifdef XNF_DEBUG
976 	if (xnfdebug & XNF_DEBUG_TRACE)
977 		printf("xnf%d set_multicast(0x%p): "
978 		    "%02x:%02x:%02x:%02x:%02x:%02x\n",
979 		    ddi_get_instance(xnfp->xnf_devinfo),
980 		    (void *)xnfp, mca[0], mca[1], mca[2],
981 		    mca[3], mca[4], mca[5]);
982 #endif
983 
984 	/*
985 	 * XXPV dme: Ideally we'd relay the address to the backend for
986 	 * enabling.  The protocol doesn't support that (interesting
987 	 * extension), so we simply succeed and hope that the relevant
988 	 * packets are going to arrive.
989 	 *
990 	 * If protocol support is added for enable/disable then we'll
991 	 * need to keep a list of those in use and re-add on resume.
992 	 */
993 	return (0);
994 }
995 
996 /*
997  * xnf_set_promiscuous() -- set or reset promiscuous mode on the board
998  *
999  *  Program the hardware to enable/disable promiscuous mode.
1000  */
1001 /*ARGSUSED*/
1002 static int
1003 xnf_set_promiscuous(void *arg, boolean_t on)
1004 {
1005 	xnf_t *xnfp = arg;
1006 
1007 #ifdef XNF_DEBUG
1008 	if (xnfdebug & XNF_DEBUG_TRACE)
1009 		printf("xnf%d set_promiscuous(0x%p, %x)\n",
1010 		    ddi_get_instance(xnfp->xnf_devinfo),
1011 		    (void *)xnfp, on);
1012 #endif
1013 	/*
1014 	 * We can't really do this, but we pretend that we can in
1015 	 * order that snoop will work.
1016 	 */
1017 	return (0);
1018 }
1019 
1020 /*
1021  * Clean buffers that we have responses for from the transmit ring.
1022  */
1023 static int
1024 xnf_clean_tx_ring(xnf_t *xnfp)
1025 {
1026 	RING_IDX		next_resp, i;
1027 	struct tx_pktinfo	*reap;
1028 	int			id;
1029 	grant_ref_t		ref;
1030 	boolean_t		work_to_do;
1031 
1032 	ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
1033 
1034 loop:
1035 	while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_tx_ring)) {
1036 		/*
1037 		 * index of next transmission ack
1038 		 */
1039 		next_resp = xnfp->xnf_tx_ring.sring->rsp_prod;
1040 		membar_consumer();
1041 		/*
1042 		 * Clean tx packets from ring that we have responses for
1043 		 */
1044 		for (i = xnfp->xnf_tx_ring.rsp_cons; i != next_resp; i++) {
1045 			id = RING_GET_RESPONSE(&xnfp->xnf_tx_ring, i)->id;
1046 			reap = &xnfp->xnf_tx_pkt_info[id];
1047 			ref = reap->grant_ref;
1048 			/*
1049 			 * Return id to free list
1050 			 */
1051 			reap->id = xnfp->xnf_tx_pkt_id_list;
1052 			xnfp->xnf_tx_pkt_id_list = id;
1053 			if (gnttab_query_foreign_access(ref) != 0)
1054 				panic("tx grant still in use "
1055 				    "by backend domain");
1056 			(void) ddi_dma_unbind_handle(reap->dma_handle);
1057 			(void) gnttab_end_foreign_access_ref(ref,
1058 			    xnfp->xnf_tx_pages_readonly);
1059 			gnttab_release_grant_reference(&xnfp->xnf_gref_tx_head,
1060 			    ref);
1061 			freemsg(reap->mp);
1062 			reap->mp = NULL;
1063 			reap->grant_ref = GRANT_INVALID_REF;
1064 			if (reap->bdesc != NULL)
1065 				xnf_free_tx_buffer(reap->bdesc);
1066 			reap->bdesc = NULL;
1067 		}
1068 		xnfp->xnf_tx_ring.rsp_cons = next_resp;
1069 		membar_enter();
1070 	}
1071 
1072 	/* LINTED: constant in conditional context */
1073 	RING_FINAL_CHECK_FOR_RESPONSES(&xnfp->xnf_tx_ring, work_to_do);
1074 	if (work_to_do)
1075 		goto loop;
1076 
1077 	return (RING_FREE_REQUESTS(&xnfp->xnf_tx_ring));
1078 }
1079 
1080 /*
1081  * If we need to pull up data from either a packet that crosses a page
1082  * boundary or consisting of multiple mblks, do it here.  We allocate
1083  * a page aligned buffer and copy the data into it.  The header for the
1084  * allocated buffer is returned. (which is also allocated here)
1085  */
1086 static struct xnf_buffer_desc *
1087 xnf_pullupmsg(xnf_t *xnfp, mblk_t *mp)
1088 {
1089 	struct xnf_buffer_desc	*bdesc;
1090 	mblk_t			*mptr;
1091 	caddr_t			bp;
1092 	int			len;
1093 
1094 	/*
1095 	 * get a xmit buffer from the xmit buffer pool
1096 	 */
1097 	mutex_enter(&xnfp->xnf_rx_buf_mutex);
1098 	bdesc = xnf_get_tx_buffer(xnfp);
1099 	mutex_exit(&xnfp->xnf_rx_buf_mutex);
1100 	if (bdesc == NULL)
1101 		return (bdesc);
1102 	/*
1103 	 * Copy the data into the buffer
1104 	 */
1105 	xnfp->xnf_stat_tx_pullup++;
1106 	bp = bdesc->buf;
1107 	for (mptr = mp; mptr != NULL; mptr = mptr->b_cont) {
1108 		len = mptr->b_wptr - mptr->b_rptr;
1109 		bcopy(mptr->b_rptr, bp, len);
1110 		bp += len;
1111 	}
1112 	return (bdesc);
1113 }
1114 
1115 void
1116 xnf_pseudo_cksum(caddr_t buf, int length)
1117 {
1118 	struct ether_header *ehp;
1119 	uint16_t sap, len, *stuff;
1120 	uint32_t cksum;
1121 	size_t offset;
1122 	ipha_t *ipha;
1123 	ipaddr_t src, dst;
1124 
1125 	ASSERT(length >= sizeof (*ehp));
1126 	ehp = (struct ether_header *)buf;
1127 
1128 	if (ntohs(ehp->ether_type) == VLAN_TPID) {
1129 		struct ether_vlan_header *evhp;
1130 
1131 		ASSERT(length >= sizeof (*evhp));
1132 		evhp = (struct ether_vlan_header *)buf;
1133 		sap = ntohs(evhp->ether_type);
1134 		offset = sizeof (*evhp);
1135 	} else {
1136 		sap = ntohs(ehp->ether_type);
1137 		offset = sizeof (*ehp);
1138 	}
1139 
1140 	ASSERT(sap == ETHERTYPE_IP);
1141 
1142 	/* Packet should have been pulled up by the caller. */
1143 	if ((offset + sizeof (ipha_t)) > length) {
1144 		cmn_err(CE_WARN, "xnf_pseudo_cksum: no room for checksum");
1145 		return;
1146 	}
1147 
1148 	ipha = (ipha_t *)(buf + offset);
1149 
1150 	ASSERT(IPH_HDR_LENGTH(ipha) == IP_SIMPLE_HDR_LENGTH);
1151 
1152 	len = ntohs(ipha->ipha_length) - IP_SIMPLE_HDR_LENGTH;
1153 
1154 	switch (ipha->ipha_protocol) {
1155 	case IPPROTO_TCP:
1156 		stuff = IPH_TCPH_CHECKSUMP(ipha, IP_SIMPLE_HDR_LENGTH);
1157 		cksum = IP_TCP_CSUM_COMP;
1158 		break;
1159 	case IPPROTO_UDP:
1160 		stuff = IPH_UDPH_CHECKSUMP(ipha, IP_SIMPLE_HDR_LENGTH);
1161 		cksum = IP_UDP_CSUM_COMP;
1162 		break;
1163 	default:
1164 		cmn_err(CE_WARN, "xnf_pseudo_cksum: unexpected protocol %d",
1165 		    ipha->ipha_protocol);
1166 		return;
1167 	}
1168 
1169 	src = ipha->ipha_src;
1170 	dst = ipha->ipha_dst;
1171 
1172 	cksum += (dst >> 16) + (dst & 0xFFFF);
1173 	cksum += (src >> 16) + (src & 0xFFFF);
1174 	cksum += htons(len);
1175 
1176 	cksum = (cksum >> 16) + (cksum & 0xFFFF);
1177 	cksum = (cksum >> 16) + (cksum & 0xFFFF);
1178 
1179 	ASSERT(cksum <= 0xFFFF);
1180 
1181 	*stuff = (uint16_t)(cksum ? cksum : ~cksum);
1182 }
1183 
1184 /*
1185  *  xnf_send_one() -- send a packet
1186  *
1187  *  Called when a packet is ready to be transmitted. A pointer to an
1188  *  M_DATA message that contains the packet is passed to this routine.
1189  *  At least the complete LLC header is contained in the message's
1190  *  first message block, and the remainder of the packet is contained
1191  *  within additional M_DATA message blocks linked to the first
1192  *  message block.
1193  *
1194  */
1195 static boolean_t
1196 xnf_send_one(xnf_t *xnfp, mblk_t *mp)
1197 {
1198 	struct xnf_buffer_desc	*xmitbuf;
1199 	struct tx_pktinfo	*txp_info;
1200 	mblk_t			*mptr;
1201 	ddi_dma_cookie_t	dma_cookie;
1202 	RING_IDX		slot;
1203 	int			length = 0, i, pktlen = 0, rc, tx_id;
1204 	int			tx_ring_freespace, page_oops;
1205 	uint_t			ncookies;
1206 	volatile netif_tx_request_t	*txrp;
1207 	caddr_t			bufaddr;
1208 	grant_ref_t		ref;
1209 	unsigned long		mfn;
1210 	uint32_t		pflags;
1211 	domid_t			oeid;
1212 
1213 #ifdef XNF_DEBUG
1214 	if (xnfdebug & XNF_DEBUG_SEND)
1215 		printf("xnf%d send(0x%p, 0x%p)\n",
1216 		    ddi_get_instance(xnfp->xnf_devinfo),
1217 		    (void *)xnfp, (void *)mp);
1218 #endif
1219 
1220 	ASSERT(mp != NULL);
1221 	ASSERT(mp->b_next == NULL);
1222 	ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
1223 
1224 	tx_ring_freespace = xnf_clean_tx_ring(xnfp);
1225 	ASSERT(tx_ring_freespace >= 0);
1226 
1227 	oeid = xvdi_get_oeid(xnfp->xnf_devinfo);
1228 	xnfp->xnf_stat_tx_attempt++;
1229 	/*
1230 	 * If there are no xmit ring slots available, return.
1231 	 */
1232 	if (tx_ring_freespace == 0) {
1233 		xnfp->xnf_stat_tx_defer++;
1234 		return (B_FALSE);	/* Send should be retried */
1235 	}
1236 
1237 	slot = xnfp->xnf_tx_ring.req_prod_pvt;
1238 	/* Count the number of mblks in message and compute packet size */
1239 	for (i = 0, mptr = mp; mptr != NULL; mptr = mptr->b_cont, i++)
1240 		pktlen += (mptr->b_wptr - mptr->b_rptr);
1241 
1242 	/* Make sure packet isn't too large */
1243 	if (pktlen > XNF_FRAMESIZE) {
1244 		cmn_err(CE_WARN, "xnf%d: oversized packet (%d bytes) dropped",
1245 		    ddi_get_instance(xnfp->xnf_devinfo), pktlen);
1246 		freemsg(mp);
1247 		return (B_TRUE);
1248 	}
1249 
1250 	/*
1251 	 * Test if we cross a page boundary with our buffer
1252 	 */
1253 	page_oops = (i == 1) &&
1254 	    (xnf_btop((size_t)mp->b_rptr) !=
1255 	    xnf_btop((size_t)(mp->b_rptr + pktlen)));
1256 	/*
1257 	 * XXPV - unfortunately, the Xen virtual net device currently
1258 	 * doesn't support multiple packet frags, so this will always
1259 	 * end up doing the pullup if we got more than one packet.
1260 	 */
1261 	if (i > xnf_max_tx_frags || page_oops) {
1262 		if (page_oops)
1263 			xnfp->xnf_stat_tx_pagebndry++;
1264 		if ((xmitbuf = xnf_pullupmsg(xnfp, mp)) == NULL) {
1265 			/* could not allocate resources? */
1266 #ifdef XNF_DEBUG
1267 			cmn_err(CE_WARN, "xnf%d: pullupmsg failed",
1268 			    ddi_get_instance(xnfp->xnf_devinfo));
1269 #endif
1270 			xnfp->xnf_stat_tx_defer++;
1271 			return (B_FALSE);	/* Retry send */
1272 		}
1273 		bufaddr = xmitbuf->buf;
1274 	} else {
1275 		xmitbuf = NULL;
1276 		bufaddr = (caddr_t)mp->b_rptr;
1277 	}
1278 
1279 	/* set up data descriptor */
1280 	length = pktlen;
1281 
1282 	/*
1283 	 * Get packet id from free list
1284 	 */
1285 	tx_id = xnfp->xnf_tx_pkt_id_list;
1286 	ASSERT(tx_id < NET_TX_RING_SIZE);
1287 	txp_info = &xnfp->xnf_tx_pkt_info[tx_id];
1288 	xnfp->xnf_tx_pkt_id_list = txp_info->id;
1289 	txp_info->id = tx_id;
1290 
1291 	/* Prepare for DMA mapping of tx buffer(s) */
1292 	rc = ddi_dma_addr_bind_handle(txp_info->dma_handle,
1293 	    NULL, bufaddr, length, DDI_DMA_WRITE | DDI_DMA_STREAMING,
1294 	    DDI_DMA_DONTWAIT, 0, &dma_cookie, &ncookies);
1295 	if (rc != DDI_DMA_MAPPED) {
1296 		ASSERT(rc != DDI_DMA_INUSE);
1297 		ASSERT(rc != DDI_DMA_PARTIAL_MAP);
1298 		/*
1299 		 *  Return id to free list
1300 		 */
1301 		txp_info->id = xnfp->xnf_tx_pkt_id_list;
1302 		xnfp->xnf_tx_pkt_id_list = tx_id;
1303 		if (rc == DDI_DMA_NORESOURCES) {
1304 			xnfp->xnf_stat_tx_defer++;
1305 			return (B_FALSE); /* Retry later */
1306 		}
1307 #ifdef XNF_DEBUG
1308 		cmn_err(CE_WARN, "xnf%d: bind_handle failed (%x)",
1309 		    ddi_get_instance(xnfp->xnf_devinfo), rc);
1310 #endif
1311 		return (B_FALSE);
1312 	}
1313 
1314 	ASSERT(ncookies == 1);
1315 	ref = gnttab_claim_grant_reference(&xnfp->xnf_gref_tx_head);
1316 	ASSERT((signed short)ref >= 0);
1317 	mfn = xnf_btop(pa_to_ma((paddr_t)dma_cookie.dmac_laddress));
1318 	gnttab_grant_foreign_access_ref(ref, oeid, mfn,
1319 	    xnfp->xnf_tx_pages_readonly);
1320 	txp_info->grant_ref = ref;
1321 	txrp = RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot);
1322 	txrp->gref = ref;
1323 	txrp->size = dma_cookie.dmac_size;
1324 	txrp->offset = (uintptr_t)bufaddr & PAGEOFFSET;
1325 	txrp->id = tx_id;
1326 	txrp->flags = 0;
1327 	hcksum_retrieve(mp, NULL, NULL, NULL, NULL, NULL, NULL, &pflags);
1328 	if (pflags != 0) {
1329 		ASSERT(xnfp->xnf_cksum_offload);
1330 		/*
1331 		 * If the local protocol stack requests checksum
1332 		 * offload we set the 'checksum blank' flag,
1333 		 * indicating to the peer that we need the checksum
1334 		 * calculated for us.
1335 		 *
1336 		 * We _don't_ set the validated flag, because we haven't
1337 		 * validated that the data and the checksum match.
1338 		 */
1339 		xnf_pseudo_cksum(bufaddr, length);
1340 		txrp->flags |= NETTXF_csum_blank;
1341 		xnfp->xnf_stat_tx_cksum_deferred++;
1342 	}
1343 	membar_producer();
1344 	xnfp->xnf_tx_ring.req_prod_pvt = slot + 1;
1345 
1346 	txp_info->mp = mp;
1347 	txp_info->bdesc = xmitbuf;
1348 
1349 	xnfp->xnf_stat_opackets++;
1350 	xnfp->xnf_stat_obytes += pktlen;
1351 
1352 	return (B_TRUE);	/* successful transmit attempt */
1353 }
1354 
1355 mblk_t *
1356 xnf_send(void *arg, mblk_t *mp)
1357 {
1358 	xnf_t *xnfp = arg;
1359 	mblk_t *next;
1360 	boolean_t sent_something = B_FALSE;
1361 
1362 	mutex_enter(&xnfp->xnf_txlock);
1363 
1364 	/*
1365 	 * Transmission attempts should be impossible without having
1366 	 * previously called xnf_start().
1367 	 */
1368 	ASSERT(xnfp->xnf_running);
1369 
1370 	/*
1371 	 * Wait for getting connected to the backend
1372 	 */
1373 	while (!xnfp->xnf_connected) {
1374 		cv_wait(&xnfp->xnf_cv, &xnfp->xnf_txlock);
1375 	}
1376 
1377 	while (mp != NULL) {
1378 		next = mp->b_next;
1379 		mp->b_next = NULL;
1380 
1381 		if (!xnf_send_one(xnfp, mp)) {
1382 			mp->b_next = next;
1383 			break;
1384 		}
1385 
1386 		mp = next;
1387 		sent_something = B_TRUE;
1388 	}
1389 
1390 	if (sent_something) {
1391 		boolean_t notify;
1392 
1393 		/* LINTED: constant in conditional context */
1394 		RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_tx_ring,
1395 		    notify);
1396 		if (notify)
1397 			ec_notify_via_evtchn(xnfp->xnf_evtchn);
1398 	}
1399 
1400 	xnfp->xnf_need_sched = !sent_something;
1401 
1402 	mutex_exit(&xnfp->xnf_txlock);
1403 
1404 	return (mp);
1405 }
1406 
1407 /*
1408  *  xnf_intr() -- ring interrupt service routine
1409  */
1410 static uint_t
1411 xnf_intr(caddr_t arg)
1412 {
1413 	xnf_t *xnfp = (xnf_t *)arg;
1414 	boolean_t sched = B_FALSE;
1415 
1416 	mutex_enter(&xnfp->xnf_intrlock);
1417 
1418 	/* spurious intr */
1419 	if (!xnfp->xnf_connected) {
1420 		mutex_exit(&xnfp->xnf_intrlock);
1421 		xnfp->xnf_stat_unclaimed_interrupts++;
1422 		return (DDI_INTR_UNCLAIMED);
1423 	}
1424 
1425 #ifdef XNF_DEBUG
1426 	if (xnfdebug & XNF_DEBUG_INT)
1427 		printf("xnf%d intr(0x%p)\n",
1428 		    ddi_get_instance(xnfp->xnf_devinfo), (void *)xnfp);
1429 #endif
1430 	if (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring)) {
1431 		mblk_t *mp;
1432 
1433 		if (xnfp->xnf_rx_hvcopy)
1434 			mp = xnf_process_hvcopy_recv(xnfp);
1435 		else
1436 			mp = xnf_process_recv(xnfp);
1437 
1438 		if (mp != NULL)
1439 			mac_rx(xnfp->xnf_mh, xnfp->xnf_rx_handle, mp);
1440 	}
1441 
1442 	xnfp->xnf_stat_interrupts++;
1443 	mutex_exit(&xnfp->xnf_intrlock);
1444 
1445 	/*
1446 	 * Clean tx ring and try to start any blocked xmit streams if
1447 	 * there is now some space.
1448 	 */
1449 	mutex_enter(&xnfp->xnf_txlock);
1450 	if (xnf_clean_tx_ring(xnfp) > 0) {
1451 		sched = xnfp->xnf_need_sched;
1452 		xnfp->xnf_need_sched = B_FALSE;
1453 	}
1454 	mutex_exit(&xnfp->xnf_txlock);
1455 
1456 	if (sched)
1457 		mac_tx_update(xnfp->xnf_mh);
1458 
1459 	return (DDI_INTR_CLAIMED);
1460 }
1461 
1462 /*
1463  *  xnf_start() -- start the board receiving and enable interrupts.
1464  */
1465 static int
1466 xnf_start(void *arg)
1467 {
1468 	xnf_t *xnfp = arg;
1469 
1470 #ifdef XNF_DEBUG
1471 	if (xnfdebug & XNF_DEBUG_TRACE)
1472 		printf("xnf%d start(0x%p)\n",
1473 		    ddi_get_instance(xnfp->xnf_devinfo), (void *)xnfp);
1474 #endif
1475 
1476 	mutex_enter(&xnfp->xnf_intrlock);
1477 	mutex_enter(&xnfp->xnf_txlock);
1478 
1479 	/* Accept packets from above. */
1480 	xnfp->xnf_running = B_TRUE;
1481 
1482 	mutex_exit(&xnfp->xnf_txlock);
1483 	mutex_exit(&xnfp->xnf_intrlock);
1484 
1485 	return (0);
1486 }
1487 
1488 /* xnf_stop() - disable hardware */
1489 static void
1490 xnf_stop(void *arg)
1491 {
1492 	xnf_t *xnfp = arg;
1493 
1494 #ifdef XNF_DEBUG
1495 	if (xnfdebug & XNF_DEBUG_TRACE)
1496 		printf("xnf%d stop(0x%p)\n",
1497 		    ddi_get_instance(xnfp->xnf_devinfo), (void *)xnfp);
1498 #endif
1499 
1500 	mutex_enter(&xnfp->xnf_intrlock);
1501 	mutex_enter(&xnfp->xnf_txlock);
1502 
1503 	xnfp->xnf_running = B_FALSE;
1504 
1505 	mutex_exit(&xnfp->xnf_txlock);
1506 	mutex_exit(&xnfp->xnf_intrlock);
1507 }
1508 
1509 /*
1510  * Driver private functions follow
1511  */
1512 
1513 /*
1514  * Hang buffer on rx ring
1515  */
1516 static void
1517 rx_buffer_hang(xnf_t *xnfp, struct xnf_buffer_desc *bdesc)
1518 {
1519 	volatile netif_rx_request_t	*reqp;
1520 	RING_IDX			hang_ix;
1521 	grant_ref_t			ref;
1522 	domid_t				oeid;
1523 
1524 	oeid = xvdi_get_oeid(xnfp->xnf_devinfo);
1525 
1526 	ASSERT(MUTEX_HELD(&xnfp->xnf_intrlock));
1527 	reqp = RING_GET_REQUEST(&xnfp->xnf_rx_ring,
1528 	    xnfp->xnf_rx_ring.req_prod_pvt);
1529 	hang_ix = (RING_IDX) (reqp - RING_GET_REQUEST(&xnfp->xnf_rx_ring, 0));
1530 	ASSERT(xnfp->xnf_rxpkt_bufptr[hang_ix] == NULL);
1531 	if (bdesc->grant_ref == GRANT_INVALID_REF) {
1532 		ref = gnttab_claim_grant_reference(&xnfp->xnf_gref_rx_head);
1533 		ASSERT((signed short)ref >= 0);
1534 		bdesc->grant_ref = ref;
1535 		if (xnfp->xnf_rx_hvcopy) {
1536 			pfn_t pfn = xnf_btop(bdesc->buf_phys);
1537 			mfn_t mfn = pfn_to_mfn(pfn);
1538 
1539 			gnttab_grant_foreign_access_ref(ref, oeid, mfn, 0);
1540 		} else {
1541 			gnttab_grant_foreign_transfer_ref(ref, oeid, 0);
1542 		}
1543 	}
1544 	reqp->id = hang_ix;
1545 	reqp->gref = bdesc->grant_ref;
1546 	bdesc->id = hang_ix;
1547 	xnfp->xnf_rxpkt_bufptr[hang_ix] = bdesc;
1548 	membar_producer();
1549 	xnfp->xnf_rx_ring.req_prod_pvt++;
1550 }
1551 
1552 static mblk_t *
1553 xnf_process_hvcopy_recv(xnf_t *xnfp)
1554 {
1555 	netif_rx_response_t *rxpkt;
1556 	mblk_t		*mp, *head, *tail;
1557 	struct		xnf_buffer_desc *bdesc;
1558 	boolean_t	hwcsum = B_FALSE, notify, work_to_do;
1559 	size_t 		len;
1560 
1561 	/*
1562 	 * in loop over unconsumed responses, we do:
1563 	 * 1. get a response
1564 	 * 2. take corresponding buffer off recv. ring
1565 	 * 3. indicate this by setting slot to NULL
1566 	 * 4. create a new message and
1567 	 * 5. copy data in, adjust ptr
1568 	 *
1569 	 * outside loop:
1570 	 * 7. make sure no more data has arrived; kick HV
1571 	 */
1572 
1573 	head = tail = NULL;
1574 
1575 loop:
1576 	while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring)) {
1577 
1578 		/* 1. */
1579 		rxpkt = RING_GET_RESPONSE(&xnfp->xnf_rx_ring,
1580 		    xnfp->xnf_rx_ring.rsp_cons);
1581 
1582 		DTRACE_PROBE4(got_PKT, int, (int)rxpkt->id, int,
1583 		    (int)rxpkt->offset,
1584 		    int, (int)rxpkt->flags, int, (int)rxpkt->status);
1585 
1586 		/*
1587 		 * 2.
1588 		 * Take buffer off of receive ring
1589 		 */
1590 		hwcsum = B_FALSE;
1591 		bdesc = xnfp->xnf_rxpkt_bufptr[rxpkt->id];
1592 		/* 3 */
1593 		xnfp->xnf_rxpkt_bufptr[rxpkt->id] = NULL;
1594 		ASSERT(bdesc->id == rxpkt->id);
1595 		mp = NULL;
1596 		if (!xnfp->xnf_running) {
1597 			DTRACE_PROBE4(pkt_dropped, int, rxpkt->status,
1598 			    char *, bdesc->buf, int, rxpkt->offset,
1599 			    char *, ((char *)bdesc->buf) + rxpkt->offset);
1600 			xnfp->xnf_stat_drop++;
1601 			/*
1602 			 * re-hang the buffer
1603 			 */
1604 			rx_buffer_hang(xnfp, bdesc);
1605 		} else if (rxpkt->status <= 0) {
1606 			DTRACE_PROBE4(pkt_status_negative, int, rxpkt->status,
1607 			    char *, bdesc->buf, int, rxpkt->offset,
1608 			    char *, ((char *)bdesc->buf) + rxpkt->offset);
1609 			xnfp->xnf_stat_errrx++;
1610 			if (rxpkt->status == 0)
1611 				xnfp->xnf_stat_runt++;
1612 			if (rxpkt->status == NETIF_RSP_ERROR)
1613 				xnfp->xnf_stat_mac_rcv_error++;
1614 			if (rxpkt->status == NETIF_RSP_DROPPED)
1615 				xnfp->xnf_stat_norxbuf++;
1616 			/*
1617 			 * re-hang the buffer
1618 			 */
1619 			rx_buffer_hang(xnfp, bdesc);
1620 		} else {
1621 			grant_ref_t		ref =  bdesc->grant_ref;
1622 			struct xnf_buffer_desc	*new_bdesc;
1623 			unsigned long		off = rxpkt->offset;
1624 
1625 			DTRACE_PROBE4(pkt_status_ok, int, rxpkt->status,
1626 			    char *, bdesc->buf, int, rxpkt->offset,
1627 			    char *, ((char *)bdesc->buf) + rxpkt->offset);
1628 			len = rxpkt->status;
1629 			ASSERT(off + len <= PAGEOFFSET);
1630 			if (ref == GRANT_INVALID_REF) {
1631 				mp = NULL;
1632 				new_bdesc = bdesc;
1633 				cmn_err(CE_WARN, "Bad rx grant reference %d "
1634 				    "from dom %d", ref,
1635 				    xvdi_get_oeid(xnfp->xnf_devinfo));
1636 				goto luckless;
1637 			}
1638 			/*
1639 			 * Release ref which we'll be re-claiming in
1640 			 * rx_buffer_hang().
1641 			 */
1642 			bdesc->grant_ref = GRANT_INVALID_REF;
1643 			(void) gnttab_end_foreign_access_ref(ref, 0);
1644 			gnttab_release_grant_reference(&xnfp->xnf_gref_rx_head,
1645 			    ref);
1646 			if (rxpkt->flags & NETRXF_data_validated)
1647 				hwcsum = B_TRUE;
1648 
1649 			/*
1650 			 * XXPV for the initial implementation of HVcopy,
1651 			 * create a new msg and copy in the data
1652 			 */
1653 			/* 4. */
1654 			if ((mp = allocb(len, BPRI_MED)) == NULL) {
1655 				/*
1656 				 * Couldn't get buffer to copy to,
1657 				 * drop this data, and re-hang
1658 				 * the buffer on the ring.
1659 				 */
1660 				xnfp->xnf_stat_norxbuf++;
1661 				DTRACE_PROBE(alloc_nix);
1662 			} else {
1663 				/* 5. */
1664 				DTRACE_PROBE(alloc_ok);
1665 				bcopy(bdesc->buf + off, mp->b_wptr,
1666 				    len);
1667 				mp->b_wptr += len;
1668 			}
1669 			new_bdesc = bdesc;
1670 luckless:
1671 
1672 			/* Re-hang old or hang new buffer. */
1673 			rx_buffer_hang(xnfp, new_bdesc);
1674 		}
1675 		if (mp) {
1676 			if (hwcsum) {
1677 				/*
1678 				 * See comments in xnf_process_recv().
1679 				 */
1680 
1681 				(void) hcksum_assoc(mp, NULL,
1682 				    NULL, 0, 0, 0, 0,
1683 				    HCK_FULLCKSUM |
1684 				    HCK_FULLCKSUM_OK,
1685 				    0);
1686 				xnfp->xnf_stat_rx_cksum_no_need++;
1687 			}
1688 			if (head == NULL) {
1689 				head = tail = mp;
1690 			} else {
1691 				tail->b_next = mp;
1692 				tail = mp;
1693 			}
1694 
1695 			ASSERT(mp->b_next == NULL);
1696 
1697 			xnfp->xnf_stat_ipackets++;
1698 			xnfp->xnf_stat_rbytes += len;
1699 		}
1700 
1701 		xnfp->xnf_rx_ring.rsp_cons++;
1702 
1703 		xnfp->xnf_stat_hvcopy_packet_processed++;
1704 	}
1705 
1706 	/* 7. */
1707 	/*
1708 	 * Has more data come in since we started?
1709 	 */
1710 	/* LINTED: constant in conditional context */
1711 	RING_FINAL_CHECK_FOR_RESPONSES(&xnfp->xnf_rx_ring, work_to_do);
1712 	if (work_to_do)
1713 		goto loop;
1714 
1715 	/*
1716 	 * Indicate to the backend that we have re-filled the receive
1717 	 * ring.
1718 	 */
1719 	/* LINTED: constant in conditional context */
1720 	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_rx_ring, notify);
1721 	if (notify)
1722 		ec_notify_via_evtchn(xnfp->xnf_evtchn);
1723 
1724 	return (head);
1725 }
1726 
1727 /* Process all queued received packets */
1728 static mblk_t *
1729 xnf_process_recv(xnf_t *xnfp)
1730 {
1731 	volatile netif_rx_response_t *rxpkt;
1732 	mblk_t *mp, *head, *tail;
1733 	struct xnf_buffer_desc *bdesc;
1734 	extern mblk_t *desballoc(unsigned char *, size_t, uint_t, frtn_t *);
1735 	boolean_t hwcsum = B_FALSE, notify, work_to_do;
1736 	size_t len;
1737 	pfn_t pfn;
1738 	long cnt;
1739 
1740 	head = tail = NULL;
1741 loop:
1742 	while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring)) {
1743 
1744 		rxpkt = RING_GET_RESPONSE(&xnfp->xnf_rx_ring,
1745 		    xnfp->xnf_rx_ring.rsp_cons);
1746 
1747 		/*
1748 		 * Take buffer off of receive ring
1749 		 */
1750 		hwcsum = B_FALSE;
1751 		bdesc = xnfp->xnf_rxpkt_bufptr[rxpkt->id];
1752 		xnfp->xnf_rxpkt_bufptr[rxpkt->id] = NULL;
1753 		ASSERT(bdesc->id == rxpkt->id);
1754 		mp = NULL;
1755 		if (!xnfp->xnf_running) {
1756 			xnfp->xnf_stat_drop++;
1757 			/*
1758 			 * re-hang the buffer
1759 			 */
1760 			rx_buffer_hang(xnfp, bdesc);
1761 		} else if (rxpkt->status <= 0) {
1762 			xnfp->xnf_stat_errrx++;
1763 			if (rxpkt->status == 0)
1764 				xnfp->xnf_stat_runt++;
1765 			if (rxpkt->status == NETIF_RSP_ERROR)
1766 				xnfp->xnf_stat_mac_rcv_error++;
1767 			if (rxpkt->status == NETIF_RSP_DROPPED)
1768 				xnfp->xnf_stat_norxbuf++;
1769 			/*
1770 			 * re-hang the buffer
1771 			 */
1772 			rx_buffer_hang(xnfp, bdesc);
1773 		} else {
1774 			grant_ref_t ref =  bdesc->grant_ref;
1775 			struct xnf_buffer_desc *new_bdesc;
1776 			unsigned long off = rxpkt->offset;
1777 			unsigned long mfn;
1778 
1779 			len = rxpkt->status;
1780 			ASSERT(off + len <= PAGEOFFSET);
1781 			if (ref == GRANT_INVALID_REF) {
1782 				mp = NULL;
1783 				new_bdesc = bdesc;
1784 				cmn_err(CE_WARN, "Bad rx grant reference %d "
1785 				    "from dom %d", ref,
1786 				    xvdi_get_oeid(xnfp->xnf_devinfo));
1787 				goto luckless;
1788 			}
1789 			bdesc->grant_ref = GRANT_INVALID_REF;
1790 			mfn = gnttab_end_foreign_transfer_ref(ref);
1791 			ASSERT(mfn != MFN_INVALID);
1792 			ASSERT(hat_getpfnum(kas.a_hat, bdesc->buf) ==
1793 			    PFN_INVALID);
1794 
1795 			gnttab_release_grant_reference(&xnfp->xnf_gref_rx_head,
1796 			    ref);
1797 			reassign_pfn(xnf_btop(bdesc->buf_phys), mfn);
1798 			hat_devload(kas.a_hat, bdesc->buf, PAGESIZE,
1799 			    xnf_btop(bdesc->buf_phys),
1800 			    PROT_READ | PROT_WRITE, HAT_LOAD);
1801 			balloon_drv_added(1);
1802 
1803 			if (rxpkt->flags & NETRXF_data_validated)
1804 				hwcsum = B_TRUE;
1805 			if (len <= xnf_rx_bcopy_thresh) {
1806 				/*
1807 				 * For small buffers, just copy the data
1808 				 * and send the copy upstream.
1809 				 */
1810 				new_bdesc = NULL;
1811 			} else {
1812 				/*
1813 				 * We send a pointer to this data upstream;
1814 				 * we need a new buffer to replace this one.
1815 				 */
1816 				mutex_enter(&xnfp->xnf_rx_buf_mutex);
1817 				new_bdesc = xnf_get_buffer(xnfp);
1818 				if (new_bdesc != NULL) {
1819 					xnfp->xnf_rx_bufs_outstanding++;
1820 				} else {
1821 					xnfp->xnf_stat_rx_no_ringbuf++;
1822 				}
1823 				mutex_exit(&xnfp->xnf_rx_buf_mutex);
1824 			}
1825 
1826 			if (new_bdesc == NULL) {
1827 				/*
1828 				 * Don't have a new ring buffer; bcopy the data
1829 				 * from the buffer, and preserve the
1830 				 * original buffer
1831 				 */
1832 				if ((mp = allocb(len, BPRI_MED)) == NULL) {
1833 					/*
1834 					 * Could't get buffer to copy to,
1835 					 * drop this data, and re-hang
1836 					 * the buffer on the ring.
1837 					 */
1838 					xnfp->xnf_stat_norxbuf++;
1839 				} else {
1840 					bcopy(bdesc->buf + off, mp->b_wptr,
1841 					    len);
1842 				}
1843 				/*
1844 				 * Give the buffer page back to xen
1845 				 */
1846 				pfn = xnf_btop(bdesc->buf_phys);
1847 				cnt = balloon_free_pages(1, &mfn, bdesc->buf,
1848 				    &pfn);
1849 				if (cnt != 1) {
1850 					cmn_err(CE_WARN, "unable to give a "
1851 					    "page back to the hypervisor\n");
1852 				}
1853 				new_bdesc = bdesc;
1854 			} else {
1855 				if ((mp = desballoc((unsigned char *)bdesc->buf,
1856 				    off + len, 0, (frtn_t *)bdesc)) == NULL) {
1857 					/*
1858 					 * Couldn't get mblk to pass recv data
1859 					 * up with, free the old ring buffer
1860 					 */
1861 					xnfp->xnf_stat_norxbuf++;
1862 					xnf_rcv_complete(bdesc);
1863 					goto luckless;
1864 				}
1865 				(void) ddi_dma_sync(bdesc->dma_handle,
1866 				    0, 0, DDI_DMA_SYNC_FORCPU);
1867 
1868 				mp->b_wptr += off;
1869 				mp->b_rptr += off;
1870 			}
1871 luckless:
1872 			if (mp)
1873 				mp->b_wptr += len;
1874 			/* re-hang old or hang new buffer */
1875 			rx_buffer_hang(xnfp, new_bdesc);
1876 		}
1877 		if (mp) {
1878 			if (hwcsum) {
1879 				/*
1880 				 * If the peer says that the data has
1881 				 * been validated then we declare that
1882 				 * the full checksum has been
1883 				 * verified.
1884 				 *
1885 				 * We don't look at the "checksum
1886 				 * blank" flag, and hence could have a
1887 				 * packet here that we are asserting
1888 				 * is good with a blank checksum.
1889 				 *
1890 				 * The hardware checksum offload
1891 				 * specification says that we must
1892 				 * provide the actual checksum as well
1893 				 * as an assertion that it is valid,
1894 				 * but the protocol stack doesn't
1895 				 * actually use it and some other
1896 				 * drivers don't bother, so we don't.
1897 				 * If it was necessary we could grovel
1898 				 * in the packet to find it.
1899 				 */
1900 
1901 				(void) hcksum_assoc(mp, NULL,
1902 				    NULL, 0, 0, 0, 0,
1903 				    HCK_FULLCKSUM |
1904 				    HCK_FULLCKSUM_OK,
1905 				    0);
1906 				xnfp->xnf_stat_rx_cksum_no_need++;
1907 			}
1908 			if (head == NULL) {
1909 				head = tail = mp;
1910 			} else {
1911 				tail->b_next = mp;
1912 				tail = mp;
1913 			}
1914 
1915 			ASSERT(mp->b_next == NULL);
1916 
1917 			xnfp->xnf_stat_ipackets++;
1918 			xnfp->xnf_stat_rbytes += len;
1919 		}
1920 
1921 		xnfp->xnf_rx_ring.rsp_cons++;
1922 	}
1923 
1924 	/*
1925 	 * Has more data come in since we started?
1926 	 */
1927 	/* LINTED: constant in conditional context */
1928 	RING_FINAL_CHECK_FOR_RESPONSES(&xnfp->xnf_rx_ring, work_to_do);
1929 	if (work_to_do)
1930 		goto loop;
1931 
1932 	/*
1933 	 * Indicate to the backend that we have re-filled the receive
1934 	 * ring.
1935 	 */
1936 	/* LINTED: constant in conditional context */
1937 	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_rx_ring, notify);
1938 	if (notify)
1939 		ec_notify_via_evtchn(xnfp->xnf_evtchn);
1940 
1941 	return (head);
1942 }
1943 
1944 /* Called when the upper layers free a message we passed upstream */
1945 static void
1946 xnf_rcv_complete(struct xnf_buffer_desc *bdesc)
1947 {
1948 	xnf_t *xnfp = bdesc->xnfp;
1949 	pfn_t pfn;
1950 	long cnt;
1951 
1952 	/* One less outstanding receive buffer */
1953 	mutex_enter(&xnfp->xnf_rx_buf_mutex);
1954 	--xnfp->xnf_rx_bufs_outstanding;
1955 	/*
1956 	 * Return buffer to the free list, unless the free list is getting
1957 	 * too large.  XXPV - this threshold may need tuning.
1958 	 */
1959 	if (xnfp->xnf_rx_descs_free < xnf_rx_bufs_lowat) {
1960 		/*
1961 		 * Unmap the page, and hand the machine page back
1962 		 * to xen so it can be re-used as a backend net buffer.
1963 		 */
1964 		pfn = xnf_btop(bdesc->buf_phys);
1965 		cnt = balloon_free_pages(1, NULL, bdesc->buf, &pfn);
1966 		if (cnt != 1) {
1967 			cmn_err(CE_WARN, "unable to give a page back to the "
1968 			    "hypervisor\n");
1969 		}
1970 
1971 		bdesc->next = xnfp->xnf_free_list;
1972 		xnfp->xnf_free_list = bdesc;
1973 		xnfp->xnf_rx_descs_free++;
1974 		mutex_exit(&xnfp->xnf_rx_buf_mutex);
1975 	} else {
1976 		/*
1977 		 * We can return everything here since we have a free buffer
1978 		 * that we have not given the backing page for back to xen.
1979 		 */
1980 		--xnfp->xnf_rx_buffer_count;
1981 		mutex_exit(&xnfp->xnf_rx_buf_mutex);
1982 		(void) ddi_dma_unbind_handle(bdesc->dma_handle);
1983 		ddi_dma_mem_free(&bdesc->acc_handle);
1984 		ddi_dma_free_handle(&bdesc->dma_handle);
1985 		kmem_free(bdesc, sizeof (*bdesc));
1986 	}
1987 }
1988 
1989 /*
1990  *  xnf_alloc_dma_resources() -- initialize the drivers structures
1991  */
1992 static int
1993 xnf_alloc_dma_resources(xnf_t *xnfp)
1994 {
1995 	dev_info_t 		*devinfo = xnfp->xnf_devinfo;
1996 	int			i;
1997 	size_t			len;
1998 	ddi_dma_cookie_t	dma_cookie;
1999 	uint_t			ncookies;
2000 	struct xnf_buffer_desc	*bdesc;
2001 	int			rc;
2002 	caddr_t			rptr;
2003 
2004 	xnfp->xnf_n_rx = NET_RX_RING_SIZE;
2005 	xnfp->xnf_max_rx_bufs = xnf_rx_bufs_hiwat;
2006 
2007 	xnfp->xnf_n_tx = NET_TX_RING_SIZE;
2008 
2009 	/*
2010 	 * The code below allocates all the DMA data structures that
2011 	 * need to be released when the driver is detached.
2012 	 *
2013 	 * First allocate handles for mapping (virtual address) pointers to
2014 	 * transmit data buffers to physical addresses
2015 	 */
2016 	for (i = 0; i < xnfp->xnf_n_tx; i++) {
2017 		if ((rc = ddi_dma_alloc_handle(devinfo,
2018 		    &tx_buffer_dma_attr, DDI_DMA_SLEEP, 0,
2019 		    &xnfp->xnf_tx_pkt_info[i].dma_handle)) != DDI_SUCCESS)
2020 			return (DDI_FAILURE);
2021 	}
2022 
2023 	/*
2024 	 * Allocate page for the transmit descriptor ring.
2025 	 */
2026 	if (ddi_dma_alloc_handle(devinfo, &ringbuf_dma_attr,
2027 	    DDI_DMA_SLEEP, 0, &xnfp->xnf_tx_ring_dma_handle) != DDI_SUCCESS)
2028 		goto alloc_error;
2029 
2030 	if (ddi_dma_mem_alloc(xnfp->xnf_tx_ring_dma_handle,
2031 	    PAGESIZE, &accattr, DDI_DMA_CONSISTENT,
2032 	    DDI_DMA_SLEEP, 0, &rptr, &len,
2033 	    &xnfp->xnf_tx_ring_dma_acchandle) != DDI_SUCCESS) {
2034 		ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2035 		xnfp->xnf_tx_ring_dma_handle = NULL;
2036 		goto alloc_error;
2037 	}
2038 
2039 	if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_tx_ring_dma_handle, NULL,
2040 	    rptr, PAGESIZE, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2041 	    DDI_DMA_SLEEP, 0, &dma_cookie, &ncookies)) != DDI_DMA_MAPPED) {
2042 		ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle);
2043 		ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2044 		xnfp->xnf_tx_ring_dma_handle = NULL;
2045 		xnfp->xnf_tx_ring_dma_acchandle = NULL;
2046 		if (rc == DDI_DMA_NORESOURCES)
2047 			goto alloc_error;
2048 		else
2049 			goto error;
2050 	}
2051 
2052 	ASSERT(ncookies == 1);
2053 	bzero(rptr, PAGESIZE);
2054 	/* LINTED: constant in conditional context */
2055 	SHARED_RING_INIT((netif_tx_sring_t *)rptr);
2056 	/* LINTED: constant in conditional context */
2057 	FRONT_RING_INIT(&xnfp->xnf_tx_ring, (netif_tx_sring_t *)rptr, PAGESIZE);
2058 	xnfp->xnf_tx_ring_phys_addr = dma_cookie.dmac_laddress;
2059 
2060 	/*
2061 	 * Allocate page for the receive descriptor ring.
2062 	 */
2063 	if (ddi_dma_alloc_handle(devinfo, &ringbuf_dma_attr,
2064 	    DDI_DMA_SLEEP, 0, &xnfp->xnf_rx_ring_dma_handle) != DDI_SUCCESS)
2065 		goto alloc_error;
2066 
2067 	if (ddi_dma_mem_alloc(xnfp->xnf_rx_ring_dma_handle,
2068 	    PAGESIZE, &accattr, DDI_DMA_CONSISTENT,
2069 	    DDI_DMA_SLEEP, 0, &rptr, &len,
2070 	    &xnfp->xnf_rx_ring_dma_acchandle) != DDI_SUCCESS) {
2071 		ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2072 		xnfp->xnf_rx_ring_dma_handle = NULL;
2073 		goto alloc_error;
2074 	}
2075 
2076 	if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_rx_ring_dma_handle, NULL,
2077 	    rptr, PAGESIZE, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
2078 	    DDI_DMA_SLEEP, 0, &dma_cookie, &ncookies)) != DDI_DMA_MAPPED) {
2079 		ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle);
2080 		ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2081 		xnfp->xnf_rx_ring_dma_handle = NULL;
2082 		xnfp->xnf_rx_ring_dma_acchandle = NULL;
2083 		if (rc == DDI_DMA_NORESOURCES)
2084 			goto alloc_error;
2085 		else
2086 			goto error;
2087 	}
2088 
2089 	ASSERT(ncookies == 1);
2090 	bzero(rptr, PAGESIZE);
2091 	/* LINTED: constant in conditional context */
2092 	SHARED_RING_INIT((netif_rx_sring_t *)rptr);
2093 	/* LINTED: constant in conditional context */
2094 	FRONT_RING_INIT(&xnfp->xnf_rx_ring, (netif_rx_sring_t *)rptr, PAGESIZE);
2095 	xnfp->xnf_rx_ring_phys_addr = dma_cookie.dmac_laddress;
2096 
2097 	/*
2098 	 * Preallocate receive buffers for each receive descriptor.
2099 	 */
2100 
2101 	/* Set up the "free list" of receive buffer descriptors */
2102 	for (i = 0; i < xnfp->xnf_n_rx; i++) {
2103 		if ((bdesc = xnf_alloc_buffer(xnfp)) == NULL)
2104 			goto alloc_error;
2105 		bdesc->next = xnfp->xnf_free_list;
2106 		xnfp->xnf_free_list = bdesc;
2107 	}
2108 
2109 	return (DDI_SUCCESS);
2110 
2111 alloc_error:
2112 	cmn_err(CE_WARN, "xnf%d: could not allocate enough DMA memory",
2113 	    ddi_get_instance(xnfp->xnf_devinfo));
2114 error:
2115 	xnf_release_dma_resources(xnfp);
2116 	return (DDI_FAILURE);
2117 }
2118 
2119 /*
2120  * Release all DMA resources in the opposite order from acquisition
2121  * Should not be called until all outstanding esballoc buffers
2122  * have been returned.
2123  */
2124 static void
2125 xnf_release_dma_resources(xnf_t *xnfp)
2126 {
2127 	int i;
2128 
2129 	/*
2130 	 * Free receive buffers which are currently associated with
2131 	 * descriptors
2132 	 */
2133 	for (i = 0; i < xnfp->xnf_n_rx; i++) {
2134 		struct xnf_buffer_desc *bp;
2135 
2136 		if ((bp = xnfp->xnf_rxpkt_bufptr[i]) == NULL)
2137 			continue;
2138 		xnf_free_buffer(bp);
2139 		xnfp->xnf_rxpkt_bufptr[i] = NULL;
2140 	}
2141 
2142 	/* Free the receive ring buffer */
2143 	if (xnfp->xnf_rx_ring_dma_acchandle != NULL) {
2144 		(void) ddi_dma_unbind_handle(xnfp->xnf_rx_ring_dma_handle);
2145 		ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle);
2146 		ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2147 		xnfp->xnf_rx_ring_dma_acchandle = NULL;
2148 	}
2149 	/* Free the transmit ring buffer */
2150 	if (xnfp->xnf_tx_ring_dma_acchandle != NULL) {
2151 		(void) ddi_dma_unbind_handle(xnfp->xnf_tx_ring_dma_handle);
2152 		ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle);
2153 		ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2154 		xnfp->xnf_tx_ring_dma_acchandle = NULL;
2155 	}
2156 
2157 	/*
2158 	 * Free handles for mapping (virtual address) pointers to
2159 	 * transmit data buffers to physical addresses
2160 	 */
2161 	for (i = 0; i < xnfp->xnf_n_tx; i++) {
2162 		if (xnfp->xnf_tx_pkt_info[i].dma_handle != NULL) {
2163 			ddi_dma_free_handle(
2164 			    &xnfp->xnf_tx_pkt_info[i].dma_handle);
2165 		}
2166 	}
2167 
2168 }
2169 
2170 static void
2171 xnf_release_mblks(xnf_t *xnfp)
2172 {
2173 	int	i;
2174 
2175 	for (i = 0; i < xnfp->xnf_n_tx; i++) {
2176 		if (xnfp->xnf_tx_pkt_info[i].mp == NULL)
2177 			continue;
2178 		freemsg(xnfp->xnf_tx_pkt_info[i].mp);
2179 		xnfp->xnf_tx_pkt_info[i].mp = NULL;
2180 		(void) ddi_dma_unbind_handle(
2181 		    xnfp->xnf_tx_pkt_info[i].dma_handle);
2182 	}
2183 }
2184 
2185 /*
2186  * Remove a xmit buffer descriptor from the head of the free list and return
2187  * a pointer to it.  If no buffers on list, attempt to allocate a new one.
2188  * Called with the tx_buf_mutex held.
2189  */
2190 static struct xnf_buffer_desc *
2191 xnf_get_tx_buffer(xnf_t *xnfp)
2192 {
2193 	struct xnf_buffer_desc *bdesc;
2194 
2195 	bdesc = xnfp->xnf_tx_free_list;
2196 	if (bdesc != NULL) {
2197 		xnfp->xnf_tx_free_list = bdesc->next;
2198 	} else {
2199 		bdesc = xnf_alloc_tx_buffer(xnfp);
2200 	}
2201 	return (bdesc);
2202 }
2203 
2204 /*
2205  * Remove a buffer descriptor from the head of the free list and return
2206  * a pointer to it.  If no buffers on list, attempt to allocate a new one.
2207  * Called with the rx_buf_mutex held.
2208  */
2209 static struct xnf_buffer_desc *
2210 xnf_get_buffer(xnf_t *xnfp)
2211 {
2212 	struct xnf_buffer_desc *bdesc;
2213 
2214 	bdesc = xnfp->xnf_free_list;
2215 	if (bdesc != NULL) {
2216 		xnfp->xnf_free_list = bdesc->next;
2217 		xnfp->xnf_rx_descs_free--;
2218 	} else {
2219 		bdesc = xnf_alloc_buffer(xnfp);
2220 	}
2221 	return (bdesc);
2222 }
2223 
2224 /*
2225  * Free a xmit buffer back to the xmit free list
2226  */
2227 static void
2228 xnf_free_tx_buffer(struct xnf_buffer_desc *bp)
2229 {
2230 	xnf_t *xnfp = bp->xnfp;
2231 
2232 	mutex_enter(&xnfp->xnf_tx_buf_mutex);
2233 	bp->next = xnfp->xnf_tx_free_list;
2234 	xnfp->xnf_tx_free_list = bp;
2235 	mutex_exit(&xnfp->xnf_tx_buf_mutex);
2236 }
2237 
2238 /*
2239  * Put a buffer descriptor onto the head of the free list.
2240  * for page-flip:
2241  * We can't really free these buffers back to the kernel
2242  * since we have given away their backing page to be used
2243  * by the back end net driver.
2244  * for hvcopy:
2245  * release all the memory
2246  */
2247 static void
2248 xnf_free_buffer(struct xnf_buffer_desc *bdesc)
2249 {
2250 	xnf_t *xnfp = bdesc->xnfp;
2251 
2252 	mutex_enter(&xnfp->xnf_rx_buf_mutex);
2253 	if (xnfp->xnf_rx_hvcopy) {
2254 		if (ddi_dma_unbind_handle(bdesc->dma_handle) != DDI_SUCCESS)
2255 			goto out;
2256 		ddi_dma_mem_free(&bdesc->acc_handle);
2257 		ddi_dma_free_handle(&bdesc->dma_handle);
2258 		kmem_free(bdesc, sizeof (*bdesc));
2259 		xnfp->xnf_rx_buffer_count--;
2260 	} else {
2261 		bdesc->next = xnfp->xnf_free_list;
2262 		xnfp->xnf_free_list = bdesc;
2263 		xnfp->xnf_rx_descs_free++;
2264 	}
2265 out:
2266 	mutex_exit(&xnfp->xnf_rx_buf_mutex);
2267 }
2268 
2269 /*
2270  * Allocate a DMA-able xmit buffer, including a structure to
2271  * keep track of the buffer.  Called with tx_buf_mutex held.
2272  */
2273 static struct xnf_buffer_desc *
2274 xnf_alloc_tx_buffer(xnf_t *xnfp)
2275 {
2276 	struct xnf_buffer_desc *bdesc;
2277 	size_t len;
2278 
2279 	if ((bdesc = kmem_zalloc(sizeof (*bdesc), KM_NOSLEEP)) == NULL)
2280 		return (NULL);
2281 
2282 	/* allocate a DMA access handle for receive buffer */
2283 	if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &tx_buffer_dma_attr,
2284 	    0, 0, &bdesc->dma_handle) != DDI_SUCCESS)
2285 		goto failure;
2286 
2287 	/* Allocate DMA-able memory for transmit buffer */
2288 	if (ddi_dma_mem_alloc(bdesc->dma_handle,
2289 	    PAGESIZE, &data_accattr, DDI_DMA_STREAMING, 0, 0,
2290 	    &bdesc->buf, &len, &bdesc->acc_handle) != DDI_SUCCESS)
2291 		goto failure_1;
2292 
2293 	bdesc->xnfp = xnfp;
2294 	xnfp->xnf_tx_buffer_count++;
2295 
2296 	return (bdesc);
2297 
2298 failure_1:
2299 	ddi_dma_free_handle(&bdesc->dma_handle);
2300 
2301 failure:
2302 	kmem_free(bdesc, sizeof (*bdesc));
2303 	return (NULL);
2304 }
2305 
2306 /*
2307  * Allocate a DMA-able receive buffer, including a structure to
2308  * keep track of the buffer.  Called with rx_buf_mutex held.
2309  */
2310 static struct xnf_buffer_desc *
2311 xnf_alloc_buffer(xnf_t *xnfp)
2312 {
2313 	struct			xnf_buffer_desc *bdesc;
2314 	size_t			len;
2315 	uint_t			ncookies;
2316 	ddi_dma_cookie_t	dma_cookie;
2317 	long			cnt;
2318 	pfn_t			pfn;
2319 
2320 	if (xnfp->xnf_rx_buffer_count >= xnfp->xnf_max_rx_bufs)
2321 		return (NULL);
2322 
2323 	if ((bdesc = kmem_zalloc(sizeof (*bdesc), KM_NOSLEEP)) == NULL)
2324 		return (NULL);
2325 
2326 	/* allocate a DMA access handle for receive buffer */
2327 	if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &rx_buffer_dma_attr,
2328 	    0, 0, &bdesc->dma_handle) != DDI_SUCCESS)
2329 		goto failure;
2330 
2331 	/* Allocate DMA-able memory for receive buffer */
2332 	if (ddi_dma_mem_alloc(bdesc->dma_handle,
2333 	    PAGESIZE, &data_accattr, DDI_DMA_STREAMING, 0, 0,
2334 	    &bdesc->buf, &len, &bdesc->acc_handle) != DDI_SUCCESS)
2335 		goto failure_1;
2336 
2337 	/* bind to virtual address of buffer to get physical address */
2338 	if (ddi_dma_addr_bind_handle(bdesc->dma_handle, NULL,
2339 	    bdesc->buf, PAGESIZE, DDI_DMA_READ | DDI_DMA_STREAMING,
2340 	    DDI_DMA_SLEEP, 0, &dma_cookie, &ncookies) != DDI_DMA_MAPPED)
2341 		goto failure_2;
2342 
2343 	bdesc->buf_phys = dma_cookie.dmac_laddress;
2344 	bdesc->xnfp = xnfp;
2345 	if (xnfp->xnf_rx_hvcopy) {
2346 		bdesc->free_rtn.free_func = xnf_copy_rcv_complete;
2347 	} else {
2348 		bdesc->free_rtn.free_func = xnf_rcv_complete;
2349 	}
2350 	bdesc->free_rtn.free_arg = (char *)bdesc;
2351 	bdesc->grant_ref = GRANT_INVALID_REF;
2352 	ASSERT(ncookies == 1);
2353 
2354 	xnfp->xnf_rx_buffer_count++;
2355 
2356 	if (!xnfp->xnf_rx_hvcopy) {
2357 		/*
2358 		 * Unmap the page, and hand the machine page back
2359 		 * to xen so it can be used as a backend net buffer.
2360 		 */
2361 		pfn = xnf_btop(bdesc->buf_phys);
2362 		cnt = balloon_free_pages(1, NULL, bdesc->buf, &pfn);
2363 		if (cnt != 1) {
2364 			cmn_err(CE_WARN, "unable to give a page back to the "
2365 			    "hypervisor\n");
2366 		}
2367 	}
2368 
2369 	return (bdesc);
2370 
2371 failure_2:
2372 	ddi_dma_mem_free(&bdesc->acc_handle);
2373 
2374 failure_1:
2375 	ddi_dma_free_handle(&bdesc->dma_handle);
2376 
2377 failure:
2378 	kmem_free(bdesc, sizeof (*bdesc));
2379 	return (NULL);
2380 }
2381 
2382 /*
2383  * Statistics.
2384  */
2385 static char *xnf_aux_statistics[] = {
2386 	"tx_cksum_deferred",
2387 	"rx_cksum_no_need",
2388 	"interrupts",
2389 	"unclaimed_interrupts",
2390 	"tx_pullup",
2391 	"tx_pagebndry",
2392 	"tx_attempt",
2393 	"rx_no_ringbuf",
2394 	"hvcopy_packet_processed",
2395 };
2396 
2397 static int
2398 xnf_kstat_aux_update(kstat_t *ksp, int flag)
2399 {
2400 	xnf_t *xnfp;
2401 	kstat_named_t *knp;
2402 
2403 	if (flag != KSTAT_READ)
2404 		return (EACCES);
2405 
2406 	xnfp = ksp->ks_private;
2407 	knp = ksp->ks_data;
2408 
2409 	/*
2410 	 * Assignment order must match that of the names in
2411 	 * xnf_aux_statistics.
2412 	 */
2413 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_cksum_deferred;
2414 	(knp++)->value.ui64 = xnfp->xnf_stat_rx_cksum_no_need;
2415 
2416 	(knp++)->value.ui64 = xnfp->xnf_stat_interrupts;
2417 	(knp++)->value.ui64 = xnfp->xnf_stat_unclaimed_interrupts;
2418 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_pullup;
2419 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_pagebndry;
2420 	(knp++)->value.ui64 = xnfp->xnf_stat_tx_attempt;
2421 	(knp++)->value.ui64 = xnfp->xnf_stat_rx_no_ringbuf;
2422 
2423 	(knp++)->value.ui64 = xnfp->xnf_stat_hvcopy_packet_processed;
2424 
2425 	return (0);
2426 }
2427 
2428 static boolean_t
2429 xnf_kstat_init(xnf_t *xnfp)
2430 {
2431 	int nstat = sizeof (xnf_aux_statistics) /
2432 	    sizeof (xnf_aux_statistics[0]);
2433 	char **cp = xnf_aux_statistics;
2434 	kstat_named_t *knp;
2435 
2436 	/*
2437 	 * Create and initialise kstats.
2438 	 */
2439 	if ((xnfp->xnf_kstat_aux = kstat_create("xnf",
2440 	    ddi_get_instance(xnfp->xnf_devinfo),
2441 	    "aux_statistics", "net", KSTAT_TYPE_NAMED,
2442 	    nstat, 0)) == NULL)
2443 		return (B_FALSE);
2444 
2445 	xnfp->xnf_kstat_aux->ks_private = xnfp;
2446 	xnfp->xnf_kstat_aux->ks_update = xnf_kstat_aux_update;
2447 
2448 	knp = xnfp->xnf_kstat_aux->ks_data;
2449 	while (nstat > 0) {
2450 		kstat_named_init(knp, *cp, KSTAT_DATA_UINT64);
2451 
2452 		knp++;
2453 		cp++;
2454 		nstat--;
2455 	}
2456 
2457 	kstat_install(xnfp->xnf_kstat_aux);
2458 
2459 	return (B_TRUE);
2460 }
2461 
2462 static int
2463 xnf_stat(void *arg, uint_t stat, uint64_t *val)
2464 {
2465 	xnf_t *xnfp = arg;
2466 
2467 	mutex_enter(&xnfp->xnf_intrlock);
2468 	mutex_enter(&xnfp->xnf_txlock);
2469 
2470 #define	mac_stat(q, r)				\
2471 	case (MAC_STAT_##q):			\
2472 		*val = xnfp->xnf_stat_##r;	\
2473 		break
2474 
2475 #define	ether_stat(q, r)			\
2476 	case (ETHER_STAT_##q):			\
2477 		*val = xnfp->xnf_stat_##r;	\
2478 		break
2479 
2480 	switch (stat) {
2481 
2482 	mac_stat(IPACKETS, ipackets);
2483 	mac_stat(OPACKETS, opackets);
2484 	mac_stat(RBYTES, rbytes);
2485 	mac_stat(OBYTES, obytes);
2486 	mac_stat(NORCVBUF, norxbuf);
2487 	mac_stat(IERRORS, errrx);
2488 	mac_stat(NOXMTBUF, tx_defer);
2489 
2490 	ether_stat(MACRCV_ERRORS, mac_rcv_error);
2491 	ether_stat(TOOSHORT_ERRORS, runt);
2492 
2493 	/* always claim to be in full duplex mode */
2494 	case ETHER_STAT_LINK_DUPLEX:
2495 		*val = LINK_DUPLEX_FULL;
2496 		break;
2497 
2498 	/* always claim to be at 1Gb/s link speed */
2499 	case MAC_STAT_IFSPEED:
2500 		*val = 1000000000ull;
2501 		break;
2502 
2503 	default:
2504 		mutex_exit(&xnfp->xnf_txlock);
2505 		mutex_exit(&xnfp->xnf_intrlock);
2506 
2507 		return (ENOTSUP);
2508 	}
2509 
2510 #undef mac_stat
2511 #undef ether_stat
2512 
2513 	mutex_exit(&xnfp->xnf_txlock);
2514 	mutex_exit(&xnfp->xnf_intrlock);
2515 
2516 	return (0);
2517 }
2518 
2519 /*ARGSUSED*/
2520 static void
2521 xnf_blank(void *arg, time_t ticks, uint_t count)
2522 {
2523 	/*
2524 	 * XXPV dme: blanking is not currently implemented.
2525 	 *
2526 	 * It's not obvious how to use the 'ticks' argument here.
2527 	 *
2528 	 * 'Count' might be used as an indicator of how to set
2529 	 * rsp_event when posting receive buffers to the rx_ring.  It
2530 	 * would replace the code at the tail of xnf_process_recv()
2531 	 * that simply indicates that the next completed packet should
2532 	 * cause an interrupt.
2533 	 */
2534 }
2535 
2536 static void
2537 xnf_resources(void *arg)
2538 {
2539 	xnf_t *xnfp = arg;
2540 	mac_rx_fifo_t mrf;
2541 
2542 	mrf.mrf_type = MAC_RX_FIFO;
2543 	mrf.mrf_blank = xnf_blank;
2544 	mrf.mrf_arg = (void *)xnfp;
2545 	mrf.mrf_normal_blank_time = 128;	/* XXPV dme: see xnf_blank() */
2546 	mrf.mrf_normal_pkt_count = 8;		/* XXPV dme: see xnf_blank() */
2547 
2548 	xnfp->xnf_rx_handle = mac_resource_add(xnfp->xnf_mh,
2549 	    (mac_resource_t *)&mrf);
2550 }
2551 
2552 /*ARGSUSED*/
2553 static void
2554 xnf_ioctl(void *arg, queue_t *q, mblk_t *mp)
2555 {
2556 	miocnak(q, mp, 0, EINVAL);
2557 }
2558 
2559 static boolean_t
2560 xnf_getcapab(void *arg, mac_capab_t cap, void *cap_data)
2561 {
2562 	xnf_t *xnfp = arg;
2563 
2564 	switch (cap) {
2565 	case MAC_CAPAB_HCKSUM: {
2566 		uint32_t *capab = cap_data;
2567 
2568 		/*
2569 		 * Whilst the flag used to communicate with the IO
2570 		 * domain is called "NETTXF_csum_blank", the checksum
2571 		 * in the packet must contain the pseudo-header
2572 		 * checksum and not zero.
2573 		 *
2574 		 * To help out the IO domain, we might use
2575 		 * HCKSUM_INET_PARTIAL. Unfortunately our stack will
2576 		 * then use checksum offload for IPv6 packets, which
2577 		 * the IO domain can't handle.
2578 		 *
2579 		 * As a result, we declare outselves capable of
2580 		 * HCKSUM_INET_FULL_V4. This means that we receive
2581 		 * IPv4 packets from the stack with a blank checksum
2582 		 * field and must insert the pseudo-header checksum
2583 		 * before passing the packet to the IO domain.
2584 		 */
2585 		if (xnfp->xnf_cksum_offload)
2586 			*capab = HCKSUM_INET_FULL_V4;
2587 		else
2588 			*capab = 0;
2589 		break;
2590 	}
2591 
2592 	case MAC_CAPAB_POLL:
2593 		/* Just return B_TRUE. */
2594 		break;
2595 
2596 	default:
2597 		return (B_FALSE);
2598 	}
2599 
2600 	return (B_TRUE);
2601 }
2602 
2603 /*ARGSUSED*/
2604 static void
2605 oe_state_change(dev_info_t *dip, ddi_eventcookie_t id,
2606     void *arg, void *impl_data)
2607 {
2608 	xnf_t *xnfp = ddi_get_driver_private(dip);
2609 	XenbusState new_state = *(XenbusState *)impl_data;
2610 
2611 	ASSERT(xnfp != NULL);
2612 
2613 	switch (new_state) {
2614 	case XenbusStateConnected:
2615 		mutex_enter(&xnfp->xnf_intrlock);
2616 		mutex_enter(&xnfp->xnf_txlock);
2617 
2618 		xnfp->xnf_connected = B_TRUE;
2619 		/*
2620 		 * wake up threads wanting to send data to backend,
2621 		 * but got blocked due to backend is not ready
2622 		 */
2623 		cv_broadcast(&xnfp->xnf_cv);
2624 
2625 		mutex_exit(&xnfp->xnf_txlock);
2626 		mutex_exit(&xnfp->xnf_intrlock);
2627 
2628 		/*
2629 		 * kick backend in case it missed any tx request
2630 		 * in the TX ring buffer
2631 		 */
2632 		ec_notify_via_evtchn(xnfp->xnf_evtchn);
2633 
2634 		/*
2635 		 * there maybe already queued rx data in the RX ring
2636 		 * sent by backend after it gets connected but before
2637 		 * we see its state change here, so we call our intr
2638 		 * handling routine to handle them, if any
2639 		 */
2640 		(void) xnf_intr((caddr_t)xnfp);
2641 
2642 		/* mark as link up after get connected */
2643 		mac_link_update(xnfp->xnf_mh, LINK_STATE_UP);
2644 
2645 		break;
2646 
2647 	default:
2648 		break;
2649 	}
2650 }
2651 
2652 /*
2653  * Check whether backend is capable of and willing to talk
2654  * to us via hypervisor copy, as opposed to page flip.
2655  */
2656 static boolean_t
2657 xnf_hvcopy_peer_status(dev_info_t *devinfo)
2658 {
2659 	int	be_rx_copy;
2660 	int	err;
2661 
2662 	err = xenbus_scanf(XBT_NULL, xvdi_get_oename(devinfo),
2663 	    "feature-rx-copy", "%d", &be_rx_copy);
2664 	/*
2665 	 * If we fail to read the store we assume that the key is
2666 	 * absent, implying an older domain at the far end.  Older
2667 	 * domains cannot do HV copy (we assume ..).
2668 	 */
2669 	if (err != 0)
2670 		be_rx_copy = 0;
2671 
2672 	return (be_rx_copy?B_TRUE:B_FALSE);
2673 }
2674