xref: /illumos-gate/usr/src/uts/common/io/rge/rge_main.c (revision 22f5594a529d50114d839d4ddecc2c499731a3d7)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include "rge.h"
29 
30 /*
31  * This is the string displayed by modinfo, etc.
32  * Make sure you keep the version ID up to date!
33  */
34 static char rge_ident[] = "Realtek 1Gb Ethernet v%I%";
35 
36 /*
37  * Used for buffers allocated by ddi_dma_mem_alloc()
38  */
39 static ddi_dma_attr_t dma_attr_buf = {
40 	DMA_ATTR_V0,		/* dma_attr version */
41 	(uint32_t)0,		/* dma_attr_addr_lo */
42 	(uint32_t)0xFFFFFFFF,	/* dma_attr_addr_hi */
43 	(uint32_t)0xFFFFFFFF,	/* dma_attr_count_max */
44 	(uint32_t)16,		/* dma_attr_align */
45 	0xFFFFFFFF,		/* dma_attr_burstsizes */
46 	1,			/* dma_attr_minxfer */
47 	(uint32_t)0xFFFFFFFF,	/* dma_attr_maxxfer */
48 	(uint32_t)0xFFFFFFFF,	/* dma_attr_seg */
49 	1,			/* dma_attr_sgllen */
50 	1,			/* dma_attr_granular */
51 	0,			/* dma_attr_flags */
52 };
53 
54 /*
55  * Used for BDs allocated by ddi_dma_mem_alloc()
56  */
57 static ddi_dma_attr_t dma_attr_desc = {
58 	DMA_ATTR_V0,		/* dma_attr version */
59 	(uint32_t)0,		/* dma_attr_addr_lo */
60 	(uint32_t)0xFFFFFFFF,	/* dma_attr_addr_hi */
61 	(uint32_t)0xFFFFFFFF,	/* dma_attr_count_max */
62 	(uint32_t)256,		/* dma_attr_align */
63 	0xFFFFFFFF,		/* dma_attr_burstsizes */
64 	1,			/* dma_attr_minxfer */
65 	(uint32_t)0xFFFFFFFF,	/* dma_attr_maxxfer */
66 	(uint32_t)0xFFFFFFFF,	/* dma_attr_seg */
67 	1,			/* dma_attr_sgllen */
68 	1,			/* dma_attr_granular */
69 	0,			/* dma_attr_flags */
70 };
71 
72 /*
73  * PIO access attributes for registers
74  */
75 static ddi_device_acc_attr_t rge_reg_accattr = {
76 	DDI_DEVICE_ATTR_V0,
77 	DDI_STRUCTURE_LE_ACC,
78 	DDI_STRICTORDER_ACC,
79 	DDI_DEFAULT_ACC
80 };
81 
82 /*
83  * DMA access attributes for descriptors
84  */
85 static ddi_device_acc_attr_t rge_desc_accattr = {
86 	DDI_DEVICE_ATTR_V0,
87 	DDI_NEVERSWAP_ACC,
88 	DDI_STRICTORDER_ACC,
89 	DDI_DEFAULT_ACC
90 };
91 
92 /*
93  * DMA access attributes for data
94  */
95 static ddi_device_acc_attr_t rge_buf_accattr = {
96 	DDI_DEVICE_ATTR_V0,
97 	DDI_NEVERSWAP_ACC,
98 	DDI_STRICTORDER_ACC,
99 	DDI_DEFAULT_ACC
100 };
101 
102 /*
103  * Property names
104  */
105 static char debug_propname[] = "rge_debug_flags";
106 static char mtu_propname[] = "default_mtu";
107 static char msi_propname[] = "msi_enable";
108 
109 static int		rge_m_start(void *);
110 static void		rge_m_stop(void *);
111 static int		rge_m_promisc(void *, boolean_t);
112 static int		rge_m_multicst(void *, boolean_t, const uint8_t *);
113 static int		rge_m_unicst(void *, const uint8_t *);
114 static void		rge_m_resources(void *);
115 static void		rge_m_ioctl(void *, queue_t *, mblk_t *);
116 static boolean_t	rge_m_getcapab(void *, mac_capab_t, void *);
117 
118 #define	RGE_M_CALLBACK_FLAGS	(MC_RESOURCES | MC_IOCTL | MC_GETCAPAB)
119 
120 static mac_callbacks_t rge_m_callbacks = {
121 	RGE_M_CALLBACK_FLAGS,
122 	rge_m_stat,
123 	rge_m_start,
124 	rge_m_stop,
125 	rge_m_promisc,
126 	rge_m_multicst,
127 	rge_m_unicst,
128 	rge_m_tx,
129 	rge_m_resources,
130 	rge_m_ioctl,
131 	rge_m_getcapab
132 };
133 
134 /*
135  * Allocate an area of memory and a DMA handle for accessing it
136  */
137 static int
138 rge_alloc_dma_mem(rge_t *rgep, size_t memsize, ddi_dma_attr_t *dma_attr_p,
139 	ddi_device_acc_attr_t *acc_attr_p, uint_t dma_flags, dma_area_t *dma_p)
140 {
141 	caddr_t vaddr;
142 	int err;
143 
144 	/*
145 	 * Allocate handle
146 	 */
147 	err = ddi_dma_alloc_handle(rgep->devinfo, dma_attr_p,
148 	    DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl);
149 	if (err != DDI_SUCCESS) {
150 		dma_p->dma_hdl = NULL;
151 		return (DDI_FAILURE);
152 	}
153 
154 	/*
155 	 * Allocate memory
156 	 */
157 	err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, acc_attr_p,
158 	    dma_flags & (DDI_DMA_CONSISTENT | DDI_DMA_STREAMING),
159 	    DDI_DMA_SLEEP, NULL, &vaddr, &dma_p->alength, &dma_p->acc_hdl);
160 	if (err != DDI_SUCCESS) {
161 		ddi_dma_free_handle(&dma_p->dma_hdl);
162 		dma_p->dma_hdl = NULL;
163 		dma_p->acc_hdl = NULL;
164 		return (DDI_FAILURE);
165 	}
166 
167 	/*
168 	 * Bind the two together
169 	 */
170 	dma_p->mem_va = vaddr;
171 	err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL,
172 	    vaddr, dma_p->alength, dma_flags, DDI_DMA_SLEEP, NULL,
173 	    &dma_p->cookie, &dma_p->ncookies);
174 	if (err != DDI_DMA_MAPPED || dma_p->ncookies != 1) {
175 		ddi_dma_mem_free(&dma_p->acc_hdl);
176 		ddi_dma_free_handle(&dma_p->dma_hdl);
177 		dma_p->acc_hdl = NULL;
178 		dma_p->dma_hdl = NULL;
179 		return (DDI_FAILURE);
180 	}
181 
182 	dma_p->nslots = ~0U;
183 	dma_p->size = ~0U;
184 	dma_p->token = ~0U;
185 	dma_p->offset = 0;
186 	return (DDI_SUCCESS);
187 }
188 
189 /*
190  * Free one allocated area of DMAable memory
191  */
192 static void
193 rge_free_dma_mem(dma_area_t *dma_p)
194 {
195 	if (dma_p->dma_hdl != NULL) {
196 		if (dma_p->ncookies) {
197 			(void) ddi_dma_unbind_handle(dma_p->dma_hdl);
198 			dma_p->ncookies = 0;
199 		}
200 		ddi_dma_free_handle(&dma_p->dma_hdl);
201 		dma_p->dma_hdl = NULL;
202 	}
203 
204 	if (dma_p->acc_hdl != NULL) {
205 		ddi_dma_mem_free(&dma_p->acc_hdl);
206 		dma_p->acc_hdl = NULL;
207 	}
208 }
209 
210 /*
211  * Utility routine to carve a slice off a chunk of allocated memory,
212  * updating the chunk descriptor accordingly.  The size of the slice
213  * is given by the product of the <qty> and <size> parameters.
214  */
215 static void
216 rge_slice_chunk(dma_area_t *slice, dma_area_t *chunk,
217 	uint32_t qty, uint32_t size)
218 {
219 	static uint32_t sequence = 0xbcd5704a;
220 	size_t totsize;
221 
222 	totsize = qty*size;
223 	ASSERT(size >= 0);
224 	ASSERT(totsize <= chunk->alength);
225 
226 	*slice = *chunk;
227 	slice->nslots = qty;
228 	slice->size = size;
229 	slice->alength = totsize;
230 	slice->token = ++sequence;
231 
232 	chunk->mem_va = (caddr_t)chunk->mem_va + totsize;
233 	chunk->alength -= totsize;
234 	chunk->offset += totsize;
235 	chunk->cookie.dmac_laddress += totsize;
236 	chunk->cookie.dmac_size -= totsize;
237 }
238 
239 static int
240 rge_alloc_bufs(rge_t *rgep)
241 {
242 	size_t txdescsize;
243 	size_t rxdescsize;
244 	int err;
245 
246 	/*
247 	 * Allocate memory & handle for packet statistics
248 	 */
249 	err = rge_alloc_dma_mem(rgep,
250 	    RGE_STATS_DUMP_SIZE,
251 	    &dma_attr_desc,
252 	    &rge_desc_accattr,
253 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
254 	    &rgep->dma_area_stats);
255 	if (err != DDI_SUCCESS)
256 		return (DDI_FAILURE);
257 	rgep->hw_stats = DMA_VPTR(rgep->dma_area_stats);
258 
259 	/*
260 	 * Allocate memory & handle for Tx descriptor ring
261 	 */
262 	txdescsize = RGE_SEND_SLOTS * sizeof (rge_bd_t);
263 	err = rge_alloc_dma_mem(rgep,
264 	    txdescsize,
265 	    &dma_attr_desc,
266 	    &rge_desc_accattr,
267 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
268 	    &rgep->dma_area_txdesc);
269 	if (err != DDI_SUCCESS)
270 		return (DDI_FAILURE);
271 
272 	/*
273 	 * Allocate memory & handle for Rx descriptor ring
274 	 */
275 	rxdescsize = RGE_RECV_SLOTS * sizeof (rge_bd_t);
276 	err = rge_alloc_dma_mem(rgep,
277 	    rxdescsize,
278 	    &dma_attr_desc,
279 	    &rge_desc_accattr,
280 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
281 	    &rgep->dma_area_rxdesc);
282 	if (err != DDI_SUCCESS)
283 		return (DDI_FAILURE);
284 
285 	return (DDI_SUCCESS);
286 }
287 
288 /*
289  * rge_free_bufs() -- free descriptors/buffers allocated for this
290  * device instance.
291  */
292 static void
293 rge_free_bufs(rge_t *rgep)
294 {
295 	rge_free_dma_mem(&rgep->dma_area_stats);
296 	rge_free_dma_mem(&rgep->dma_area_txdesc);
297 	rge_free_dma_mem(&rgep->dma_area_rxdesc);
298 }
299 
300 /*
301  * ========== Transmit and receive ring reinitialisation ==========
302  */
303 
304 /*
305  * These <reinit> routines each reset the rx/tx rings to an initial
306  * state, assuming that the corresponding <init> routine has already
307  * been called exactly once.
308  */
309 static void
310 rge_reinit_send_ring(rge_t *rgep)
311 {
312 	sw_sbd_t *ssbdp;
313 	rge_bd_t *bdp;
314 	uint32_t slot;
315 
316 	/*
317 	 * re-init send ring
318 	 */
319 	DMA_ZERO(rgep->tx_desc);
320 	ssbdp = rgep->sw_sbds;
321 	bdp = rgep->tx_ring;
322 	for (slot = 0; slot < RGE_SEND_SLOTS; slot++) {
323 		bdp->host_buf_addr =
324 		    RGE_BSWAP_32(ssbdp->pbuf.cookie.dmac_laddress);
325 		bdp->host_buf_addr_hi =
326 		    RGE_BSWAP_32(ssbdp->pbuf.cookie.dmac_laddress >> 32);
327 		/* last BD in Tx ring */
328 		if (slot == (RGE_SEND_SLOTS - 1))
329 			bdp->flags_len = RGE_BSWAP_32(BD_FLAG_EOR);
330 		ssbdp++;
331 		bdp++;
332 	}
333 	DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV);
334 	rgep->tx_next = 0;
335 	rgep->tc_next = 0;
336 	rgep->tc_tail = 0;
337 	rgep->tx_flow = 0;
338 	rgep->tx_free = RGE_SEND_SLOTS;
339 }
340 
341 static void
342 rge_reinit_recv_ring(rge_t *rgep)
343 {
344 	rge_bd_t *bdp;
345 	sw_rbd_t *srbdp;
346 	dma_area_t *pbuf;
347 	uint32_t slot;
348 
349 	/*
350 	 * re-init receive ring
351 	 */
352 	DMA_ZERO(rgep->rx_desc);
353 	srbdp = rgep->sw_rbds;
354 	bdp = rgep->rx_ring;
355 	for (slot = 0; slot < RGE_RECV_SLOTS; slot++) {
356 		pbuf = &srbdp->rx_buf->pbuf;
357 		bdp->host_buf_addr =
358 		    RGE_BSWAP_32(pbuf->cookie.dmac_laddress + rgep->head_room);
359 		bdp->host_buf_addr_hi =
360 		    RGE_BSWAP_32(pbuf->cookie.dmac_laddress >> 32);
361 		bdp->flags_len = RGE_BSWAP_32(BD_FLAG_HW_OWN |
362 		    (rgep->rxbuf_size - rgep->head_room));
363 		/* last BD in Tx ring */
364 		if (slot == (RGE_RECV_SLOTS - 1))
365 			bdp->flags_len |= RGE_BSWAP_32(BD_FLAG_EOR);
366 		srbdp++;
367 		bdp++;
368 	}
369 	DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV);
370 	rgep->watchdog = 0;
371 	rgep->rx_next = 0;
372 }
373 
374 static void
375 rge_reinit_buf_ring(rge_t *rgep)
376 {
377 
378 	if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)
379 		return;
380 
381 	/*
382 	 * If all the up-sending buffers haven't been returned to driver,
383 	 * use bcopy() only in rx process.
384 	 */
385 	if (rgep->rx_free != RGE_BUF_SLOTS)
386 		rgep->rx_bcopy = B_TRUE;
387 }
388 
389 static void
390 rge_reinit_rings(rge_t *rgep)
391 {
392 	rge_reinit_send_ring(rgep);
393 	rge_reinit_recv_ring(rgep);
394 	rge_reinit_buf_ring(rgep);
395 }
396 
397 static void
398 rge_fini_send_ring(rge_t *rgep)
399 {
400 	sw_sbd_t *ssbdp;
401 	uint32_t slot;
402 
403 	ssbdp = rgep->sw_sbds;
404 	for (slot = 0; slot < RGE_SEND_SLOTS; ++slot) {
405 		rge_free_dma_mem(&ssbdp->pbuf);
406 		ssbdp++;
407 	}
408 
409 	kmem_free(rgep->sw_sbds, RGE_SEND_SLOTS * sizeof (sw_sbd_t));
410 	rgep->sw_sbds = NULL;
411 }
412 
413 static void
414 rge_fini_recv_ring(rge_t *rgep)
415 {
416 	sw_rbd_t *srbdp;
417 	uint32_t slot;
418 
419 	srbdp = rgep->sw_rbds;
420 	for (slot = 0; slot < RGE_RECV_SLOTS; ++srbdp, ++slot) {
421 		if (srbdp->rx_buf) {
422 			if (srbdp->rx_buf->mp != NULL) {
423 				freemsg(srbdp->rx_buf->mp);
424 				srbdp->rx_buf->mp = NULL;
425 			}
426 			rge_free_dma_mem(&srbdp->rx_buf->pbuf);
427 			kmem_free(srbdp->rx_buf, sizeof (dma_buf_t));
428 			srbdp->rx_buf = NULL;
429 		}
430 	}
431 
432 	kmem_free(rgep->sw_rbds, RGE_RECV_SLOTS * sizeof (sw_rbd_t));
433 	rgep->sw_rbds = NULL;
434 }
435 
436 static void
437 rge_fini_buf_ring(rge_t *rgep)
438 {
439 	sw_rbd_t *srbdp;
440 	uint32_t slot;
441 
442 	if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)
443 		return;
444 
445 	ASSERT(rgep->rx_free == RGE_BUF_SLOTS);
446 
447 	srbdp = rgep->free_srbds;
448 	for (slot = 0; slot < RGE_BUF_SLOTS; ++srbdp, ++slot) {
449 		if (srbdp->rx_buf != NULL) {
450 			if (srbdp->rx_buf->mp != NULL) {
451 				freemsg(srbdp->rx_buf->mp);
452 				srbdp->rx_buf->mp = NULL;
453 			}
454 			rge_free_dma_mem(&srbdp->rx_buf->pbuf);
455 			kmem_free(srbdp->rx_buf, sizeof (dma_buf_t));
456 			srbdp->rx_buf = NULL;
457 		}
458 	}
459 
460 	kmem_free(rgep->free_srbds, RGE_BUF_SLOTS * sizeof (sw_rbd_t));
461 	rgep->free_srbds = NULL;
462 }
463 
464 static void
465 rge_fini_rings(rge_t *rgep)
466 {
467 	rge_fini_send_ring(rgep);
468 	rge_fini_recv_ring(rgep);
469 	rge_fini_buf_ring(rgep);
470 }
471 
472 static int
473 rge_init_send_ring(rge_t *rgep)
474 {
475 	uint32_t slot;
476 	sw_sbd_t *ssbdp;
477 	dma_area_t *pbuf;
478 	dma_area_t desc;
479 	int err;
480 
481 	/*
482 	 * Allocate the array of s/w Tx Buffer Descriptors
483 	 */
484 	ssbdp = kmem_zalloc(RGE_SEND_SLOTS*sizeof (*ssbdp), KM_SLEEP);
485 	rgep->sw_sbds = ssbdp;
486 
487 	/*
488 	 * Init send ring
489 	 */
490 	rgep->tx_desc = rgep->dma_area_txdesc;
491 	DMA_ZERO(rgep->tx_desc);
492 	rgep->tx_ring = rgep->tx_desc.mem_va;
493 
494 	desc = rgep->tx_desc;
495 	for (slot = 0; slot < RGE_SEND_SLOTS; slot++) {
496 		rge_slice_chunk(&ssbdp->desc, &desc, 1, sizeof (rge_bd_t));
497 
498 		/*
499 		 * Allocate memory & handle for Tx buffers
500 		 */
501 		pbuf = &ssbdp->pbuf;
502 		err = rge_alloc_dma_mem(rgep, rgep->txbuf_size,
503 		    &dma_attr_buf, &rge_buf_accattr,
504 		    DDI_DMA_WRITE | DDI_DMA_STREAMING, pbuf);
505 		if (err != DDI_SUCCESS) {
506 			rge_error(rgep,
507 			    "rge_init_send_ring: alloc tx buffer failed");
508 			rge_fini_send_ring(rgep);
509 			return (DDI_FAILURE);
510 		}
511 		ssbdp++;
512 	}
513 	ASSERT(desc.alength == 0);
514 
515 	DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV);
516 	return (DDI_SUCCESS);
517 }
518 
519 static int
520 rge_init_recv_ring(rge_t *rgep)
521 {
522 	uint32_t slot;
523 	sw_rbd_t *srbdp;
524 	dma_buf_t *rx_buf;
525 	dma_area_t *pbuf;
526 	int err;
527 
528 	/*
529 	 * Allocate the array of s/w Rx Buffer Descriptors
530 	 */
531 	srbdp = kmem_zalloc(RGE_RECV_SLOTS*sizeof (*srbdp), KM_SLEEP);
532 	rgep->sw_rbds = srbdp;
533 
534 	/*
535 	 * Init receive ring
536 	 */
537 	rgep->rx_next = 0;
538 	rgep->rx_desc = rgep->dma_area_rxdesc;
539 	DMA_ZERO(rgep->rx_desc);
540 	rgep->rx_ring = rgep->rx_desc.mem_va;
541 
542 	for (slot = 0; slot < RGE_RECV_SLOTS; slot++) {
543 		srbdp->rx_buf = rx_buf =
544 		    kmem_zalloc(sizeof (dma_buf_t), KM_SLEEP);
545 
546 		/*
547 		 * Allocate memory & handle for Rx buffers
548 		 */
549 		pbuf = &rx_buf->pbuf;
550 		err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size,
551 		    &dma_attr_buf, &rge_buf_accattr,
552 		    DDI_DMA_READ | DDI_DMA_STREAMING, pbuf);
553 		if (err != DDI_SUCCESS) {
554 			rge_fini_recv_ring(rgep);
555 			rge_error(rgep,
556 			    "rge_init_recv_ring: alloc rx buffer failed");
557 			return (DDI_FAILURE);
558 		}
559 
560 		pbuf->alength -= rgep->head_room;
561 		pbuf->offset += rgep->head_room;
562 		if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)) {
563 			rx_buf->rx_recycle.free_func = rge_rx_recycle;
564 			rx_buf->rx_recycle.free_arg = (caddr_t)rx_buf;
565 			rx_buf->private = (caddr_t)rgep;
566 			rx_buf->mp = desballoc(DMA_VPTR(rx_buf->pbuf),
567 			    rgep->rxbuf_size, 0, &rx_buf->rx_recycle);
568 			if (rx_buf->mp == NULL) {
569 				rge_fini_recv_ring(rgep);
570 				rge_problem(rgep,
571 				    "rge_init_recv_ring: desballoc() failed");
572 				return (DDI_FAILURE);
573 			}
574 		}
575 		srbdp++;
576 	}
577 	DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV);
578 	return (DDI_SUCCESS);
579 }
580 
581 static int
582 rge_init_buf_ring(rge_t *rgep)
583 {
584 	uint32_t slot;
585 	sw_rbd_t *free_srbdp;
586 	dma_buf_t *rx_buf;
587 	dma_area_t *pbuf;
588 	int err;
589 
590 	if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) {
591 		rgep->rx_bcopy = B_TRUE;
592 		return (DDI_SUCCESS);
593 	}
594 
595 	/*
596 	 * Allocate the array of s/w free Buffer Descriptors
597 	 */
598 	free_srbdp = kmem_zalloc(RGE_BUF_SLOTS*sizeof (*free_srbdp), KM_SLEEP);
599 	rgep->free_srbds = free_srbdp;
600 
601 	/*
602 	 * Init free buffer ring
603 	 */
604 	rgep->rc_next = 0;
605 	rgep->rf_next = 0;
606 	rgep->rx_bcopy = B_FALSE;
607 	rgep->rx_free = RGE_BUF_SLOTS;
608 	for (slot = 0; slot < RGE_BUF_SLOTS; slot++) {
609 		free_srbdp->rx_buf = rx_buf =
610 		    kmem_zalloc(sizeof (dma_buf_t), KM_SLEEP);
611 
612 		/*
613 		 * Allocate memory & handle for free Rx buffers
614 		 */
615 		pbuf = &rx_buf->pbuf;
616 		err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size,
617 		    &dma_attr_buf, &rge_buf_accattr,
618 		    DDI_DMA_READ | DDI_DMA_STREAMING, pbuf);
619 		if (err != DDI_SUCCESS) {
620 			rge_fini_buf_ring(rgep);
621 			rge_error(rgep,
622 			    "rge_init_buf_ring: alloc rx free buffer failed");
623 			return (DDI_FAILURE);
624 		}
625 		pbuf->alength -= rgep->head_room;
626 		pbuf->offset += rgep->head_room;
627 		rx_buf->rx_recycle.free_func = rge_rx_recycle;
628 		rx_buf->rx_recycle.free_arg = (caddr_t)rx_buf;
629 		rx_buf->private = (caddr_t)rgep;
630 		rx_buf->mp = desballoc(DMA_VPTR(rx_buf->pbuf),
631 		    rgep->rxbuf_size, 0, &rx_buf->rx_recycle);
632 		if (rx_buf->mp == NULL) {
633 			rge_fini_buf_ring(rgep);
634 			rge_problem(rgep,
635 			    "rge_init_buf_ring: desballoc() failed");
636 			return (DDI_FAILURE);
637 		}
638 		free_srbdp++;
639 	}
640 	return (DDI_SUCCESS);
641 }
642 
643 static int
644 rge_init_rings(rge_t *rgep)
645 {
646 	int err;
647 
648 	err = rge_init_send_ring(rgep);
649 	if (err != DDI_SUCCESS)
650 		return (DDI_FAILURE);
651 
652 	err = rge_init_recv_ring(rgep);
653 	if (err != DDI_SUCCESS) {
654 		rge_fini_send_ring(rgep);
655 		return (DDI_FAILURE);
656 	}
657 
658 	err = rge_init_buf_ring(rgep);
659 	if (err != DDI_SUCCESS) {
660 		rge_fini_send_ring(rgep);
661 		rge_fini_recv_ring(rgep);
662 		return (DDI_FAILURE);
663 	}
664 
665 	return (DDI_SUCCESS);
666 }
667 
668 /*
669  * ========== Internal state management entry points ==========
670  */
671 
672 #undef	RGE_DBG
673 #define	RGE_DBG		RGE_DBG_NEMO	/* debug flag for this code	*/
674 
675 /*
676  * These routines provide all the functionality required by the
677  * corresponding MAC layer entry points, but don't update the
678  * MAC state so they can be called internally without disturbing
679  * our record of what NEMO thinks we should be doing ...
680  */
681 
682 /*
683  *	rge_reset() -- reset h/w & rings to initial state
684  */
685 static void
686 rge_reset(rge_t *rgep)
687 {
688 	ASSERT(mutex_owned(rgep->genlock));
689 
690 	/*
691 	 * Grab all the other mutexes in the world (this should
692 	 * ensure no other threads are manipulating driver state)
693 	 */
694 	mutex_enter(rgep->rx_lock);
695 	mutex_enter(rgep->rc_lock);
696 	rw_enter(rgep->errlock, RW_WRITER);
697 
698 	(void) rge_chip_reset(rgep);
699 	rge_reinit_rings(rgep);
700 	rge_chip_init(rgep);
701 
702 	/*
703 	 * Free the world ...
704 	 */
705 	rw_exit(rgep->errlock);
706 	mutex_exit(rgep->rc_lock);
707 	mutex_exit(rgep->rx_lock);
708 
709 	rgep->stats.rpackets = 0;
710 	rgep->stats.rbytes = 0;
711 	rgep->stats.opackets = 0;
712 	rgep->stats.obytes = 0;
713 	rgep->stats.tx_pre_ismax = B_FALSE;
714 	rgep->stats.tx_cur_ismax = B_FALSE;
715 
716 	RGE_DEBUG(("rge_reset($%p) done", (void *)rgep));
717 }
718 
719 /*
720  *	rge_stop() -- stop processing, don't reset h/w or rings
721  */
722 static void
723 rge_stop(rge_t *rgep)
724 {
725 	ASSERT(mutex_owned(rgep->genlock));
726 
727 	rge_chip_stop(rgep, B_FALSE);
728 
729 	RGE_DEBUG(("rge_stop($%p) done", (void *)rgep));
730 }
731 
732 /*
733  *	rge_start() -- start transmitting/receiving
734  */
735 static void
736 rge_start(rge_t *rgep)
737 {
738 	ASSERT(mutex_owned(rgep->genlock));
739 
740 	/*
741 	 * Start chip processing, including enabling interrupts
742 	 */
743 	rge_chip_start(rgep);
744 	rgep->watchdog = 0;
745 }
746 
747 /*
748  * rge_restart - restart transmitting/receiving after error or suspend
749  */
750 void
751 rge_restart(rge_t *rgep)
752 {
753 	uint32_t i;
754 
755 	ASSERT(mutex_owned(rgep->genlock));
756 	/*
757 	 * Wait for posted buffer to be freed...
758 	 */
759 	if (!rgep->rx_bcopy) {
760 		for (i = 0; i < RXBUFF_FREE_LOOP; i++) {
761 			if (rgep->rx_free == RGE_BUF_SLOTS)
762 				break;
763 			drv_usecwait(1000);
764 			RGE_DEBUG(("rge_restart: waiting for rx buf free..."));
765 		}
766 	}
767 	rge_reset(rgep);
768 	rgep->stats.chip_reset++;
769 	if (rgep->rge_mac_state == RGE_MAC_STARTED) {
770 		rge_start(rgep);
771 		rgep->resched_needed = B_TRUE;
772 		(void) ddi_intr_trigger_softint(rgep->resched_hdl, NULL);
773 	}
774 }
775 
776 
777 /*
778  * ========== Nemo-required management entry points ==========
779  */
780 
781 #undef	RGE_DBG
782 #define	RGE_DBG		RGE_DBG_NEMO	/* debug flag for this code	*/
783 
784 /*
785  *	rge_m_stop() -- stop transmitting/receiving
786  */
787 static void
788 rge_m_stop(void *arg)
789 {
790 	rge_t *rgep = arg;		/* private device info	*/
791 	uint32_t i;
792 
793 	/*
794 	 * Just stop processing, then record new MAC state
795 	 */
796 	mutex_enter(rgep->genlock);
797 	if (rgep->suspended) {
798 		ASSERT(rgep->rge_mac_state == RGE_MAC_STOPPED);
799 		mutex_exit(rgep->genlock);
800 		return;
801 	}
802 	rge_stop(rgep);
803 	/*
804 	 * Wait for posted buffer to be freed...
805 	 */
806 	if (!rgep->rx_bcopy) {
807 		for (i = 0; i < RXBUFF_FREE_LOOP; i++) {
808 			if (rgep->rx_free == RGE_BUF_SLOTS)
809 				break;
810 			drv_usecwait(1000);
811 			RGE_DEBUG(("rge_m_stop: waiting for rx buf free..."));
812 		}
813 	}
814 	rgep->rge_mac_state = RGE_MAC_STOPPED;
815 	RGE_DEBUG(("rge_m_stop($%p) done", arg));
816 	mutex_exit(rgep->genlock);
817 }
818 
819 /*
820  *	rge_m_start() -- start transmitting/receiving
821  */
822 static int
823 rge_m_start(void *arg)
824 {
825 	rge_t *rgep = arg;		/* private device info	*/
826 
827 	mutex_enter(rgep->genlock);
828 	if (rgep->suspended) {
829 		mutex_exit(rgep->genlock);
830 		return (DDI_FAILURE);
831 	}
832 	/*
833 	 * Clear hw/sw statistics
834 	 */
835 	DMA_ZERO(rgep->dma_area_stats);
836 	bzero(&rgep->stats, sizeof (rge_stats_t));
837 
838 	/*
839 	 * Start processing and record new MAC state
840 	 */
841 	rge_reset(rgep);
842 	rge_start(rgep);
843 	rgep->rge_mac_state = RGE_MAC_STARTED;
844 	RGE_DEBUG(("rge_m_start($%p) done", arg));
845 
846 	mutex_exit(rgep->genlock);
847 
848 	return (0);
849 }
850 
851 /*
852  *	rge_m_unicst_set() -- set the physical network address
853  */
854 static int
855 rge_m_unicst(void *arg, const uint8_t *macaddr)
856 {
857 	rge_t *rgep = arg;		/* private device info	*/
858 
859 	/*
860 	 * Remember the new current address in the driver state
861 	 * Sync the chip's idea of the address too ...
862 	 */
863 	mutex_enter(rgep->genlock);
864 	bcopy(macaddr, rgep->netaddr, ETHERADDRL);
865 
866 	if (rgep->suspended) {
867 		mutex_exit(rgep->genlock);
868 		return (DDI_SUCCESS);
869 	}
870 
871 	rge_chip_sync(rgep, RGE_SET_MAC);
872 	mutex_exit(rgep->genlock);
873 
874 	return (0);
875 }
876 
877 /*
878  * Compute the index of the required bit in the multicast hash map.
879  * This must mirror the way the hardware actually does it!
880  */
881 static uint32_t
882 rge_hash_index(const uint8_t *mca)
883 {
884 	uint32_t crc = (uint32_t)RGE_HASH_CRC;
885 	uint32_t const POLY = RGE_HASH_POLY;
886 	uint32_t msb;
887 	int bytes;
888 	uchar_t currentbyte;
889 	uint32_t index;
890 	int bit;
891 
892 	for (bytes = 0; bytes < ETHERADDRL; bytes++) {
893 		currentbyte = mca[bytes];
894 		for (bit = 0; bit < 8; bit++) {
895 			msb = crc >> 31;
896 			crc <<= 1;
897 			if (msb ^ (currentbyte & 1))
898 				crc ^= POLY;
899 			currentbyte >>= 1;
900 		}
901 	}
902 	index = crc >> 26;
903 		/* the index value is between 0 and 63(0x3f) */
904 
905 	return (index);
906 }
907 
908 /*
909  *	rge_m_multicst_add() -- enable/disable a multicast address
910  */
911 static int
912 rge_m_multicst(void *arg, boolean_t add, const uint8_t *mca)
913 {
914 	rge_t *rgep = arg;		/* private device info	*/
915 	struct ether_addr *addr;
916 	uint32_t index;
917 	uint32_t reg;
918 	uint8_t *hashp;
919 
920 	mutex_enter(rgep->genlock);
921 	hashp = rgep->mcast_hash;
922 	addr = (struct ether_addr *)mca;
923 	/*
924 	 * Calculate the Multicast address hash index value
925 	 *	Normally, the position of MAR0-MAR7 is
926 	 *	MAR0: offset 0x08, ..., MAR7: offset 0x0F.
927 	 *
928 	 *	For pcie chipset, the position of MAR0-MAR7 is
929 	 *	different from others:
930 	 *	MAR0: offset 0x0F, ..., MAR7: offset 0x08.
931 	 */
932 	index = rge_hash_index(addr->ether_addr_octet);
933 	if (rgep->chipid.is_pcie)
934 		reg = (~(index / RGE_MCAST_NUM)) & 0x7;
935 	else
936 		reg = index / RGE_MCAST_NUM;
937 
938 	if (add) {
939 		if (rgep->mcast_refs[index]++) {
940 			mutex_exit(rgep->genlock);
941 			return (0);
942 		}
943 		hashp[reg] |= 1 << (index % RGE_MCAST_NUM);
944 	} else {
945 		if (--rgep->mcast_refs[index]) {
946 			mutex_exit(rgep->genlock);
947 			return (0);
948 		}
949 		hashp[reg] &= ~ (1 << (index % RGE_MCAST_NUM));
950 	}
951 
952 	if (rgep->suspended) {
953 		mutex_exit(rgep->genlock);
954 		return (DDI_SUCCESS);
955 	}
956 
957 	/*
958 	 * Set multicast register
959 	 */
960 	rge_chip_sync(rgep, RGE_SET_MUL);
961 
962 	mutex_exit(rgep->genlock);
963 	return (0);
964 }
965 
966 /*
967  * rge_m_promisc() -- set or reset promiscuous mode on the board
968  *
969  *	Program the hardware to enable/disable promiscuous and/or
970  *	receive-all-multicast modes.
971  */
972 static int
973 rge_m_promisc(void *arg, boolean_t on)
974 {
975 	rge_t *rgep = arg;
976 
977 	/*
978 	 * Store MAC layer specified mode and pass to chip layer to update h/w
979 	 */
980 	mutex_enter(rgep->genlock);
981 
982 	if (rgep->promisc == on) {
983 		mutex_exit(rgep->genlock);
984 		return (0);
985 	}
986 	rgep->promisc = on;
987 
988 	if (rgep->suspended) {
989 		mutex_exit(rgep->genlock);
990 		return (DDI_SUCCESS);
991 	}
992 
993 	rge_chip_sync(rgep, RGE_SET_PROMISC);
994 	RGE_DEBUG(("rge_m_promisc_set($%p) done", arg));
995 	mutex_exit(rgep->genlock);
996 	return (0);
997 }
998 
999 /*
1000  * Loopback ioctl code
1001  */
1002 
1003 static lb_property_t loopmodes[] = {
1004 	{ normal,	"normal",	RGE_LOOP_NONE		},
1005 	{ internal,	"PHY",		RGE_LOOP_INTERNAL_PHY	},
1006 	{ internal,	"MAC",		RGE_LOOP_INTERNAL_MAC	}
1007 };
1008 
1009 static enum ioc_reply
1010 rge_set_loop_mode(rge_t *rgep, uint32_t mode)
1011 {
1012 	/*
1013 	 * If the mode isn't being changed, there's nothing to do ...
1014 	 */
1015 	if (mode == rgep->param_loop_mode)
1016 		return (IOC_ACK);
1017 
1018 	/*
1019 	 * Validate the requested mode and prepare a suitable message
1020 	 * to explain the link down/up cycle that the change will
1021 	 * probably induce ...
1022 	 */
1023 	switch (mode) {
1024 	default:
1025 		return (IOC_INVAL);
1026 
1027 	case RGE_LOOP_NONE:
1028 	case RGE_LOOP_INTERNAL_PHY:
1029 	case RGE_LOOP_INTERNAL_MAC:
1030 		break;
1031 	}
1032 
1033 	/*
1034 	 * All OK; tell the caller to reprogram
1035 	 * the PHY and/or MAC for the new mode ...
1036 	 */
1037 	rgep->param_loop_mode = mode;
1038 	return (IOC_RESTART_ACK);
1039 }
1040 
1041 static enum ioc_reply
1042 rge_loop_ioctl(rge_t *rgep, queue_t *wq, mblk_t *mp, struct iocblk *iocp)
1043 {
1044 	lb_info_sz_t *lbsp;
1045 	lb_property_t *lbpp;
1046 	uint32_t *lbmp;
1047 	int cmd;
1048 
1049 	_NOTE(ARGUNUSED(wq))
1050 
1051 	/*
1052 	 * Validate format of ioctl
1053 	 */
1054 	if (mp->b_cont == NULL)
1055 		return (IOC_INVAL);
1056 
1057 	cmd = iocp->ioc_cmd;
1058 	switch (cmd) {
1059 	default:
1060 		/* NOTREACHED */
1061 		rge_error(rgep, "rge_loop_ioctl: invalid cmd 0x%x", cmd);
1062 		return (IOC_INVAL);
1063 
1064 	case LB_GET_INFO_SIZE:
1065 		if (iocp->ioc_count != sizeof (lb_info_sz_t))
1066 			return (IOC_INVAL);
1067 		lbsp = (lb_info_sz_t *)mp->b_cont->b_rptr;
1068 		*lbsp = sizeof (loopmodes);
1069 		return (IOC_REPLY);
1070 
1071 	case LB_GET_INFO:
1072 		if (iocp->ioc_count != sizeof (loopmodes))
1073 			return (IOC_INVAL);
1074 		lbpp = (lb_property_t *)mp->b_cont->b_rptr;
1075 		bcopy(loopmodes, lbpp, sizeof (loopmodes));
1076 		return (IOC_REPLY);
1077 
1078 	case LB_GET_MODE:
1079 		if (iocp->ioc_count != sizeof (uint32_t))
1080 			return (IOC_INVAL);
1081 		lbmp = (uint32_t *)mp->b_cont->b_rptr;
1082 		*lbmp = rgep->param_loop_mode;
1083 		return (IOC_REPLY);
1084 
1085 	case LB_SET_MODE:
1086 		if (iocp->ioc_count != sizeof (uint32_t))
1087 			return (IOC_INVAL);
1088 		lbmp = (uint32_t *)mp->b_cont->b_rptr;
1089 		return (rge_set_loop_mode(rgep, *lbmp));
1090 	}
1091 }
1092 
1093 /*
1094  * Specific rge IOCTLs, the MAC layer handles the generic ones.
1095  */
1096 static void
1097 rge_m_ioctl(void *arg, queue_t *wq, mblk_t *mp)
1098 {
1099 	rge_t *rgep = arg;
1100 	struct iocblk *iocp;
1101 	enum ioc_reply status;
1102 	boolean_t need_privilege;
1103 	int err;
1104 	int cmd;
1105 
1106 	/*
1107 	 * If suspended, we might actually be able to do some of
1108 	 * these ioctls, but it is harder to make sure they occur
1109 	 * without actually putting the hardware in an undesireable
1110 	 * state.  So just NAK it.
1111 	 */
1112 	mutex_enter(rgep->genlock);
1113 	if (rgep->suspended) {
1114 		miocnak(wq, mp, 0, EINVAL);
1115 		mutex_exit(rgep->genlock);
1116 		return;
1117 	}
1118 	mutex_exit(rgep->genlock);
1119 
1120 	/*
1121 	 * Validate the command before bothering with the mutex ...
1122 	 */
1123 	iocp = (struct iocblk *)mp->b_rptr;
1124 	iocp->ioc_error = 0;
1125 	need_privilege = B_TRUE;
1126 	cmd = iocp->ioc_cmd;
1127 	switch (cmd) {
1128 	default:
1129 		miocnak(wq, mp, 0, EINVAL);
1130 		return;
1131 
1132 	case RGE_MII_READ:
1133 	case RGE_MII_WRITE:
1134 	case RGE_DIAG:
1135 	case RGE_PEEK:
1136 	case RGE_POKE:
1137 	case RGE_PHY_RESET:
1138 	case RGE_SOFT_RESET:
1139 	case RGE_HARD_RESET:
1140 		break;
1141 
1142 	case LB_GET_INFO_SIZE:
1143 	case LB_GET_INFO:
1144 	case LB_GET_MODE:
1145 		need_privilege = B_FALSE;
1146 		/* FALLTHRU */
1147 	case LB_SET_MODE:
1148 		break;
1149 
1150 	case ND_GET:
1151 		need_privilege = B_FALSE;
1152 		/* FALLTHRU */
1153 	case ND_SET:
1154 		break;
1155 	}
1156 
1157 	if (need_privilege) {
1158 		/*
1159 		 * Check for specific net_config privilege
1160 		 */
1161 		err = secpolicy_net_config(iocp->ioc_cr, B_FALSE);
1162 		if (err != 0) {
1163 			miocnak(wq, mp, 0, err);
1164 			return;
1165 		}
1166 	}
1167 
1168 	mutex_enter(rgep->genlock);
1169 
1170 	switch (cmd) {
1171 	default:
1172 		_NOTE(NOTREACHED)
1173 		status = IOC_INVAL;
1174 		break;
1175 
1176 	case RGE_MII_READ:
1177 	case RGE_MII_WRITE:
1178 	case RGE_DIAG:
1179 	case RGE_PEEK:
1180 	case RGE_POKE:
1181 	case RGE_PHY_RESET:
1182 	case RGE_SOFT_RESET:
1183 	case RGE_HARD_RESET:
1184 		status = rge_chip_ioctl(rgep, wq, mp, iocp);
1185 		break;
1186 
1187 	case LB_GET_INFO_SIZE:
1188 	case LB_GET_INFO:
1189 	case LB_GET_MODE:
1190 	case LB_SET_MODE:
1191 		status = rge_loop_ioctl(rgep, wq, mp, iocp);
1192 		break;
1193 
1194 	case ND_GET:
1195 	case ND_SET:
1196 		status = rge_nd_ioctl(rgep, wq, mp, iocp);
1197 		break;
1198 	}
1199 
1200 	/*
1201 	 * Do we need to reprogram the PHY and/or the MAC?
1202 	 * Do it now, while we still have the mutex.
1203 	 *
1204 	 * Note: update the PHY first, 'cos it controls the
1205 	 * speed/duplex parameters that the MAC code uses.
1206 	 */
1207 	switch (status) {
1208 	case IOC_RESTART_REPLY:
1209 	case IOC_RESTART_ACK:
1210 		rge_phy_update(rgep);
1211 		break;
1212 	}
1213 
1214 	mutex_exit(rgep->genlock);
1215 
1216 	/*
1217 	 * Finally, decide how to reply
1218 	 */
1219 	switch (status) {
1220 	default:
1221 	case IOC_INVAL:
1222 		/*
1223 		 * Error, reply with a NAK and EINVAL or the specified error
1224 		 */
1225 		miocnak(wq, mp, 0, iocp->ioc_error == 0 ?
1226 		    EINVAL : iocp->ioc_error);
1227 		break;
1228 
1229 	case IOC_DONE:
1230 		/*
1231 		 * OK, reply already sent
1232 		 */
1233 		break;
1234 
1235 	case IOC_RESTART_ACK:
1236 	case IOC_ACK:
1237 		/*
1238 		 * OK, reply with an ACK
1239 		 */
1240 		miocack(wq, mp, 0, 0);
1241 		break;
1242 
1243 	case IOC_RESTART_REPLY:
1244 	case IOC_REPLY:
1245 		/*
1246 		 * OK, send prepared reply as ACK or NAK
1247 		 */
1248 		mp->b_datap->db_type = iocp->ioc_error == 0 ?
1249 		    M_IOCACK : M_IOCNAK;
1250 		qreply(wq, mp);
1251 		break;
1252 	}
1253 }
1254 
1255 static void
1256 rge_m_resources(void *arg)
1257 {
1258 	rge_t *rgep = arg;
1259 	mac_rx_fifo_t mrf;
1260 
1261 	mutex_enter(rgep->genlock);
1262 
1263 	/*
1264 	 * Register Rx rings as resources and save mac
1265 	 * resource id for future reference
1266 	 */
1267 	mrf.mrf_type = MAC_RX_FIFO;
1268 	mrf.mrf_blank = rge_chip_blank;
1269 	mrf.mrf_arg = (void *)rgep;
1270 	mrf.mrf_normal_blank_time = RGE_RX_INT_TIME;
1271 	mrf.mrf_normal_pkt_count = RGE_RX_INT_PKTS;
1272 	rgep->handle = mac_resource_add(rgep->mh, (mac_resource_t *)&mrf);
1273 
1274 	mutex_exit(rgep->genlock);
1275 }
1276 
1277 /* ARGSUSED */
1278 static boolean_t
1279 rge_m_getcapab(void *arg, mac_capab_t cap, void *cap_data)
1280 {
1281 	switch (cap) {
1282 	case MAC_CAPAB_HCKSUM: {
1283 		uint32_t *hcksum_txflags = cap_data;
1284 		*hcksum_txflags = HCKSUM_INET_FULL_V4 | HCKSUM_IPHDRCKSUM;
1285 		break;
1286 	}
1287 	case MAC_CAPAB_POLL:
1288 		/*
1289 		 * There's nothing for us to fill in, simply returning
1290 		 * B_TRUE stating that we support polling is sufficient.
1291 		 */
1292 		break;
1293 	default:
1294 		return (B_FALSE);
1295 	}
1296 	return (B_TRUE);
1297 }
1298 
1299 /*
1300  * ============ Init MSI/Fixed Interrupt routines ==============
1301  */
1302 
1303 /*
1304  * rge_add_intrs:
1305  *
1306  * Register FIXED or MSI interrupts.
1307  */
1308 static int
1309 rge_add_intrs(rge_t *rgep, int intr_type)
1310 {
1311 	dev_info_t *dip = rgep->devinfo;
1312 	int avail;
1313 	int actual;
1314 	int intr_size;
1315 	int count;
1316 	int i, j;
1317 	int ret;
1318 
1319 	/* Get number of interrupts */
1320 	ret = ddi_intr_get_nintrs(dip, intr_type, &count);
1321 	if ((ret != DDI_SUCCESS) || (count == 0)) {
1322 		rge_error(rgep, "ddi_intr_get_nintrs() failure, ret: %d, "
1323 		    "count: %d", ret, count);
1324 		return (DDI_FAILURE);
1325 	}
1326 
1327 	/* Get number of available interrupts */
1328 	ret = ddi_intr_get_navail(dip, intr_type, &avail);
1329 	if ((ret != DDI_SUCCESS) || (avail == 0)) {
1330 		rge_error(rgep, "ddi_intr_get_navail() failure, "
1331 		    "ret: %d, avail: %d\n", ret, avail);
1332 		return (DDI_FAILURE);
1333 	}
1334 
1335 	/* Allocate an array of interrupt handles */
1336 	intr_size = count * sizeof (ddi_intr_handle_t);
1337 	rgep->htable = kmem_alloc(intr_size, KM_SLEEP);
1338 	rgep->intr_rqst = count;
1339 
1340 	/* Call ddi_intr_alloc() */
1341 	ret = ddi_intr_alloc(dip, rgep->htable, intr_type, 0,
1342 	    count, &actual, DDI_INTR_ALLOC_NORMAL);
1343 	if (ret != DDI_SUCCESS || actual == 0) {
1344 		rge_error(rgep, "ddi_intr_alloc() failed %d\n", ret);
1345 		kmem_free(rgep->htable, intr_size);
1346 		return (DDI_FAILURE);
1347 	}
1348 	if (actual < count) {
1349 		rge_log(rgep, "ddi_intr_alloc() Requested: %d, Received: %d\n",
1350 		    count, actual);
1351 	}
1352 	rgep->intr_cnt = actual;
1353 
1354 	/*
1355 	 * Get priority for first msi, assume remaining are all the same
1356 	 */
1357 	if ((ret = ddi_intr_get_pri(rgep->htable[0], &rgep->intr_pri)) !=
1358 	    DDI_SUCCESS) {
1359 		rge_error(rgep, "ddi_intr_get_pri() failed %d\n", ret);
1360 		/* Free already allocated intr */
1361 		for (i = 0; i < actual; i++) {
1362 			(void) ddi_intr_free(rgep->htable[i]);
1363 		}
1364 		kmem_free(rgep->htable, intr_size);
1365 		return (DDI_FAILURE);
1366 	}
1367 
1368 	/* Test for high level mutex */
1369 	if (rgep->intr_pri >= ddi_intr_get_hilevel_pri()) {
1370 		rge_error(rgep, "rge_add_intrs:"
1371 		    "Hi level interrupt not supported");
1372 		for (i = 0; i < actual; i++)
1373 			(void) ddi_intr_free(rgep->htable[i]);
1374 		kmem_free(rgep->htable, intr_size);
1375 		return (DDI_FAILURE);
1376 	}
1377 
1378 	/* Call ddi_intr_add_handler() */
1379 	for (i = 0; i < actual; i++) {
1380 		if ((ret = ddi_intr_add_handler(rgep->htable[i], rge_intr,
1381 		    (caddr_t)rgep, (caddr_t)(uintptr_t)i)) != DDI_SUCCESS) {
1382 			rge_error(rgep, "ddi_intr_add_handler() "
1383 			    "failed %d\n", ret);
1384 			/* Remove already added intr */
1385 			for (j = 0; j < i; j++)
1386 				(void) ddi_intr_remove_handler(rgep->htable[j]);
1387 			/* Free already allocated intr */
1388 			for (i = 0; i < actual; i++) {
1389 				(void) ddi_intr_free(rgep->htable[i]);
1390 			}
1391 			kmem_free(rgep->htable, intr_size);
1392 			return (DDI_FAILURE);
1393 		}
1394 	}
1395 
1396 	if ((ret = ddi_intr_get_cap(rgep->htable[0], &rgep->intr_cap))
1397 	    != DDI_SUCCESS) {
1398 		rge_error(rgep, "ddi_intr_get_cap() failed %d\n", ret);
1399 		for (i = 0; i < actual; i++) {
1400 			(void) ddi_intr_remove_handler(rgep->htable[i]);
1401 			(void) ddi_intr_free(rgep->htable[i]);
1402 		}
1403 		kmem_free(rgep->htable, intr_size);
1404 		return (DDI_FAILURE);
1405 	}
1406 
1407 	return (DDI_SUCCESS);
1408 }
1409 
1410 /*
1411  * rge_rem_intrs:
1412  *
1413  * Unregister FIXED or MSI interrupts
1414  */
1415 static void
1416 rge_rem_intrs(rge_t *rgep)
1417 {
1418 	int i;
1419 
1420 	/* Disable all interrupts */
1421 	if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) {
1422 		/* Call ddi_intr_block_disable() */
1423 		(void) ddi_intr_block_disable(rgep->htable, rgep->intr_cnt);
1424 	} else {
1425 		for (i = 0; i < rgep->intr_cnt; i++) {
1426 			(void) ddi_intr_disable(rgep->htable[i]);
1427 		}
1428 	}
1429 
1430 	/* Call ddi_intr_remove_handler() */
1431 	for (i = 0; i < rgep->intr_cnt; i++) {
1432 		(void) ddi_intr_remove_handler(rgep->htable[i]);
1433 		(void) ddi_intr_free(rgep->htable[i]);
1434 	}
1435 
1436 	kmem_free(rgep->htable, rgep->intr_rqst * sizeof (ddi_intr_handle_t));
1437 }
1438 
1439 /*
1440  * ========== Per-instance setup/teardown code ==========
1441  */
1442 
1443 #undef	RGE_DBG
1444 #define	RGE_DBG		RGE_DBG_INIT	/* debug flag for this code	*/
1445 
1446 static void
1447 rge_unattach(rge_t *rgep)
1448 {
1449 	/*
1450 	 * Flag that no more activity may be initiated
1451 	 */
1452 	rgep->progress &= ~PROGRESS_READY;
1453 	rgep->rge_mac_state = RGE_MAC_UNATTACH;
1454 
1455 	/*
1456 	 * Quiesce the PHY and MAC (leave it reset but still powered).
1457 	 * Clean up and free all RGE data structures
1458 	 */
1459 	if (rgep->periodic_id != NULL) {
1460 		ddi_periodic_delete(rgep->periodic_id);
1461 		rgep->periodic_id = NULL;
1462 	}
1463 
1464 	if (rgep->progress & PROGRESS_KSTATS)
1465 		rge_fini_kstats(rgep);
1466 
1467 	if (rgep->progress & PROGRESS_PHY)
1468 		(void) rge_phy_reset(rgep);
1469 
1470 	if (rgep->progress & PROGRESS_INIT) {
1471 		mutex_enter(rgep->genlock);
1472 		(void) rge_chip_reset(rgep);
1473 		mutex_exit(rgep->genlock);
1474 		rge_fini_rings(rgep);
1475 	}
1476 
1477 	if (rgep->progress & PROGRESS_INTR) {
1478 		rge_rem_intrs(rgep);
1479 		mutex_destroy(rgep->rc_lock);
1480 		mutex_destroy(rgep->rx_lock);
1481 		mutex_destroy(rgep->tc_lock);
1482 		mutex_destroy(rgep->tx_lock);
1483 		rw_destroy(rgep->errlock);
1484 		mutex_destroy(rgep->genlock);
1485 	}
1486 
1487 	if (rgep->progress & PROGRESS_FACTOTUM)
1488 		(void) ddi_intr_remove_softint(rgep->factotum_hdl);
1489 
1490 	if (rgep->progress & PROGRESS_RESCHED)
1491 		(void) ddi_intr_remove_softint(rgep->resched_hdl);
1492 
1493 	if (rgep->progress & PROGRESS_NDD)
1494 		rge_nd_cleanup(rgep);
1495 
1496 	rge_free_bufs(rgep);
1497 
1498 	if (rgep->progress & PROGRESS_REGS)
1499 		ddi_regs_map_free(&rgep->io_handle);
1500 
1501 	if (rgep->progress & PROGRESS_CFG)
1502 		pci_config_teardown(&rgep->cfg_handle);
1503 
1504 	ddi_remove_minor_node(rgep->devinfo, NULL);
1505 	kmem_free(rgep, sizeof (*rgep));
1506 }
1507 
1508 static int
1509 rge_resume(dev_info_t *devinfo)
1510 {
1511 	rge_t *rgep;			/* Our private data	*/
1512 	chip_id_t *cidp;
1513 	chip_id_t chipid;
1514 
1515 	rgep = ddi_get_driver_private(devinfo);
1516 
1517 	/*
1518 	 * If there are state inconsistancies, this is bad.  Returning
1519 	 * DDI_FAILURE here will eventually cause the machine to panic,
1520 	 * so it is best done here so that there is a possibility of
1521 	 * debugging the problem.
1522 	 */
1523 	if (rgep == NULL)
1524 		cmn_err(CE_PANIC,
1525 		    "rge: ngep returned from ddi_get_driver_private was NULL");
1526 
1527 	/*
1528 	 * Refuse to resume if the data structures aren't consistent
1529 	 */
1530 	if (rgep->devinfo != devinfo)
1531 		cmn_err(CE_PANIC,
1532 		    "rge: passed devinfo not the same as saved devinfo");
1533 
1534 	/*
1535 	 * Read chip ID & set up config space command register(s)
1536 	 * Refuse to resume if the chip has changed its identity!
1537 	 */
1538 	cidp = &rgep->chipid;
1539 	rge_chip_cfg_init(rgep, &chipid);
1540 	if (chipid.vendor != cidp->vendor)
1541 		return (DDI_FAILURE);
1542 	if (chipid.device != cidp->device)
1543 		return (DDI_FAILURE);
1544 	if (chipid.revision != cidp->revision)
1545 		return (DDI_FAILURE);
1546 
1547 	mutex_enter(rgep->genlock);
1548 
1549 	/*
1550 	 * Only in one case, this conditional branch can be executed: the port
1551 	 * hasn't been plumbed.
1552 	 */
1553 	if (rgep->suspended == B_FALSE) {
1554 		mutex_exit(rgep->genlock);
1555 		return (DDI_SUCCESS);
1556 	}
1557 	rgep->rge_mac_state = RGE_MAC_STARTED;
1558 	/*
1559 	 * All OK, reinitialise h/w & kick off NEMO scheduling
1560 	 */
1561 	rge_restart(rgep);
1562 	rgep->suspended = B_FALSE;
1563 
1564 	mutex_exit(rgep->genlock);
1565 
1566 	return (DDI_SUCCESS);
1567 }
1568 
1569 
1570 /*
1571  * attach(9E) -- Attach a device to the system
1572  *
1573  * Called once for each board successfully probed.
1574  */
1575 static int
1576 rge_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
1577 {
1578 	rge_t *rgep;			/* Our private data	*/
1579 	mac_register_t *macp;
1580 	chip_id_t *cidp;
1581 	int intr_types;
1582 	caddr_t regs;
1583 	int instance;
1584 	int i;
1585 	int err;
1586 
1587 	/*
1588 	 * we don't support high level interrupts in the driver
1589 	 */
1590 	if (ddi_intr_hilevel(devinfo, 0) != 0) {
1591 		cmn_err(CE_WARN,
1592 		    "rge_attach -- unsupported high level interrupt");
1593 		return (DDI_FAILURE);
1594 	}
1595 
1596 	instance = ddi_get_instance(devinfo);
1597 	RGE_GTRACE(("rge_attach($%p, %d) instance %d",
1598 	    (void *)devinfo, cmd, instance));
1599 	RGE_BRKPT(NULL, "rge_attach");
1600 
1601 	switch (cmd) {
1602 	default:
1603 		return (DDI_FAILURE);
1604 
1605 	case DDI_RESUME:
1606 		return (rge_resume(devinfo));
1607 
1608 	case DDI_ATTACH:
1609 		break;
1610 	}
1611 
1612 	rgep = kmem_zalloc(sizeof (*rgep), KM_SLEEP);
1613 	ddi_set_driver_private(devinfo, rgep);
1614 	rgep->devinfo = devinfo;
1615 
1616 	/*
1617 	 * Initialize more fields in RGE private data
1618 	 */
1619 	rgep->rge_mac_state = RGE_MAC_ATTACH;
1620 	rgep->debug = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1621 	    DDI_PROP_DONTPASS, debug_propname, rge_debug);
1622 	rgep->default_mtu = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1623 	    DDI_PROP_DONTPASS, mtu_propname, ETHERMTU);
1624 	rgep->msi_enable = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1625 	    DDI_PROP_DONTPASS, msi_propname, B_TRUE);
1626 	(void) snprintf(rgep->ifname, sizeof (rgep->ifname), "%s%d",
1627 	    RGE_DRIVER_NAME, instance);
1628 
1629 	/*
1630 	 * Map config space registers
1631 	 * Read chip ID & set up config space command register(s)
1632 	 *
1633 	 * Note: this leaves the chip accessible by Memory Space
1634 	 * accesses, but with interrupts and Bus Mastering off.
1635 	 * This should ensure that nothing untoward will happen
1636 	 * if it has been left active by the (net-)bootloader.
1637 	 * We'll re-enable Bus Mastering once we've reset the chip,
1638 	 * and allow interrupts only when everything else is set up.
1639 	 */
1640 	err = pci_config_setup(devinfo, &rgep->cfg_handle);
1641 	if (err != DDI_SUCCESS) {
1642 		rge_problem(rgep, "pci_config_setup() failed");
1643 		goto attach_fail;
1644 	}
1645 	rgep->progress |= PROGRESS_CFG;
1646 	cidp = &rgep->chipid;
1647 	bzero(cidp, sizeof (*cidp));
1648 	rge_chip_cfg_init(rgep, cidp);
1649 
1650 	/*
1651 	 * Map operating registers
1652 	 */
1653 	err = ddi_regs_map_setup(devinfo, 1, &regs,
1654 	    0, 0, &rge_reg_accattr, &rgep->io_handle);
1655 	if (err != DDI_SUCCESS) {
1656 		rge_problem(rgep, "ddi_regs_map_setup() failed");
1657 		goto attach_fail;
1658 	}
1659 	rgep->io_regs = regs;
1660 	rgep->progress |= PROGRESS_REGS;
1661 
1662 	/*
1663 	 * Characterise the device, so we know its requirements.
1664 	 * Then allocate the appropriate TX and RX descriptors & buffers.
1665 	 */
1666 	rge_chip_ident(rgep);
1667 	err = rge_alloc_bufs(rgep);
1668 	if (err != DDI_SUCCESS) {
1669 		rge_problem(rgep, "DMA buffer allocation failed");
1670 		goto attach_fail;
1671 	}
1672 
1673 	/*
1674 	 * Register NDD-tweakable parameters
1675 	 */
1676 	if (rge_nd_init(rgep)) {
1677 		rge_problem(rgep, "rge_nd_init() failed");
1678 		goto attach_fail;
1679 	}
1680 	rgep->progress |= PROGRESS_NDD;
1681 
1682 	/*
1683 	 * Add the softint handlers:
1684 	 *
1685 	 * Both of these handlers are used to avoid restrictions on the
1686 	 * context and/or mutexes required for some operations.  In
1687 	 * particular, the hardware interrupt handler and its subfunctions
1688 	 * can detect a number of conditions that we don't want to handle
1689 	 * in that context or with that set of mutexes held.  So, these
1690 	 * softints are triggered instead:
1691 	 *
1692 	 * the <resched> softint is triggered if if we have previously
1693 	 * had to refuse to send a packet because of resource shortage
1694 	 * (we've run out of transmit buffers), but the send completion
1695 	 * interrupt handler has now detected that more buffers have
1696 	 * become available.
1697 	 *
1698 	 * the <factotum> is triggered if the h/w interrupt handler
1699 	 * sees the <link state changed> or <error> bits in the status
1700 	 * block.  It's also triggered periodically to poll the link
1701 	 * state, just in case we aren't getting link status change
1702 	 * interrupts ...
1703 	 */
1704 	err = ddi_intr_add_softint(devinfo, &rgep->resched_hdl,
1705 	    DDI_INTR_SOFTPRI_MIN, rge_reschedule, (caddr_t)rgep);
1706 	if (err != DDI_SUCCESS) {
1707 		rge_problem(rgep, "ddi_intr_add_softint() failed");
1708 		goto attach_fail;
1709 	}
1710 	rgep->progress |= PROGRESS_RESCHED;
1711 	err = ddi_intr_add_softint(devinfo, &rgep->factotum_hdl,
1712 	    DDI_INTR_SOFTPRI_MIN, rge_chip_factotum, (caddr_t)rgep);
1713 	if (err != DDI_SUCCESS) {
1714 		rge_problem(rgep, "ddi_intr_add_softint() failed");
1715 		goto attach_fail;
1716 	}
1717 	rgep->progress |= PROGRESS_FACTOTUM;
1718 
1719 	/*
1720 	 * Get supported interrupt types
1721 	 */
1722 	if (ddi_intr_get_supported_types(devinfo, &intr_types)
1723 	    != DDI_SUCCESS) {
1724 		rge_error(rgep, "ddi_intr_get_supported_types failed\n");
1725 		goto attach_fail;
1726 	}
1727 
1728 	/*
1729 	 * Add the h/w interrupt handler and initialise mutexes
1730 	 * RTL8101E is observed to have MSI invalidation issue after S/R.
1731 	 * So the FIXED interrupt is used instead.
1732 	 */
1733 	if (rgep->chipid.mac_ver == MAC_VER_8101E)
1734 		rgep->msi_enable = B_FALSE;
1735 	if ((intr_types & DDI_INTR_TYPE_MSI) && rgep->msi_enable) {
1736 		if (rge_add_intrs(rgep, DDI_INTR_TYPE_MSI) != DDI_SUCCESS) {
1737 			rge_error(rgep, "MSI registration failed, "
1738 			    "trying FIXED interrupt type\n");
1739 		} else {
1740 			rge_log(rgep, "Using MSI interrupt type\n");
1741 			rgep->intr_type = DDI_INTR_TYPE_MSI;
1742 			rgep->progress |= PROGRESS_INTR;
1743 		}
1744 	}
1745 	if (!(rgep->progress & PROGRESS_INTR) &&
1746 	    (intr_types & DDI_INTR_TYPE_FIXED)) {
1747 		if (rge_add_intrs(rgep, DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) {
1748 			rge_error(rgep, "FIXED interrupt "
1749 			    "registration failed\n");
1750 			goto attach_fail;
1751 		}
1752 		rge_log(rgep, "Using FIXED interrupt type\n");
1753 		rgep->intr_type = DDI_INTR_TYPE_FIXED;
1754 		rgep->progress |= PROGRESS_INTR;
1755 	}
1756 	if (!(rgep->progress & PROGRESS_INTR)) {
1757 		rge_error(rgep, "No interrupts registered\n");
1758 		goto attach_fail;
1759 	}
1760 	mutex_init(rgep->genlock, NULL, MUTEX_DRIVER,
1761 	    DDI_INTR_PRI(rgep->intr_pri));
1762 	rw_init(rgep->errlock, NULL, RW_DRIVER,
1763 	    DDI_INTR_PRI(rgep->intr_pri));
1764 	mutex_init(rgep->tx_lock, NULL, MUTEX_DRIVER,
1765 	    DDI_INTR_PRI(rgep->intr_pri));
1766 	mutex_init(rgep->tc_lock, NULL, MUTEX_DRIVER,
1767 	    DDI_INTR_PRI(rgep->intr_pri));
1768 	mutex_init(rgep->rx_lock, NULL, MUTEX_DRIVER,
1769 	    DDI_INTR_PRI(rgep->intr_pri));
1770 	mutex_init(rgep->rc_lock, NULL, MUTEX_DRIVER,
1771 	    DDI_INTR_PRI(rgep->intr_pri));
1772 
1773 	/*
1774 	 * Initialize rings
1775 	 */
1776 	err = rge_init_rings(rgep);
1777 	if (err != DDI_SUCCESS) {
1778 		rge_problem(rgep, "rge_init_rings() failed");
1779 		goto attach_fail;
1780 	}
1781 	rgep->progress |= PROGRESS_INIT;
1782 
1783 	/*
1784 	 * Now that mutex locks are initialized, enable interrupts.
1785 	 */
1786 	if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) {
1787 		/* Call ddi_intr_block_enable() for MSI interrupts */
1788 		(void) ddi_intr_block_enable(rgep->htable, rgep->intr_cnt);
1789 	} else {
1790 		/* Call ddi_intr_enable for MSI or FIXED interrupts */
1791 		for (i = 0; i < rgep->intr_cnt; i++) {
1792 			(void) ddi_intr_enable(rgep->htable[i]);
1793 		}
1794 	}
1795 
1796 	/*
1797 	 * Initialise link state variables
1798 	 * Stop, reset & reinitialise the chip.
1799 	 * Initialise the (internal) PHY.
1800 	 */
1801 	rgep->param_link_up = LINK_STATE_UNKNOWN;
1802 
1803 	/*
1804 	 * Reset chip & rings to initial state; also reset address
1805 	 * filtering, promiscuity, loopback mode.
1806 	 */
1807 	mutex_enter(rgep->genlock);
1808 	(void) rge_chip_reset(rgep);
1809 	rge_chip_sync(rgep, RGE_GET_MAC);
1810 	bzero(rgep->mcast_hash, sizeof (rgep->mcast_hash));
1811 	bzero(rgep->mcast_refs, sizeof (rgep->mcast_refs));
1812 	rgep->promisc = B_FALSE;
1813 	rgep->param_loop_mode = RGE_LOOP_NONE;
1814 	mutex_exit(rgep->genlock);
1815 	rge_phy_init(rgep);
1816 	rgep->progress |= PROGRESS_PHY;
1817 
1818 	/*
1819 	 * Create & initialise named kstats
1820 	 */
1821 	rge_init_kstats(rgep, instance);
1822 	rgep->progress |= PROGRESS_KSTATS;
1823 
1824 	if ((macp = mac_alloc(MAC_VERSION)) == NULL)
1825 		goto attach_fail;
1826 	macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
1827 	macp->m_driver = rgep;
1828 	macp->m_dip = devinfo;
1829 	macp->m_src_addr = rgep->netaddr;
1830 	macp->m_callbacks = &rge_m_callbacks;
1831 	macp->m_min_sdu = 0;
1832 	macp->m_max_sdu = rgep->default_mtu;
1833 	macp->m_margin = VLAN_TAGSZ;
1834 
1835 	/*
1836 	 * Finally, we're ready to register ourselves with the MAC layer
1837 	 * interface; if this succeeds, we're all ready to start()
1838 	 */
1839 	err = mac_register(macp, &rgep->mh);
1840 	mac_free(macp);
1841 	if (err != 0)
1842 		goto attach_fail;
1843 
1844 	/*
1845 	 * Register a periodical handler.
1846 	 * reg_chip_cyclic() is invoked in kernel context.
1847 	 */
1848 	rgep->periodic_id = ddi_periodic_add(rge_chip_cyclic, rgep,
1849 	    RGE_CYCLIC_PERIOD, DDI_IPL_0);
1850 
1851 	rgep->progress |= PROGRESS_READY;
1852 	return (DDI_SUCCESS);
1853 
1854 attach_fail:
1855 	rge_unattach(rgep);
1856 	return (DDI_FAILURE);
1857 }
1858 
1859 /*
1860  *	rge_suspend() -- suspend transmit/receive for powerdown
1861  */
1862 static int
1863 rge_suspend(rge_t *rgep)
1864 {
1865 	/*
1866 	 * Stop processing and idle (powerdown) the PHY ...
1867 	 */
1868 	mutex_enter(rgep->genlock);
1869 	rw_enter(rgep->errlock, RW_READER);
1870 
1871 	if (rgep->rge_mac_state != RGE_MAC_STARTED) {
1872 		mutex_exit(rgep->genlock);
1873 		return (DDI_SUCCESS);
1874 	}
1875 
1876 	rgep->suspended = B_TRUE;
1877 	rge_stop(rgep);
1878 	rgep->rge_mac_state = RGE_MAC_STOPPED;
1879 
1880 	rw_exit(rgep->errlock);
1881 	mutex_exit(rgep->genlock);
1882 
1883 	return (DDI_SUCCESS);
1884 }
1885 
1886 /*
1887  * detach(9E) -- Detach a device from the system
1888  */
1889 static int
1890 rge_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
1891 {
1892 	rge_t *rgep;
1893 
1894 	RGE_GTRACE(("rge_detach($%p, %d)", (void *)devinfo, cmd));
1895 
1896 	rgep = ddi_get_driver_private(devinfo);
1897 
1898 	switch (cmd) {
1899 	default:
1900 		return (DDI_FAILURE);
1901 
1902 	case DDI_SUSPEND:
1903 		return (rge_suspend(rgep));
1904 
1905 	case DDI_DETACH:
1906 		break;
1907 	}
1908 
1909 	/*
1910 	 * If there is any posted buffer, the driver should reject to be
1911 	 * detached. Need notice upper layer to release them.
1912 	 */
1913 	if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) &&
1914 	    rgep->rx_free != RGE_BUF_SLOTS)
1915 		return (DDI_FAILURE);
1916 
1917 	/*
1918 	 * Unregister from the MAC layer subsystem.  This can fail, in
1919 	 * particular if there are DLPI style-2 streams still open -
1920 	 * in which case we just return failure without shutting
1921 	 * down chip operations.
1922 	 */
1923 	if (mac_unregister(rgep->mh) != 0)
1924 		return (DDI_FAILURE);
1925 
1926 	/*
1927 	 * All activity stopped, so we can clean up & exit
1928 	 */
1929 	rge_unattach(rgep);
1930 	return (DDI_SUCCESS);
1931 }
1932 
1933 
1934 /*
1935  * ========== Module Loading Data & Entry Points ==========
1936  */
1937 
1938 #undef	RGE_DBG
1939 #define	RGE_DBG		RGE_DBG_INIT	/* debug flag for this code	*/
1940 DDI_DEFINE_STREAM_OPS(rge_dev_ops, nulldev, nulldev, rge_attach, rge_detach,
1941     nodev, NULL, D_MP, NULL);
1942 
1943 static struct modldrv rge_modldrv = {
1944 	&mod_driverops,		/* Type of module.  This one is a driver */
1945 	rge_ident,		/* short description */
1946 	&rge_dev_ops		/* driver specific ops */
1947 };
1948 
1949 static struct modlinkage modlinkage = {
1950 	MODREV_1, (void *)&rge_modldrv, NULL
1951 };
1952 
1953 
1954 int
1955 _info(struct modinfo *modinfop)
1956 {
1957 	return (mod_info(&modlinkage, modinfop));
1958 }
1959 
1960 int
1961 _init(void)
1962 {
1963 	int status;
1964 
1965 	mac_init_ops(&rge_dev_ops, "rge");
1966 	status = mod_install(&modlinkage);
1967 	if (status == DDI_SUCCESS)
1968 		mutex_init(rge_log_mutex, NULL, MUTEX_DRIVER, NULL);
1969 	else
1970 		mac_fini_ops(&rge_dev_ops);
1971 
1972 	return (status);
1973 }
1974 
1975 int
1976 _fini(void)
1977 {
1978 	int status;
1979 
1980 	status = mod_remove(&modlinkage);
1981 	if (status == DDI_SUCCESS) {
1982 		mac_fini_ops(&rge_dev_ops);
1983 		mutex_destroy(rge_log_mutex);
1984 	}
1985 	return (status);
1986 }
1987