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