xref: /illumos-gate/usr/src/uts/common/io/e1000g/e1000g_alloc.c (revision 91760536453132b0d3369ad5543622a5478007e6)
1 /*
2  * This file is provided under a CDDLv1 license.  When using or
3  * redistributing this file, you may do so under this license.
4  * In redistributing this file this license must be included
5  * and no other modification of this header file is permitted.
6  *
7  * CDDL LICENSE SUMMARY
8  *
9  * Copyright(c) 1999 - 2008 Intel Corporation. All rights reserved.
10  *
11  * The contents of this file are subject to the terms of Version
12  * 1.0 of the Common Development and Distribution License (the "License").
13  *
14  * You should have received a copy of the License with this software.
15  * You can obtain a copy of the License at
16  *	http://www.opensolaris.org/os/licensing.
17  * See the License for the specific language governing permissions
18  * and limitations under the License.
19  */
20 
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms of the CDDLv1.
24  */
25 
26 /*
27  * **********************************************************************
28  * Module Name:								*
29  *   e1000g_alloc.c							*
30  *									*
31  * Abstract:								*
32  *   This file contains some routines that take care of			*
33  *   memory allocation for descriptors and buffers.			*
34  *									*
35  * **********************************************************************
36  */
37 
38 #include "e1000g_sw.h"
39 #include "e1000g_debug.h"
40 
41 #define	TX_SW_PKT_AREA_SZ \
42 	(sizeof (tx_sw_packet_t) * Adapter->tx_freelist_num)
43 
44 static int e1000g_alloc_tx_descriptors(e1000g_tx_ring_t *);
45 static int e1000g_alloc_rx_descriptors(e1000g_rx_ring_t *);
46 static void e1000g_free_tx_descriptors(e1000g_tx_ring_t *);
47 static void e1000g_free_rx_descriptors(e1000g_rx_ring_t *);
48 static int e1000g_alloc_tx_packets(e1000g_tx_ring_t *);
49 static int e1000g_alloc_rx_packets(e1000g_rx_ring_t *);
50 static void e1000g_free_tx_packets(e1000g_tx_ring_t *);
51 static void e1000g_free_rx_packets(e1000g_rx_ring_t *);
52 static int e1000g_alloc_dma_buffer(struct e1000g *,
53     dma_buffer_t *, size_t, ddi_dma_attr_t *p_dma_attr);
54 static void e1000g_free_dma_buffer(dma_buffer_t *);
55 #ifdef __sparc
56 static int e1000g_alloc_dvma_buffer(struct e1000g *, dma_buffer_t *, size_t);
57 static void e1000g_free_dvma_buffer(dma_buffer_t *);
58 #endif
59 static int e1000g_alloc_descriptors(struct e1000g *Adapter);
60 static void e1000g_free_descriptors(struct e1000g *Adapter);
61 static int e1000g_alloc_packets(struct e1000g *Adapter);
62 static void e1000g_free_packets(struct e1000g *Adapter);
63 static p_rx_sw_packet_t e1000g_alloc_rx_sw_packet(e1000g_rx_ring_t *,
64     ddi_dma_attr_t *p_dma_attr);
65 
66 /* DMA access attributes for descriptors <Little Endian> */
67 static ddi_device_acc_attr_t e1000g_desc_acc_attr = {
68 	DDI_DEVICE_ATTR_V0,
69 	DDI_STRUCTURE_LE_ACC,
70 	DDI_STRICTORDER_ACC,
71 	DDI_FLAGERR_ACC
72 };
73 
74 /* DMA access attributes for DMA buffers */
75 #ifdef __sparc
76 static ddi_device_acc_attr_t e1000g_buf_acc_attr = {
77 	DDI_DEVICE_ATTR_V0,
78 	DDI_STRUCTURE_BE_ACC,
79 	DDI_STRICTORDER_ACC,
80 };
81 #else
82 static ddi_device_acc_attr_t e1000g_buf_acc_attr = {
83 	DDI_DEVICE_ATTR_V0,
84 	DDI_STRUCTURE_LE_ACC,
85 	DDI_STRICTORDER_ACC,
86 };
87 #endif
88 
89 /* DMA attributes for tx mblk buffers */
90 static ddi_dma_attr_t e1000g_tx_dma_attr = {
91 	DMA_ATTR_V0,		/* version of this structure */
92 	0,			/* lowest usable address */
93 	0xffffffffffffffffULL,	/* highest usable address */
94 	0x7fffffff,		/* maximum DMAable byte count */
95 	1,			/* alignment in bytes */
96 	0x7ff,			/* burst sizes (any?) */
97 	1,			/* minimum transfer */
98 	0xffffffffU,		/* maximum transfer */
99 	0xffffffffffffffffULL,	/* maximum segment length */
100 	MAX_COOKIES,		/* maximum number of segments */
101 	1,			/* granularity */
102 	DDI_DMA_FLAGERR,	/* dma_attr_flags */
103 };
104 
105 /* DMA attributes for pre-allocated rx/tx buffers */
106 static ddi_dma_attr_t e1000g_buf_dma_attr = {
107 	DMA_ATTR_V0,		/* version of this structure */
108 	0,			/* lowest usable address */
109 	0xffffffffffffffffULL,	/* highest usable address */
110 	0x7fffffff,		/* maximum DMAable byte count */
111 	1,			/* alignment in bytes */
112 	0x7ff,			/* burst sizes (any?) */
113 	1,			/* minimum transfer */
114 	0xffffffffU,		/* maximum transfer */
115 	0xffffffffffffffffULL,	/* maximum segment length */
116 	1,			/* maximum number of segments */
117 	1,			/* granularity */
118 	DDI_DMA_FLAGERR,	/* dma_attr_flags */
119 };
120 
121 /* DMA attributes for rx/tx descriptors */
122 static ddi_dma_attr_t e1000g_desc_dma_attr = {
123 	DMA_ATTR_V0,		/* version of this structure */
124 	0,			/* lowest usable address */
125 	0xffffffffffffffffULL,	/* highest usable address */
126 	0x7fffffff,		/* maximum DMAable byte count */
127 	E1000_MDALIGN,		/* alignment in bytes 4K! */
128 	0x7ff,			/* burst sizes (any?) */
129 	1,			/* minimum transfer */
130 	0xffffffffU,		/* maximum transfer */
131 	0xffffffffffffffffULL,	/* maximum segment length */
132 	1,			/* maximum number of segments */
133 	1,			/* granularity */
134 	DDI_DMA_FLAGERR,	/* dma_attr_flags */
135 };
136 
137 #ifdef __sparc
138 static ddi_dma_lim_t e1000g_dma_limits = {
139 	(uint_t)0,		/* dlim_addr_lo */
140 	(uint_t)0xffffffff,	/* dlim_addr_hi */
141 	(uint_t)0xffffffff,	/* dlim_cntr_max */
142 	(uint_t)0xfc00fc,	/* dlim_burstsizes for 32 and 64 bit xfers */
143 	0x1,			/* dlim_minxfer */
144 	1024			/* dlim_speed */
145 };
146 #endif
147 
148 #ifdef __sparc
149 static dma_type_t e1000g_dma_type = USE_DVMA;
150 #else
151 static dma_type_t e1000g_dma_type = USE_DMA;
152 #endif
153 
154 extern krwlock_t e1000g_dma_type_lock;
155 
156 
157 int
158 e1000g_alloc_dma_resources(struct e1000g *Adapter)
159 {
160 	int result;
161 
162 	result = DDI_FAILURE;
163 
164 	while ((result != DDI_SUCCESS) &&
165 	    (Adapter->tx_desc_num >= MIN_NUM_TX_DESCRIPTOR) &&
166 	    (Adapter->rx_desc_num >= MIN_NUM_RX_DESCRIPTOR) &&
167 	    (Adapter->tx_freelist_num >= MIN_NUM_TX_FREELIST) &&
168 	    (Adapter->rx_freelist_num >= MIN_NUM_RX_FREELIST)) {
169 
170 		result = e1000g_alloc_descriptors(Adapter);
171 
172 		if (result == DDI_SUCCESS) {
173 			result = e1000g_alloc_packets(Adapter);
174 
175 			if (result != DDI_SUCCESS)
176 				e1000g_free_descriptors(Adapter);
177 		}
178 
179 		/*
180 		 * If the allocation fails due to resource shortage,
181 		 * we'll reduce the numbers of descriptors/buffers by
182 		 * half, and try the allocation again.
183 		 */
184 		if (result != DDI_SUCCESS) {
185 			/*
186 			 * We must ensure the number of descriptors
187 			 * is always a multiple of 8.
188 			 */
189 			Adapter->tx_desc_num =
190 			    (Adapter->tx_desc_num >> 4) << 3;
191 			Adapter->rx_desc_num =
192 			    (Adapter->rx_desc_num >> 4) << 3;
193 
194 			Adapter->tx_freelist_num >>= 1;
195 			Adapter->rx_freelist_num >>= 1;
196 		}
197 	}
198 
199 	return (result);
200 }
201 
202 /*
203  * e1000g_alloc_descriptors - allocate DMA buffers for descriptors
204  *
205  * This routine allocates neccesary DMA buffers for
206  *	Transmit Descriptor Area
207  *	Receive Descrpitor Area
208  */
209 static int
210 e1000g_alloc_descriptors(struct e1000g *Adapter)
211 {
212 	int result;
213 	e1000g_tx_ring_t *tx_ring;
214 	e1000g_rx_ring_t *rx_ring;
215 
216 	tx_ring = Adapter->tx_ring;
217 
218 	result = e1000g_alloc_tx_descriptors(tx_ring);
219 	if (result != DDI_SUCCESS)
220 		return (DDI_FAILURE);
221 
222 	rx_ring = Adapter->rx_ring;
223 
224 	result = e1000g_alloc_rx_descriptors(rx_ring);
225 	if (result != DDI_SUCCESS) {
226 		e1000g_free_tx_descriptors(tx_ring);
227 		return (DDI_FAILURE);
228 	}
229 
230 	return (DDI_SUCCESS);
231 }
232 
233 static void
234 e1000g_free_descriptors(struct e1000g *Adapter)
235 {
236 	e1000g_tx_ring_t *tx_ring;
237 	e1000g_rx_ring_t *rx_ring;
238 
239 	tx_ring = Adapter->tx_ring;
240 	rx_ring = Adapter->rx_ring;
241 
242 	e1000g_free_tx_descriptors(tx_ring);
243 	e1000g_free_rx_descriptors(rx_ring);
244 }
245 
246 static int
247 e1000g_alloc_tx_descriptors(e1000g_tx_ring_t *tx_ring)
248 {
249 	int mystat;
250 	boolean_t alloc_flag;
251 	size_t size;
252 	size_t len;
253 	uintptr_t templong;
254 	uint_t cookie_count;
255 	dev_info_t *devinfo;
256 	ddi_dma_cookie_t cookie;
257 	struct e1000g *Adapter;
258 	ddi_dma_attr_t dma_attr;
259 
260 	Adapter = tx_ring->adapter;
261 	devinfo = Adapter->dip;
262 
263 	alloc_flag = B_FALSE;
264 	dma_attr = e1000g_desc_dma_attr;
265 
266 	/*
267 	 * Solaris 7 has a problem with allocating physically contiguous memory
268 	 * that is aligned on a 4K boundary. The transmit and rx descriptors
269 	 * need to aligned on a 4kbyte boundary. We first try to allocate the
270 	 * memory with DMA attributes set to 4K alignment and also no scatter/
271 	 * gather mechanism specified. In most cases, this does not allocate
272 	 * memory aligned at a 4Kbyte boundary. We then try asking for memory
273 	 * aligned on 4K boundary with scatter/gather set to 2. This works when
274 	 * the amount of memory is less than 4k i.e a page size. If neither of
275 	 * these options work or if the number of descriptors is greater than
276 	 * 4K, ie more than 256 descriptors, we allocate 4k extra memory and
277 	 * and then align the memory at a 4k boundary.
278 	 */
279 	size = sizeof (struct e1000_tx_desc) * Adapter->tx_desc_num;
280 
281 	/*
282 	 * Memory allocation for the transmit buffer descriptors.
283 	 */
284 	dma_attr.dma_attr_sgllen = 1;
285 
286 	/*
287 	 * Allocate a new DMA handle for the transmit descriptor
288 	 * memory area.
289 	 */
290 	mystat = ddi_dma_alloc_handle(devinfo, &dma_attr,
291 	    DDI_DMA_DONTWAIT, 0,
292 	    &tx_ring->tbd_dma_handle);
293 
294 	if (mystat != DDI_SUCCESS) {
295 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
296 		    "Could not allocate tbd dma handle: %d", mystat);
297 		tx_ring->tbd_dma_handle = NULL;
298 		return (DDI_FAILURE);
299 	}
300 
301 	/*
302 	 * Allocate memory to DMA data to and from the transmit
303 	 * descriptors.
304 	 */
305 	mystat = ddi_dma_mem_alloc(tx_ring->tbd_dma_handle,
306 	    size,
307 	    &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT,
308 	    DDI_DMA_DONTWAIT, 0,
309 	    (caddr_t *)&tx_ring->tbd_area,
310 	    &len, &tx_ring->tbd_acc_handle);
311 
312 	if ((mystat != DDI_SUCCESS) ||
313 	    ((uintptr_t)tx_ring->tbd_area & (E1000_MDALIGN - 1))) {
314 		if (mystat == DDI_SUCCESS) {
315 			ddi_dma_mem_free(&tx_ring->tbd_acc_handle);
316 			tx_ring->tbd_acc_handle = NULL;
317 			tx_ring->tbd_area = NULL;
318 		}
319 		if (tx_ring->tbd_dma_handle != NULL) {
320 			ddi_dma_free_handle(&tx_ring->tbd_dma_handle);
321 			tx_ring->tbd_dma_handle = NULL;
322 		}
323 		alloc_flag = B_FALSE;
324 	} else
325 		alloc_flag = B_TRUE;
326 
327 	/*
328 	 * Initialize the entire transmit buffer descriptor area to zero
329 	 */
330 	if (alloc_flag)
331 		bzero(tx_ring->tbd_area, len);
332 
333 	/*
334 	 * If the previous DMA attributes setting could not give us contiguous
335 	 * memory or the number of descriptors is greater than the page size,
336 	 * we allocate 4K extra memory and then align it at a 4k boundary.
337 	 */
338 	if (!alloc_flag) {
339 		size = size + ROUNDOFF;
340 
341 		/*
342 		 * DMA attributes set to no scatter/gather and 16 bit alignment
343 		 */
344 		dma_attr.dma_attr_align = 1;
345 		dma_attr.dma_attr_sgllen = 1;
346 
347 		/*
348 		 * Allocate a new DMA handle for the transmit descriptor memory
349 		 * area.
350 		 */
351 		mystat = ddi_dma_alloc_handle(devinfo, &dma_attr,
352 		    DDI_DMA_DONTWAIT, 0,
353 		    &tx_ring->tbd_dma_handle);
354 
355 		if (mystat != DDI_SUCCESS) {
356 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
357 			    "Could not re-allocate tbd dma handle: %d", mystat);
358 			tx_ring->tbd_dma_handle = NULL;
359 			return (DDI_FAILURE);
360 		}
361 
362 		/*
363 		 * Allocate memory to DMA data to and from the transmit
364 		 * descriptors.
365 		 */
366 		mystat = ddi_dma_mem_alloc(tx_ring->tbd_dma_handle,
367 		    size,
368 		    &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT,
369 		    DDI_DMA_DONTWAIT, 0,
370 		    (caddr_t *)&tx_ring->tbd_area,
371 		    &len, &tx_ring->tbd_acc_handle);
372 
373 		if (mystat != DDI_SUCCESS) {
374 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
375 			    "Could not allocate tbd dma memory: %d", mystat);
376 			tx_ring->tbd_acc_handle = NULL;
377 			tx_ring->tbd_area = NULL;
378 			if (tx_ring->tbd_dma_handle != NULL) {
379 				ddi_dma_free_handle(&tx_ring->tbd_dma_handle);
380 				tx_ring->tbd_dma_handle = NULL;
381 			}
382 			return (DDI_FAILURE);
383 		} else
384 			alloc_flag = B_TRUE;
385 
386 		/*
387 		 * Initialize the entire transmit buffer descriptor area to zero
388 		 */
389 		bzero(tx_ring->tbd_area, len);
390 		/*
391 		 * Memory has been allocated with the ddi_dma_mem_alloc call,
392 		 * but has not been aligned. We now align it on a 4k boundary.
393 		 */
394 		templong = P2NPHASE((uintptr_t)tx_ring->tbd_area, ROUNDOFF);
395 		len = size - templong;
396 		templong += (uintptr_t)tx_ring->tbd_area;
397 		tx_ring->tbd_area = (struct e1000_tx_desc *)templong;
398 	}	/* alignment workaround */
399 
400 	/*
401 	 * Transmit buffer descriptor memory allocation succeeded
402 	 */
403 	ASSERT(alloc_flag);
404 
405 	/*
406 	 * Allocates DMA resources for the memory that was allocated by
407 	 * the ddi_dma_mem_alloc call. The DMA resources then get bound to the
408 	 * the memory address
409 	 */
410 	mystat = ddi_dma_addr_bind_handle(tx_ring->tbd_dma_handle,
411 	    (struct as *)NULL, (caddr_t)tx_ring->tbd_area,
412 	    len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
413 	    DDI_DMA_DONTWAIT, 0, &cookie, &cookie_count);
414 
415 	if (mystat != DDI_SUCCESS) {
416 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
417 		    "Could not bind tbd dma resource: %d", mystat);
418 		if (tx_ring->tbd_acc_handle != NULL) {
419 			ddi_dma_mem_free(&tx_ring->tbd_acc_handle);
420 			tx_ring->tbd_acc_handle = NULL;
421 			tx_ring->tbd_area = NULL;
422 		}
423 		if (tx_ring->tbd_dma_handle != NULL) {
424 			ddi_dma_free_handle(&tx_ring->tbd_dma_handle);
425 			tx_ring->tbd_dma_handle = NULL;
426 		}
427 		return (DDI_FAILURE);
428 	}
429 
430 	ASSERT(cookie_count == 1);	/* 1 cookie */
431 
432 	if (cookie_count != 1) {
433 		E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL,
434 		    "Could not bind tbd dma resource in a single frag. "
435 		    "Count - %d Len - %d", cookie_count, len);
436 		e1000g_free_tx_descriptors(tx_ring);
437 		return (DDI_FAILURE);
438 	}
439 
440 	tx_ring->tbd_dma_addr = cookie.dmac_laddress;
441 	tx_ring->tbd_first = tx_ring->tbd_area;
442 	tx_ring->tbd_last = tx_ring->tbd_first +
443 	    (Adapter->tx_desc_num - 1);
444 
445 	return (DDI_SUCCESS);
446 }
447 
448 static int
449 e1000g_alloc_rx_descriptors(e1000g_rx_ring_t *rx_ring)
450 {
451 	int mystat;
452 	boolean_t alloc_flag;
453 	size_t size;
454 	size_t len;
455 	uintptr_t templong;
456 	uint_t cookie_count;
457 	dev_info_t *devinfo;
458 	ddi_dma_cookie_t cookie;
459 	struct e1000g *Adapter;
460 	ddi_dma_attr_t dma_attr;
461 
462 	Adapter = rx_ring->adapter;
463 	devinfo = Adapter->dip;
464 
465 	alloc_flag = B_FALSE;
466 	dma_attr = e1000g_desc_dma_attr;
467 
468 	/*
469 	 * Memory allocation for the receive buffer descriptors.
470 	 */
471 	size = (sizeof (struct e1000_rx_desc)) * Adapter->rx_desc_num;
472 
473 	/*
474 	 * Asking for aligned memory with DMA attributes set for 4k alignment
475 	 */
476 	dma_attr.dma_attr_sgllen = 1;
477 	dma_attr.dma_attr_align = E1000_MDALIGN;
478 
479 	/*
480 	 * Allocate a new DMA handle for the receive descriptors
481 	 */
482 	mystat = ddi_dma_alloc_handle(devinfo, &dma_attr,
483 	    DDI_DMA_DONTWAIT, 0,
484 	    &rx_ring->rbd_dma_handle);
485 
486 	if (mystat != DDI_SUCCESS) {
487 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
488 		    "Could not allocate rbd dma handle: %d", mystat);
489 		rx_ring->rbd_dma_handle = NULL;
490 		return (DDI_FAILURE);
491 	}
492 	/*
493 	 * Allocate memory to DMA data to and from the receive
494 	 * descriptors.
495 	 */
496 	mystat = ddi_dma_mem_alloc(rx_ring->rbd_dma_handle,
497 	    size,
498 	    &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT,
499 	    DDI_DMA_DONTWAIT, 0,
500 	    (caddr_t *)&rx_ring->rbd_area,
501 	    &len, &rx_ring->rbd_acc_handle);
502 
503 	/*
504 	 * Check if memory allocation succeeded and also if the
505 	 * allocated memory is aligned correctly.
506 	 */
507 	if ((mystat != DDI_SUCCESS) ||
508 	    ((uintptr_t)rx_ring->rbd_area & (E1000_MDALIGN - 1))) {
509 		if (mystat == DDI_SUCCESS) {
510 			ddi_dma_mem_free(&rx_ring->rbd_acc_handle);
511 			rx_ring->rbd_acc_handle = NULL;
512 			rx_ring->rbd_area = NULL;
513 		}
514 		if (rx_ring->rbd_dma_handle != NULL) {
515 			ddi_dma_free_handle(&rx_ring->rbd_dma_handle);
516 			rx_ring->rbd_dma_handle = NULL;
517 		}
518 		alloc_flag = B_FALSE;
519 	} else
520 		alloc_flag = B_TRUE;
521 
522 	/*
523 	 * Initialize the allocated receive descriptor memory to zero.
524 	 */
525 	if (alloc_flag)
526 		bzero((caddr_t)rx_ring->rbd_area, len);
527 
528 	/*
529 	 * If memory allocation did not succeed, do the alignment ourselves
530 	 */
531 	if (!alloc_flag) {
532 		dma_attr.dma_attr_align = 1;
533 		dma_attr.dma_attr_sgllen = 1;
534 		size = size + ROUNDOFF;
535 		/*
536 		 * Allocate a new DMA handle for the receive descriptor.
537 		 */
538 		mystat = ddi_dma_alloc_handle(devinfo, &dma_attr,
539 		    DDI_DMA_DONTWAIT, 0,
540 		    &rx_ring->rbd_dma_handle);
541 
542 		if (mystat != DDI_SUCCESS) {
543 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
544 			    "Could not re-allocate rbd dma handle: %d", mystat);
545 			rx_ring->rbd_dma_handle = NULL;
546 			return (DDI_FAILURE);
547 		}
548 		/*
549 		 * Allocate memory to DMA data to and from the receive
550 		 * descriptors.
551 		 */
552 		mystat = ddi_dma_mem_alloc(rx_ring->rbd_dma_handle,
553 		    size,
554 		    &e1000g_desc_acc_attr, DDI_DMA_CONSISTENT,
555 		    DDI_DMA_DONTWAIT, 0,
556 		    (caddr_t *)&rx_ring->rbd_area,
557 		    &len, &rx_ring->rbd_acc_handle);
558 
559 		if (mystat != DDI_SUCCESS) {
560 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
561 			    "Could not allocate rbd dma memory: %d", mystat);
562 			rx_ring->rbd_acc_handle = NULL;
563 			rx_ring->rbd_area = NULL;
564 			if (rx_ring->rbd_dma_handle != NULL) {
565 				ddi_dma_free_handle(&rx_ring->rbd_dma_handle);
566 				rx_ring->rbd_dma_handle = NULL;
567 			}
568 			return (DDI_FAILURE);
569 		} else
570 			alloc_flag = B_TRUE;
571 
572 		/*
573 		 * Initialize the allocated receive descriptor memory to zero.
574 		 */
575 		bzero((caddr_t)rx_ring->rbd_area, len);
576 		templong = P2NPHASE((uintptr_t)rx_ring->rbd_area, ROUNDOFF);
577 		len = size - templong;
578 		templong += (uintptr_t)rx_ring->rbd_area;
579 		rx_ring->rbd_area = (struct e1000_rx_desc *)templong;
580 	}	/* alignment workaround */
581 
582 	/*
583 	 * The memory allocation of the receive descriptors succeeded
584 	 */
585 	ASSERT(alloc_flag);
586 
587 	/*
588 	 * Allocates DMA resources for the memory that was allocated by
589 	 * the ddi_dma_mem_alloc call.
590 	 */
591 	mystat = ddi_dma_addr_bind_handle(rx_ring->rbd_dma_handle,
592 	    (struct as *)NULL, (caddr_t)rx_ring->rbd_area,
593 	    len, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
594 	    DDI_DMA_DONTWAIT, 0, &cookie, &cookie_count);
595 
596 	if (mystat != DDI_SUCCESS) {
597 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
598 		    "Could not bind rbd dma resource: %d", mystat);
599 		if (rx_ring->rbd_acc_handle != NULL) {
600 			ddi_dma_mem_free(&rx_ring->rbd_acc_handle);
601 			rx_ring->rbd_acc_handle = NULL;
602 			rx_ring->rbd_area = NULL;
603 		}
604 		if (rx_ring->rbd_dma_handle != NULL) {
605 			ddi_dma_free_handle(&rx_ring->rbd_dma_handle);
606 			rx_ring->rbd_dma_handle = NULL;
607 		}
608 		return (DDI_FAILURE);
609 	}
610 
611 	ASSERT(cookie_count == 1);
612 	if (cookie_count != 1) {
613 		E1000G_DEBUGLOG_2(Adapter, E1000G_WARN_LEVEL,
614 		    "Could not bind rbd dma resource in a single frag. "
615 		    "Count - %d Len - %d", cookie_count, len);
616 		e1000g_free_rx_descriptors(rx_ring);
617 		return (DDI_FAILURE);
618 	}
619 
620 	rx_ring->rbd_dma_addr = cookie.dmac_laddress;
621 	rx_ring->rbd_first = rx_ring->rbd_area;
622 	rx_ring->rbd_last = rx_ring->rbd_first +
623 	    (Adapter->rx_desc_num - 1);
624 
625 	return (DDI_SUCCESS);
626 }
627 
628 static void
629 e1000g_free_rx_descriptors(e1000g_rx_ring_t *rx_ring)
630 {
631 	if (rx_ring->rbd_dma_handle != NULL) {
632 		(void) ddi_dma_unbind_handle(rx_ring->rbd_dma_handle);
633 	}
634 	if (rx_ring->rbd_acc_handle != NULL) {
635 		ddi_dma_mem_free(&rx_ring->rbd_acc_handle);
636 		rx_ring->rbd_acc_handle = NULL;
637 		rx_ring->rbd_area = NULL;
638 	}
639 	if (rx_ring->rbd_dma_handle != NULL) {
640 		ddi_dma_free_handle(&rx_ring->rbd_dma_handle);
641 		rx_ring->rbd_dma_handle = NULL;
642 	}
643 	rx_ring->rbd_dma_addr = NULL;
644 	rx_ring->rbd_first = NULL;
645 	rx_ring->rbd_last = NULL;
646 }
647 
648 static void
649 e1000g_free_tx_descriptors(e1000g_tx_ring_t *tx_ring)
650 {
651 	if (tx_ring->tbd_dma_handle != NULL) {
652 		(void) ddi_dma_unbind_handle(tx_ring->tbd_dma_handle);
653 	}
654 	if (tx_ring->tbd_acc_handle != NULL) {
655 		ddi_dma_mem_free(&tx_ring->tbd_acc_handle);
656 		tx_ring->tbd_acc_handle = NULL;
657 		tx_ring->tbd_area = NULL;
658 	}
659 	if (tx_ring->tbd_dma_handle != NULL) {
660 		ddi_dma_free_handle(&tx_ring->tbd_dma_handle);
661 		tx_ring->tbd_dma_handle = NULL;
662 	}
663 	tx_ring->tbd_dma_addr = NULL;
664 	tx_ring->tbd_first = NULL;
665 	tx_ring->tbd_last = NULL;
666 }
667 
668 
669 /*
670  * e1000g_alloc_packets - allocate DMA buffers for rx/tx
671  *
672  * This routine allocates neccesary buffers for
673  *	 Transmit sw packet structure
674  *	 DMA handle for Transmit
675  *	 DMA buffer for Transmit
676  *	 Receive sw packet structure
677  *	 DMA buffer for Receive
678  */
679 static int
680 e1000g_alloc_packets(struct e1000g *Adapter)
681 {
682 	int result;
683 	e1000g_tx_ring_t *tx_ring;
684 	e1000g_rx_ring_t *rx_ring;
685 
686 	tx_ring = Adapter->tx_ring;
687 	rx_ring = Adapter->rx_ring;
688 
689 again:
690 	rw_enter(&e1000g_dma_type_lock, RW_READER);
691 
692 	result = e1000g_alloc_tx_packets(tx_ring);
693 	if (result != DDI_SUCCESS) {
694 		if (e1000g_dma_type == USE_DVMA) {
695 			rw_exit(&e1000g_dma_type_lock);
696 
697 			rw_enter(&e1000g_dma_type_lock, RW_WRITER);
698 			e1000g_dma_type = USE_DMA;
699 			rw_exit(&e1000g_dma_type_lock);
700 
701 			E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL,
702 			    "No enough dvma resource for Tx packets, "
703 			    "trying to allocate dma buffers...\n");
704 			goto again;
705 		}
706 		rw_exit(&e1000g_dma_type_lock);
707 
708 		E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
709 		    "Failed to allocate dma buffers for Tx packets\n");
710 		return (DDI_FAILURE);
711 	}
712 
713 	result = e1000g_alloc_rx_packets(rx_ring);
714 	if (result != DDI_SUCCESS) {
715 		e1000g_free_tx_packets(tx_ring);
716 		if (e1000g_dma_type == USE_DVMA) {
717 			rw_exit(&e1000g_dma_type_lock);
718 
719 			rw_enter(&e1000g_dma_type_lock, RW_WRITER);
720 			e1000g_dma_type = USE_DMA;
721 			rw_exit(&e1000g_dma_type_lock);
722 
723 			E1000G_DEBUGLOG_0(Adapter, E1000G_INFO_LEVEL,
724 			    "No enough dvma resource for Rx packets, "
725 			    "trying to allocate dma buffers...\n");
726 			goto again;
727 		}
728 		rw_exit(&e1000g_dma_type_lock);
729 
730 		E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
731 		    "Failed to allocate dma buffers for Rx packets\n");
732 		return (DDI_FAILURE);
733 	}
734 
735 	rw_exit(&e1000g_dma_type_lock);
736 
737 	return (DDI_SUCCESS);
738 }
739 
740 static void
741 e1000g_free_packets(struct e1000g *Adapter)
742 {
743 	e1000g_tx_ring_t *tx_ring;
744 	e1000g_rx_ring_t *rx_ring;
745 
746 	tx_ring = Adapter->tx_ring;
747 	rx_ring = Adapter->rx_ring;
748 
749 	e1000g_free_tx_packets(tx_ring);
750 	e1000g_free_rx_packets(rx_ring);
751 }
752 
753 #ifdef __sparc
754 static int
755 e1000g_alloc_dvma_buffer(struct e1000g *Adapter,
756     dma_buffer_t *buf, size_t size)
757 {
758 	int mystat;
759 	dev_info_t *devinfo;
760 	ddi_dma_cookie_t cookie;
761 
762 	if (e1000g_force_detach)
763 		devinfo = Adapter->priv_dip;
764 	else
765 		devinfo = Adapter->dip;
766 
767 	mystat = dvma_reserve(devinfo,
768 	    &e1000g_dma_limits,
769 	    Adapter->dvma_page_num,
770 	    &buf->dma_handle);
771 
772 	if (mystat != DDI_SUCCESS) {
773 		buf->dma_handle = NULL;
774 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
775 		    "Could not allocate dvma buffer handle: %d\n", mystat);
776 		return (DDI_FAILURE);
777 	}
778 
779 	buf->address = kmem_alloc(size, KM_NOSLEEP);
780 
781 	if (buf->address == NULL) {
782 		if (buf->dma_handle != NULL) {
783 			dvma_release(buf->dma_handle);
784 			buf->dma_handle = NULL;
785 		}
786 		E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
787 		    "Could not allocate dvma buffer memory\n");
788 		return (DDI_FAILURE);
789 	}
790 
791 	dvma_kaddr_load(buf->dma_handle,
792 	    buf->address, size, 0, &cookie);
793 
794 	buf->dma_address = cookie.dmac_laddress;
795 	buf->size = size;
796 	buf->len = 0;
797 
798 	return (DDI_SUCCESS);
799 }
800 
801 static void
802 e1000g_free_dvma_buffer(dma_buffer_t *buf)
803 {
804 	if (buf->dma_handle != NULL) {
805 		dvma_unload(buf->dma_handle, 0, -1);
806 	} else {
807 		return;
808 	}
809 
810 	buf->dma_address = NULL;
811 
812 	if (buf->address != NULL) {
813 		kmem_free(buf->address, buf->size);
814 		buf->address = NULL;
815 	}
816 
817 	if (buf->dma_handle != NULL) {
818 		dvma_release(buf->dma_handle);
819 		buf->dma_handle = NULL;
820 	}
821 
822 	buf->size = 0;
823 	buf->len = 0;
824 }
825 #endif
826 
827 static int
828 e1000g_alloc_dma_buffer(struct e1000g *Adapter,
829     dma_buffer_t *buf, size_t size, ddi_dma_attr_t *p_dma_attr)
830 {
831 	int mystat;
832 	dev_info_t *devinfo;
833 	ddi_dma_cookie_t cookie;
834 	size_t len;
835 	uint_t count;
836 
837 	if (e1000g_force_detach)
838 		devinfo = Adapter->priv_dip;
839 	else
840 		devinfo = Adapter->dip;
841 
842 	mystat = ddi_dma_alloc_handle(devinfo,
843 	    p_dma_attr,
844 	    DDI_DMA_DONTWAIT, 0,
845 	    &buf->dma_handle);
846 
847 	if (mystat != DDI_SUCCESS) {
848 		buf->dma_handle = NULL;
849 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
850 		    "Could not allocate dma buffer handle: %d\n", mystat);
851 		return (DDI_FAILURE);
852 	}
853 
854 	mystat = ddi_dma_mem_alloc(buf->dma_handle,
855 	    size, &e1000g_buf_acc_attr, DDI_DMA_STREAMING,
856 	    DDI_DMA_DONTWAIT, 0,
857 	    &buf->address,
858 	    &len, &buf->acc_handle);
859 
860 	if (mystat != DDI_SUCCESS) {
861 		buf->acc_handle = NULL;
862 		buf->address = NULL;
863 		if (buf->dma_handle != NULL) {
864 			ddi_dma_free_handle(&buf->dma_handle);
865 			buf->dma_handle = NULL;
866 		}
867 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
868 		    "Could not allocate dma buffer memory: %d\n", mystat);
869 		return (DDI_FAILURE);
870 	}
871 
872 	mystat = ddi_dma_addr_bind_handle(buf->dma_handle,
873 	    (struct as *)NULL,
874 	    buf->address,
875 	    len, DDI_DMA_READ | DDI_DMA_STREAMING,
876 	    DDI_DMA_DONTWAIT, 0, &cookie, &count);
877 
878 	if (mystat != DDI_SUCCESS) {
879 		if (buf->acc_handle != NULL) {
880 			ddi_dma_mem_free(&buf->acc_handle);
881 			buf->acc_handle = NULL;
882 			buf->address = NULL;
883 		}
884 		if (buf->dma_handle != NULL) {
885 			ddi_dma_free_handle(&buf->dma_handle);
886 			buf->dma_handle = NULL;
887 		}
888 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
889 		    "Could not bind buffer dma handle: %d\n", mystat);
890 		return (DDI_FAILURE);
891 	}
892 
893 	ASSERT(count == 1);
894 	if (count != 1) {
895 		if (buf->dma_handle != NULL) {
896 			(void) ddi_dma_unbind_handle(buf->dma_handle);
897 		}
898 		if (buf->acc_handle != NULL) {
899 			ddi_dma_mem_free(&buf->acc_handle);
900 			buf->acc_handle = NULL;
901 			buf->address = NULL;
902 		}
903 		if (buf->dma_handle != NULL) {
904 			ddi_dma_free_handle(&buf->dma_handle);
905 			buf->dma_handle = NULL;
906 		}
907 		E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
908 		    "Could not bind buffer as a single frag. "
909 		    "Count = %d\n", count);
910 		return (DDI_FAILURE);
911 	}
912 
913 	buf->dma_address = cookie.dmac_laddress;
914 	buf->size = len;
915 	buf->len = 0;
916 
917 	return (DDI_SUCCESS);
918 }
919 
920 static void
921 e1000g_free_dma_buffer(dma_buffer_t *buf)
922 {
923 	if (buf->dma_handle != NULL) {
924 		(void) ddi_dma_unbind_handle(buf->dma_handle);
925 	} else {
926 		return;
927 	}
928 
929 	buf->dma_address = NULL;
930 
931 	if (buf->acc_handle != NULL) {
932 		ddi_dma_mem_free(&buf->acc_handle);
933 		buf->acc_handle = NULL;
934 		buf->address = NULL;
935 	}
936 
937 	if (buf->dma_handle != NULL) {
938 		ddi_dma_free_handle(&buf->dma_handle);
939 		buf->dma_handle = NULL;
940 	}
941 
942 	buf->size = 0;
943 	buf->len = 0;
944 }
945 
946 static int
947 e1000g_alloc_tx_packets(e1000g_tx_ring_t *tx_ring)
948 {
949 	int j;
950 	p_tx_sw_packet_t packet;
951 	int mystat;
952 	dma_buffer_t *tx_buf;
953 	struct e1000g *Adapter;
954 	dev_info_t *devinfo;
955 	ddi_dma_attr_t dma_attr;
956 
957 	Adapter = tx_ring->adapter;
958 	devinfo = Adapter->dip;
959 	dma_attr = e1000g_buf_dma_attr;
960 
961 	/*
962 	 * Memory allocation for the Transmit software structure, the transmit
963 	 * software packet. This structure stores all the relevant information
964 	 * for transmitting a single packet.
965 	 */
966 	tx_ring->packet_area =
967 	    kmem_zalloc(TX_SW_PKT_AREA_SZ, KM_NOSLEEP);
968 
969 	if (tx_ring->packet_area == NULL)
970 		return (DDI_FAILURE);
971 
972 	for (j = 0, packet = tx_ring->packet_area;
973 	    j < Adapter->tx_freelist_num; j++, packet++) {
974 
975 		ASSERT(packet != NULL);
976 
977 		/*
978 		 * Pre-allocate dma handles for transmit. These dma handles
979 		 * will be dynamically bound to the data buffers passed down
980 		 * from the upper layers at the time of transmitting. The
981 		 * dynamic binding only applies for the packets that are larger
982 		 * than the tx_bcopy_thresh.
983 		 */
984 		switch (e1000g_dma_type) {
985 #ifdef __sparc
986 		case USE_DVMA:
987 			mystat = dvma_reserve(devinfo,
988 			    &e1000g_dma_limits,
989 			    Adapter->dvma_page_num,
990 			    &packet->tx_dma_handle);
991 			break;
992 #endif
993 		case USE_DMA:
994 			mystat = ddi_dma_alloc_handle(devinfo,
995 			    &e1000g_tx_dma_attr,
996 			    DDI_DMA_DONTWAIT, 0,
997 			    &packet->tx_dma_handle);
998 			break;
999 		default:
1000 			ASSERT(B_FALSE);
1001 			break;
1002 		}
1003 		if (mystat != DDI_SUCCESS) {
1004 			packet->tx_dma_handle = NULL;
1005 			E1000G_DEBUGLOG_1(Adapter, E1000G_WARN_LEVEL,
1006 			    "Could not allocate tx dma handle: %d\n", mystat);
1007 			goto tx_pkt_fail;
1008 		}
1009 
1010 		/*
1011 		 * Pre-allocate transmit buffers for small packets that the
1012 		 * size is less than tx_bcopy_thresh. The data of those small
1013 		 * packets will be bcopy() to the transmit buffers instead of
1014 		 * using dynamical DMA binding. For small packets, bcopy will
1015 		 * bring better performance than DMA binding.
1016 		 */
1017 		tx_buf = packet->tx_buf;
1018 
1019 		switch (e1000g_dma_type) {
1020 #ifdef __sparc
1021 		case USE_DVMA:
1022 			mystat = e1000g_alloc_dvma_buffer(Adapter,
1023 			    tx_buf, Adapter->tx_buffer_size);
1024 			break;
1025 #endif
1026 		case USE_DMA:
1027 			mystat = e1000g_alloc_dma_buffer(Adapter,
1028 			    tx_buf, Adapter->tx_buffer_size, &dma_attr);
1029 			break;
1030 		default:
1031 			ASSERT(B_FALSE);
1032 			break;
1033 		}
1034 		if (mystat != DDI_SUCCESS) {
1035 			ASSERT(packet->tx_dma_handle != NULL);
1036 			switch (e1000g_dma_type) {
1037 #ifdef __sparc
1038 			case USE_DVMA:
1039 				dvma_release(packet->tx_dma_handle);
1040 				break;
1041 #endif
1042 			case USE_DMA:
1043 				ddi_dma_free_handle(&packet->tx_dma_handle);
1044 				break;
1045 			default:
1046 				ASSERT(B_FALSE);
1047 				break;
1048 			}
1049 			packet->tx_dma_handle = NULL;
1050 			E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
1051 			    "Allocate Tx buffer fail\n");
1052 			goto tx_pkt_fail;
1053 		}
1054 
1055 		packet->dma_type = e1000g_dma_type;
1056 	} /* for */
1057 
1058 	return (DDI_SUCCESS);
1059 
1060 tx_pkt_fail:
1061 	e1000g_free_tx_packets(tx_ring);
1062 
1063 	return (DDI_FAILURE);
1064 }
1065 
1066 static int
1067 e1000g_alloc_rx_packets(e1000g_rx_ring_t *rx_ring)
1068 {
1069 	int i;
1070 	p_rx_sw_packet_t packet;
1071 	struct e1000g *Adapter;
1072 	uint32_t packet_num;
1073 	ddi_dma_attr_t dma_attr;
1074 
1075 	Adapter = rx_ring->adapter;
1076 	dma_attr = e1000g_buf_dma_attr;
1077 	dma_attr.dma_attr_align = Adapter->rx_buf_align;
1078 
1079 	/*
1080 	 * Allocate memory for the rx_sw_packet structures. Each one of these
1081 	 * structures will contain a virtual and physical address to an actual
1082 	 * receive buffer in host memory. Since we use one rx_sw_packet per
1083 	 * received packet, the maximum number of rx_sw_packet that we'll
1084 	 * need is equal to the number of receive descriptors that we've
1085 	 * allocated.
1086 	 */
1087 	packet_num = Adapter->rx_desc_num + Adapter->rx_freelist_num;
1088 	rx_ring->packet_area = NULL;
1089 
1090 	for (i = 0; i < packet_num; i++) {
1091 		packet = e1000g_alloc_rx_sw_packet(rx_ring, &dma_attr);
1092 		if (packet == NULL)
1093 			goto rx_pkt_fail;
1094 
1095 		packet->next = rx_ring->packet_area;
1096 		rx_ring->packet_area = packet;
1097 	}
1098 
1099 	return (DDI_SUCCESS);
1100 
1101 rx_pkt_fail:
1102 	e1000g_free_rx_packets(rx_ring);
1103 
1104 	return (DDI_FAILURE);
1105 }
1106 
1107 static p_rx_sw_packet_t
1108 e1000g_alloc_rx_sw_packet(e1000g_rx_ring_t *rx_ring, ddi_dma_attr_t *p_dma_attr)
1109 {
1110 	int mystat;
1111 	p_rx_sw_packet_t packet;
1112 	dma_buffer_t *rx_buf;
1113 	struct e1000g *Adapter;
1114 
1115 	Adapter = rx_ring->adapter;
1116 
1117 	packet = kmem_zalloc(sizeof (rx_sw_packet_t), KM_NOSLEEP);
1118 	if (packet == NULL) {
1119 		E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
1120 		    "Cound not allocate memory for Rx SwPacket\n");
1121 		return (NULL);
1122 	}
1123 
1124 	rx_buf = packet->rx_buf;
1125 
1126 	switch (e1000g_dma_type) {
1127 #ifdef __sparc
1128 	case USE_DVMA:
1129 		mystat = e1000g_alloc_dvma_buffer(Adapter,
1130 		    rx_buf, Adapter->rx_buffer_size);
1131 		break;
1132 #endif
1133 	case USE_DMA:
1134 		mystat = e1000g_alloc_dma_buffer(Adapter,
1135 		    rx_buf, Adapter->rx_buffer_size, p_dma_attr);
1136 		break;
1137 	default:
1138 		ASSERT(B_FALSE);
1139 		break;
1140 	}
1141 
1142 	if (mystat != DDI_SUCCESS) {
1143 		if (packet != NULL)
1144 			kmem_free(packet, sizeof (rx_sw_packet_t));
1145 
1146 		E1000G_DEBUGLOG_0(Adapter, E1000G_WARN_LEVEL,
1147 		    "Failed to allocate Rx buffer\n");
1148 		return (NULL);
1149 	}
1150 
1151 	rx_buf->size -= E1000G_IPALIGNROOM;
1152 	rx_buf->address += E1000G_IPALIGNROOM;
1153 	rx_buf->dma_address += E1000G_IPALIGNROOM;
1154 
1155 	packet->rx_ring = (caddr_t)rx_ring;
1156 	packet->free_rtn.free_func = e1000g_rxfree_func;
1157 	packet->free_rtn.free_arg = (char *)packet;
1158 	/*
1159 	 * esballoc is changed to desballoc which
1160 	 * is undocumented call but as per sun,
1161 	 * we can use it. It gives better efficiency.
1162 	 */
1163 	packet->mp = desballoc((unsigned char *)
1164 	    rx_buf->address - E1000G_IPALIGNROOM,
1165 	    rx_buf->size + E1000G_IPALIGNROOM,
1166 	    BPRI_MED, &packet->free_rtn);
1167 
1168 	if (packet->mp != NULL) {
1169 		packet->mp->b_rptr += E1000G_IPALIGNROOM;
1170 		packet->mp->b_wptr += E1000G_IPALIGNROOM;
1171 	}
1172 
1173 	packet->dma_type = e1000g_dma_type;
1174 
1175 	return (packet);
1176 }
1177 
1178 void
1179 e1000g_free_rx_sw_packet(p_rx_sw_packet_t packet)
1180 {
1181 	dma_buffer_t *rx_buf;
1182 
1183 	if (packet->mp != NULL) {
1184 		freemsg(packet->mp);
1185 		packet->mp = NULL;
1186 	}
1187 
1188 	rx_buf = packet->rx_buf;
1189 	ASSERT(rx_buf->dma_handle != NULL);
1190 
1191 	rx_buf->size += E1000G_IPALIGNROOM;
1192 	rx_buf->address -= E1000G_IPALIGNROOM;
1193 
1194 	switch (packet->dma_type) {
1195 #ifdef __sparc
1196 	case USE_DVMA:
1197 		e1000g_free_dvma_buffer(rx_buf);
1198 		break;
1199 #endif
1200 	case USE_DMA:
1201 		e1000g_free_dma_buffer(rx_buf);
1202 		break;
1203 	default:
1204 		ASSERT(B_FALSE);
1205 		break;
1206 	}
1207 
1208 	packet->dma_type = USE_NONE;
1209 
1210 	kmem_free(packet, sizeof (rx_sw_packet_t));
1211 }
1212 
1213 static void
1214 e1000g_free_rx_packets(e1000g_rx_ring_t *rx_ring)
1215 {
1216 	p_rx_sw_packet_t packet, next_packet, free_list;
1217 
1218 	rw_enter(&e1000g_rx_detach_lock, RW_WRITER);
1219 
1220 	free_list = NULL;
1221 	packet = rx_ring->packet_area;
1222 	for (; packet != NULL; packet = next_packet) {
1223 		next_packet = packet->next;
1224 
1225 		if (packet->flag == E1000G_RX_SW_SENDUP) {
1226 			rx_ring->pending_count++;
1227 			e1000g_mblks_pending++;
1228 			packet->flag = E1000G_RX_SW_STOP;
1229 			packet->next = rx_ring->pending_list;
1230 			rx_ring->pending_list = packet;
1231 		} else {
1232 			packet->next = free_list;
1233 			free_list = packet;
1234 		}
1235 	}
1236 	rx_ring->packet_area = NULL;
1237 
1238 	rw_exit(&e1000g_rx_detach_lock);
1239 
1240 	packet = free_list;
1241 	for (; packet != NULL; packet = next_packet) {
1242 		next_packet = packet->next;
1243 
1244 		ASSERT(packet->flag == E1000G_RX_SW_FREE);
1245 		e1000g_free_rx_sw_packet(packet);
1246 	}
1247 }
1248 
1249 static void
1250 e1000g_free_tx_packets(e1000g_tx_ring_t *tx_ring)
1251 {
1252 	int j;
1253 	struct e1000g *Adapter;
1254 	p_tx_sw_packet_t packet;
1255 	dma_buffer_t *tx_buf;
1256 
1257 	Adapter = tx_ring->adapter;
1258 
1259 	for (j = 0, packet = tx_ring->packet_area;
1260 	    j < Adapter->tx_freelist_num; j++, packet++) {
1261 
1262 		if (packet == NULL)
1263 			break;
1264 
1265 		/* Free the Tx DMA handle for dynamical binding */
1266 		if (packet->tx_dma_handle != NULL) {
1267 			switch (packet->dma_type) {
1268 #ifdef __sparc
1269 			case USE_DVMA:
1270 				dvma_release(packet->tx_dma_handle);
1271 				break;
1272 #endif
1273 			case USE_DMA:
1274 				ddi_dma_free_handle(&packet->tx_dma_handle);
1275 				break;
1276 			default:
1277 				ASSERT(B_FALSE);
1278 				break;
1279 			}
1280 			packet->tx_dma_handle = NULL;
1281 		} else {
1282 			/*
1283 			 * If the dma handle is NULL, then we don't
1284 			 * need to check the packets left. For they
1285 			 * have not been initialized or have been freed.
1286 			 */
1287 			break;
1288 		}
1289 
1290 		tx_buf = packet->tx_buf;
1291 
1292 		switch (packet->dma_type) {
1293 #ifdef __sparc
1294 		case USE_DVMA:
1295 			e1000g_free_dvma_buffer(tx_buf);
1296 			break;
1297 #endif
1298 		case USE_DMA:
1299 			e1000g_free_dma_buffer(tx_buf);
1300 			break;
1301 		default:
1302 			ASSERT(B_FALSE);
1303 			break;
1304 		}
1305 
1306 		packet->dma_type = USE_NONE;
1307 	}
1308 	if (tx_ring->packet_area != NULL) {
1309 		kmem_free(tx_ring->packet_area, TX_SW_PKT_AREA_SZ);
1310 		tx_ring->packet_area = NULL;
1311 	}
1312 }
1313 
1314 /*
1315  * e1000g_release_dma_resources - release allocated DMA resources
1316  *
1317  * This function releases any pending buffers that has been
1318  * previously allocated
1319  */
1320 void
1321 e1000g_release_dma_resources(struct e1000g *Adapter)
1322 {
1323 	e1000g_free_descriptors(Adapter);
1324 	e1000g_free_packets(Adapter);
1325 }
1326 
1327 /* ARGSUSED */
1328 void
1329 e1000g_set_fma_flags(struct e1000g *Adapter, int acc_flag, int dma_flag)
1330 {
1331 	if (acc_flag) {
1332 		e1000g_desc_acc_attr.devacc_attr_access = DDI_FLAGERR_ACC;
1333 	} else {
1334 		e1000g_desc_acc_attr.devacc_attr_access = DDI_DEFAULT_ACC;
1335 	}
1336 
1337 	if (dma_flag) {
1338 		e1000g_tx_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
1339 		e1000g_buf_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
1340 		e1000g_desc_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
1341 	} else {
1342 		e1000g_tx_dma_attr.dma_attr_flags = 0;
1343 		e1000g_buf_dma_attr.dma_attr_flags = 0;
1344 		e1000g_desc_dma_attr.dma_attr_flags = 0;
1345 	}
1346 }
1347