xref: /illumos-gate/usr/src/uts/common/io/atge/atge_main.c (revision 66582b606a8194f7f3ba5b3a3a6dca5b0d346361)
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 /*
23  * Copyright (c) 2012 Gary Mills
24  *
25  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
26  *
27  * Copyright (c) 2018, Joyent, Inc.
28  */
29 /*
30  * Copyright (c) 2009, Pyun YongHyeon <yongari@FreeBSD.org>
31  * All rights reserved.
32  *
33  * Redistribution and use in source and binary forms, with or without
34  * modification, are permitted provided that the following conditions
35  * are met:
36  * 1. Redistributions of source code must retain the above copyright
37  *    notice unmodified, this list of conditions, and the following
38  *    disclaimer.
39  * 2. Redistributions in binary form must reproduce the above copyright
40  *    notice, this list of conditions and the following disclaimer in the
41  *    documentation and/or other materials provided with the distribution.
42  *
43  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
44  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
47  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53  * SUCH DAMAGE.
54  */
55 
56 #include <sys/types.h>
57 #include <sys/stream.h>
58 #include <sys/strsun.h>
59 #include <sys/stat.h>
60 #include <sys/modctl.h>
61 #include <sys/kstat.h>
62 #include <sys/ethernet.h>
63 #include <sys/devops.h>
64 #include <sys/debug.h>
65 #include <sys/conf.h>
66 #include <sys/mii.h>
67 #include <sys/miiregs.h>
68 #include <sys/mac.h>
69 #include <sys/mac_provider.h>
70 #include <sys/mac_ether.h>
71 #include <sys/sysmacros.h>
72 #include <sys/dditypes.h>
73 #include <sys/ddi.h>
74 #include <sys/sunddi.h>
75 #include <sys/byteorder.h>
76 #include <sys/note.h>
77 #include <sys/vlan.h>
78 #include <sys/strsubr.h>
79 #include <sys/crc32.h>
80 #include <sys/sdt.h>
81 #include <sys/pci.h>
82 #include <sys/pci_cap.h>
83 
84 #include "atge.h"
85 #include "atge_cmn_reg.h"
86 #include "atge_l1c_reg.h"
87 #include "atge_l1e_reg.h"
88 #include "atge_l1_reg.h"
89 
90 
91 /*
92  * Atheros/Attansic Ethernet chips are of four types - L1, L2, L1E and L1C.
93  * This driver is for L1E/L1/L1C but can be extended to support other chips.
94  * L1E comes in 1Gigabit and Fast Ethernet flavors. L1 comes in 1Gigabit
95  * flavors only.  L1C comes in both flavours.
96  *
97  * Atheros/Attansic Ethernet controllers have descriptor based TX and RX
98  * with an exception of L1E. L1E's RX side is not descriptor based ring.
99  * The L1E's RX uses pages (not to be confused with MMU pages) for
100  * receiving pkts. The header has four fields :
101  *
102  *        uint32_t seqno;    Sequence number of the frame.
103  *        uint32_t length;   Length of the frame.
104  *        uint32_t flags;    Flags
105  *        uint32_t vtag;     We don't use hardware VTAG.
106  *
107  * We use only one queue for RX (each queue can have two pages) and each
108  * page is L1E_RX_PAGE_SZ large in bytes. That's the reason we don't
109  * use zero-copy RX because we are limited to two pages and each page
110  * accomodates large number of pkts.
111  *
112  * The TX side on all three chips is descriptor based ring; and all the
113  * more reason to have one driver for these chips.
114  *
115  * We use two locks - atge_intr_lock and atge_tx_lock. Both the locks
116  * should be held if the operation has impact on the driver instance.
117  *
118  * All the three chips have hash-based multicast filter.
119  *
120  * We use CMB (Coalescing Message Block) for RX but not for TX as there
121  * are some issues with TX. RX CMB is used to get the last descriptor
122  * posted by the chip. Each CMB is for a RX page (one queue can have two
123  * pages) and are uint32_t (4 bytes) long.
124  *
125  * The descriptor table should have 32-bit physical address limit due to
126  * the limitation of having same high address for TX/RX/SMB/CMB. The
127  * TX/RX buffers can be 64-bit.
128  *
129  * Every DMA memory in atge is represented by atge_dma_t be it TX/RX Buffers
130  * or TX/RX descriptor table or SMB/CMB. To keep the code simple, we have
131  * kept sgl as 1 so that we get contingous pages from root complex.
132  *
133  * L1 chip (0x1048) uses descriptor based TX and RX ring. Most of registers are
134  * common with L1E chip (0x1026).
135  */
136 
137 /*
138  * Function Prototypes for debugging.
139  */
140 void	atge_error(dev_info_t *, char *, ...);
141 void	atge_debug_func(char *, ...);
142 
143 /*
144  * Function Prototypes for driver operations.
145  */
146 static int	atge_resume(dev_info_t *);
147 static int	atge_add_intr(atge_t *);
148 static int	atge_alloc_dma(atge_t *);
149 static void	atge_remove_intr(atge_t *);
150 static void	atge_free_dma(atge_t *);
151 static void	atge_device_reset(atge_t *);
152 static void	atge_device_init(atge_t *);
153 static void	atge_device_start(atge_t *);
154 static void	atge_disable_intrs(atge_t *);
155 atge_dma_t *atge_alloc_a_dma_blk(atge_t *, ddi_dma_attr_t *, int, int);
156 void	atge_free_a_dma_blk(atge_dma_t *);
157 static void	atge_rxfilter(atge_t *);
158 static void	atge_device_reset_l1_l1e(atge_t *);
159 void	atge_program_ether(atge_t *atgep);
160 void	atge_device_restart(atge_t *);
161 void	atge_device_stop(atge_t *);
162 static int	atge_send_a_packet(atge_t *, mblk_t *);
163 static uint32_t	atge_ether_crc(const uint8_t *, int);
164 
165 
166 /*
167  * L1E/L2E specific functions.
168  */
169 void	atge_l1e_device_reset(atge_t *);
170 void	atge_l1e_stop_mac(atge_t *);
171 int	atge_l1e_alloc_dma(atge_t *);
172 void	atge_l1e_free_dma(atge_t *);
173 void	atge_l1e_init_tx_ring(atge_t *);
174 void	atge_l1e_init_rx_pages(atge_t *);
175 void	atge_l1e_program_dma(atge_t *);
176 void	atge_l1e_send_packet(atge_ring_t *);
177 mblk_t	*atge_l1e_receive(atge_t *);
178 uint_t	atge_l1e_interrupt(caddr_t, caddr_t);
179 void	atge_l1e_gather_stats(atge_t *);
180 void	atge_l1e_clear_stats(atge_t *);
181 
182 /*
183  * L1 specific functions.
184  */
185 int	atge_l1_alloc_dma(atge_t *);
186 void	atge_l1_free_dma(atge_t *);
187 void	atge_l1_init_tx_ring(atge_t *);
188 void	atge_l1_init_rx_ring(atge_t *);
189 void	atge_l1_init_rr_ring(atge_t *);
190 void	atge_l1_init_cmb(atge_t *);
191 void	atge_l1_init_smb(atge_t *);
192 void	atge_l1_program_dma(atge_t *);
193 void	atge_l1_stop_tx_mac(atge_t *);
194 void	atge_l1_stop_rx_mac(atge_t *);
195 uint_t	atge_l1_interrupt(caddr_t, caddr_t);
196 void	atge_l1_send_packet(atge_ring_t *);
197 
198 /*
199  * L1C specific functions.
200  */
201 int	atge_l1c_alloc_dma(atge_t *);
202 void	atge_l1c_free_dma(atge_t *);
203 void	atge_l1c_init_tx_ring(atge_t *);
204 void	atge_l1c_init_rx_ring(atge_t *);
205 void	atge_l1c_init_rr_ring(atge_t *);
206 void	atge_l1c_init_cmb(atge_t *);
207 void	atge_l1c_init_smb(atge_t *);
208 void	atge_l1c_program_dma(atge_t *);
209 void	atge_l1c_stop_tx_mac(atge_t *);
210 void	atge_l1c_stop_rx_mac(atge_t *);
211 uint_t	atge_l1c_interrupt(caddr_t, caddr_t);
212 void	atge_l1c_send_packet(atge_ring_t *);
213 void	atge_l1c_gather_stats(atge_t *);
214 void	atge_l1c_clear_stats(atge_t *);
215 
216 /*
217  * Function prototyps for MII operations.
218  */
219 uint16_t	atge_mii_read(void *, uint8_t, uint8_t);
220 void	atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
221 uint16_t	atge_l1c_mii_read(void *, uint8_t, uint8_t);
222 void	atge_l1c_mii_write(void *, uint8_t, uint8_t, uint16_t);
223 void	atge_l1e_mii_reset(void *);
224 void	atge_l1_mii_reset(void *);
225 void	atge_l1c_mii_reset(void *);
226 static void	atge_mii_notify(void *, link_state_t);
227 void	atge_tx_reclaim(atge_t *atgep, int cons);
228 
229 /*
230  * L1E/L2E chip.
231  */
232 static	mii_ops_t atge_l1e_mii_ops = {
233 	MII_OPS_VERSION,
234 	atge_mii_read,
235 	atge_mii_write,
236 	atge_mii_notify,
237 	atge_l1e_mii_reset
238 };
239 
240 /*
241  * L1 chip.
242  */
243 static	mii_ops_t atge_l1_mii_ops = {
244 	MII_OPS_VERSION,
245 	atge_mii_read,
246 	atge_mii_write,
247 	atge_mii_notify,
248 	atge_l1_mii_reset
249 };
250 
251 /*
252  * L1C chip.
253  */
254 static	mii_ops_t atge_l1c_mii_ops = {
255 	MII_OPS_VERSION,
256 	atge_l1c_mii_read,
257 	atge_l1c_mii_write,
258 	atge_mii_notify,
259 	NULL
260 };
261 
262 /*
263  * Function Prototypes for MAC callbacks.
264  */
265 static int	atge_m_stat(void *, uint_t, uint64_t *);
266 static int	atge_m_start(void *);
267 static void	atge_m_stop(void *);
268 static int	atge_m_getprop(void *, const char *, mac_prop_id_t, uint_t,
269     void *);
270 static int	atge_m_setprop(void *, const char *, mac_prop_id_t, uint_t,
271     const void *);
272 static void	atge_m_propinfo(void *, const char *, mac_prop_id_t,
273     mac_prop_info_handle_t);
274 static int	atge_m_unicst(void *, const uint8_t *);
275 static int	atge_m_multicst(void *, boolean_t, const uint8_t *);
276 static int	atge_m_promisc(void *, boolean_t);
277 static mblk_t	*atge_m_tx(void *, mblk_t *);
278 
279 static	mac_callbacks_t	atge_m_callbacks = {
280 	MC_SETPROP | MC_GETPROP | MC_PROPINFO,
281 	atge_m_stat,
282 	atge_m_start,
283 	atge_m_stop,
284 	atge_m_promisc,
285 	atge_m_multicst,
286 	atge_m_unicst,
287 	atge_m_tx,
288 	NULL,		/* mc_reserved */
289 	NULL,		/* mc_ioctl */
290 	NULL,		/* mc_getcapab */
291 	NULL,		/* mc_open */
292 	NULL,		/* mc_close */
293 	atge_m_setprop,
294 	atge_m_getprop,
295 	atge_m_propinfo
296 };
297 
298 /*
299  * DMA Data access requirements.
300  */
301 static struct ddi_device_acc_attr atge_dev_attr = {
302 	DDI_DEVICE_ATTR_V0,
303 	DDI_STRUCTURE_LE_ACC,
304 	DDI_STRICTORDER_ACC
305 };
306 
307 /*
308  * Buffers should be native endianness.
309  */
310 static struct ddi_device_acc_attr atge_buf_attr = {
311 	DDI_DEVICE_ATTR_V0,
312 	DDI_NEVERSWAP_ACC,	/* native endianness */
313 	DDI_STRICTORDER_ACC
314 };
315 
316 /*
317  * DMA device attributes. Buffer can be 64-bit.
318  */
319 static ddi_dma_attr_t atge_dma_attr_buf = {
320 	DMA_ATTR_V0,		/* dma_attr_version */
321 	0,			/* dma_attr_addr_lo */
322 	0x00ffffffffffull,	/* dma_attr_addr_hi */
323 	0x000000003fffull,	/* dma_attr_count_max */
324 	8,			/* dma_attr_align */
325 	0x00003ffc,		/* dma_attr_burstsizes */
326 	1,			/* dma_attr_minxfer */
327 	0x0000000027ffull,	/* dma_attr_maxxfer */
328 	0x0000ffffffffull,	/* dma_attr_seg */
329 	1,			/* dma_attr_sgllen */
330 	1,			/* dma_attr_granular */
331 	0			/* dma_attr_flags */
332 };
333 
334 /*
335  * Table of supported devices.
336  */
337 #define	ATGE_VENDOR_ID	0x1969
338 #define	ATGE_L1_STR	"Attansic L1"
339 #define	ATGE_L1CG_STR	"Atheros AR8131 Gigabit Ethernet"
340 #define	ATGE_L1CF_STR	"Atheros AR8132 Fast Ethernet"
341 #define	ATGE_L1E_STR	"Atheros AR8121/8113/8114"
342 #define	ATGE_AR8151V1_STR	"Atheros AR8151 v1.0 Gigabit Ethernet"
343 #define	ATGE_AR8151V2_STR	"Atheros AR8151 v2.0 Gigabit Ethernet"
344 #define	ATGE_AR8152V1_STR	"Atheros AR8152 v1.1 Fast Ethernet"
345 #define	ATGE_AR8152V2_STR	"Atheros AR8152 v2.0 Fast Ethernet"
346 
347 static atge_cards_t atge_cards[] = {
348 	{ATGE_VENDOR_ID, ATGE_CHIP_AR8151V2_DEV_ID, ATGE_AR8151V2_STR,
349 	    ATGE_CHIP_L1C},
350 	{ATGE_VENDOR_ID, ATGE_CHIP_AR8151V1_DEV_ID, ATGE_AR8151V1_STR,
351 	    ATGE_CHIP_L1C},
352 	{ATGE_VENDOR_ID, ATGE_CHIP_AR8152V2_DEV_ID, ATGE_AR8152V2_STR,
353 	    ATGE_CHIP_L1C},
354 	{ATGE_VENDOR_ID, ATGE_CHIP_AR8152V1_DEV_ID, ATGE_AR8152V1_STR,
355 	    ATGE_CHIP_L1C},
356 	{ATGE_VENDOR_ID, ATGE_CHIP_L1CG_DEV_ID, ATGE_L1CG_STR, ATGE_CHIP_L1C},
357 	{ATGE_VENDOR_ID, ATGE_CHIP_L1CF_DEV_ID, ATGE_L1CF_STR, ATGE_CHIP_L1C},
358 	{ATGE_VENDOR_ID, ATGE_CHIP_L1E_DEV_ID, ATGE_L1E_STR, ATGE_CHIP_L1E},
359 	{ATGE_VENDOR_ID, ATGE_CHIP_L1_DEV_ID, ATGE_L1_STR, ATGE_CHIP_L1},
360 };
361 
362 /*
363  * Global Debugging flag. Developer level debugging is done only in DEBUG mode.
364  */
365 int	atge_debug = 1;
366 
367 /*
368  * Debugging and error reporting.
369  */
370 void
371 atge_debug_func(char *fmt, ...)
372 {
373 	va_list	ap;
374 	char	buf[256];
375 
376 	va_start(ap, fmt);
377 	(void) vsnprintf(buf, sizeof (buf), fmt, ap);
378 	va_end(ap);
379 
380 	DTRACE_PROBE1(atge__debug, char *, buf);
381 }
382 
383 static
384 void
385 atge_message(dev_info_t *dip, int level, char *fmt, va_list ap)
386 {
387 	char	buf[256];
388 	char	*p = "!%s%d: %s";
389 	char	*q = "!atge: %s";
390 
391 	(void) vsnprintf(buf, sizeof (buf), fmt, ap);
392 
393 	if (level != CE_NOTE) {
394 		p++;
395 		q++;
396 	}
397 
398 	if (dip) {
399 		cmn_err(level, p,
400 		    ddi_driver_name(dip), ddi_get_instance(dip), buf);
401 	} else {
402 		cmn_err(level, q, buf);
403 	}
404 }
405 
406 void
407 atge_notice(dev_info_t *dip, char *fmt, ...)
408 {
409 	va_list	ap;
410 
411 	va_start(ap, fmt);
412 	(void) atge_message(dip, CE_NOTE, fmt, ap);
413 	va_end(ap);
414 }
415 
416 void
417 atge_error(dev_info_t *dip, char *fmt, ...)
418 {
419 	va_list	ap;
420 
421 	va_start(ap, fmt);
422 	(void) atge_message(dip, CE_WARN, fmt, ap);
423 	va_end(ap);
424 }
425 
426 void
427 atge_mac_config(atge_t *atgep)
428 {
429 	uint32_t reg;
430 	int speed;
431 	link_duplex_t ld;
432 
433 	/* Re-enable TX/RX MACs */
434 	reg = INL(atgep, ATGE_MAC_CFG);
435 	reg &= ~(ATGE_CFG_FULL_DUPLEX | ATGE_CFG_TX_FC | ATGE_CFG_RX_FC |
436 	    ATGE_CFG_SPEED_MASK);
437 
438 	switch (ATGE_MODEL(atgep)) {
439 	case ATGE_CHIP_L1C:
440 		switch (ATGE_DID(atgep)) {
441 		case ATGE_CHIP_AR8151V2_DEV_ID:
442 		case ATGE_CHIP_AR8151V1_DEV_ID:
443 		case ATGE_CHIP_AR8152V2_DEV_ID:
444 			reg |= ATGE_CFG_HASH_ALG_CRC32 | ATGE_CFG_SPEED_MODE_SW;
445 			break;
446 		}
447 		break;
448 	}
449 
450 	speed = mii_get_speed(atgep->atge_mii);
451 	switch (speed) {
452 	case 10:
453 	case 100:
454 		reg |= ATGE_CFG_SPEED_10_100;
455 		break;
456 	case 1000:
457 		reg |= ATGE_CFG_SPEED_1000;
458 		break;
459 	}
460 
461 	ld = mii_get_duplex(atgep->atge_mii);
462 	if (ld == LINK_DUPLEX_FULL)
463 		reg |= ATGE_CFG_FULL_DUPLEX;
464 
465 	/* Re-enable TX/RX MACs */
466 	switch (ATGE_MODEL(atgep)) {
467 	case ATGE_CHIP_L1E:
468 		reg |= ATGE_CFG_TX_ENB | ATGE_CFG_RX_ENB | ATGE_CFG_RX_FC;
469 		break;
470 	case ATGE_CHIP_L1:
471 	case ATGE_CHIP_L1C:
472 		reg |= ATGE_CFG_TX_ENB | ATGE_CFG_RX_ENB;
473 		break;
474 	}
475 
476 	OUTL(atgep, ATGE_MAC_CFG, reg);
477 
478 	switch (ATGE_MODEL(atgep)) {
479 	case ATGE_CHIP_L1E:
480 		reg = ATGE_USECS(ATGE_IM_RX_TIMER_DEFAULT) << IM_TIMER_RX_SHIFT;
481 		reg |= ATGE_USECS(ATGE_IM_TX_TIMER_DEFAULT) <<
482 		    IM_TIMER_TX_SHIFT;
483 		OUTL(atgep, ATGE_IM_TIMER, reg);
484 		break;
485 	case ATGE_CHIP_L1:
486 		break;
487 	case ATGE_CHIP_L1C:
488 		/* Configure interrupt moderation timer. */
489 		reg = ATGE_USECS(atgep->atge_int_rx_mod) << IM_TIMER_RX_SHIFT;
490 		reg |= ATGE_USECS(atgep->atge_int_tx_mod) << IM_TIMER_TX_SHIFT;
491 		OUTL(atgep, ATGE_IM_TIMER, reg);
492 		/*
493 		 * We don't want to automatic interrupt clear as task queue
494 		 * for the interrupt should know interrupt status.
495 		 */
496 		reg = 0;
497 		if (ATGE_USECS(atgep->atge_int_rx_mod) != 0)
498 			reg |= MASTER_IM_RX_TIMER_ENB;
499 		if (ATGE_USECS(atgep->atge_int_tx_mod) != 0)
500 			reg |= MASTER_IM_TX_TIMER_ENB;
501 		OUTL(atgep, ATGE_MASTER_CFG, reg);
502 		break;
503 	}
504 
505 	ATGE_DB(("%s: %s() mac_cfg is : %x",
506 	    atgep->atge_name, __func__, INL(atgep, ATGE_MAC_CFG)));
507 }
508 
509 static void
510 atge_mii_notify(void *arg, link_state_t link)
511 {
512 	atge_t *atgep = arg;
513 
514 	ATGE_DB(("%s: %s() LINK STATUS CHANGED from %x -> %x",
515 	    atgep->atge_name, __func__, atgep->atge_link_state, link));
516 
517 	mac_link_update(atgep->atge_mh, link);
518 
519 	/*
520 	 * Reconfigure MAC if link status is UP now.
521 	 */
522 	mutex_enter(&atgep->atge_tx_lock);
523 	if (link == LINK_STATE_UP) {
524 		atgep->atge_link_state = LINK_STATE_UP;
525 		atge_mac_config(atgep);
526 		atgep->atge_tx_resched = 0;
527 	} else {
528 		atgep->atge_link_state = LINK_STATE_DOWN;
529 		atgep->atge_flags |= ATGE_MII_CHECK;
530 	}
531 
532 	mutex_exit(&atgep->atge_tx_lock);
533 
534 	if (link == LINK_STATE_UP)
535 		mac_tx_update(atgep->atge_mh);
536 }
537 
538 void
539 atge_tx_reclaim(atge_t *atgep, int end)
540 {
541 	atge_tx_desc_t  *txd;
542 	atge_ring_t *r = atgep->atge_tx_ring;
543 	uchar_t *c;
544 	int start;
545 
546 	ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
547 	ASSERT(r != NULL);
548 
549 	start = r->r_consumer;
550 
551 	if (start == end)
552 		return;
553 
554 	while (start != end) {
555 		r->r_avail_desc++;
556 		if (r->r_avail_desc > ATGE_TX_RING_CNT) {
557 
558 			atge_error(atgep->atge_dip,
559 			    "Reclaim : TX descriptor error");
560 
561 			if (r->r_avail_desc > (ATGE_TX_RING_CNT + 5)) {
562 				atge_device_stop(atgep);
563 				break;
564 			}
565 		}
566 
567 		c = (uchar_t *)r->r_desc_ring->addr;
568 		c += (sizeof (atge_tx_desc_t) * start);
569 		txd = (atge_tx_desc_t *)c;
570 
571 		/*
572 		 * Clearing TX descriptor helps in debugging some strange
573 		 * problems.
574 		 */
575 		txd->addr = 0;
576 		txd->len = 0;
577 		txd->flags = 0;
578 
579 		ATGE_INC_SLOT(start, ATGE_TX_RING_CNT);
580 	}
581 
582 	atgep->atge_tx_ring->r_consumer = start;
583 
584 	DMA_SYNC(r->r_desc_ring, 0, ATGE_TX_RING_SZ, DDI_DMA_SYNC_FORDEV);
585 }
586 
587 /*
588  * Adds interrupt handler depending upon the type of interrupt supported by
589  * the chip.
590  */
591 static int
592 atge_add_intr_handler(atge_t *atgep, int intr_type)
593 {
594 	int err;
595 	int count = 0;
596 	int avail = 0;
597 	int i;
598 	int flag;
599 
600 	if (intr_type != DDI_INTR_TYPE_FIXED) {
601 		err = ddi_intr_get_nintrs(atgep->atge_dip, intr_type, &count);
602 		if (err != DDI_SUCCESS) {
603 			atge_error(atgep->atge_dip,
604 			    "ddi_intr_get_nintrs failed : %d", err);
605 			return (DDI_FAILURE);
606 		}
607 
608 		ATGE_DB(("%s: %s() count : %d",
609 		    atgep->atge_name, __func__, count));
610 
611 		err = ddi_intr_get_navail(atgep->atge_dip, intr_type, &avail);
612 		if (err != DDI_SUCCESS) {
613 			atge_error(atgep->atge_dip,
614 			    "ddi_intr_get_navail failed : %d", err);
615 			return (DDI_FAILURE);
616 		}
617 
618 		if (avail < count) {
619 			atge_error(atgep->atge_dip, "count :%d,"
620 			    " avail : %d", count, avail);
621 		}
622 
623 		flag = DDI_INTR_ALLOC_STRICT;
624 	} else {
625 		/*
626 		 * DDI_INTR_TYPE_FIXED case.
627 		 */
628 		count = 1;
629 		avail = 1;
630 		flag = DDI_INTR_ALLOC_NORMAL;
631 	}
632 
633 	atgep->atge_intr_size = avail * sizeof (ddi_intr_handle_t);
634 	atgep->atge_intr_handle = kmem_zalloc(atgep->atge_intr_size, KM_SLEEP);
635 
636 	ATGE_DB(("%s: %s() avail:%d, count : %d, type : %d",
637 	    atgep->atge_name, __func__, avail, count,
638 	    intr_type));
639 
640 	err = ddi_intr_alloc(atgep->atge_dip, atgep->atge_intr_handle,
641 	    intr_type, 0, avail, &atgep->atge_intr_cnt, flag);
642 
643 	if (err != DDI_SUCCESS) {
644 		atge_error(atgep->atge_dip, "ddi_intr_alloc failed : %d", err);
645 		kmem_free(atgep->atge_intr_handle, atgep->atge_intr_size);
646 		return (DDI_FAILURE);
647 	}
648 
649 	ATGE_DB(("%s: atge_add_intr_handler() after alloc count"
650 	    " :%d, avail : %d", atgep->atge_name, count, avail));
651 
652 	err = ddi_intr_get_pri(atgep->atge_intr_handle[0],
653 	    &atgep->atge_intr_pri);
654 	if (err != DDI_SUCCESS) {
655 		atge_error(atgep->atge_dip, "ddi_intr_get_pri failed:%d", err);
656 		for (i = 0; i < atgep->atge_intr_cnt; i++) {
657 			(void) ddi_intr_free(atgep->atge_intr_handle[i]);
658 		}
659 		kmem_free(atgep->atge_intr_handle, atgep->atge_intr_size);
660 
661 		return (DDI_FAILURE);
662 	}
663 
664 	/*
665 	 * Add interrupt handler now.
666 	 */
667 	for (i = 0; i < atgep->atge_intr_cnt; i++) {
668 		switch (ATGE_MODEL(atgep)) {
669 		case ATGE_CHIP_L1E:
670 			err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
671 			    atge_l1e_interrupt, atgep, (caddr_t)(uintptr_t)i);
672 			break;
673 		case ATGE_CHIP_L1:
674 			err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
675 			    atge_l1_interrupt, atgep, (caddr_t)(uintptr_t)i);
676 			break;
677 		case ATGE_CHIP_L1C:
678 			err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
679 			    atge_l1c_interrupt, atgep, (caddr_t)(uintptr_t)i);
680 			break;
681 		}
682 
683 		if (err != DDI_SUCCESS) {
684 			atge_error(atgep->atge_dip,
685 			    "ddi_intr_add_handler failed : %d", err);
686 
687 			(void) ddi_intr_free(atgep->atge_intr_handle[i]);
688 			while (--i >= 0) {
689 				(void) ddi_intr_remove_handler(
690 				    atgep->atge_intr_handle[i]);
691 				(void) ddi_intr_free(
692 				    atgep->atge_intr_handle[i]);
693 			}
694 
695 			kmem_free(atgep->atge_intr_handle,
696 			    atgep->atge_intr_size);
697 
698 			return (DDI_FAILURE);
699 		}
700 	}
701 
702 	err = ddi_intr_get_cap(atgep->atge_intr_handle[0],
703 	    &atgep->atge_intr_cap);
704 
705 	if (err != DDI_SUCCESS) {
706 		atge_error(atgep->atge_dip,
707 		    "ddi_intr_get_cap failed : %d", err);
708 		atge_remove_intr(atgep);
709 		return (DDI_FAILURE);
710 	}
711 
712 	if (intr_type == DDI_INTR_TYPE_FIXED)
713 		atgep->atge_flags |= ATGE_FIXED_TYPE;
714 	else if (intr_type == DDI_INTR_TYPE_MSI)
715 		atgep->atge_flags |= ATGE_MSI_TYPE;
716 	else if (intr_type == DDI_INTR_TYPE_MSIX)
717 		atgep->atge_flags |= ATGE_MSIX_TYPE;
718 
719 	return (DDI_SUCCESS);
720 }
721 
722 void
723 atge_remove_intr(atge_t *atgep)
724 {
725 	int i;
726 	int cap = 0;
727 
728 	if (atgep->atge_intr_handle == NULL)
729 		return;
730 
731 	if (atgep->atge_intr_cap & DDI_INTR_FLAG_BLOCK) {
732 		(void) ddi_intr_block_disable(atgep->atge_intr_handle,
733 		    atgep->atge_intr_cnt);
734 
735 		cap = 1;
736 	}
737 
738 	for (i = 0; i < atgep->atge_intr_cnt; i++) {
739 		if (cap == 0)
740 			(void) ddi_intr_disable(atgep->atge_intr_handle[i]);
741 
742 		(void) ddi_intr_remove_handler(atgep->atge_intr_handle[i]);
743 		(void) ddi_intr_free(atgep->atge_intr_handle[i]);
744 	}
745 
746 	kmem_free(atgep->atge_intr_handle, atgep->atge_intr_size);
747 }
748 
749 int
750 atge_enable_intrs(atge_t *atgep)
751 {
752 	int err;
753 	int i;
754 
755 	if (atgep->atge_intr_cap & DDI_INTR_FLAG_BLOCK) {
756 		/*
757 		 * Do block enable.
758 		 */
759 		err = ddi_intr_block_enable(atgep->atge_intr_handle,
760 		    atgep->atge_intr_cnt);
761 
762 		if (err != DDI_SUCCESS) {
763 			atge_error(atgep->atge_dip,
764 			    "Failed to block enable intrs %d", err);
765 			err = DDI_FAILURE;
766 		} else {
767 			err = DDI_SUCCESS;
768 		}
769 	} else {
770 		/*
771 		 * Call ddi_intr_enable() for MSI non-block enable.
772 		 */
773 		for (i = 0; i < atgep->atge_intr_cnt; i++) {
774 			err = ddi_intr_enable(atgep->atge_intr_handle[i]);
775 			if (err != DDI_SUCCESS) {
776 				atge_error(atgep->atge_dip,
777 				    "Failed to enable intrs on %d with : %d",
778 				    i, err);
779 				break;
780 			}
781 		}
782 
783 		if (err == DDI_SUCCESS)
784 			err = DDI_SUCCESS;
785 		else
786 			err = DDI_FAILURE;
787 	}
788 
789 	return (err);
790 }
791 
792 /*
793  * Adds interrupt handler depending on the supported interrupt type by the
794  * chip.
795  */
796 static int
797 atge_add_intr(atge_t *atgep)
798 {
799 	int	err;
800 
801 	/*
802 	 * Get the supported interrupt types.
803 	 */
804 	err = ddi_intr_get_supported_types(atgep->atge_dip,
805 	    &atgep->atge_intr_types);
806 	if (err != DDI_SUCCESS) {
807 		atge_error(atgep->atge_dip,
808 		    "ddi_intr_get_supported_types failed : %d", err);
809 		return (DDI_FAILURE);
810 	}
811 
812 	ATGE_DB(("%s: ddi_intr_get_supported_types() returned : %d",
813 	    atgep->atge_name, atgep->atge_intr_types));
814 
815 
816 	if (atgep->atge_intr_types & DDI_INTR_TYPE_MSIX) {
817 		err = atge_add_intr_handler(atgep, DDI_INTR_TYPE_MSIX);
818 		if (err == DDI_SUCCESS) {
819 			ATGE_DB(("%s: Using MSIx for interrupt",
820 			    atgep->atge_name));
821 			return (err);
822 		}
823 	}
824 
825 	if (atgep->atge_intr_types & DDI_INTR_TYPE_MSI) {
826 		err = atge_add_intr_handler(atgep, DDI_INTR_TYPE_MSI);
827 		if (err == DDI_SUCCESS) {
828 			ATGE_DB(("%s: Using MSI for interrupt",
829 			    atgep->atge_name));
830 			return (err);
831 		}
832 	}
833 
834 	err = DDI_FAILURE;
835 	if (atgep->atge_intr_types & DDI_INTR_TYPE_FIXED) {
836 		err = atge_add_intr_handler(atgep, DDI_INTR_TYPE_FIXED);
837 		if (err == DDI_SUCCESS) {
838 			ATGE_DB(("%s: Using FIXED type for interrupt",
839 			    atgep->atge_name));
840 			return (err);
841 		}
842 	}
843 
844 	return (err);
845 }
846 
847 int
848 atge_identify_hardware(atge_t *atgep)
849 {
850 	uint16_t vid, did;
851 	int i;
852 
853 	vid = pci_config_get16(atgep->atge_conf_handle, PCI_CONF_VENID);
854 	did = pci_config_get16(atgep->atge_conf_handle, PCI_CONF_DEVID);
855 
856 	atgep->atge_model = 0;
857 	for (i = 0; i < (sizeof (atge_cards) / sizeof (atge_cards_t)); i++) {
858 		if (atge_cards[i].vendor_id == vid &&
859 		    atge_cards[i].device_id == did) {
860 			atgep->atge_model = atge_cards[i].model;
861 			atgep->atge_vid = vid;
862 			atgep->atge_did = did;
863 			atgep->atge_revid =
864 			    pci_config_get8(atgep->atge_conf_handle,
865 			    PCI_CONF_REVID);
866 			atge_notice(atgep->atge_dip, "PCI-ID pci%x,%x,%x: %s",
867 			    vid, did, atgep->atge_revid,
868 			    atge_cards[i].cardname);
869 			ATGE_DB(("%s: %s : PCI-ID pci%x,%x and model : %d",
870 			    atgep->atge_name, __func__, vid, did,
871 			    atgep->atge_model));
872 
873 			return (DDI_SUCCESS);
874 		}
875 	}
876 
877 	atge_error(atgep->atge_dip, "atge driver is attaching to unknown"
878 	    " pci%x,%x vendor/device-id card", vid, did);
879 
880 	/*
881 	 * Assume it's L1C chip.
882 	 */
883 	atgep->atge_model = ATGE_CHIP_L1C;
884 	atgep->atge_vid = vid;
885 	atgep->atge_did = did;
886 	atgep->atge_revid = pci_config_get8(atgep->atge_conf_handle,
887 	    PCI_CONF_REVID);
888 
889 	/*
890 	 * We will leave the decision to caller.
891 	 */
892 	return (DDI_FAILURE);
893 }
894 
895 int
896 atge_get_macaddr(atge_t *atgep)
897 {
898 	uint32_t reg;
899 
900 	reg = INL(atgep, ATGE_SPI_CTRL);
901 	if ((reg & SPI_VPD_ENB) != 0) {
902 		/*
903 		 * Get VPD stored in TWSI EEPROM.
904 		 */
905 		reg &= ~SPI_VPD_ENB;
906 		OUTL(atgep, ATGE_SPI_CTRL, reg);
907 
908 		ATGE_DB(("%s: %s called Get VPD", atgep->atge_name, __func__));
909 	}
910 
911 	atgep->atge_ether_addr[5] = INB(atgep, ATGE_PAR0 + 0);
912 	atgep->atge_ether_addr[4] = INB(atgep, ATGE_PAR0 + 1);
913 	atgep->atge_ether_addr[3] = INB(atgep, ATGE_PAR0 + 2);
914 	atgep->atge_ether_addr[2] = INB(atgep, ATGE_PAR0 + 3);
915 	atgep->atge_ether_addr[1] = INB(atgep, ATGE_PAR1 + 0);
916 	atgep->atge_ether_addr[0] = INB(atgep, ATGE_PAR1 + 1);
917 
918 	ATGE_DB(("%s: %s() Station Address - %x:%x:%x:%x:%x:%x",
919 	    atgep->atge_name, __func__,
920 	    atgep->atge_ether_addr[0],
921 	    atgep->atge_ether_addr[1],
922 	    atgep->atge_ether_addr[2],
923 	    atgep->atge_ether_addr[3],
924 	    atgep->atge_ether_addr[4],
925 	    atgep->atge_ether_addr[5]));
926 
927 	bcopy(atgep->atge_ether_addr, atgep->atge_dev_addr, ETHERADDRL);
928 
929 	return (DDI_SUCCESS);
930 }
931 
932 /*
933  * Reset functionality for L1, L1E, and L1C. It's same.
934  */
935 static void
936 atge_device_reset(atge_t *atgep)
937 {
938 	switch (ATGE_MODEL(atgep)) {
939 	case ATGE_CHIP_L1E:
940 	case ATGE_CHIP_L1:
941 	case ATGE_CHIP_L1C:
942 		atge_device_reset_l1_l1e(atgep);
943 		break;
944 	}
945 }
946 
947 void
948 atge_device_reset_l1_l1e(atge_t *atgep)
949 {
950 	uint32_t reg;
951 	int t;
952 	switch (ATGE_MODEL(atgep)) {
953 	case ATGE_CHIP_L1C:
954 		OUTL(atgep, ATGE_MASTER_CFG, MASTER_RESET | 0x40);
955 		break;
956 	default:
957 		OUTL(atgep, ATGE_MASTER_CFG, MASTER_RESET);
958 		break;
959 	}
960 	reg = INL(atgep, ATGE_MASTER_CFG);
961 	for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
962 		drv_usecwait(10);
963 		reg = INL(atgep, ATGE_MASTER_CFG);
964 		if ((reg & MASTER_RESET) == 0)
965 			break;
966 	}
967 
968 	if (t == 0) {
969 		atge_error(atgep->atge_dip, " master reset timeout reg : %x",
970 		    reg);
971 	}
972 
973 	for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
974 		if ((reg = INL(atgep, ATGE_IDLE_STATUS)) == 0)
975 			break;
976 
977 		drv_usecwait(10);
978 	}
979 
980 	if (t == 0) {
981 		atge_error(atgep->atge_dip, "device reset timeout reg : %x",
982 		    reg);
983 	}
984 
985 	switch (ATGE_MODEL(atgep)) {
986 	case ATGE_CHIP_L1E:
987 	case ATGE_CHIP_L1:
988 		/*
989 		 * Initialize PCIe module. These values came from FreeBSD and
990 		 * we don't know the meaning of it.
991 		 */
992 		OUTL(atgep, ATGE_LTSSM_ID_CFG, 0x6500);
993 		reg = INL(atgep, 0x1008) | 0x8000;
994 		OUTL(atgep, 0x1008, reg);
995 		break;
996 	case ATGE_CHIP_L1C:
997 		break;
998 	}
999 
1000 	/*
1001 	 * Get chip revision.
1002 	 */
1003 	atgep->atge_chip_rev = INL(atgep, ATGE_MASTER_CFG) >>
1004 	    MASTER_CHIP_REV_SHIFT;
1005 
1006 	ATGE_DB(("%s: %s reset successfully rev : %x", atgep->atge_name,
1007 	    __func__, atgep->atge_chip_rev));
1008 }
1009 
1010 /*
1011  * DMA allocation for L1 and L1E is bit different since L1E uses RX pages
1012  * instead of descriptor based RX model.
1013  */
1014 static int
1015 atge_alloc_dma(atge_t *atgep)
1016 {
1017 	int err = DDI_FAILURE;
1018 
1019 	switch (ATGE_MODEL(atgep)) {
1020 	case ATGE_CHIP_L1E:
1021 		err = atge_l1e_alloc_dma(atgep);
1022 		break;
1023 	case ATGE_CHIP_L1:
1024 		err = atge_l1_alloc_dma(atgep);
1025 		break;
1026 	case ATGE_CHIP_L1C:
1027 		err = atge_l1c_alloc_dma(atgep);
1028 		break;
1029 	}
1030 
1031 	return (err);
1032 }
1033 
1034 static void
1035 atge_free_dma(atge_t *atgep)
1036 {
1037 	switch (ATGE_MODEL(atgep)) {
1038 	case ATGE_CHIP_L1E:
1039 		atge_l1e_free_dma(atgep);
1040 		break;
1041 	case ATGE_CHIP_L1:
1042 		atge_l1_free_dma(atgep);
1043 		break;
1044 	case ATGE_CHIP_L1C:
1045 		atge_l1c_free_dma(atgep);
1046 		break;
1047 	}
1048 }
1049 
1050 /*
1051  * Attach entry point in the driver.
1052  */
1053 static int
1054 atge_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
1055 {
1056 	atge_t	*atgep;
1057 	mac_register_t	*macreg;
1058 	int	instance;
1059 	uint16_t cap_ptr;
1060 	uint16_t burst;
1061 	int err;
1062 	mii_ops_t *mii_ops;
1063 
1064 	instance =  ddi_get_instance(devinfo);
1065 
1066 	switch (cmd) {
1067 	case DDI_RESUME:
1068 		return (atge_resume(devinfo));
1069 
1070 	case DDI_ATTACH:
1071 		ddi_set_driver_private(devinfo, NULL);
1072 		break;
1073 	default:
1074 		return (DDI_FAILURE);
1075 
1076 	}
1077 
1078 	atgep = kmem_zalloc(sizeof (atge_t), KM_SLEEP);
1079 	ddi_set_driver_private(devinfo, atgep);
1080 	atgep->atge_dip = devinfo;
1081 
1082 	/*
1083 	 * Setup name and instance number to be used for debugging and
1084 	 * error reporting.
1085 	 */
1086 	(void) snprintf(atgep->atge_name, sizeof (atgep->atge_name), "%s%d",
1087 	    "atge", instance);
1088 
1089 
1090 	/*
1091 	 * Map PCI config space.
1092 	 */
1093 	err = pci_config_setup(devinfo, &atgep->atge_conf_handle);
1094 	if (err != DDI_SUCCESS) {
1095 		atge_error(devinfo, "pci_config_setup() failed");
1096 		goto fail1;
1097 	}
1098 
1099 	(void) atge_identify_hardware(atgep);
1100 
1101 	/*
1102 	 * Map Device registers.
1103 	 */
1104 	err = ddi_regs_map_setup(devinfo, ATGE_PCI_REG_NUMBER,
1105 	    &atgep->atge_io_regs, 0, 0, &atge_dev_attr, &atgep->atge_io_handle);
1106 	if (err != DDI_SUCCESS) {
1107 		atge_error(devinfo, "ddi_regs_map_setup() failed");
1108 		goto fail2;
1109 	}
1110 
1111 	/*
1112 	 * Add interrupt and its associated handler.
1113 	 */
1114 	err = atge_add_intr(atgep);
1115 	if (err != DDI_SUCCESS) {
1116 		atge_error(devinfo, "Failed to add interrupt handler");
1117 		goto fail3;
1118 	}
1119 
1120 	mutex_init(&atgep->atge_intr_lock, NULL, MUTEX_DRIVER,
1121 	    DDI_INTR_PRI(atgep->atge_intr_pri));
1122 
1123 	mutex_init(&atgep->atge_tx_lock, NULL, MUTEX_DRIVER,
1124 	    DDI_INTR_PRI(atgep->atge_intr_pri));
1125 
1126 	mutex_init(&atgep->atge_rx_lock, NULL, MUTEX_DRIVER,
1127 	    DDI_INTR_PRI(atgep->atge_intr_pri));
1128 
1129 	mutex_init(&atgep->atge_mii_lock, NULL, MUTEX_DRIVER, NULL);
1130 
1131 	/*
1132 	 * Used to lock down MBOX register on L1 chip since RX consumer,
1133 	 * TX producer and RX return ring consumer are shared.
1134 	 */
1135 	mutex_init(&atgep->atge_mbox_lock, NULL, MUTEX_DRIVER,
1136 	    DDI_INTR_PRI(atgep->atge_intr_pri));
1137 
1138 	atgep->atge_link_state = LINK_STATE_DOWN;
1139 	atgep->atge_mtu = ETHERMTU;
1140 
1141 	switch (ATGE_MODEL(atgep)) {
1142 	case ATGE_CHIP_L1E:
1143 		if (atgep->atge_revid > 0xF0) {
1144 			/* L2E Rev. B. AR8114 */
1145 			atgep->atge_flags |= ATGE_FLAG_FASTETHER;
1146 		} else {
1147 			if ((INL(atgep, L1E_PHY_STATUS) &
1148 			    PHY_STATUS_100M) != 0) {
1149 				/* L1E AR8121 */
1150 				atgep->atge_flags |= ATGE_FLAG_JUMBO;
1151 			} else {
1152 				/* L2E Rev. A. AR8113 */
1153 				atgep->atge_flags |= ATGE_FLAG_FASTETHER;
1154 			}
1155 		}
1156 		break;
1157 	case ATGE_CHIP_L1:
1158 		break;
1159 	case ATGE_CHIP_L1C:
1160 		/*
1161 		 * One odd thing is AR8132 uses the same PHY hardware(F1
1162 		 * gigabit PHY) of AR8131. So atphy(4) of AR8132 reports
1163 		 * the PHY supports 1000Mbps but that's not true. The PHY
1164 		 * used in AR8132 can't establish gigabit link even if it
1165 		 * shows the same PHY model/revision number of AR8131.
1166 		 *
1167 		 * It seems that AR813x/AR815x has silicon bug for SMB. In
1168 		 * addition, Atheros said that enabling SMB wouldn't improve
1169 		 * performance. However I think it's bad to access lots of
1170 		 * registers to extract MAC statistics.
1171 		 *
1172 		 * Don't use Tx CMB. It is known to have silicon bug.
1173 		 */
1174 		switch (ATGE_DID(atgep)) {
1175 		case ATGE_CHIP_AR8152V2_DEV_ID:
1176 		case ATGE_CHIP_AR8152V1_DEV_ID:
1177 			atgep->atge_flags |= ATGE_FLAG_APS |
1178 			    ATGE_FLAG_FASTETHER |
1179 			    ATGE_FLAG_ASPM_MON | ATGE_FLAG_JUMBO |
1180 			    ATGE_FLAG_SMB_BUG | ATGE_FLAG_CMB_BUG;
1181 			break;
1182 		case ATGE_CHIP_AR8151V2_DEV_ID:
1183 		case ATGE_CHIP_AR8151V1_DEV_ID:
1184 			atgep->atge_flags |= ATGE_FLAG_APS |
1185 			    ATGE_FLAG_ASPM_MON | ATGE_FLAG_JUMBO |
1186 			    ATGE_FLAG_SMB_BUG | ATGE_FLAG_CMB_BUG;
1187 			break;
1188 		case ATGE_CHIP_L1CF_DEV_ID:
1189 			atgep->atge_flags |= ATGE_FLAG_FASTETHER;
1190 			break;
1191 		case ATGE_CHIP_L1CG_DEV_ID:
1192 			break;
1193 		}
1194 		break;
1195 	}
1196 
1197 	/*
1198 	 * Get DMA parameters from PCIe device control register.
1199 	 */
1200 	err = PCI_CAP_LOCATE(atgep->atge_conf_handle, PCI_CAP_ID_PCI_E,
1201 	    &cap_ptr);
1202 
1203 	if (err == DDI_FAILURE) {
1204 		atgep->atge_dma_rd_burst = DMA_CFG_RD_BURST_128;
1205 		atgep->atge_dma_wr_burst = DMA_CFG_WR_BURST_128;
1206 	} else {
1207 		atgep->atge_flags |= ATGE_FLAG_PCIE;
1208 		burst = pci_config_get16(atgep->atge_conf_handle,
1209 		    cap_ptr + 0x08);
1210 
1211 		/*
1212 		 * Max read request size.
1213 		 */
1214 		atgep->atge_dma_rd_burst = ((burst >> 12) & 0x07) <<
1215 		    DMA_CFG_RD_BURST_SHIFT;
1216 
1217 		/*
1218 		 * Max Payload Size.
1219 		 */
1220 		atgep->atge_dma_wr_burst = ((burst >> 5) & 0x07) <<
1221 		    DMA_CFG_WR_BURST_SHIFT;
1222 
1223 		ATGE_DB(("%s: %s() MRR : %d, MPS : %d",
1224 		    atgep->atge_name, __func__,
1225 		    (128 << ((burst >> 12) & 0x07)),
1226 		    (128 << ((burst >> 5) & 0x07))));
1227 	}
1228 
1229 	/* Clear data link and flow-control protocol error. */
1230 	switch (ATGE_MODEL(atgep)) {
1231 	case ATGE_CHIP_L1E:
1232 		break;
1233 	case ATGE_CHIP_L1:
1234 		break;
1235 	case ATGE_CHIP_L1C:
1236 		OUTL_AND(atgep, ATGE_PEX_UNC_ERR_SEV,
1237 		    ~(PEX_UNC_ERR_SEV_UC | PEX_UNC_ERR_SEV_FCP));
1238 		OUTL_AND(atgep, ATGE_LTSSM_ID_CFG, ~LTSSM_ID_WRO_ENB);
1239 		OUTL_OR(atgep, ATGE_PCIE_PHYMISC, PCIE_PHYMISC_FORCE_RCV_DET);
1240 		break;
1241 	}
1242 
1243 	/*
1244 	 * Allocate DMA resources.
1245 	 */
1246 	err = atge_alloc_dma(atgep);
1247 	if (err != DDI_SUCCESS) {
1248 		atge_error(devinfo, "Failed to allocate DMA resources");
1249 		goto fail4;
1250 	}
1251 
1252 	/*
1253 	 * Get station address.
1254 	 */
1255 	(void) atge_get_macaddr(atgep);
1256 
1257 	/*
1258 	 * Setup MII.
1259 	 */
1260 	switch (ATGE_MODEL(atgep)) {
1261 	case ATGE_CHIP_L1E:
1262 		mii_ops = &atge_l1e_mii_ops;
1263 		break;
1264 	case ATGE_CHIP_L1:
1265 		mii_ops = &atge_l1_mii_ops;
1266 		break;
1267 	case ATGE_CHIP_L1C:
1268 		mii_ops = &atge_l1c_mii_ops;
1269 		break;
1270 	}
1271 
1272 	if ((atgep->atge_mii = mii_alloc(atgep, devinfo,
1273 	    mii_ops)) == NULL) {
1274 		atge_error(devinfo, "mii_alloc() failed");
1275 		goto fail4;
1276 	}
1277 
1278 	/*
1279 	 * Register with MAC layer.
1280 	 */
1281 	if ((macreg = mac_alloc(MAC_VERSION)) == NULL) {
1282 		atge_error(devinfo, "mac_alloc() failed due to version");
1283 		goto fail4;
1284 	}
1285 
1286 	macreg->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
1287 	macreg->m_driver = atgep;
1288 	macreg->m_dip = devinfo;
1289 	macreg->m_instance = instance;
1290 	macreg->m_src_addr = atgep->atge_ether_addr;
1291 	macreg->m_callbacks = &atge_m_callbacks;
1292 	macreg->m_min_sdu = 0;
1293 	macreg->m_max_sdu = atgep->atge_mtu;
1294 	macreg->m_margin = VLAN_TAGSZ;
1295 
1296 	if ((err = mac_register(macreg, &atgep->atge_mh)) != 0) {
1297 		atge_error(devinfo, "mac_register() failed with :%d", err);
1298 		mac_free(macreg);
1299 		goto fail4;
1300 	}
1301 
1302 	mac_free(macreg);
1303 
1304 	ATGE_DB(("%s: %s() driver attached successfully",
1305 	    atgep->atge_name, __func__));
1306 
1307 	atge_device_reset(atgep);
1308 
1309 	atgep->atge_chip_state = ATGE_CHIP_INITIALIZED;
1310 
1311 	/*
1312 	 * At last - enable interrupts.
1313 	 */
1314 	err = atge_enable_intrs(atgep);
1315 	if (err == DDI_FAILURE) {
1316 		goto fail5;
1317 	}
1318 
1319 	/*
1320 	 * Reset the PHY before starting.
1321 	 */
1322 	switch (ATGE_MODEL(atgep)) {
1323 	case ATGE_CHIP_L1E:
1324 		atge_l1e_mii_reset(atgep);
1325 		break;
1326 	case ATGE_CHIP_L1:
1327 		atge_l1_mii_reset(atgep);
1328 		break;
1329 	case ATGE_CHIP_L1C:
1330 		atge_l1c_mii_reset(atgep);
1331 		break;
1332 	}
1333 
1334 	/*
1335 	 * Let the PHY run.
1336 	 */
1337 	mii_start(atgep->atge_mii);
1338 
1339 	return (DDI_SUCCESS);
1340 
1341 fail5:
1342 	(void) mac_unregister(atgep->atge_mh);
1343 	atge_device_stop(atgep);
1344 	mii_stop(atgep->atge_mii);
1345 	mii_free(atgep->atge_mii);
1346 fail4:
1347 	atge_free_dma(atgep);
1348 	mutex_destroy(&atgep->atge_intr_lock);
1349 	mutex_destroy(&atgep->atge_tx_lock);
1350 	mutex_destroy(&atgep->atge_rx_lock);
1351 	atge_remove_intr(atgep);
1352 fail3:
1353 	ddi_regs_map_free(&atgep->atge_io_handle);
1354 fail2:
1355 	pci_config_teardown(&atgep->atge_conf_handle);
1356 fail1:
1357 	kmem_free(atgep, sizeof (atge_t));
1358 	return (DDI_FAILURE);
1359 }
1360 
1361 static int
1362 atge_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
1363 {
1364 	atge_t	*atgep;
1365 
1366 	atgep = ddi_get_driver_private(dip);
1367 	if (atgep == NULL) {
1368 		atge_error(dip, "No soft state in detach");
1369 		return (DDI_FAILURE);
1370 	}
1371 
1372 	switch (cmd) {
1373 	case DDI_DETACH:
1374 
1375 		/*
1376 		 * First unregister with MAC layer before stopping DMA
1377 		 */
1378 		if (mac_disable(atgep->atge_mh) != DDI_SUCCESS)
1379 			return (DDI_FAILURE);
1380 
1381 		mii_stop(atgep->atge_mii);
1382 
1383 		mutex_enter(&atgep->atge_intr_lock);
1384 		mutex_enter(&atgep->atge_tx_lock);
1385 		atge_device_stop(atgep);
1386 		mutex_exit(&atgep->atge_tx_lock);
1387 		mutex_exit(&atgep->atge_intr_lock);
1388 
1389 		mii_free(atgep->atge_mii);
1390 		atge_free_dma(atgep);
1391 
1392 		ddi_regs_map_free(&atgep->atge_io_handle);
1393 		atge_remove_intr(atgep);
1394 		pci_config_teardown(&atgep->atge_conf_handle);
1395 
1396 		(void) mac_unregister(atgep->atge_mh);
1397 		mutex_destroy(&atgep->atge_intr_lock);
1398 		mutex_destroy(&atgep->atge_tx_lock);
1399 		mutex_destroy(&atgep->atge_rx_lock);
1400 		kmem_free(atgep, sizeof (atge_t));
1401 		ddi_set_driver_private(dip, NULL);
1402 
1403 		return (DDI_SUCCESS);
1404 
1405 	case DDI_SUSPEND:
1406 		ATGE_DB(("%s: %s() is being suspended",
1407 		    atgep->atge_name, __func__));
1408 
1409 		/*
1410 		 * Suspend monitoring MII.
1411 		 */
1412 		mii_suspend(atgep->atge_mii);
1413 
1414 		mutex_enter(&atgep->atge_intr_lock);
1415 		mutex_enter(&atgep->atge_tx_lock);
1416 		atgep->atge_chip_state |= ATGE_CHIP_SUSPENDED;
1417 		atge_device_stop(atgep);
1418 		mutex_exit(&atgep->atge_tx_lock);
1419 		mutex_exit(&atgep->atge_intr_lock);
1420 
1421 		return (DDI_SUCCESS);
1422 
1423 	default:
1424 		return (DDI_FAILURE);
1425 	}
1426 }
1427 
1428 int
1429 atge_alloc_buffers(atge_ring_t *r, size_t rcnt, size_t buflen, int f)
1430 {
1431 	atge_dma_t *dma;
1432 	atge_dma_t **tbl;
1433 	int err = DDI_SUCCESS;
1434 	int i;
1435 
1436 	tbl = kmem_zalloc(rcnt * sizeof (atge_dma_t *), KM_SLEEP);
1437 	r->r_buf_tbl = tbl;
1438 
1439 	for (i = 0; i < rcnt; i++) {
1440 		dma = atge_buf_alloc(r->r_atge, buflen, f);
1441 		if (dma == NULL) {
1442 			err = DDI_FAILURE;
1443 			break;
1444 		}
1445 
1446 		tbl[i] = dma;
1447 	}
1448 
1449 	return (err);
1450 }
1451 
1452 void
1453 atge_free_buffers(atge_ring_t *r, size_t rcnt)
1454 {
1455 	atge_dma_t **tbl;
1456 	int i;
1457 
1458 	if (r == NULL || r->r_buf_tbl == NULL)
1459 		return;
1460 
1461 	tbl = r->r_buf_tbl;
1462 	for (i = 0; i < rcnt; i++)  {
1463 		if (tbl[i] != NULL) {
1464 			atge_buf_free(tbl[i]);
1465 		}
1466 	}
1467 
1468 	kmem_free(tbl, rcnt * sizeof (atge_dma_t *));
1469 }
1470 
1471 atge_dma_t *
1472 atge_alloc_a_dma_blk(atge_t *atgep, ddi_dma_attr_t *attr, int size, int d)
1473 {
1474 	int err;
1475 	atge_dma_t *dma;
1476 
1477 	dma = kmem_zalloc(sizeof (atge_dma_t), KM_SLEEP);
1478 
1479 	err = ddi_dma_alloc_handle(atgep->atge_dip, attr,
1480 	    DDI_DMA_SLEEP, NULL, &dma->hdl);
1481 
1482 	if (err != DDI_SUCCESS) {
1483 		atge_error(atgep->atge_dip, "%s() : failed"
1484 		    " in ddi_dma_alloc_handle() : %d", __func__, err);
1485 		goto fail;
1486 	}
1487 
1488 	err = ddi_dma_mem_alloc(dma->hdl,
1489 	    size, &atge_buf_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
1490 	    &dma->addr, &dma->len, &dma->acchdl);
1491 
1492 	if (err != DDI_SUCCESS) {
1493 		atge_error(atgep->atge_dip, "%s() : failed"
1494 		    " in ddi_dma_mem_alloc() : %d", __func__, err);
1495 		ddi_dma_free_handle(&dma->hdl);
1496 		goto fail;
1497 	}
1498 
1499 	err = ddi_dma_addr_bind_handle(dma->hdl, NULL, dma->addr,
1500 	    dma->len, d | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
1501 	    NULL, &dma->cookie, &dma->count);
1502 
1503 	if (err != DDI_SUCCESS) {
1504 		atge_error(atgep->atge_dip, "%s() : failed"
1505 		    " in ddi_dma_addr_bind_handle() : %d", __func__, err);
1506 		ddi_dma_mem_free(&dma->acchdl);
1507 		ddi_dma_free_handle(&dma->hdl);
1508 		goto fail;
1509 	}
1510 
1511 	return (dma);
1512 fail:
1513 	kmem_free(dma, sizeof (atge_dma_t));
1514 	return (NULL);
1515 }
1516 
1517 void
1518 atge_free_a_dma_blk(atge_dma_t *dma)
1519 {
1520 	if (dma != NULL) {
1521 		(void) ddi_dma_unbind_handle(dma->hdl);
1522 		ddi_dma_mem_free(&dma->acchdl);
1523 		ddi_dma_free_handle(&dma->hdl);
1524 		kmem_free(dma, sizeof (atge_dma_t));
1525 	}
1526 }
1527 
1528 atge_dma_t *
1529 atge_buf_alloc(atge_t *atgep, size_t len, int f)
1530 {
1531 	atge_dma_t *dma = NULL;
1532 	int err;
1533 
1534 	dma = kmem_zalloc(sizeof (atge_dma_t), KM_SLEEP);
1535 
1536 	err = ddi_dma_alloc_handle(atgep->atge_dip, &atge_dma_attr_buf,
1537 	    DDI_DMA_SLEEP, NULL, &dma->hdl);
1538 
1539 	if (err != DDI_SUCCESS) {
1540 		atge_error(atgep->atge_dip, "%s() : failed"
1541 		    " in %s() : %d", __func__, err);
1542 		goto fail;
1543 	}
1544 
1545 	err = ddi_dma_mem_alloc(dma->hdl, len, &atge_buf_attr,
1546 	    DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &dma->addr,
1547 	    &dma->len, &dma->acchdl);
1548 
1549 	if (err != DDI_SUCCESS) {
1550 		atge_error(atgep->atge_dip, "%s() : failed"
1551 		    " in %s() : %d", __func__, err);
1552 		ddi_dma_free_handle(&dma->hdl);
1553 		goto fail;
1554 	}
1555 
1556 	err = ddi_dma_addr_bind_handle(dma->hdl, NULL, dma->addr, dma->len,
1557 	    (f | DDI_DMA_CONSISTENT), DDI_DMA_SLEEP, NULL, &dma->cookie,
1558 	    &dma->count);
1559 
1560 	if (err != DDI_SUCCESS) {
1561 		atge_error(atgep->atge_dip, "%s() : failed"
1562 		    " in %s() : %d", __func__, err);
1563 		ddi_dma_mem_free(&dma->acchdl);
1564 		ddi_dma_free_handle(&dma->hdl);
1565 		goto fail;
1566 	}
1567 
1568 	/*
1569 	 * Number of return'ed cookie should be one.
1570 	 */
1571 	ASSERT(dma->count == 1);
1572 
1573 	return (dma);
1574 fail:
1575 	kmem_free(dma, sizeof (atge_dma_t));
1576 	return (NULL);
1577 }
1578 
1579 void
1580 atge_buf_free(atge_dma_t *dma)
1581 {
1582 	ASSERT(dma != NULL);
1583 
1584 	(void) ddi_dma_unbind_handle(dma->hdl);
1585 	ddi_dma_mem_free(&dma->acchdl);
1586 	ddi_dma_free_handle(&dma->hdl);
1587 	kmem_free(dma, sizeof (atge_dma_t));
1588 }
1589 
1590 static int
1591 atge_resume(dev_info_t *dip)
1592 {
1593 	atge_t	*atgep;
1594 
1595 	if ((atgep = ddi_get_driver_private(dip)) == NULL) {
1596 		return (DDI_FAILURE);
1597 	}
1598 
1599 	mutex_enter(&atgep->atge_intr_lock);
1600 	mutex_enter(&atgep->atge_tx_lock);
1601 
1602 	atgep->atge_chip_state &= ~ATGE_CHIP_SUSPENDED;
1603 
1604 	if (atgep->atge_chip_state & ATGE_CHIP_RUNNING) {
1605 		atge_device_restart(atgep);
1606 	} else {
1607 		atge_device_reset(atgep);
1608 	}
1609 
1610 	mutex_exit(&atgep->atge_tx_lock);
1611 	mutex_exit(&atgep->atge_intr_lock);
1612 
1613 	/*
1614 	 * Reset the PHY before resuming MII.
1615 	 */
1616 	switch (ATGE_MODEL(atgep)) {
1617 	case ATGE_CHIP_L1E:
1618 		atge_l1e_mii_reset(atgep);
1619 		break;
1620 	case ATGE_CHIP_L1:
1621 		break;
1622 	case ATGE_CHIP_L1C:
1623 		break;
1624 	}
1625 
1626 	mii_resume(atgep->atge_mii);
1627 
1628 	/* kick-off downstream */
1629 	mac_tx_update(atgep->atge_mh);
1630 
1631 	return (DDI_SUCCESS);
1632 }
1633 
1634 static int
1635 atge_quiesce(dev_info_t *dip)
1636 {
1637 	atge_t	*atgep;
1638 
1639 	if ((atgep = ddi_get_driver_private(dip)) == NULL) {
1640 		return (DDI_FAILURE);
1641 	}
1642 
1643 	atge_device_stop(atgep);
1644 
1645 	return (DDI_SUCCESS);
1646 }
1647 
1648 void
1649 atge_add_multicst(atge_t *atgep, uint8_t *macaddr)
1650 {
1651 	uint32_t crc;
1652 	int bit;
1653 
1654 	ASSERT(MUTEX_HELD(&atgep->atge_intr_lock));
1655 	ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
1656 
1657 	ATGE_DB(("%s: %s() %x:%x:%x:%x:%x:%x",
1658 	    atgep->atge_name, __func__, macaddr[0], macaddr[1], macaddr[2],
1659 	    macaddr[3], macaddr[4], macaddr[5]));
1660 
1661 	crc = atge_ether_crc(macaddr, ETHERADDRL);
1662 	bit = (crc >> 26);
1663 	atgep->atge_mchash_ref_cnt[bit]++;
1664 	atgep->atge_mchash |= (1ULL << (crc >> 26));
1665 
1666 	ATGE_DB(("%s: %s() mchash :%llx, bit : %d,"
1667 	    " atge_mchash_ref_cnt[bit] :%d",
1668 	    atgep->atge_name, __func__, atgep->atge_mchash, bit,
1669 	    atgep->atge_mchash_ref_cnt[bit]));
1670 }
1671 
1672 void
1673 atge_remove_multicst(atge_t *atgep, uint8_t *macaddr)
1674 {
1675 	uint32_t crc;
1676 	int bit;
1677 
1678 	ASSERT(MUTEX_HELD(&atgep->atge_intr_lock));
1679 	ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
1680 
1681 	ATGE_DB(("%s: %s() %x:%x:%x:%x:%x:%x",
1682 	    atgep->atge_name, __func__, macaddr[0], macaddr[1], macaddr[2],
1683 	    macaddr[3], macaddr[4], macaddr[5]));
1684 
1685 	crc = atge_ether_crc(macaddr, ETHERADDRL);
1686 	bit = (crc >> 26);
1687 	atgep->atge_mchash_ref_cnt[bit]--;
1688 	if (atgep->atge_mchash_ref_cnt[bit] == 0)
1689 		atgep->atge_mchash &= ~(1ULL << (crc >> 26));
1690 
1691 	ATGE_DB(("%s: %s() mchash :%llx, bit : %d,"
1692 	    " atge_mchash_ref_cnt[bit] :%d",
1693 	    atgep->atge_name, __func__, atgep->atge_mchash, bit,
1694 	    atgep->atge_mchash_ref_cnt[bit]));
1695 }
1696 
1697 int
1698 atge_m_multicst(void *arg, boolean_t add, const uint8_t *macaddr)
1699 {
1700 	atge_t *atgep = arg;
1701 
1702 	mutex_enter(&atgep->atge_intr_lock);
1703 	mutex_enter(&atgep->atge_tx_lock);
1704 
1705 	if (add) {
1706 		atge_add_multicst(atgep, (uint8_t *)macaddr);
1707 	} else {
1708 		atge_remove_multicst(atgep, (uint8_t *)macaddr);
1709 	}
1710 
1711 	atge_rxfilter(atgep);
1712 
1713 	mutex_exit(&atgep->atge_tx_lock);
1714 	mutex_exit(&atgep->atge_intr_lock);
1715 
1716 	return (0);
1717 }
1718 
1719 int
1720 atge_m_promisc(void *arg, boolean_t on)
1721 {
1722 	atge_t *atgep = arg;
1723 
1724 	mutex_enter(&atgep->atge_intr_lock);
1725 	mutex_enter(&atgep->atge_tx_lock);
1726 
1727 	if (on) {
1728 		atgep->atge_filter_flags |= ATGE_PROMISC;
1729 	} else {
1730 		atgep->atge_filter_flags &= ~ATGE_PROMISC;
1731 	}
1732 
1733 	if (atgep->atge_chip_state & ATGE_CHIP_RUNNING) {
1734 		atge_rxfilter(atgep);
1735 	}
1736 
1737 	mutex_exit(&atgep->atge_tx_lock);
1738 	mutex_exit(&atgep->atge_intr_lock);
1739 
1740 	return (0);
1741 }
1742 
1743 int
1744 atge_m_unicst(void *arg, const uint8_t *macaddr)
1745 {
1746 	atge_t *atgep = arg;
1747 
1748 	mutex_enter(&atgep->atge_intr_lock);
1749 	mutex_enter(&atgep->atge_tx_lock);
1750 	bcopy(macaddr, atgep->atge_ether_addr, ETHERADDRL);
1751 	atge_program_ether(atgep);
1752 	atge_rxfilter(atgep);
1753 	mutex_exit(&atgep->atge_tx_lock);
1754 	mutex_exit(&atgep->atge_intr_lock);
1755 
1756 	return (0);
1757 }
1758 
1759 mblk_t *
1760 atge_m_tx(void *arg, mblk_t *mp)
1761 {
1762 	atge_t *atgep = arg;
1763 	mblk_t	*nmp;
1764 
1765 	mutex_enter(&atgep->atge_tx_lock);
1766 
1767 	/*
1768 	 * This NIC does not like us to send pkt when link is down.
1769 	 */
1770 	if (!(atgep->atge_link_state & LINK_STATE_UP)) {
1771 		atgep->atge_tx_resched = 1;
1772 
1773 		mutex_exit(&atgep->atge_tx_lock);
1774 		return (mp);
1775 	}
1776 
1777 	/*
1778 	 * Don't send a pkt if chip isn't running or in suspended state.
1779 	 */
1780 	if ((atgep->atge_chip_state & ATGE_CHIP_RUNNING) == 0 ||
1781 	    atgep->atge_chip_state & ATGE_CHIP_SUSPENDED) {
1782 		atgep->atge_carrier_errors++;
1783 		atgep->atge_tx_resched = 1;
1784 
1785 		mutex_exit(&atgep->atge_tx_lock);
1786 		return (mp);
1787 	}
1788 
1789 	while (mp != NULL) {
1790 		nmp = mp->b_next;
1791 		mp->b_next = NULL;
1792 
1793 		if (atge_send_a_packet(atgep, mp) == DDI_FAILURE) {
1794 			mp->b_next = nmp;
1795 			break;
1796 		}
1797 
1798 		mp = nmp;
1799 	}
1800 
1801 	mutex_exit(&atgep->atge_tx_lock);
1802 	return (mp);
1803 }
1804 
1805 int
1806 atge_m_start(void *arg)
1807 {
1808 	atge_t *atgep = arg;
1809 	int started = 0;
1810 
1811 	ASSERT(atgep != NULL);
1812 
1813 
1814 	mii_stop(atgep->atge_mii);
1815 
1816 	mutex_enter(&atgep->atge_intr_lock);
1817 	mutex_enter(&atgep->atge_tx_lock);
1818 
1819 	if (!(atgep->atge_chip_state & ATGE_CHIP_SUSPENDED)) {
1820 		atge_device_restart(atgep);
1821 		started = 1;
1822 	}
1823 
1824 	mutex_exit(&atgep->atge_tx_lock);
1825 	mutex_exit(&atgep->atge_intr_lock);
1826 
1827 	mii_start(atgep->atge_mii);
1828 
1829 	/* kick-off downstream */
1830 	if (started)
1831 		mac_tx_update(atgep->atge_mh);
1832 
1833 	return (0);
1834 }
1835 
1836 void
1837 atge_m_stop(void *arg)
1838 {
1839 	atge_t *atgep = arg;
1840 
1841 	mii_stop(atgep->atge_mii);
1842 
1843 	/*
1844 	 * Cancel any pending I/O.
1845 	 */
1846 	mutex_enter(&atgep->atge_intr_lock);
1847 	atgep->atge_chip_state &= ~ATGE_CHIP_RUNNING;
1848 	if (!(atgep->atge_chip_state & ATGE_CHIP_SUSPENDED))
1849 		atge_device_stop(atgep);
1850 	mutex_exit(&atgep->atge_intr_lock);
1851 }
1852 
1853 int
1854 atge_m_stat(void *arg, uint_t stat, uint64_t *val)
1855 {
1856 	atge_t *atgep = arg;
1857 
1858 	if (mii_m_getstat(atgep->atge_mii, stat, val) == 0) {
1859 		return (0);
1860 	}
1861 
1862 	switch (stat) {
1863 	case MAC_STAT_MULTIRCV:
1864 		*val = atgep->atge_multircv;
1865 		break;
1866 
1867 	case MAC_STAT_BRDCSTRCV:
1868 		*val = atgep->atge_brdcstrcv;
1869 		break;
1870 
1871 	case MAC_STAT_MULTIXMT:
1872 		*val = atgep->atge_multixmt;
1873 		break;
1874 
1875 	case MAC_STAT_BRDCSTXMT:
1876 		*val = atgep->atge_brdcstxmt;
1877 		break;
1878 
1879 	case MAC_STAT_IPACKETS:
1880 		*val = atgep->atge_ipackets;
1881 		break;
1882 
1883 	case MAC_STAT_RBYTES:
1884 		*val = atgep->atge_rbytes;
1885 		break;
1886 
1887 	case MAC_STAT_OPACKETS:
1888 		*val = atgep->atge_opackets;
1889 		break;
1890 
1891 	case MAC_STAT_OBYTES:
1892 		*val = atgep->atge_obytes;
1893 		break;
1894 
1895 	case MAC_STAT_NORCVBUF:
1896 		*val = atgep->atge_norcvbuf;
1897 		break;
1898 
1899 	case MAC_STAT_NOXMTBUF:
1900 		*val = 0;
1901 		break;
1902 
1903 	case MAC_STAT_COLLISIONS:
1904 		*val = atgep->atge_collisions;
1905 		break;
1906 
1907 	case MAC_STAT_IERRORS:
1908 		*val = atgep->atge_errrcv;
1909 		break;
1910 
1911 	case MAC_STAT_OERRORS:
1912 		*val = atgep->atge_errxmt;
1913 		break;
1914 
1915 	case ETHER_STAT_ALIGN_ERRORS:
1916 		*val = atgep->atge_align_errors;
1917 		break;
1918 
1919 	case ETHER_STAT_FCS_ERRORS:
1920 		*val = atgep->atge_fcs_errors;
1921 		break;
1922 
1923 	case ETHER_STAT_SQE_ERRORS:
1924 		*val = atgep->atge_sqe_errors;
1925 		break;
1926 
1927 	case ETHER_STAT_DEFER_XMTS:
1928 		*val = atgep->atge_defer_xmts;
1929 		break;
1930 
1931 	case ETHER_STAT_FIRST_COLLISIONS:
1932 		*val = atgep->atge_first_collisions;
1933 		break;
1934 
1935 	case ETHER_STAT_MULTI_COLLISIONS:
1936 		*val = atgep->atge_multi_collisions;
1937 		break;
1938 
1939 	case ETHER_STAT_TX_LATE_COLLISIONS:
1940 		*val = atgep->atge_tx_late_collisions;
1941 		break;
1942 
1943 	case ETHER_STAT_EX_COLLISIONS:
1944 		*val = atgep->atge_ex_collisions;
1945 		break;
1946 
1947 	case ETHER_STAT_MACXMT_ERRORS:
1948 		*val = atgep->atge_macxmt_errors;
1949 		break;
1950 
1951 	case ETHER_STAT_CARRIER_ERRORS:
1952 		*val = atgep->atge_carrier_errors;
1953 		break;
1954 
1955 	case ETHER_STAT_TOOLONG_ERRORS:
1956 		*val = atgep->atge_toolong_errors;
1957 		break;
1958 
1959 	case ETHER_STAT_MACRCV_ERRORS:
1960 		*val = atgep->atge_macrcv_errors;
1961 		break;
1962 
1963 	case MAC_STAT_OVERFLOWS:
1964 		*val = atgep->atge_overflow;
1965 		break;
1966 
1967 	case MAC_STAT_UNDERFLOWS:
1968 		*val = atgep->atge_underflow;
1969 		break;
1970 
1971 	case ETHER_STAT_TOOSHORT_ERRORS:
1972 		*val = atgep->atge_runt;
1973 		break;
1974 
1975 	case ETHER_STAT_JABBER_ERRORS:
1976 		*val = atgep->atge_jabber;
1977 		break;
1978 
1979 	default:
1980 		return (ENOTSUP);
1981 	}
1982 
1983 	return (0);
1984 }
1985 
1986 int
1987 atge_m_getprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz,
1988     void *val)
1989 {
1990 	atge_t *atgep = arg;
1991 
1992 	return (mii_m_getprop(atgep->atge_mii, name, num, sz, val));
1993 }
1994 
1995 int
1996 atge_m_setprop(void *arg, const char *name, mac_prop_id_t num, uint_t sz,
1997     const void *val)
1998 {
1999 	atge_t *atgep = arg;
2000 	int r;
2001 
2002 	r = mii_m_setprop(atgep->atge_mii, name, num, sz, val);
2003 
2004 	if (r == 0) {
2005 		mutex_enter(&atgep->atge_intr_lock);
2006 		mutex_enter(&atgep->atge_tx_lock);
2007 
2008 		if (atgep->atge_chip_state & ATGE_CHIP_RUNNING) {
2009 			atge_device_restart(atgep);
2010 		}
2011 
2012 		mutex_exit(&atgep->atge_tx_lock);
2013 		mutex_exit(&atgep->atge_intr_lock);
2014 	}
2015 
2016 	return (r);
2017 }
2018 
2019 static void
2020 atge_m_propinfo(void *arg, const char *name, mac_prop_id_t num,
2021     mac_prop_info_handle_t prh)
2022 {
2023 	atge_t *atgep = arg;
2024 
2025 	mii_m_propinfo(atgep->atge_mii, name, num, prh);
2026 }
2027 
2028 void
2029 atge_program_ether(atge_t *atgep)
2030 {
2031 	ether_addr_t e;
2032 
2033 	/*
2034 	 * Reprogram the Station address.
2035 	 */
2036 	bcopy(atgep->atge_ether_addr, e, ETHERADDRL);
2037 	OUTL(atgep, ATGE_PAR0,
2038 	    ((e[2] << 24) | (e[3] << 16) | (e[4] << 8) | e[5]));
2039 	OUTL(atgep, ATGE_PAR1, (e[0] << 8) | e[1]);
2040 }
2041 
2042 /*
2043  * Device specific operations.
2044  */
2045 void
2046 atge_device_start(atge_t *atgep)
2047 {
2048 	uint32_t rxf_hi, rxf_lo, rrd_hi, rrd_lo;
2049 	uint32_t reg;
2050 	uint32_t fsize;
2051 
2052 	/*
2053 	 * Reprogram the Station address.
2054 	 */
2055 	atge_program_ether(atgep);
2056 
2057 	switch (ATGE_MODEL(atgep)) {
2058 	case ATGE_CHIP_L1E:
2059 		atge_l1e_program_dma(atgep);
2060 		break;
2061 	case ATGE_CHIP_L1:
2062 		atge_l1_program_dma(atgep);
2063 		break;
2064 	case ATGE_CHIP_L1C:
2065 		atge_l1c_program_dma(atgep);
2066 		break;
2067 	}
2068 
2069 	ATGE_DB(("%s: %s() dma, counters programmed ", atgep->atge_name,
2070 	    __func__));
2071 
2072 	switch (ATGE_MODEL(atgep)) {
2073 	case ATGE_CHIP_L1E:
2074 	case ATGE_CHIP_L1:
2075 		OUTW(atgep, ATGE_INTR_CLR_TIMER, 1*1000/2);
2076 		break;
2077 	case ATGE_CHIP_L1C:
2078 		/*
2079 		 * Disable interrupt re-trigger timer. We don't want automatic
2080 		 * re-triggering of un-ACKed interrupts.
2081 		 */
2082 		OUTL(atgep, ATGE_INTR_RETRIG_TIMER, ATGE_USECS(0));
2083 		/* Configure CMB. */
2084 		OUTL(atgep, ATGE_CMB_TX_TIMER, ATGE_USECS(0));
2085 		/*
2086 		 * Hardware can be configured to issue SMB interrupt based
2087 		 * on programmed interval. Since there is a callout that is
2088 		 * invoked for every hz in driver we use that instead of
2089 		 * relying on periodic SMB interrupt.
2090 		 */
2091 		OUTL(atgep, ATGE_SMB_STAT_TIMER, ATGE_USECS(0));
2092 		/* Clear MAC statistics. */
2093 		atge_l1c_clear_stats(atgep);
2094 		break;
2095 	}
2096 
2097 	/*
2098 	 * Set Maximum frame size but don't let MTU be less than ETHER_MTU.
2099 	 */
2100 	if (atgep->atge_mtu < ETHERMTU)
2101 		atgep->atge_max_frame_size = ETHERMTU;
2102 	else
2103 		atgep->atge_max_frame_size = atgep->atge_mtu;
2104 
2105 	atgep->atge_max_frame_size += sizeof (struct ether_header) +
2106 	    VLAN_TAGSZ + ETHERFCSL;
2107 	OUTL(atgep, ATGE_FRAME_SIZE, atgep->atge_max_frame_size);
2108 
2109 	switch (ATGE_MODEL(atgep)) {
2110 	case ATGE_CHIP_L1E:
2111 		break;
2112 	case ATGE_CHIP_L1:
2113 		break;
2114 	case ATGE_CHIP_L1C:
2115 		/* Disable header split(?) */
2116 		OUTL(atgep, ATGE_HDS_CFG, 0);
2117 		break;
2118 	}
2119 
2120 	/*
2121 	 * Configure IPG/IFG parameters.
2122 	 */
2123 	OUTL(atgep, ATGE_IPG_IFG_CFG,
2124 	    ((IPG_IFG_IPG2_DEFAULT << IPG_IFG_IPG2_SHIFT) & IPG_IFG_IPG2_MASK) |
2125 	    ((IPG_IFG_IPG1_DEFAULT << IPG_IFG_IPG1_SHIFT) & IPG_IFG_IPG1_MASK) |
2126 	    ((IPG_IFG_MIFG_DEFAULT << IPG_IFG_MIFG_SHIFT) & IPG_IFG_MIFG_MASK) |
2127 	    ((IPG_IFG_IPGT_DEFAULT << IPG_IFG_IPGT_SHIFT) & IPG_IFG_IPGT_MASK));
2128 
2129 	/*
2130 	 * Set parameters for half-duplex media.
2131 	 */
2132 	OUTL(atgep, ATGE_HDPX_CFG,
2133 	    ((HDPX_CFG_LCOL_DEFAULT << HDPX_CFG_LCOL_SHIFT) &
2134 	    HDPX_CFG_LCOL_MASK) |
2135 	    ((HDPX_CFG_RETRY_DEFAULT << HDPX_CFG_RETRY_SHIFT) &
2136 	    HDPX_CFG_RETRY_MASK) | HDPX_CFG_EXC_DEF_EN |
2137 	    ((HDPX_CFG_ABEBT_DEFAULT << HDPX_CFG_ABEBT_SHIFT) &
2138 	    HDPX_CFG_ABEBT_MASK) |
2139 	    ((HDPX_CFG_JAMIPG_DEFAULT << HDPX_CFG_JAMIPG_SHIFT) &
2140 	    HDPX_CFG_JAMIPG_MASK));
2141 
2142 	/*
2143 	 * Configure jumbo frame.
2144 	 */
2145 	switch (ATGE_MODEL(atgep)) {
2146 	case ATGE_CHIP_L1E:
2147 		if (atgep->atge_flags & ATGE_FLAG_JUMBO) {
2148 
2149 			if (atgep->atge_mtu < ETHERMTU)
2150 				reg = atgep->atge_max_frame_size;
2151 			else if (atgep->atge_mtu < 6 * 1024)
2152 				reg = (atgep->atge_max_frame_size * 2) / 3;
2153 			else
2154 				reg = atgep->atge_max_frame_size / 2;
2155 
2156 			OUTL(atgep, L1E_TX_JUMBO_THRESH,
2157 			    ROUNDUP(reg, TX_JUMBO_THRESH_UNIT) >>
2158 			    TX_JUMBO_THRESH_UNIT_SHIFT);
2159 		}
2160 		break;
2161 	case ATGE_CHIP_L1:
2162 		fsize = ROUNDUP(atgep->atge_max_frame_size, sizeof (uint64_t));
2163 		OUTL(atgep, ATGE_RXQ_JUMBO_CFG,
2164 		    (((fsize / sizeof (uint64_t)) <<
2165 		    RXQ_JUMBO_CFG_SZ_THRESH_SHIFT) &
2166 		    RXQ_JUMBO_CFG_SZ_THRESH_MASK) |
2167 		    ((RXQ_JUMBO_CFG_LKAH_DEFAULT <<
2168 		    RXQ_JUMBO_CFG_LKAH_SHIFT) & RXQ_JUMBO_CFG_LKAH_MASK) |
2169 		    ((ATGE_USECS(8) << RXQ_JUMBO_CFG_RRD_TIMER_SHIFT) &
2170 		    RXQ_JUMBO_CFG_RRD_TIMER_MASK));
2171 		break;
2172 	case ATGE_CHIP_L1C:
2173 		break;
2174 	}
2175 
2176 	/*
2177 	 * Configure flow-control parameters.
2178 	 */
2179 	switch (ATGE_MODEL(atgep)) {
2180 	case ATGE_CHIP_L1E:
2181 	case ATGE_CHIP_L1:
2182 		if ((atgep->atge_flags & ATGE_FLAG_PCIE) != 0) {
2183 		/*
2184 		 * Some hardware version require this magic.
2185 		 */
2186 		OUTL(atgep, ATGE_LTSSM_ID_CFG, 0x6500);
2187 		reg = INL(atgep, 0x1008);
2188 		OUTL(atgep, 0x1008, reg | 0x8000);
2189 		}
2190 		break;
2191 	case ATGE_CHIP_L1C:
2192 		break;
2193 	}
2194 
2195 	/*
2196 	 * These are all magic parameters which came from FreeBSD.
2197 	 */
2198 	switch (ATGE_MODEL(atgep)) {
2199 	case ATGE_CHIP_L1E:
2200 		reg = INL(atgep, L1E_SRAM_RX_FIFO_LEN);
2201 		rxf_hi = (reg * 4) / 5;
2202 		rxf_lo = reg/ 5;
2203 
2204 		OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
2205 		    ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
2206 		    RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
2207 		    ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
2208 		    RXQ_FIFO_PAUSE_THRESH_HI_MASK));
2209 		break;
2210 	case ATGE_CHIP_L1:
2211 		switch (atgep->atge_chip_rev) {
2212 		case 0x8001:
2213 		case 0x9001:
2214 		case 0x9002:
2215 		case 0x9003:
2216 			rxf_hi = L1_RX_RING_CNT / 16;
2217 			rxf_lo = (L1_RX_RING_CNT * 7) / 8;
2218 			rrd_hi = (L1_RR_RING_CNT * 7) / 8;
2219 			rrd_lo = L1_RR_RING_CNT / 16;
2220 			break;
2221 		default:
2222 			reg = INL(atgep, L1_SRAM_RX_FIFO_LEN);
2223 			rxf_lo = reg / 16;
2224 			if (rxf_lo > 192)
2225 				rxf_lo = 192;
2226 			rxf_hi = (reg * 7) / 8;
2227 			if (rxf_hi < rxf_lo)
2228 				rxf_hi = rxf_lo + 16;
2229 			reg = INL(atgep, L1_SRAM_RRD_LEN);
2230 			rrd_lo = reg / 8;
2231 			rrd_hi = (reg * 7) / 8;
2232 			if (rrd_lo > 2)
2233 				rrd_lo = 2;
2234 			if (rrd_hi < rrd_lo)
2235 				rrd_hi = rrd_lo + 3;
2236 			break;
2237 		}
2238 
2239 		OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
2240 		    ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
2241 		    RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
2242 		    ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
2243 		    RXQ_FIFO_PAUSE_THRESH_HI_MASK));
2244 
2245 		OUTL(atgep, L1_RXQ_RRD_PAUSE_THRESH,
2246 		    ((rrd_lo << RXQ_RRD_PAUSE_THRESH_LO_SHIFT) &
2247 		    RXQ_RRD_PAUSE_THRESH_LO_MASK) |
2248 		    ((rrd_hi << RXQ_RRD_PAUSE_THRESH_HI_SHIFT) &
2249 		    RXQ_RRD_PAUSE_THRESH_HI_MASK));
2250 		break;
2251 	case ATGE_CHIP_L1C:
2252 		switch (ATGE_DID(atgep)) {
2253 		case ATGE_CHIP_AR8151V2_DEV_ID:
2254 		case ATGE_CHIP_AR8152V1_DEV_ID:
2255 			OUTL(atgep, ATGE_SERDES_LOCK,
2256 			    INL(atgep, ATGE_SERDES_LOCK) |
2257 			    SERDES_MAC_CLK_SLOWDOWN |
2258 			    SERDES_PHY_CLK_SLOWDOWN);
2259 			break;
2260 		case ATGE_CHIP_L1CG_DEV_ID:
2261 		case ATGE_CHIP_L1CF_DEV_ID:
2262 			/*
2263 			 * Configure flow control parameters.
2264 			 * XON	: 80% of Rx FIFO
2265 			 * XOFF : 30% of Rx FIFO
2266 			 */
2267 			reg = INL(atgep, L1C_SRAM_RX_FIFO_LEN);
2268 			rxf_hi = (reg * 8) / 10;
2269 			rxf_lo = (reg * 3) / 10;
2270 
2271 			OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
2272 			    ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
2273 			    RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
2274 			    ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
2275 			    RXQ_FIFO_PAUSE_THRESH_HI_MASK));
2276 			break;
2277 		}
2278 		break;
2279 	}
2280 
2281 	switch (ATGE_MODEL(atgep)) {
2282 	case ATGE_CHIP_L1E:
2283 		/* Configure RxQ. */
2284 		reg = RXQ_CFG_ALIGN_32 | RXQ_CFG_CUT_THROUGH_ENB |
2285 		    RXQ_CFG_IPV6_CSUM_VERIFY | RXQ_CFG_ENB;
2286 		OUTL(atgep, ATGE_RXQ_CFG, reg);
2287 		/*
2288 		 * Configure TxQ.
2289 		 */
2290 		reg = (128 <<
2291 		    (atgep->atge_dma_rd_burst >> DMA_CFG_RD_BURST_SHIFT)) <<
2292 		    TXQ_CFG_TX_FIFO_BURST_SHIFT;
2293 
2294 		reg |= (TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) &
2295 		    TXQ_CFG_TPD_BURST_MASK;
2296 
2297 		reg |= TXQ_CFG_ENHANCED_MODE | TXQ_CFG_ENB;
2298 
2299 		OUTL(atgep, ATGE_TXQ_CFG, reg);
2300 		/* Disable RSS. */
2301 		OUTL(atgep, L1E_RSS_IDT_TABLE0, 0);
2302 		OUTL(atgep, L1E_RSS_CPU, 0);
2303 		/*
2304 		 * Configure DMA parameters.
2305 		 */
2306 		/*
2307 		 * Don't use Tx CMB. It is known to cause RRS update failure
2308 		 * under certain circumstances. Typical phenomenon of the
2309 		 * issue would be unexpected sequence number encountered in
2310 		 * Rx handler. Hence we don't set DMA_CFG_TXCMB_ENB.
2311 		 */
2312 		OUTL(atgep, ATGE_DMA_CFG,
2313 		    DMA_CFG_OUT_ORDER | DMA_CFG_RD_REQ_PRI | DMA_CFG_RCB_64 |
2314 		    atgep->atge_dma_rd_burst | atgep->atge_dma_wr_burst |
2315 		    DMA_CFG_RXCMB_ENB |
2316 		    ((DMA_CFG_RD_DELAY_CNT_DEFAULT <<
2317 		    DMA_CFG_RD_DELAY_CNT_SHIFT) & DMA_CFG_RD_DELAY_CNT_MASK) |
2318 		    ((DMA_CFG_WR_DELAY_CNT_DEFAULT <<
2319 		    DMA_CFG_WR_DELAY_CNT_SHIFT) & DMA_CFG_WR_DELAY_CNT_MASK));
2320 		/*
2321 		 * Enable CMB/SMB timer.
2322 		 */
2323 		OUTL(atgep, L1E_SMB_STAT_TIMER, 100000);
2324 		atge_l1e_clear_stats(atgep);
2325 		break;
2326 	case ATGE_CHIP_L1:
2327 		/* Configure RxQ. */
2328 		reg =
2329 		    ((RXQ_CFG_RD_BURST_DEFAULT << RXQ_CFG_RD_BURST_SHIFT) &
2330 		    RXQ_CFG_RD_BURST_MASK) |
2331 		    ((RXQ_CFG_RRD_BURST_THRESH_DEFAULT <<
2332 		    RXQ_CFG_RRD_BURST_THRESH_SHIFT) &
2333 		    RXQ_CFG_RRD_BURST_THRESH_MASK) |
2334 		    ((RXQ_CFG_RD_PREF_MIN_IPG_DEFAULT <<
2335 		    RXQ_CFG_RD_PREF_MIN_IPG_SHIFT) &
2336 		    RXQ_CFG_RD_PREF_MIN_IPG_MASK) |
2337 		    RXQ_CFG_CUT_THROUGH_ENB | RXQ_CFG_ENB;
2338 		OUTL(atgep, ATGE_RXQ_CFG, reg);
2339 		/*
2340 		 * Configure TxQ.
2341 		 */
2342 		reg =
2343 		    (((TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) &
2344 		    TXQ_CFG_TPD_BURST_MASK) |
2345 		    ((TXQ_CFG_TX_FIFO_BURST_DEFAULT <<
2346 		    TXQ_CFG_TX_FIFO_BURST_SHIFT) &
2347 		    TXQ_CFG_TX_FIFO_BURST_MASK) |
2348 		    ((TXQ_CFG_TPD_FETCH_DEFAULT <<
2349 		    TXQ_CFG_TPD_FETCH_THRESH_SHIFT) &
2350 		    TXQ_CFG_TPD_FETCH_THRESH_MASK) |
2351 		    TXQ_CFG_ENB);
2352 		OUTL(atgep, ATGE_TXQ_CFG, reg);
2353 		/* Jumbo frames */
2354 		OUTL(atgep, L1_TX_JUMBO_TPD_TH_IPG,
2355 		    (((fsize / sizeof (uint64_t) << TX_JUMBO_TPD_TH_SHIFT)) &
2356 		    TX_JUMBO_TPD_TH_MASK) |
2357 		    ((TX_JUMBO_TPD_IPG_DEFAULT << TX_JUMBO_TPD_IPG_SHIFT) &
2358 		    TX_JUMBO_TPD_IPG_MASK));
2359 		/*
2360 		 * Configure DMA parameters.
2361 		 */
2362 		OUTL(atgep, ATGE_DMA_CFG,
2363 		    DMA_CFG_ENH_ORDER | DMA_CFG_RCB_64 |
2364 		    atgep->atge_dma_rd_burst | DMA_CFG_RD_ENB |
2365 		    atgep->atge_dma_wr_burst | DMA_CFG_WR_ENB);
2366 
2367 		/* Configure CMB DMA write threshold. */
2368 		OUTL(atgep, L1_CMB_WR_THRESH,
2369 		    ((CMB_WR_THRESH_RRD_DEFAULT << CMB_WR_THRESH_RRD_SHIFT) &
2370 		    CMB_WR_THRESH_RRD_MASK) |
2371 		    ((CMB_WR_THRESH_TPD_DEFAULT << CMB_WR_THRESH_TPD_SHIFT) &
2372 		    CMB_WR_THRESH_TPD_MASK));
2373 		/*
2374 		 * Enable CMB/SMB timer.
2375 		 */
2376 		/* Set CMB/SMB timer and enable them. */
2377 		OUTL(atgep, L1_CMB_WR_TIMER,
2378 		    ((ATGE_USECS(2) << CMB_WR_TIMER_TX_SHIFT) &
2379 		    CMB_WR_TIMER_TX_MASK) |
2380 		    ((ATGE_USECS(2) << CMB_WR_TIMER_RX_SHIFT) &
2381 		    CMB_WR_TIMER_RX_MASK));
2382 
2383 		/* Request SMB updates for every seconds. */
2384 		OUTL(atgep, L1_SMB_TIMER, ATGE_USECS(1000 * 1000));
2385 		OUTL(atgep, L1_CSMB_CTRL,
2386 		    CSMB_CTRL_SMB_ENB | CSMB_CTRL_CMB_ENB);
2387 		break;
2388 	case ATGE_CHIP_L1C:
2389 		/* Configure RxQ. */
2390 		reg =
2391 		    RXQ_CFG_RD_BURST_DEFAULT << L1C_RXQ_CFG_RD_BURST_SHIFT |
2392 		    RXQ_CFG_IPV6_CSUM_VERIFY | RXQ_CFG_ENB;
2393 		if ((atgep->atge_flags & ATGE_FLAG_ASPM_MON) != 0)
2394 			reg |= RXQ_CFG_ASPM_THROUGHPUT_LIMIT_1M;
2395 		OUTL(atgep, ATGE_RXQ_CFG, reg);
2396 		/*
2397 		 * Configure TxQ.
2398 		 */
2399 		reg = (128 <<
2400 		    (atgep->atge_dma_rd_burst >> DMA_CFG_RD_BURST_SHIFT)) <<
2401 		    TXQ_CFG_TX_FIFO_BURST_SHIFT;
2402 
2403 		switch (ATGE_DID(atgep)) {
2404 		case ATGE_CHIP_AR8152V2_DEV_ID:
2405 		case ATGE_CHIP_AR8152V1_DEV_ID:
2406 			reg >>= 1;
2407 			break;
2408 		}
2409 
2410 		reg |= (L1C_TXQ_CFG_TPD_BURST_DEFAULT <<
2411 		    TXQ_CFG_TPD_BURST_SHIFT) & TXQ_CFG_TPD_BURST_MASK;
2412 
2413 		reg |= TXQ_CFG_ENHANCED_MODE | TXQ_CFG_ENB;
2414 
2415 		OUTL(atgep, L1C_TXQ_CFG, reg);
2416 		/* Disable RSS until I understand L1C/L2C's RSS logic. */
2417 		OUTL(atgep, L1C_RSS_IDT_TABLE0, 0xe4e4e4e4);
2418 		OUTL(atgep, L1C_RSS_CPU, 0);
2419 		/*
2420 		 * Configure DMA parameters.
2421 		 */
2422 		OUTL(atgep, ATGE_DMA_CFG,
2423 		    DMA_CFG_SMB_DIS |
2424 		    DMA_CFG_OUT_ORDER | DMA_CFG_RD_REQ_PRI | DMA_CFG_RCB_64 |
2425 		    DMA_CFG_RD_DELAY_CNT_DEFAULT << DMA_CFG_RD_DELAY_CNT_SHIFT |
2426 		    DMA_CFG_WR_DELAY_CNT_DEFAULT << DMA_CFG_WR_DELAY_CNT_SHIFT |
2427 
2428 		    atgep->atge_dma_rd_burst | DMA_CFG_RD_ENB |
2429 		    atgep->atge_dma_wr_burst | DMA_CFG_WR_ENB);
2430 		/* Configure CMB DMA write threshold not required. */
2431 		/* Set CMB/SMB timer and enable them not required. */
2432 		break;
2433 	}
2434 
2435 	/*
2436 	 * Disable all WOL bits as WOL can interfere normal Rx
2437 	 * operation.
2438 	 */
2439 	OUTL(atgep, ATGE_WOL_CFG, 0);
2440 
2441 	/*
2442 	 * Configure Tx/Rx MACs.
2443 	 *  - Auto-padding for short frames.
2444 	 *  - Enable CRC generation.
2445 	 *
2446 	 *  Start with full-duplex/1000Mbps media. Actual reconfiguration
2447 	 *  of MAC is followed after link establishment.
2448 	 */
2449 	reg = (ATGE_CFG_TX_CRC_ENB | ATGE_CFG_TX_AUTO_PAD |
2450 	    ATGE_CFG_FULL_DUPLEX |
2451 	    ((ATGE_CFG_PREAMBLE_DEFAULT << ATGE_CFG_PREAMBLE_SHIFT) &
2452 	    ATGE_CFG_PREAMBLE_MASK));
2453 
2454 	/*
2455 	 *  AR813x/AR815x always does checksum computation regardless
2456 	 *  of MAC_CFG_RXCSUM_ENB bit. Also the controller is known to
2457 	 *  have bug in protocol field in Rx return structure so
2458 	 *  these controllers can't handle fragmented frames. Disable
2459 	 *  Rx checksum offloading until there is a newer controller
2460 	 *  that has sane implementation.
2461 	 */
2462 	switch (ATGE_DID(atgep)) {
2463 	case ATGE_CHIP_AR8151V2_DEV_ID:
2464 	case ATGE_CHIP_AR8151V1_DEV_ID:
2465 	case ATGE_CHIP_AR8152V2_DEV_ID:
2466 		reg |= ATGE_CFG_HASH_ALG_CRC32 | ATGE_CFG_SPEED_MODE_SW;
2467 		break;
2468 	}
2469 
2470 	if ((atgep->atge_flags & ATGE_FLAG_FASTETHER) != 0) {
2471 		reg |= ATGE_CFG_SPEED_10_100;
2472 		ATGE_DB(("%s: %s() Fast Ethernet", atgep->atge_name, __func__));
2473 	} else {
2474 		reg |= ATGE_CFG_SPEED_1000;
2475 		ATGE_DB(("%s: %s() 1G speed", atgep->atge_name, __func__));
2476 	}
2477 	switch (ATGE_MODEL(atgep)) {
2478 	case ATGE_CHIP_L1C:
2479 		reg |= L1C_CFG_SINGLE_PAUSE_ENB;
2480 		break;
2481 	}
2482 
2483 	OUTL(atgep, ATGE_MAC_CFG, reg);
2484 
2485 	atgep->atge_chip_state |= ATGE_CHIP_RUNNING;
2486 
2487 	/*
2488 	 * Set up the receive filter.
2489 	 */
2490 	atge_rxfilter(atgep);
2491 
2492 	/*
2493 	 * Acknowledge all pending interrupts and clear it.
2494 	 */
2495 	switch (ATGE_MODEL(atgep)) {
2496 	case ATGE_CHIP_L1E:
2497 		OUTL(atgep, ATGE_INTR_MASK, L1E_INTRS);
2498 		OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2499 		OUTL(atgep, ATGE_INTR_STATUS, 0);
2500 		break;
2501 	case ATGE_CHIP_L1:
2502 	case ATGE_CHIP_L1C:
2503 		OUTL(atgep, ATGE_INTR_STATUS, 0);
2504 		OUTL(atgep, ATGE_INTR_MASK, atgep->atge_intrs);
2505 		break;
2506 	}
2507 
2508 	atge_mac_config(atgep);
2509 
2510 	ATGE_DB(("%s: %s() device started", atgep->atge_name, __func__));
2511 }
2512 
2513 /*
2514  * Generic functions.
2515  */
2516 
2517 #define	CRC32_POLY_BE   0x04c11db7
2518 uint32_t
2519 atge_ether_crc(const uint8_t *addr, int len)
2520 {
2521 	int idx;
2522 	int bit;
2523 	uint_t data;
2524 	uint32_t crc;
2525 
2526 	crc = 0xffffffff;
2527 	for (idx = 0; idx < len; idx++) {
2528 		for (data = *addr++, bit = 0; bit < 8; bit++, data >>= 1) {
2529 			crc = (crc << 1)
2530 			    ^ ((((crc >> 31) ^ data) & 1) ? CRC32_POLY_BE : 0);
2531 		}
2532 	}
2533 
2534 	return (crc);
2535 }
2536 
2537 
2538 /*
2539  * Programs RX filter. We use a link-list to keep track of all multicast
2540  * addressess.
2541  */
2542 void
2543 atge_rxfilter(atge_t *atgep)
2544 {
2545 	uint32_t rxcfg;
2546 	uint64_t mchash;
2547 
2548 	rxcfg = INL(atgep, ATGE_MAC_CFG);
2549 	rxcfg &= ~(ATGE_CFG_ALLMULTI | ATGE_CFG_PROMISC);
2550 
2551 	/*
2552 	 * Accept broadcast frames.
2553 	 */
2554 	rxcfg |= ATGE_CFG_BCAST;
2555 
2556 	/*
2557 	 * We don't use Hardware VLAN tagging.
2558 	 */
2559 	rxcfg &= ~ATGE_CFG_VLAN_TAG_STRIP;
2560 
2561 	if (atgep->atge_filter_flags & (ATGE_PROMISC | ATGE_ALL_MULTICST)) {
2562 		mchash = ~0ULL;
2563 
2564 		if (atgep->atge_filter_flags & ATGE_PROMISC)
2565 			rxcfg |= ATGE_CFG_PROMISC;
2566 
2567 		if (atgep->atge_filter_flags & ATGE_ALL_MULTICST)
2568 			rxcfg |= ATGE_CFG_ALLMULTI;
2569 	} else {
2570 		mchash = atgep->atge_mchash;
2571 	}
2572 
2573 	atge_program_ether(atgep);
2574 
2575 	OUTL(atgep, ATGE_MAR0, (uint32_t)mchash);
2576 	OUTL(atgep, ATGE_MAR1, (uint32_t)(mchash >> 32));
2577 	OUTL(atgep, ATGE_MAC_CFG, rxcfg);
2578 
2579 	ATGE_DB(("%s: %s() mac_cfg is : %x, mchash : %llx",
2580 	    atgep->atge_name, __func__, rxcfg, mchash));
2581 }
2582 
2583 void
2584 atge_device_stop(atge_t *atgep)
2585 {
2586 	uint32_t reg;
2587 	int t;
2588 
2589 	/*
2590 	 * If the chip is being suspended, then don't touch the state. Caller
2591 	 * will take care of setting the correct state.
2592 	 */
2593 	if (!(atgep->atge_chip_state & ATGE_CHIP_SUSPENDED)) {
2594 		atgep->atge_chip_state |= ATGE_CHIP_STOPPED;
2595 		atgep->atge_chip_state &= ~ATGE_CHIP_RUNNING;
2596 	}
2597 
2598 	/*
2599 	 * Collect stats for L1E. L1 chip's stats are collected by interrupt.
2600 	 */
2601 	switch (ATGE_MODEL(atgep)) {
2602 	case ATGE_CHIP_L1E:
2603 		atge_l1e_gather_stats(atgep);
2604 		break;
2605 	case ATGE_CHIP_L1:
2606 	case ATGE_CHIP_L1C:
2607 		break;
2608 	}
2609 
2610 	/*
2611 	 * Disable interrupts.
2612 	 */
2613 	atge_disable_intrs(atgep);
2614 
2615 	switch (ATGE_MODEL(atgep)) {
2616 	case ATGE_CHIP_L1E:
2617 		/* Clear CTRL not required. */
2618 		/* Stop DMA Engine not required. */
2619 		/*
2620 		 * Disable queue processing.
2621 		 */
2622 		/* Stop TxQ */
2623 		reg = INL(atgep, ATGE_TXQ_CFG);
2624 		reg = reg & ~TXQ_CFG_ENB;
2625 		OUTL(atgep, ATGE_TXQ_CFG, reg);
2626 		/* Stop RxQ */
2627 		reg = INL(atgep, ATGE_RXQ_CFG);
2628 		reg = reg & ~RXQ_CFG_ENB;
2629 		OUTL(atgep, ATGE_RXQ_CFG, reg);
2630 		/* Stop DMA */
2631 		reg = INL(atgep, ATGE_DMA_CFG);
2632 		reg = reg & ~(DMA_CFG_TXCMB_ENB | DMA_CFG_RXCMB_ENB);
2633 		OUTL(atgep, ATGE_DMA_CFG, reg);
2634 		drv_usecwait(1000);
2635 		atge_l1e_stop_mac(atgep);
2636 		OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2637 		break;
2638 	case ATGE_CHIP_L1:
2639 		/* Clear CTRL. */
2640 		OUTL(atgep, L1_CSMB_CTRL, 0);
2641 		/* Stop DMA Engine */
2642 		atge_l1_stop_tx_mac(atgep);
2643 		atge_l1_stop_rx_mac(atgep);
2644 		reg = INL(atgep, ATGE_DMA_CFG);
2645 		reg &= ~(DMA_CFG_RD_ENB | DMA_CFG_WR_ENB);
2646 		OUTL(atgep, ATGE_DMA_CFG, reg);
2647 		/*
2648 		 * Disable queue processing.
2649 		 */
2650 		/* Stop TxQ */
2651 		reg = INL(atgep, ATGE_TXQ_CFG);
2652 		reg = reg & ~TXQ_CFG_ENB;
2653 		OUTL(atgep, ATGE_TXQ_CFG, reg);
2654 		/* Stop RxQ */
2655 		reg = INL(atgep, ATGE_RXQ_CFG);
2656 		reg = reg & ~RXQ_CFG_ENB;
2657 		OUTL(atgep, ATGE_RXQ_CFG, reg);
2658 		break;
2659 	case ATGE_CHIP_L1C:
2660 		/* Clear CTRL not required. */
2661 		/* Stop DMA Engine */
2662 		atge_l1c_stop_tx_mac(atgep);
2663 		atge_l1c_stop_rx_mac(atgep);
2664 		reg = INL(atgep, ATGE_DMA_CFG);
2665 		reg &= ~(DMA_CFG_RD_ENB | DMA_CFG_WR_ENB);
2666 		OUTL(atgep, ATGE_DMA_CFG, reg);
2667 		/*
2668 		 * Disable queue processing.
2669 		 */
2670 		/* Stop TxQ */
2671 		reg = INL(atgep, L1C_TXQ_CFG);
2672 		reg = reg & ~TXQ_CFG_ENB;
2673 		OUTL(atgep, L1C_TXQ_CFG, reg);
2674 		/* Stop RxQ */
2675 		reg = INL(atgep, ATGE_RXQ_CFG);
2676 		reg = reg & ~RXQ_CFG_ENB;
2677 		OUTL(atgep, ATGE_RXQ_CFG, reg);
2678 		break;
2679 	}
2680 
2681 	for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
2682 		if ((reg = INL(atgep, ATGE_IDLE_STATUS)) == 0)
2683 			break;
2684 		drv_usecwait(10);
2685 	}
2686 
2687 	if (t == 0) {
2688 		atge_error(atgep->atge_dip, "%s() stopping TX/RX MAC timeout",
2689 		    __func__);
2690 	}
2691 }
2692 
2693 void
2694 atge_disable_intrs(atge_t *atgep)
2695 {
2696 	OUTL(atgep, ATGE_INTR_MASK, 0);
2697 	OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2698 }
2699 
2700 void
2701 atge_device_init(atge_t *atgep)
2702 {
2703 	switch (ATGE_MODEL(atgep)) {
2704 	case ATGE_CHIP_L1E:
2705 		atgep->atge_intrs = L1E_INTRS;
2706 		atgep->atge_int_mod = ATGE_IM_TIMER_DEFAULT;
2707 
2708 		atge_l1e_init_tx_ring(atgep);
2709 		atge_l1e_init_rx_pages(atgep);
2710 		break;
2711 	case ATGE_CHIP_L1:
2712 		atgep->atge_intrs = L1_INTRS | INTR_GPHY | INTR_PHY_LINK_DOWN |
2713 		    INTR_LINK_CHG;
2714 		atgep->atge_int_mod = ATGE_IM_TIMER_DEFAULT;
2715 
2716 		atge_l1_init_tx_ring(atgep);
2717 		atge_l1_init_rx_ring(atgep);
2718 		atge_l1_init_rr_ring(atgep);
2719 		atge_l1_init_cmb(atgep);
2720 		atge_l1_init_smb(atgep);
2721 		break;
2722 	case ATGE_CHIP_L1C:
2723 		atgep->atge_intrs = L1C_INTRS | L1C_INTR_GPHY |
2724 		    L1C_INTR_PHY_LINK_DOWN;
2725 		atgep->atge_int_rx_mod = 400/2;
2726 		atgep->atge_int_tx_mod = 2000/1;
2727 
2728 		atge_l1c_init_tx_ring(atgep);
2729 		atge_l1c_init_rx_ring(atgep);
2730 		atge_l1c_init_rr_ring(atgep);
2731 		atge_l1c_init_cmb(atgep);
2732 		atge_l1c_init_smb(atgep);
2733 
2734 		/* Enable all clocks. */
2735 		OUTL(atgep, ATGE_CLK_GATING_CFG, 0);
2736 		break;
2737 	}
2738 }
2739 
2740 void
2741 atge_device_restart(atge_t *atgep)
2742 {
2743 	ASSERT(MUTEX_HELD(&atgep->atge_intr_lock));
2744 	ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
2745 
2746 	/*
2747 	 * Cancel any pending I/O.
2748 	 */
2749 	atge_device_stop(atgep);
2750 
2751 	/*
2752 	 * Reset the chip to a known state.
2753 	 */
2754 	atge_device_reset(atgep);
2755 
2756 	/*
2757 	 * Initialize the ring and other descriptor like CMB/SMB/Rx return.
2758 	 */
2759 	atge_device_init(atgep);
2760 
2761 	/*
2762 	 * Start the chip.
2763 	 */
2764 	atge_device_start(atgep);
2765 
2766 }
2767 
2768 static int
2769 atge_send_a_packet(atge_t *atgep, mblk_t *mp)
2770 {
2771 	uchar_t *c;
2772 	uint32_t cflags = 0;
2773 	atge_ring_t *r;
2774 	size_t pktlen;
2775 	uchar_t *buf;
2776 	int	start;
2777 
2778 	ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
2779 	ASSERT(mp != NULL);
2780 
2781 	pktlen = msgsize(mp);
2782 	if (pktlen > atgep->atge_tx_buf_len) {
2783 		atgep->atge_macxmt_errors++;
2784 
2785 		ATGE_DB(("%s: %s() pktlen (%d) > rx_buf_len (%d)",
2786 		    atgep->atge_name, __func__,
2787 		    pktlen, atgep->atge_rx_buf_len));
2788 
2789 		freemsg(mp);
2790 		return (DDI_SUCCESS);
2791 	}
2792 
2793 	r = atgep->atge_tx_ring;
2794 
2795 	if (r->r_avail_desc <= 1) {
2796 		atgep->atge_noxmtbuf++;
2797 		atgep->atge_tx_resched = 1;
2798 
2799 		ATGE_DB(("%s: %s() No transmit buf",
2800 		    atgep->atge_name, __func__));
2801 
2802 		return (DDI_FAILURE);
2803 	}
2804 
2805 	start = r->r_producer;
2806 
2807 	/*
2808 	 * Get the DMA buffer to hold a packet.
2809 	 */
2810 	buf = (uchar_t *)r->r_buf_tbl[start]->addr;
2811 
2812 	/*
2813 	 * Copy the msg and free mp
2814 	 */
2815 	mcopymsg(mp, buf);
2816 
2817 	r->r_avail_desc--;
2818 
2819 	c = (uchar_t *)r->r_desc_ring->addr;
2820 	switch (ATGE_MODEL(atgep)) {
2821 	case ATGE_CHIP_L1C:
2822 		{
2823 		l1c_tx_desc_t	*txd;
2824 
2825 		c += (sizeof (l1c_tx_desc_t) * start);
2826 		txd = (l1c_tx_desc_t *)c;
2827 
2828 		ATGE_PUT64(r->r_desc_ring, &txd->addr,
2829 		    r->r_buf_tbl[start]->cookie.dmac_laddress);
2830 
2831 		ATGE_PUT32(r->r_desc_ring, &txd->len, L1C_TX_BYTES(pktlen));
2832 
2833 		cflags |= L1C_TD_EOP;
2834 		ATGE_PUT32(r->r_desc_ring, &txd->flags, cflags);
2835 		break;
2836 		}
2837 	default:
2838 		{
2839 		atge_tx_desc_t	*txd;
2840 
2841 		c += (sizeof (atge_tx_desc_t) * start);
2842 		txd = (atge_tx_desc_t *)c;
2843 
2844 		ATGE_PUT64(r->r_desc_ring, &txd->addr,
2845 		    r->r_buf_tbl[start]->cookie.dmac_laddress);
2846 
2847 		ATGE_PUT32(r->r_desc_ring, &txd->len, ATGE_TX_BYTES(pktlen));
2848 
2849 		cflags |= ATGE_TD_EOP;
2850 		ATGE_PUT32(r->r_desc_ring, &txd->flags, cflags);
2851 		break;
2852 		}
2853 	}
2854 	/*
2855 	 * Sync buffer first.
2856 	 */
2857 	DMA_SYNC(r->r_buf_tbl[start], 0, pktlen, DDI_DMA_SYNC_FORDEV);
2858 
2859 	/*
2860 	 * Increment TX producer count by one.
2861 	 */
2862 	ATGE_INC_SLOT(r->r_producer, ATGE_TX_RING_CNT);
2863 
2864 	/*
2865 	 * Sync descriptor table.
2866 	 */
2867 	DMA_SYNC(r->r_desc_ring, 0, ATGE_TX_RING_SZ, DDI_DMA_SYNC_FORDEV);
2868 
2869 	/*
2870 	 * Program TX descriptor to send a packet.
2871 	 */
2872 	switch (ATGE_MODEL(atgep)) {
2873 	case ATGE_CHIP_L1E:
2874 		atge_l1e_send_packet(r);
2875 		break;
2876 	case ATGE_CHIP_L1:
2877 		atge_l1_send_packet(r);
2878 		break;
2879 	case ATGE_CHIP_L1C:
2880 		atge_l1c_send_packet(r);
2881 		break;
2882 	}
2883 
2884 	r->r_atge->atge_opackets++;
2885 	r->r_atge->atge_obytes += pktlen;
2886 
2887 	ATGE_DB(("%s: %s() pktlen : %d, avail_desc : %d, producer  :%d, "
2888 	    "consumer : %d", atgep->atge_name, __func__, pktlen,
2889 	    r->r_avail_desc, r->r_producer, r->r_consumer));
2890 
2891 	return (DDI_SUCCESS);
2892 }
2893 
2894 /*
2895  * Stream Information.
2896  */
2897 DDI_DEFINE_STREAM_OPS(atge_devops, nulldev, nulldev, atge_attach, atge_detach,
2898     nodev, NULL, D_MP, NULL, atge_quiesce);
2899 
2900 /*
2901  * Module linkage information.
2902  */
2903 static	struct	modldrv	atge_modldrv = {
2904 	&mod_driverops,				/* Type of Module */
2905 	"Atheros/Attansic Gb Ethernet",		/* Description */
2906 	&atge_devops				/* drv_dev_ops */
2907 };
2908 
2909 static	struct	modlinkage atge_modlinkage = {
2910 	MODREV_1,			/* ml_rev */
2911 	(void *)&atge_modldrv,
2912 	NULL
2913 };
2914 
2915 /*
2916  * DDI Entry points.
2917  */
2918 int
2919 _init(void)
2920 {
2921 	int	r;
2922 	mac_init_ops(&atge_devops, "atge");
2923 	if ((r = mod_install(&atge_modlinkage)) != DDI_SUCCESS) {
2924 		mac_fini_ops(&atge_devops);
2925 	}
2926 
2927 	return (r);
2928 }
2929 
2930 int
2931 _fini(void)
2932 {
2933 	int	r;
2934 
2935 	if ((r = mod_remove(&atge_modlinkage)) == DDI_SUCCESS) {
2936 		mac_fini_ops(&atge_devops);
2937 	}
2938 
2939 	return (r);
2940 }
2941 
2942 int
2943 _info(struct modinfo *modinfop)
2944 {
2945 	return (mod_info(&atge_modlinkage, modinfop));
2946 }
2947