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