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