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.
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.
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]
23 * Copyright (c) 2012 Gary Mills
25 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Copyright (c) 2009, Pyun YongHyeon <yongari@FreeBSD.org>
29 * All rights reserved.
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
34 * 1. Redistributions of source code must retain the above copyright
35 * notice unmodified, this list of conditions, and the following
37 * 2. Redistributions in binary form must reproduce the above copyright
38 * notice, this list of conditions and the following disclaimer in the
39 * documentation and/or other materials provided with the distribution.
41 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 #include <sys/types.h>
55 #include <sys/stream.h>
56 #include <sys/strsun.h>
58 #include <sys/modctl.h>
59 #include <sys/kstat.h>
60 #include <sys/ethernet.h>
61 #include <sys/devops.h>
62 #include <sys/debug.h>
65 #include <sys/miiregs.h>
67 #include <sys/mac_provider.h>
68 #include <sys/mac_ether.h>
69 #include <sys/sysmacros.h>
70 #include <sys/dditypes.h>
72 #include <sys/sunddi.h>
73 #include <sys/byteorder.h>
76 #include <sys/strsubr.h>
77 #include <sys/crc32.h>
80 #include <sys/pci_cap.h>
83 #include "atge_cmn_reg.h"
84 #include "atge_l1c_reg.h"
85 #include "atge_l1e_reg.h"
86 #include "atge_l1_reg.h"
90 * Atheros/Attansic Ethernet chips are of four types - L1, L2, L1E and L1C.
91 * This driver is for L1E/L1/L1C but can be extended to support other chips.
92 * L1E comes in 1Gigabit and Fast Ethernet flavors. L1 comes in 1Gigabit
93 * flavors only. L1C comes in both flavours.
95 * Atheros/Attansic Ethernet controllers have descriptor based TX and RX
96 * with an exception of L1E. L1E's RX side is not descriptor based ring.
97 * The L1E's RX uses pages (not to be confused with MMU pages) for
98 * receiving pkts. The header has four fields :
100 * uint32_t seqno; Sequence number of the frame.
101 * uint32_t length; Length of the frame.
102 * uint32_t flags; Flags
103 * uint32_t vtag; We don't use hardware VTAG.
105 * We use only one queue for RX (each queue can have two pages) and each
106 * page is L1E_RX_PAGE_SZ large in bytes. That's the reason we don't
107 * use zero-copy RX because we are limited to two pages and each page
108 * accomodates large number of pkts.
110 * The TX side on all three chips is descriptor based ring; and all the
111 * more reason to have one driver for these chips.
113 * We use two locks - atge_intr_lock and atge_tx_lock. Both the locks
114 * should be held if the operation has impact on the driver instance.
116 * All the three chips have hash-based multicast filter.
118 * We use CMB (Coalescing Message Block) for RX but not for TX as there
119 * are some issues with TX. RX CMB is used to get the last descriptor
120 * posted by the chip. Each CMB is for a RX page (one queue can have two
121 * pages) and are uint32_t (4 bytes) long.
123 * The descriptor table should have 32-bit physical address limit due to
124 * the limitation of having same high address for TX/RX/SMB/CMB. The
125 * TX/RX buffers can be 64-bit.
127 * Every DMA memory in atge is represented by atge_dma_t be it TX/RX Buffers
128 * or TX/RX descriptor table or SMB/CMB. To keep the code simple, we have
129 * kept sgl as 1 so that we get contingous pages from root complex.
131 * L1 chip (0x1048) uses descriptor based TX and RX ring. Most of registers are
132 * common with L1E chip (0x1026).
136 * Function Prototypes for debugging.
138 void atge_error(dev_info_t
*, char *, ...);
139 void atge_debug_func(char *, ...);
142 * Function Prototypes for driver operations.
144 static int atge_resume(dev_info_t
*);
145 static int atge_add_intr(atge_t
*);
146 static int atge_alloc_dma(atge_t
*);
147 static void atge_remove_intr(atge_t
*);
148 static void atge_free_dma(atge_t
*);
149 static void atge_device_reset(atge_t
*);
150 static void atge_device_init(atge_t
*);
151 static void atge_device_start(atge_t
*);
152 static void atge_disable_intrs(atge_t
*);
153 atge_dma_t
*atge_alloc_a_dma_blk(atge_t
*, ddi_dma_attr_t
*, int, int);
154 void atge_free_a_dma_blk(atge_dma_t
*);
155 static void atge_rxfilter(atge_t
*);
156 static void atge_device_reset_l1_l1e(atge_t
*);
157 void atge_program_ether(atge_t
*atgep
);
158 void atge_device_restart(atge_t
*);
159 void atge_device_stop(atge_t
*);
160 static int atge_send_a_packet(atge_t
*, mblk_t
*);
161 static uint32_t atge_ether_crc(const uint8_t *, int);
165 * L1E/L2E specific functions.
167 void atge_l1e_device_reset(atge_t
*);
168 void atge_l1e_stop_mac(atge_t
*);
169 int atge_l1e_alloc_dma(atge_t
*);
170 void atge_l1e_free_dma(atge_t
*);
171 void atge_l1e_init_tx_ring(atge_t
*);
172 void atge_l1e_init_rx_pages(atge_t
*);
173 void atge_l1e_program_dma(atge_t
*);
174 void atge_l1e_send_packet(atge_ring_t
*);
175 mblk_t
*atge_l1e_receive(atge_t
*);
176 uint_t
atge_l1e_interrupt(caddr_t
, caddr_t
);
177 void atge_l1e_gather_stats(atge_t
*);
178 void atge_l1e_clear_stats(atge_t
*);
181 * L1 specific functions.
183 int atge_l1_alloc_dma(atge_t
*);
184 void atge_l1_free_dma(atge_t
*);
185 void atge_l1_init_tx_ring(atge_t
*);
186 void atge_l1_init_rx_ring(atge_t
*);
187 void atge_l1_init_rr_ring(atge_t
*);
188 void atge_l1_init_cmb(atge_t
*);
189 void atge_l1_init_smb(atge_t
*);
190 void atge_l1_program_dma(atge_t
*);
191 void atge_l1_stop_tx_mac(atge_t
*);
192 void atge_l1_stop_rx_mac(atge_t
*);
193 uint_t
atge_l1_interrupt(caddr_t
, caddr_t
);
194 void atge_l1_send_packet(atge_ring_t
*);
197 * L1C specific functions.
199 int atge_l1c_alloc_dma(atge_t
*);
200 void atge_l1c_free_dma(atge_t
*);
201 void atge_l1c_init_tx_ring(atge_t
*);
202 void atge_l1c_init_rx_ring(atge_t
*);
203 void atge_l1c_init_rr_ring(atge_t
*);
204 void atge_l1c_init_cmb(atge_t
*);
205 void atge_l1c_init_smb(atge_t
*);
206 void atge_l1c_program_dma(atge_t
*);
207 void atge_l1c_stop_tx_mac(atge_t
*);
208 void atge_l1c_stop_rx_mac(atge_t
*);
209 uint_t
atge_l1c_interrupt(caddr_t
, caddr_t
);
210 void atge_l1c_send_packet(atge_ring_t
*);
211 void atge_l1c_gather_stats(atge_t
*);
212 void atge_l1c_clear_stats(atge_t
*);
215 * Function prototyps for MII operations.
217 uint16_t atge_mii_read(void *, uint8_t, uint8_t);
218 void atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
219 uint16_t atge_l1c_mii_read(void *, uint8_t, uint8_t);
220 void atge_l1c_mii_write(void *, uint8_t, uint8_t, uint16_t);
221 void atge_l1e_mii_reset(void *);
222 void atge_l1_mii_reset(void *);
223 void atge_l1c_mii_reset(void *);
224 static void atge_mii_notify(void *, link_state_t
);
225 void atge_tx_reclaim(atge_t
*atgep
, int cons
);
230 static mii_ops_t atge_l1e_mii_ops
= {
241 static mii_ops_t atge_l1_mii_ops
= {
252 static mii_ops_t atge_l1c_mii_ops
= {
261 * Function Prototypes for MAC callbacks.
263 static int atge_m_stat(void *, uint_t
, uint64_t *);
264 static int atge_m_start(void *);
265 static void atge_m_stop(void *);
266 static int atge_m_getprop(void *, const char *, mac_prop_id_t
, uint_t
,
268 static int atge_m_setprop(void *, const char *, mac_prop_id_t
, uint_t
,
270 static void atge_m_propinfo(void *, const char *, mac_prop_id_t
,
271 mac_prop_info_handle_t
);
272 static int atge_m_unicst(void *, const uint8_t *);
273 static int atge_m_multicst(void *, boolean_t
, const uint8_t *);
274 static int atge_m_promisc(void *, boolean_t
);
275 static mblk_t
*atge_m_tx(void *, mblk_t
*);
277 static mac_callbacks_t atge_m_callbacks
= {
278 MC_SETPROP
| MC_GETPROP
| MC_PROPINFO
,
286 NULL
, /* mc_reserved */
288 NULL
, /* mc_getcapab */
297 * DMA Data access requirements.
299 static struct ddi_device_acc_attr atge_dev_attr
= {
301 DDI_STRUCTURE_LE_ACC
,
306 * Buffers should be native endianness.
308 static struct ddi_device_acc_attr atge_buf_attr
= {
310 DDI_NEVERSWAP_ACC
, /* native endianness */
315 * DMA device attributes. Buffer can be 64-bit.
317 static ddi_dma_attr_t atge_dma_attr_buf
= {
318 DMA_ATTR_V0
, /* dma_attr_version */
319 0, /* dma_attr_addr_lo */
320 0x00ffffffffffull
, /* dma_attr_addr_hi */
321 0x000000003fffull
, /* dma_attr_count_max */
322 8, /* dma_attr_align */
323 0x00003ffc, /* dma_attr_burstsizes */
324 1, /* dma_attr_minxfer */
325 0x0000000027ffull
, /* dma_attr_maxxfer */
326 0x0000ffffffffull
, /* dma_attr_seg */
327 1, /* dma_attr_sgllen */
328 1, /* dma_attr_granular */
329 0 /* dma_attr_flags */
333 * Table of supported devices.
335 #define ATGE_VENDOR_ID 0x1969
336 #define ATGE_L1_STR "Attansic L1"
337 #define ATGE_L1CG_STR "Atheros AR8131 Gigabit Ethernet"
338 #define ATGE_L1CF_STR "Atheros AR8132 Fast Ethernet"
339 #define ATGE_L1E_STR "Atheros AR8121/8113/8114"
340 #define ATGE_AR8151V1_STR "Atheros AR8151 v1.0 Gigabit Ethernet"
341 #define ATGE_AR8151V2_STR "Atheros AR8151 v2.0 Gigabit Ethernet"
342 #define ATGE_AR8152V1_STR "Atheros AR8152 v1.1 Fast Ethernet"
343 #define ATGE_AR8152V2_STR "Atheros AR8152 v2.0 Fast Ethernet"
345 static atge_cards_t atge_cards
[] = {
346 {ATGE_VENDOR_ID
, ATGE_CHIP_AR8151V2_DEV_ID
, ATGE_AR8151V2_STR
,
348 {ATGE_VENDOR_ID
, ATGE_CHIP_AR8151V1_DEV_ID
, ATGE_AR8151V1_STR
,
350 {ATGE_VENDOR_ID
, ATGE_CHIP_AR8152V2_DEV_ID
, ATGE_AR8152V2_STR
,
352 {ATGE_VENDOR_ID
, ATGE_CHIP_AR8152V1_DEV_ID
, ATGE_AR8152V1_STR
,
354 {ATGE_VENDOR_ID
, ATGE_CHIP_L1CG_DEV_ID
, ATGE_L1CG_STR
, ATGE_CHIP_L1C
},
355 {ATGE_VENDOR_ID
, ATGE_CHIP_L1CF_DEV_ID
, ATGE_L1CF_STR
, ATGE_CHIP_L1C
},
356 {ATGE_VENDOR_ID
, ATGE_CHIP_L1E_DEV_ID
, ATGE_L1E_STR
, ATGE_CHIP_L1E
},
357 {ATGE_VENDOR_ID
, ATGE_CHIP_L1_DEV_ID
, ATGE_L1_STR
, ATGE_CHIP_L1
},
361 * Global Debugging flag. Developer level debugging is done only in DEBUG mode.
366 * Debugging and error reporting.
369 atge_debug_func(char *fmt
, ...)
375 (void) vsnprintf(buf
, sizeof (buf
), fmt
, ap
);
378 DTRACE_PROBE1(atge__debug
, char *, buf
);
383 atge_message(dev_info_t
*dip
, int level
, char *fmt
, va_list ap
)
386 char *p
= "!%s%d: %s";
387 char *q
= "!atge: %s";
389 (void) vsnprintf(buf
, sizeof (buf
), fmt
, ap
);
391 if (level
!= CE_NOTE
) {
398 ddi_driver_name(dip
), ddi_get_instance(dip
), buf
);
400 cmn_err(level
, q
, buf
);
405 atge_notice(dev_info_t
*dip
, char *fmt
, ...)
410 (void) atge_message(dip
, CE_NOTE
, fmt
, ap
);
415 atge_error(dev_info_t
*dip
, char *fmt
, ...)
420 (void) atge_message(dip
, CE_WARN
, fmt
, ap
);
425 atge_mac_config(atge_t
*atgep
)
431 /* Re-enable TX/RX MACs */
432 reg
= INL(atgep
, ATGE_MAC_CFG
);
433 reg
&= ~(ATGE_CFG_FULL_DUPLEX
| ATGE_CFG_TX_FC
| ATGE_CFG_RX_FC
|
434 ATGE_CFG_SPEED_MASK
);
436 switch (ATGE_MODEL(atgep
)) {
438 switch (ATGE_DID(atgep
)) {
439 case ATGE_CHIP_AR8151V2_DEV_ID
:
440 case ATGE_CHIP_AR8151V1_DEV_ID
:
441 case ATGE_CHIP_AR8152V2_DEV_ID
:
442 reg
|= ATGE_CFG_HASH_ALG_CRC32
| ATGE_CFG_SPEED_MODE_SW
;
448 speed
= mii_get_speed(atgep
->atge_mii
);
452 reg
|= ATGE_CFG_SPEED_10_100
;
455 reg
|= ATGE_CFG_SPEED_1000
;
459 ld
= mii_get_duplex(atgep
->atge_mii
);
460 if (ld
== LINK_DUPLEX_FULL
)
461 reg
|= ATGE_CFG_FULL_DUPLEX
;
463 /* Re-enable TX/RX MACs */
464 switch (ATGE_MODEL(atgep
)) {
466 reg
|= ATGE_CFG_TX_ENB
| ATGE_CFG_RX_ENB
| ATGE_CFG_RX_FC
;
470 reg
|= ATGE_CFG_TX_ENB
| ATGE_CFG_RX_ENB
;
474 OUTL(atgep
, ATGE_MAC_CFG
, reg
);
476 switch (ATGE_MODEL(atgep
)) {
478 reg
= ATGE_USECS(ATGE_IM_RX_TIMER_DEFAULT
) << IM_TIMER_RX_SHIFT
;
479 reg
|= ATGE_USECS(ATGE_IM_TX_TIMER_DEFAULT
) <<
481 OUTL(atgep
, ATGE_IM_TIMER
, reg
);
486 /* Configure interrupt moderation timer. */
487 reg
= ATGE_USECS(atgep
->atge_int_rx_mod
) << IM_TIMER_RX_SHIFT
;
488 reg
|= ATGE_USECS(atgep
->atge_int_tx_mod
) << IM_TIMER_TX_SHIFT
;
489 OUTL(atgep
, ATGE_IM_TIMER
, reg
);
491 * We don't want to automatic interrupt clear as task queue
492 * for the interrupt should know interrupt status.
495 if (ATGE_USECS(atgep
->atge_int_rx_mod
) != 0)
496 reg
|= MASTER_IM_RX_TIMER_ENB
;
497 if (ATGE_USECS(atgep
->atge_int_tx_mod
) != 0)
498 reg
|= MASTER_IM_TX_TIMER_ENB
;
499 OUTL(atgep
, ATGE_MASTER_CFG
, reg
);
503 ATGE_DB(("%s: %s() mac_cfg is : %x",
504 atgep
->atge_name
, __func__
, INL(atgep
, ATGE_MAC_CFG
)));
508 atge_mii_notify(void *arg
, link_state_t link
)
512 ATGE_DB(("%s: %s() LINK STATUS CHANGED from %x -> %x",
513 atgep
->atge_name
, __func__
, atgep
->atge_link_state
, link
));
515 mac_link_update(atgep
->atge_mh
, link
);
518 * Reconfigure MAC if link status is UP now.
520 mutex_enter(&atgep
->atge_tx_lock
);
521 if (link
== LINK_STATE_UP
) {
522 atgep
->atge_link_state
= LINK_STATE_UP
;
523 atge_mac_config(atgep
);
524 atgep
->atge_tx_resched
= 0;
526 atgep
->atge_link_state
= LINK_STATE_DOWN
;
527 atgep
->atge_flags
|= ATGE_MII_CHECK
;
530 mutex_exit(&atgep
->atge_tx_lock
);
532 if (link
== LINK_STATE_UP
)
533 mac_tx_update(atgep
->atge_mh
);
537 atge_tx_reclaim(atge_t
*atgep
, int end
)
540 atge_ring_t
*r
= atgep
->atge_tx_ring
;
544 ASSERT(MUTEX_HELD(&atgep
->atge_tx_lock
));
547 start
= r
->r_consumer
;
552 while (start
!= end
) {
554 if (r
->r_avail_desc
> ATGE_TX_RING_CNT
) {
556 atge_error(atgep
->atge_dip
,
557 "Reclaim : TX descriptor error");
559 if (r
->r_avail_desc
> (ATGE_TX_RING_CNT
+ 5)) {
560 atge_device_stop(atgep
);
565 c
= (uchar_t
*)r
->r_desc_ring
->addr
;
566 c
+= (sizeof (atge_tx_desc_t
) * start
);
567 txd
= (atge_tx_desc_t
*)c
;
570 * Clearing TX descriptor helps in debugging some strange
577 ATGE_INC_SLOT(start
, ATGE_TX_RING_CNT
);
580 atgep
->atge_tx_ring
->r_consumer
= start
;
582 DMA_SYNC(r
->r_desc_ring
, 0, ATGE_TX_RING_SZ
, DDI_DMA_SYNC_FORDEV
);
586 * Adds interrupt handler depending upon the type of interrupt supported by
590 atge_add_intr_handler(atge_t
*atgep
, int intr_type
)
598 if (intr_type
!= DDI_INTR_TYPE_FIXED
) {
599 err
= ddi_intr_get_nintrs(atgep
->atge_dip
, intr_type
, &count
);
600 if (err
!= DDI_SUCCESS
) {
601 atge_error(atgep
->atge_dip
,
602 "ddi_intr_get_nintrs failed : %d", err
);
603 return (DDI_FAILURE
);
606 ATGE_DB(("%s: %s() count : %d",
607 atgep
->atge_name
, __func__
, count
));
609 err
= ddi_intr_get_navail(atgep
->atge_dip
, intr_type
, &avail
);
610 if (err
!= DDI_SUCCESS
) {
611 atge_error(atgep
->atge_dip
,
612 "ddi_intr_get_navail failed : %d", err
);
613 return (DDI_FAILURE
);
617 atge_error(atgep
->atge_dip
, "count :%d,"
618 " avail : %d", count
, avail
);
621 flag
= DDI_INTR_ALLOC_STRICT
;
624 * DDI_INTR_TYPE_FIXED case.
628 flag
= DDI_INTR_ALLOC_NORMAL
;
631 atgep
->atge_intr_size
= avail
* sizeof (ddi_intr_handle_t
);
632 atgep
->atge_intr_handle
= kmem_zalloc(atgep
->atge_intr_size
, KM_SLEEP
);
634 ATGE_DB(("%s: %s() avail:%d, count : %d, type : %d",
635 atgep
->atge_name
, __func__
, avail
, count
,
638 err
= ddi_intr_alloc(atgep
->atge_dip
, atgep
->atge_intr_handle
,
639 intr_type
, 0, avail
, &atgep
->atge_intr_cnt
, flag
);
641 if (err
!= DDI_SUCCESS
) {
642 atge_error(atgep
->atge_dip
, "ddi_intr_alloc failed : %d", err
);
643 kmem_free(atgep
->atge_intr_handle
, atgep
->atge_intr_size
);
644 return (DDI_FAILURE
);
647 ATGE_DB(("%s: atge_add_intr_handler() after alloc count"
648 " :%d, avail : %d", atgep
->atge_name
, count
, avail
));
650 err
= ddi_intr_get_pri(atgep
->atge_intr_handle
[0],
651 &atgep
->atge_intr_pri
);
652 if (err
!= DDI_SUCCESS
) {
653 atge_error(atgep
->atge_dip
, "ddi_intr_get_pri failed:%d", err
);
654 for (i
= 0; i
< atgep
->atge_intr_cnt
; i
++) {
655 (void) ddi_intr_free(atgep
->atge_intr_handle
[i
]);
657 kmem_free(atgep
->atge_intr_handle
, atgep
->atge_intr_size
);
659 return (DDI_FAILURE
);
663 * Add interrupt handler now.
665 for (i
= 0; i
< atgep
->atge_intr_cnt
; i
++) {
666 switch (ATGE_MODEL(atgep
)) {
668 err
= ddi_intr_add_handler(atgep
->atge_intr_handle
[i
],
669 atge_l1e_interrupt
, atgep
, (caddr_t
)(uintptr_t)i
);
672 err
= ddi_intr_add_handler(atgep
->atge_intr_handle
[i
],
673 atge_l1_interrupt
, atgep
, (caddr_t
)(uintptr_t)i
);
676 err
= ddi_intr_add_handler(atgep
->atge_intr_handle
[i
],
677 atge_l1c_interrupt
, atgep
, (caddr_t
)(uintptr_t)i
);
681 if (err
!= DDI_SUCCESS
) {
682 atge_error(atgep
->atge_dip
,
683 "ddi_intr_add_handler failed : %d", err
);
685 (void) ddi_intr_free(atgep
->atge_intr_handle
[i
]);
687 (void) ddi_intr_remove_handler(
688 atgep
->atge_intr_handle
[i
]);
689 (void) ddi_intr_free(
690 atgep
->atge_intr_handle
[i
]);
693 kmem_free(atgep
->atge_intr_handle
,
694 atgep
->atge_intr_size
);
696 return (DDI_FAILURE
);
700 err
= ddi_intr_get_cap(atgep
->atge_intr_handle
[0],
701 &atgep
->atge_intr_cap
);
703 if (err
!= DDI_SUCCESS
) {
704 atge_error(atgep
->atge_dip
,
705 "ddi_intr_get_cap failed : %d", err
);
706 atge_remove_intr(atgep
);
707 return (DDI_FAILURE
);
710 if (intr_type
== DDI_INTR_TYPE_FIXED
)
711 atgep
->atge_flags
|= ATGE_FIXED_TYPE
;
712 else if (intr_type
== DDI_INTR_TYPE_MSI
)
713 atgep
->atge_flags
|= ATGE_MSI_TYPE
;
714 else if (intr_type
== DDI_INTR_TYPE_MSIX
)
715 atgep
->atge_flags
|= ATGE_MSIX_TYPE
;
717 return (DDI_SUCCESS
);
721 atge_remove_intr(atge_t
*atgep
)
726 if (atgep
->atge_intr_handle
== NULL
)
729 if (atgep
->atge_intr_cap
& DDI_INTR_FLAG_BLOCK
) {
730 (void) ddi_intr_block_disable(atgep
->atge_intr_handle
,
731 atgep
->atge_intr_cnt
);
736 for (i
= 0; i
< atgep
->atge_intr_cnt
; i
++) {
738 (void) ddi_intr_disable(atgep
->atge_intr_handle
[i
]);
740 (void) ddi_intr_remove_handler(atgep
->atge_intr_handle
[i
]);
741 (void) ddi_intr_free(atgep
->atge_intr_handle
[i
]);
744 kmem_free(atgep
->atge_intr_handle
, atgep
->atge_intr_size
);
748 atge_enable_intrs(atge_t
*atgep
)
753 if (atgep
->atge_intr_cap
& DDI_INTR_FLAG_BLOCK
) {
757 err
= ddi_intr_block_enable(atgep
->atge_intr_handle
,
758 atgep
->atge_intr_cnt
);
760 if (err
!= DDI_SUCCESS
) {
761 atge_error(atgep
->atge_dip
,
762 "Failed to block enable intrs %d", err
);
769 * Call ddi_intr_enable() for MSI non-block enable.
771 for (i
= 0; i
< atgep
->atge_intr_cnt
; i
++) {
772 err
= ddi_intr_enable(atgep
->atge_intr_handle
[i
]);
773 if (err
!= DDI_SUCCESS
) {
774 atge_error(atgep
->atge_dip
,
775 "Failed to enable intrs on %d with : %d",
781 if (err
== DDI_SUCCESS
)
791 * Adds interrupt handler depending on the supported interrupt type by the
795 atge_add_intr(atge_t
*atgep
)
800 * Get the supported interrupt types.
802 err
= ddi_intr_get_supported_types(atgep
->atge_dip
,
803 &atgep
->atge_intr_types
);
804 if (err
!= DDI_SUCCESS
) {
805 atge_error(atgep
->atge_dip
,
806 "ddi_intr_get_supported_types failed : %d", err
);
807 return (DDI_FAILURE
);
810 ATGE_DB(("%s: ddi_intr_get_supported_types() returned : %d",
811 atgep
->atge_name
, atgep
->atge_intr_types
));
814 if (atgep
->atge_intr_types
& DDI_INTR_TYPE_MSIX
) {
815 err
= atge_add_intr_handler(atgep
, DDI_INTR_TYPE_MSIX
);
816 if (err
== DDI_SUCCESS
) {
817 ATGE_DB(("%s: Using MSIx for interrupt",
823 if (atgep
->atge_intr_types
& DDI_INTR_TYPE_MSI
) {
824 err
= atge_add_intr_handler(atgep
, DDI_INTR_TYPE_MSI
);
825 if (err
== DDI_SUCCESS
) {
826 ATGE_DB(("%s: Using MSI for interrupt",
833 if (atgep
->atge_intr_types
& DDI_INTR_TYPE_FIXED
) {
834 err
= atge_add_intr_handler(atgep
, DDI_INTR_TYPE_FIXED
);
835 if (err
== DDI_SUCCESS
) {
836 ATGE_DB(("%s: Using FIXED type for interrupt",
846 atge_identify_hardware(atge_t
*atgep
)
851 vid
= pci_config_get16(atgep
->atge_conf_handle
, PCI_CONF_VENID
);
852 did
= pci_config_get16(atgep
->atge_conf_handle
, PCI_CONF_DEVID
);
854 atgep
->atge_model
= 0;
855 for (i
= 0; i
< (sizeof (atge_cards
) / sizeof (atge_cards_t
)); i
++) {
856 if (atge_cards
[i
].vendor_id
== vid
&&
857 atge_cards
[i
].device_id
== did
) {
858 atgep
->atge_model
= atge_cards
[i
].model
;
859 atgep
->atge_vid
= vid
;
860 atgep
->atge_did
= did
;
862 pci_config_get8(atgep
->atge_conf_handle
,
864 atge_notice(atgep
->atge_dip
, "PCI-ID pci%x,%x,%x: %s",
865 vid
, did
, atgep
->atge_revid
,
866 atge_cards
[i
].cardname
);
867 ATGE_DB(("%s: %s : PCI-ID pci%x,%x and model : %d",
868 atgep
->atge_name
, __func__
, vid
, did
,
871 return (DDI_SUCCESS
);
875 atge_error(atgep
->atge_dip
, "atge driver is attaching to unknown"
876 " pci%x,%x vendor/device-id card", vid
, did
);
879 * Assume it's L1C chip.
881 atgep
->atge_model
= ATGE_CHIP_L1C
;
882 atgep
->atge_vid
= vid
;
883 atgep
->atge_did
= did
;
884 atgep
->atge_revid
= pci_config_get8(atgep
->atge_conf_handle
,
888 * We will leave the decision to caller.
890 return (DDI_FAILURE
);
894 atge_get_macaddr(atge_t
*atgep
)
898 reg
= INL(atgep
, ATGE_SPI_CTRL
);
899 if ((reg
& SPI_VPD_ENB
) != 0) {
901 * Get VPD stored in TWSI EEPROM.
904 OUTL(atgep
, ATGE_SPI_CTRL
, reg
);
906 ATGE_DB(("%s: %s called Get VPD", atgep
->atge_name
, __func__
));
909 atgep
->atge_ether_addr
[5] = INB(atgep
, ATGE_PAR0
+ 0);
910 atgep
->atge_ether_addr
[4] = INB(atgep
, ATGE_PAR0
+ 1);
911 atgep
->atge_ether_addr
[3] = INB(atgep
, ATGE_PAR0
+ 2);
912 atgep
->atge_ether_addr
[2] = INB(atgep
, ATGE_PAR0
+ 3);
913 atgep
->atge_ether_addr
[1] = INB(atgep
, ATGE_PAR1
+ 0);
914 atgep
->atge_ether_addr
[0] = INB(atgep
, ATGE_PAR1
+ 1);
916 ATGE_DB(("%s: %s() Station Address - %x:%x:%x:%x:%x:%x",
917 atgep
->atge_name
, __func__
,
918 atgep
->atge_ether_addr
[0],
919 atgep
->atge_ether_addr
[1],
920 atgep
->atge_ether_addr
[2],
921 atgep
->atge_ether_addr
[3],
922 atgep
->atge_ether_addr
[4],
923 atgep
->atge_ether_addr
[5]));
925 bcopy(atgep
->atge_ether_addr
, atgep
->atge_dev_addr
, ETHERADDRL
);
927 return (DDI_SUCCESS
);
931 * Reset functionality for L1, L1E, and L1C. It's same.
934 atge_device_reset(atge_t
*atgep
)
936 switch (ATGE_MODEL(atgep
)) {
940 atge_device_reset_l1_l1e(atgep
);
946 atge_device_reset_l1_l1e(atge_t
*atgep
)
950 switch (ATGE_MODEL(atgep
)) {
952 OUTL(atgep
, ATGE_MASTER_CFG
, MASTER_RESET
| 0x40);
955 OUTL(atgep
, ATGE_MASTER_CFG
, MASTER_RESET
);
958 reg
= INL(atgep
, ATGE_MASTER_CFG
);
959 for (t
= ATGE_RESET_TIMEOUT
; t
> 0; t
--) {
961 reg
= INL(atgep
, ATGE_MASTER_CFG
);
962 if ((reg
& MASTER_RESET
) == 0)
967 atge_error(atgep
->atge_dip
, " master reset timeout reg : %x",
971 for (t
= ATGE_RESET_TIMEOUT
; t
> 0; t
--) {
972 if ((reg
= INL(atgep
, ATGE_IDLE_STATUS
)) == 0)
979 atge_error(atgep
->atge_dip
, "device reset timeout reg : %x",
983 switch (ATGE_MODEL(atgep
)) {
987 * Initialize PCIe module. These values came from FreeBSD and
988 * we don't know the meaning of it.
990 OUTL(atgep
, ATGE_LTSSM_ID_CFG
, 0x6500);
991 reg
= INL(atgep
, 0x1008) | 0x8000;
992 OUTL(atgep
, 0x1008, reg
);
1001 atgep
->atge_chip_rev
= INL(atgep
, ATGE_MASTER_CFG
) >>
1002 MASTER_CHIP_REV_SHIFT
;
1004 ATGE_DB(("%s: %s reset successfully rev : %x", atgep
->atge_name
,
1005 __func__
, atgep
->atge_chip_rev
));
1009 * DMA allocation for L1 and L1E is bit different since L1E uses RX pages
1010 * instead of descriptor based RX model.
1013 atge_alloc_dma(atge_t
*atgep
)
1015 int err
= DDI_FAILURE
;
1017 switch (ATGE_MODEL(atgep
)) {
1019 err
= atge_l1e_alloc_dma(atgep
);
1022 err
= atge_l1_alloc_dma(atgep
);
1025 err
= atge_l1c_alloc_dma(atgep
);
1033 atge_free_dma(atge_t
*atgep
)
1035 switch (ATGE_MODEL(atgep
)) {
1037 atge_l1e_free_dma(atgep
);
1040 atge_l1_free_dma(atgep
);
1043 atge_l1c_free_dma(atgep
);
1049 * Attach entry point in the driver.
1052 atge_attach(dev_info_t
*devinfo
, ddi_attach_cmd_t cmd
)
1055 mac_register_t
*macreg
;
1062 instance
= ddi_get_instance(devinfo
);
1066 return (atge_resume(devinfo
));
1069 ddi_set_driver_private(devinfo
, NULL
);
1072 return (DDI_FAILURE
);
1076 atgep
= kmem_zalloc(sizeof (atge_t
), KM_SLEEP
);
1077 ddi_set_driver_private(devinfo
, atgep
);
1078 atgep
->atge_dip
= devinfo
;
1081 * Setup name and instance number to be used for debugging and
1084 (void) snprintf(atgep
->atge_name
, sizeof (atgep
->atge_name
), "%s%d",
1089 * Map PCI config space.
1091 err
= pci_config_setup(devinfo
, &atgep
->atge_conf_handle
);
1092 if (err
!= DDI_SUCCESS
) {
1093 atge_error(devinfo
, "pci_config_setup() failed");
1097 (void) atge_identify_hardware(atgep
);
1100 * Map Device registers.
1102 err
= ddi_regs_map_setup(devinfo
, ATGE_PCI_REG_NUMBER
,
1103 &atgep
->atge_io_regs
, 0, 0, &atge_dev_attr
, &atgep
->atge_io_handle
);
1104 if (err
!= DDI_SUCCESS
) {
1105 atge_error(devinfo
, "ddi_regs_map_setup() failed");
1110 * Add interrupt and its associated handler.
1112 err
= atge_add_intr(atgep
);
1113 if (err
!= DDI_SUCCESS
) {
1114 atge_error(devinfo
, "Failed to add interrupt handler");
1118 mutex_init(&atgep
->atge_intr_lock
, NULL
, MUTEX_DRIVER
,
1119 DDI_INTR_PRI(atgep
->atge_intr_pri
));
1121 mutex_init(&atgep
->atge_tx_lock
, NULL
, MUTEX_DRIVER
,
1122 DDI_INTR_PRI(atgep
->atge_intr_pri
));
1124 mutex_init(&atgep
->atge_rx_lock
, NULL
, MUTEX_DRIVER
,
1125 DDI_INTR_PRI(atgep
->atge_intr_pri
));
1127 mutex_init(&atgep
->atge_mii_lock
, NULL
, MUTEX_DRIVER
, NULL
);
1130 * Used to lock down MBOX register on L1 chip since RX consumer,
1131 * TX producer and RX return ring consumer are shared.
1133 mutex_init(&atgep
->atge_mbox_lock
, NULL
, MUTEX_DRIVER
,
1134 DDI_INTR_PRI(atgep
->atge_intr_pri
));
1136 atgep
->atge_link_state
= LINK_STATE_DOWN
;
1137 atgep
->atge_mtu
= ETHERMTU
;
1139 switch (ATGE_MODEL(atgep
)) {
1141 if (atgep
->atge_revid
> 0xF0) {
1142 /* L2E Rev. B. AR8114 */
1143 atgep
->atge_flags
|= ATGE_FLAG_FASTETHER
;
1145 if ((INL(atgep
, L1E_PHY_STATUS
) &
1146 PHY_STATUS_100M
) != 0) {
1148 atgep
->atge_flags
|= ATGE_FLAG_JUMBO
;
1150 /* L2E Rev. A. AR8113 */
1151 atgep
->atge_flags
|= ATGE_FLAG_FASTETHER
;
1159 * One odd thing is AR8132 uses the same PHY hardware(F1
1160 * gigabit PHY) of AR8131. So atphy(4) of AR8132 reports
1161 * the PHY supports 1000Mbps but that's not true. The PHY
1162 * used in AR8132 can't establish gigabit link even if it
1163 * shows the same PHY model/revision number of AR8131.
1165 * It seems that AR813x/AR815x has silicon bug for SMB. In
1166 * addition, Atheros said that enabling SMB wouldn't improve
1167 * performance. However I think it's bad to access lots of
1168 * registers to extract MAC statistics.
1170 * Don't use Tx CMB. It is known to have silicon bug.
1172 switch (ATGE_DID(atgep
)) {
1173 case ATGE_CHIP_AR8152V2_DEV_ID
:
1174 case ATGE_CHIP_AR8152V1_DEV_ID
:
1175 atgep
->atge_flags
|= ATGE_FLAG_APS
|
1176 ATGE_FLAG_FASTETHER
|
1177 ATGE_FLAG_ASPM_MON
| ATGE_FLAG_JUMBO
|
1178 ATGE_FLAG_SMB_BUG
| ATGE_FLAG_CMB_BUG
;
1180 case ATGE_CHIP_AR8151V2_DEV_ID
:
1181 case ATGE_CHIP_AR8151V1_DEV_ID
:
1182 atgep
->atge_flags
|= ATGE_FLAG_APS
|
1183 ATGE_FLAG_ASPM_MON
| ATGE_FLAG_JUMBO
|
1184 ATGE_FLAG_SMB_BUG
| ATGE_FLAG_CMB_BUG
;
1186 case ATGE_CHIP_L1CF_DEV_ID
:
1187 atgep
->atge_flags
|= ATGE_FLAG_FASTETHER
;
1189 case ATGE_CHIP_L1CG_DEV_ID
:
1196 * Get DMA parameters from PCIe device control register.
1198 err
= PCI_CAP_LOCATE(atgep
->atge_conf_handle
, PCI_CAP_ID_PCI_E
,
1201 if (err
== DDI_FAILURE
) {
1202 atgep
->atge_dma_rd_burst
= DMA_CFG_RD_BURST_128
;
1203 atgep
->atge_dma_wr_burst
= DMA_CFG_WR_BURST_128
;
1205 atgep
->atge_flags
|= ATGE_FLAG_PCIE
;
1206 burst
= pci_config_get16(atgep
->atge_conf_handle
,
1210 * Max read request size.
1212 atgep
->atge_dma_rd_burst
= ((burst
>> 12) & 0x07) <<
1213 DMA_CFG_RD_BURST_SHIFT
;
1218 atgep
->atge_dma_wr_burst
= ((burst
>> 5) & 0x07) <<
1219 DMA_CFG_WR_BURST_SHIFT
;
1221 ATGE_DB(("%s: %s() MRR : %d, MPS : %d",
1222 atgep
->atge_name
, __func__
,
1223 (128 << ((burst
>> 12) & 0x07)),
1224 (128 << ((burst
>> 5) & 0x07))));
1227 /* Clear data link and flow-control protocol error. */
1228 switch (ATGE_MODEL(atgep
)) {
1234 OUTL_AND(atgep
, ATGE_PEX_UNC_ERR_SEV
,
1235 ~(PEX_UNC_ERR_SEV_UC
| PEX_UNC_ERR_SEV_FCP
));
1236 OUTL_AND(atgep
, ATGE_LTSSM_ID_CFG
, ~LTSSM_ID_WRO_ENB
);
1237 OUTL_OR(atgep
, ATGE_PCIE_PHYMISC
, PCIE_PHYMISC_FORCE_RCV_DET
);
1242 * Allocate DMA resources.
1244 err
= atge_alloc_dma(atgep
);
1245 if (err
!= DDI_SUCCESS
) {
1246 atge_error(devinfo
, "Failed to allocate DMA resources");
1251 * Get station address.
1253 (void) atge_get_macaddr(atgep
);
1258 switch (ATGE_MODEL(atgep
)) {
1260 mii_ops
= &atge_l1e_mii_ops
;
1263 mii_ops
= &atge_l1_mii_ops
;
1266 mii_ops
= &atge_l1c_mii_ops
;
1270 if ((atgep
->atge_mii
= mii_alloc(atgep
, devinfo
,
1271 mii_ops
)) == NULL
) {
1272 atge_error(devinfo
, "mii_alloc() failed");
1277 * Register with MAC layer.
1279 if ((macreg
= mac_alloc(MAC_VERSION
)) == NULL
) {
1280 atge_error(devinfo
, "mac_alloc() failed due to version");
1284 macreg
->m_type_ident
= MAC_PLUGIN_IDENT_ETHER
;
1285 macreg
->m_driver
= atgep
;
1286 macreg
->m_dip
= devinfo
;
1287 macreg
->m_instance
= instance
;
1288 macreg
->m_src_addr
= atgep
->atge_ether_addr
;
1289 macreg
->m_callbacks
= &atge_m_callbacks
;
1290 macreg
->m_min_sdu
= 0;
1291 macreg
->m_max_sdu
= atgep
->atge_mtu
;
1292 macreg
->m_margin
= VLAN_TAGSZ
;
1294 if ((err
= mac_register(macreg
, &atgep
->atge_mh
)) != 0) {
1295 atge_error(devinfo
, "mac_register() failed with :%d", err
);
1302 ATGE_DB(("%s: %s() driver attached successfully",
1303 atgep
->atge_name
, __func__
));
1305 atge_device_reset(atgep
);
1307 atgep
->atge_chip_state
= ATGE_CHIP_INITIALIZED
;
1310 * At last - enable interrupts.
1312 err
= atge_enable_intrs(atgep
);
1313 if (err
== DDI_FAILURE
) {
1318 * Reset the PHY before starting.
1320 switch (ATGE_MODEL(atgep
)) {
1322 atge_l1e_mii_reset(atgep
);
1325 atge_l1_mii_reset(atgep
);
1328 atge_l1c_mii_reset(atgep
);
1335 mii_start(atgep
->atge_mii
);
1337 return (DDI_SUCCESS
);
1340 (void) mac_unregister(atgep
->atge_mh
);
1341 atge_device_stop(atgep
);
1342 mii_stop(atgep
->atge_mii
);
1343 mii_free(atgep
->atge_mii
);
1345 atge_free_dma(atgep
);
1346 mutex_destroy(&atgep
->atge_intr_lock
);
1347 mutex_destroy(&atgep
->atge_tx_lock
);
1348 mutex_destroy(&atgep
->atge_rx_lock
);
1349 atge_remove_intr(atgep
);
1351 ddi_regs_map_free(&atgep
->atge_io_handle
);
1353 pci_config_teardown(&atgep
->atge_conf_handle
);
1356 kmem_free(atgep
, sizeof (atge_t
));
1358 return (DDI_FAILURE
);
1362 atge_detach(dev_info_t
*dip
, ddi_detach_cmd_t cmd
)
1366 atgep
= ddi_get_driver_private(dip
);
1367 if (atgep
== NULL
) {
1368 atge_error(dip
, "No soft state in detach");
1369 return (DDI_FAILURE
);
1376 * First unregister with MAC layer before stopping DMA
1378 if (mac_disable(atgep
->atge_mh
) != DDI_SUCCESS
)
1379 return (DDI_FAILURE
);
1381 mii_stop(atgep
->atge_mii
);
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
);
1389 mii_free(atgep
->atge_mii
);
1390 atge_free_dma(atgep
);
1392 ddi_regs_map_free(&atgep
->atge_io_handle
);
1393 atge_remove_intr(atgep
);
1394 pci_config_teardown(&atgep
->atge_conf_handle
);
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
);
1403 return (DDI_SUCCESS
);
1406 ATGE_DB(("%s: %s() is being suspended",
1407 atgep
->atge_name
, __func__
));
1410 * Suspend monitoring MII.
1412 mii_suspend(atgep
->atge_mii
);
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
);
1421 return (DDI_SUCCESS
);
1424 return (DDI_FAILURE
);
1429 atge_alloc_buffers(atge_ring_t
*r
, size_t rcnt
, size_t buflen
, int f
)
1433 int err
= DDI_SUCCESS
;
1436 tbl
= kmem_zalloc(rcnt
* sizeof (atge_dma_t
*), KM_SLEEP
);
1439 for (i
= 0; i
< rcnt
; i
++) {
1440 dma
= atge_buf_alloc(r
->r_atge
, buflen
, f
);
1453 atge_free_buffers(atge_ring_t
*r
, size_t rcnt
)
1458 if (r
== NULL
|| r
->r_buf_tbl
== NULL
)
1462 for (i
= 0; i
< rcnt
; i
++) {
1463 if (tbl
[i
] != NULL
) {
1464 atge_buf_free(tbl
[i
]);
1468 kmem_free(tbl
, rcnt
* sizeof (atge_dma_t
*));
1472 atge_alloc_a_dma_blk(atge_t
*atgep
, ddi_dma_attr_t
*attr
, int size
, int d
)
1477 dma
= kmem_zalloc(sizeof (atge_dma_t
), KM_SLEEP
);
1479 err
= ddi_dma_alloc_handle(atgep
->atge_dip
, attr
,
1480 DDI_DMA_SLEEP
, NULL
, &dma
->hdl
);
1482 if (err
!= DDI_SUCCESS
) {
1483 atge_error(atgep
->atge_dip
, "%s() : failed"
1484 " in ddi_dma_alloc_handle() : %d", __func__
, err
);
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
);
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
);
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
);
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
);
1513 kmem_free(dma
, sizeof (atge_dma_t
));
1518 atge_free_a_dma_blk(atge_dma_t
*dma
)
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
));
1529 atge_buf_alloc(atge_t
*atgep
, size_t len
, int f
)
1531 atge_dma_t
*dma
= NULL
;
1534 dma
= kmem_zalloc(sizeof (atge_dma_t
), KM_SLEEP
);
1536 err
= ddi_dma_alloc_handle(atgep
->atge_dip
, &atge_dma_attr_buf
,
1537 DDI_DMA_SLEEP
, NULL
, &dma
->hdl
);
1539 if (err
!= DDI_SUCCESS
) {
1540 atge_error(atgep
->atge_dip
, "%s() : failed"
1541 " in %s() : %d", __func__
, err
);
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
);
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
);
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
,
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
);
1569 * Number of return'ed cookie should be one.
1571 ASSERT(dma
->count
== 1);
1575 kmem_free(dma
, sizeof (atge_dma_t
));
1580 atge_buf_free(atge_dma_t
*dma
)
1582 ASSERT(dma
!= NULL
);
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
));
1591 atge_resume(dev_info_t
*dip
)
1595 if ((atgep
= ddi_get_driver_private(dip
)) == NULL
) {
1596 return (DDI_FAILURE
);
1599 mutex_enter(&atgep
->atge_intr_lock
);
1600 mutex_enter(&atgep
->atge_tx_lock
);
1602 atgep
->atge_chip_state
&= ~ATGE_CHIP_SUSPENDED
;
1604 if (atgep
->atge_chip_state
& ATGE_CHIP_RUNNING
) {
1605 atge_device_restart(atgep
);
1607 atge_device_reset(atgep
);
1610 mutex_exit(&atgep
->atge_tx_lock
);
1611 mutex_exit(&atgep
->atge_intr_lock
);
1614 * Reset the PHY before resuming MII.
1616 switch (ATGE_MODEL(atgep
)) {
1618 atge_l1e_mii_reset(atgep
);
1626 mii_resume(atgep
->atge_mii
);
1628 /* kick-off downstream */
1629 mac_tx_update(atgep
->atge_mh
);
1631 return (DDI_SUCCESS
);
1635 atge_quiesce(dev_info_t
*dip
)
1639 if ((atgep
= ddi_get_driver_private(dip
)) == NULL
) {
1640 return (DDI_FAILURE
);
1643 atge_device_stop(atgep
);
1645 return (DDI_SUCCESS
);
1649 atge_add_multicst(atge_t
*atgep
, uint8_t *macaddr
)
1654 ASSERT(MUTEX_HELD(&atgep
->atge_intr_lock
));
1655 ASSERT(MUTEX_HELD(&atgep
->atge_tx_lock
));
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]));
1661 crc
= atge_ether_crc(macaddr
, ETHERADDRL
);
1663 atgep
->atge_mchash_ref_cnt
[bit
]++;
1664 atgep
->atge_mchash
|= (1ULL << (crc
>> 26));
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
]));
1673 atge_remove_multicst(atge_t
*atgep
, uint8_t *macaddr
)
1678 ASSERT(MUTEX_HELD(&atgep
->atge_intr_lock
));
1679 ASSERT(MUTEX_HELD(&atgep
->atge_tx_lock
));
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]));
1685 crc
= atge_ether_crc(macaddr
, ETHERADDRL
);
1687 atgep
->atge_mchash_ref_cnt
[bit
]--;
1688 if (atgep
->atge_mchash_ref_cnt
[bit
] == 0)
1689 atgep
->atge_mchash
&= ~(1ULL << (crc
>> 26));
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
]));
1698 atge_m_multicst(void *arg
, boolean_t add
, const uint8_t *macaddr
)
1700 atge_t
*atgep
= arg
;
1702 mutex_enter(&atgep
->atge_intr_lock
);
1703 mutex_enter(&atgep
->atge_tx_lock
);
1706 atge_add_multicst(atgep
, (uint8_t *)macaddr
);
1708 atge_remove_multicst(atgep
, (uint8_t *)macaddr
);
1711 atge_rxfilter(atgep
);
1713 mutex_exit(&atgep
->atge_tx_lock
);
1714 mutex_exit(&atgep
->atge_intr_lock
);
1720 atge_m_promisc(void *arg
, boolean_t on
)
1722 atge_t
*atgep
= arg
;
1724 mutex_enter(&atgep
->atge_intr_lock
);
1725 mutex_enter(&atgep
->atge_tx_lock
);
1728 atgep
->atge_filter_flags
|= ATGE_PROMISC
;
1730 atgep
->atge_filter_flags
&= ~ATGE_PROMISC
;
1733 if (atgep
->atge_chip_state
& ATGE_CHIP_RUNNING
) {
1734 atge_rxfilter(atgep
);
1737 mutex_exit(&atgep
->atge_tx_lock
);
1738 mutex_exit(&atgep
->atge_intr_lock
);
1744 atge_m_unicst(void *arg
, const uint8_t *macaddr
)
1746 atge_t
*atgep
= arg
;
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
);
1760 atge_m_tx(void *arg
, mblk_t
*mp
)
1762 atge_t
*atgep
= arg
;
1765 mutex_enter(&atgep
->atge_tx_lock
);
1768 * This NIC does not like us to send pkt when link is down.
1770 if (!(atgep
->atge_link_state
& LINK_STATE_UP
)) {
1771 atgep
->atge_tx_resched
= 1;
1773 mutex_exit(&atgep
->atge_tx_lock
);
1778 * Don't send a pkt if chip isn't running or in suspended state.
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;
1785 mutex_exit(&atgep
->atge_tx_lock
);
1789 while (mp
!= NULL
) {
1793 if (atge_send_a_packet(atgep
, mp
) == DDI_FAILURE
) {
1801 mutex_exit(&atgep
->atge_tx_lock
);
1806 atge_m_start(void *arg
)
1808 atge_t
*atgep
= arg
;
1811 ASSERT(atgep
!= NULL
);
1814 mii_stop(atgep
->atge_mii
);
1816 mutex_enter(&atgep
->atge_intr_lock
);
1817 mutex_enter(&atgep
->atge_tx_lock
);
1819 if (!(atgep
->atge_chip_state
& ATGE_CHIP_SUSPENDED
)) {
1820 atge_device_restart(atgep
);
1824 mutex_exit(&atgep
->atge_tx_lock
);
1825 mutex_exit(&atgep
->atge_intr_lock
);
1827 mii_start(atgep
->atge_mii
);
1829 /* kick-off downstream */
1831 mac_tx_update(atgep
->atge_mh
);
1837 atge_m_stop(void *arg
)
1839 atge_t
*atgep
= arg
;
1841 mii_stop(atgep
->atge_mii
);
1844 * Cancel any pending I/O.
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
);
1854 atge_m_stat(void *arg
, uint_t stat
, uint64_t *val
)
1856 atge_t
*atgep
= arg
;
1858 if (mii_m_getstat(atgep
->atge_mii
, stat
, val
) == 0) {
1863 case MAC_STAT_MULTIRCV
:
1864 *val
= atgep
->atge_multircv
;
1867 case MAC_STAT_BRDCSTRCV
:
1868 *val
= atgep
->atge_brdcstrcv
;
1871 case MAC_STAT_MULTIXMT
:
1872 *val
= atgep
->atge_multixmt
;
1875 case MAC_STAT_BRDCSTXMT
:
1876 *val
= atgep
->atge_brdcstxmt
;
1879 case MAC_STAT_IPACKETS
:
1880 *val
= atgep
->atge_ipackets
;
1883 case MAC_STAT_RBYTES
:
1884 *val
= atgep
->atge_rbytes
;
1887 case MAC_STAT_OPACKETS
:
1888 *val
= atgep
->atge_opackets
;
1891 case MAC_STAT_OBYTES
:
1892 *val
= atgep
->atge_obytes
;
1895 case MAC_STAT_NORCVBUF
:
1896 *val
= atgep
->atge_norcvbuf
;
1899 case MAC_STAT_NOXMTBUF
:
1903 case MAC_STAT_COLLISIONS
:
1904 *val
= atgep
->atge_collisions
;
1907 case MAC_STAT_IERRORS
:
1908 *val
= atgep
->atge_errrcv
;
1911 case MAC_STAT_OERRORS
:
1912 *val
= atgep
->atge_errxmt
;
1915 case ETHER_STAT_ALIGN_ERRORS
:
1916 *val
= atgep
->atge_align_errors
;
1919 case ETHER_STAT_FCS_ERRORS
:
1920 *val
= atgep
->atge_fcs_errors
;
1923 case ETHER_STAT_SQE_ERRORS
:
1924 *val
= atgep
->atge_sqe_errors
;
1927 case ETHER_STAT_DEFER_XMTS
:
1928 *val
= atgep
->atge_defer_xmts
;
1931 case ETHER_STAT_FIRST_COLLISIONS
:
1932 *val
= atgep
->atge_first_collisions
;
1935 case ETHER_STAT_MULTI_COLLISIONS
:
1936 *val
= atgep
->atge_multi_collisions
;
1939 case ETHER_STAT_TX_LATE_COLLISIONS
:
1940 *val
= atgep
->atge_tx_late_collisions
;
1943 case ETHER_STAT_EX_COLLISIONS
:
1944 *val
= atgep
->atge_ex_collisions
;
1947 case ETHER_STAT_MACXMT_ERRORS
:
1948 *val
= atgep
->atge_macxmt_errors
;
1951 case ETHER_STAT_CARRIER_ERRORS
:
1952 *val
= atgep
->atge_carrier_errors
;
1955 case ETHER_STAT_TOOLONG_ERRORS
:
1956 *val
= atgep
->atge_toolong_errors
;
1959 case ETHER_STAT_MACRCV_ERRORS
:
1960 *val
= atgep
->atge_macrcv_errors
;
1963 case MAC_STAT_OVERFLOWS
:
1964 *val
= atgep
->atge_overflow
;
1967 case MAC_STAT_UNDERFLOWS
:
1968 *val
= atgep
->atge_underflow
;
1971 case ETHER_STAT_TOOSHORT_ERRORS
:
1972 *val
= atgep
->atge_runt
;
1975 case ETHER_STAT_JABBER_ERRORS
:
1976 *val
= atgep
->atge_jabber
;
1987 atge_m_getprop(void *arg
, const char *name
, mac_prop_id_t num
, uint_t sz
,
1990 atge_t
*atgep
= arg
;
1992 return (mii_m_getprop(atgep
->atge_mii
, name
, num
, sz
, val
));
1996 atge_m_setprop(void *arg
, const char *name
, mac_prop_id_t num
, uint_t sz
,
1999 atge_t
*atgep
= arg
;
2002 r
= mii_m_setprop(atgep
->atge_mii
, name
, num
, sz
, val
);
2005 mutex_enter(&atgep
->atge_intr_lock
);
2006 mutex_enter(&atgep
->atge_tx_lock
);
2008 if (atgep
->atge_chip_state
& ATGE_CHIP_RUNNING
) {
2009 atge_device_restart(atgep
);
2012 mutex_exit(&atgep
->atge_tx_lock
);
2013 mutex_exit(&atgep
->atge_intr_lock
);
2020 atge_m_propinfo(void *arg
, const char *name
, mac_prop_id_t num
,
2021 mac_prop_info_handle_t prh
)
2023 atge_t
*atgep
= arg
;
2025 mii_m_propinfo(atgep
->atge_mii
, name
, num
, prh
);
2029 atge_program_ether(atge_t
*atgep
)
2034 * Reprogram the Station address.
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]);
2043 * Device specific operations.
2046 atge_device_start(atge_t
*atgep
)
2048 uint32_t rxf_hi
, rxf_lo
, rrd_hi
, rrd_lo
;
2053 * Reprogram the Station address.
2055 atge_program_ether(atgep
);
2057 switch (ATGE_MODEL(atgep
)) {
2059 atge_l1e_program_dma(atgep
);
2062 atge_l1_program_dma(atgep
);
2065 atge_l1c_program_dma(atgep
);
2069 ATGE_DB(("%s: %s() dma, counters programmed ", atgep
->atge_name
,
2072 switch (ATGE_MODEL(atgep
)) {
2075 OUTW(atgep
, ATGE_INTR_CLR_TIMER
, 1*1000/2);
2079 * Disable interrupt re-trigger timer. We don't want automatic
2080 * re-triggering of un-ACKed interrupts.
2082 OUTL(atgep
, ATGE_INTR_RETRIG_TIMER
, ATGE_USECS(0));
2083 /* Configure CMB. */
2084 OUTL(atgep
, ATGE_CMB_TX_TIMER
, ATGE_USECS(0));
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.
2091 OUTL(atgep
, ATGE_SMB_STAT_TIMER
, ATGE_USECS(0));
2092 /* Clear MAC statistics. */
2093 atge_l1c_clear_stats(atgep
);
2098 * Set Maximum frame size but don't let MTU be less than ETHER_MTU.
2100 if (atgep
->atge_mtu
< ETHERMTU
)
2101 atgep
->atge_max_frame_size
= ETHERMTU
;
2103 atgep
->atge_max_frame_size
= atgep
->atge_mtu
;
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
);
2109 switch (ATGE_MODEL(atgep
)) {
2115 /* Disable header split(?) */
2116 OUTL(atgep
, ATGE_HDS_CFG
, 0);
2121 * Configure IPG/IFG parameters.
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
));
2130 * Set parameters for half-duplex media.
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
));
2143 * Configure jumbo frame.
2145 switch (ATGE_MODEL(atgep
)) {
2147 if (atgep
->atge_flags
& ATGE_FLAG_JUMBO
) {
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;
2154 reg
= atgep
->atge_max_frame_size
/ 2;
2156 OUTL(atgep
, L1E_TX_JUMBO_THRESH
,
2157 ROUNDUP(reg
, TX_JUMBO_THRESH_UNIT
) >>
2158 TX_JUMBO_THRESH_UNIT_SHIFT
);
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
));
2177 * Configure flow-control parameters.
2179 switch (ATGE_MODEL(atgep
)) {
2182 if ((atgep
->atge_flags
& ATGE_FLAG_PCIE
) != 0) {
2184 * Some hardware version require this magic.
2186 OUTL(atgep
, ATGE_LTSSM_ID_CFG
, 0x6500);
2187 reg
= INL(atgep
, 0x1008);
2188 OUTL(atgep
, 0x1008, reg
| 0x8000);
2196 * These are all magic parameters which came from FreeBSD.
2198 switch (ATGE_MODEL(atgep
)) {
2200 reg
= INL(atgep
, L1E_SRAM_RX_FIFO_LEN
);
2201 rxf_hi
= (reg
* 4) / 5;
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
));
2211 switch (atgep
->atge_chip_rev
) {
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;
2222 reg
= INL(atgep
, L1_SRAM_RX_FIFO_LEN
);
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
);
2231 rrd_hi
= (reg
* 7) / 8;
2234 if (rrd_hi
< rrd_lo
)
2235 rrd_hi
= rrd_lo
+ 3;
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
));
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
));
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
);
2260 case ATGE_CHIP_L1CG_DEV_ID
:
2261 case ATGE_CHIP_L1CF_DEV_ID
:
2263 * Configure flow control parameters.
2264 * XON : 80% of Rx FIFO
2265 * XOFF : 30% of Rx FIFO
2267 reg
= INL(atgep
, L1C_SRAM_RX_FIFO_LEN
);
2268 rxf_hi
= (reg
* 8) / 10;
2269 rxf_lo
= (reg
* 3) / 10;
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
));
2281 switch (ATGE_MODEL(atgep
)) {
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
);
2291 (atgep
->atge_dma_rd_burst
>> DMA_CFG_RD_BURST_SHIFT
)) <<
2292 TXQ_CFG_TX_FIFO_BURST_SHIFT
;
2294 reg
|= (TXQ_CFG_TPD_BURST_DEFAULT
<< TXQ_CFG_TPD_BURST_SHIFT
) &
2295 TXQ_CFG_TPD_BURST_MASK
;
2297 reg
|= TXQ_CFG_ENHANCED_MODE
| TXQ_CFG_ENB
;
2299 OUTL(atgep
, ATGE_TXQ_CFG
, reg
);
2301 OUTL(atgep
, L1E_RSS_IDT_TABLE0
, 0);
2302 OUTL(atgep
, L1E_RSS_CPU
, 0);
2304 * Configure DMA parameters.
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.
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
|
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
));
2321 * Enable CMB/SMB timer.
2323 OUTL(atgep
, L1E_SMB_STAT_TIMER
, 100000);
2324 atge_l1e_clear_stats(atgep
);
2327 /* Configure RxQ. */
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
);
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
) |
2352 OUTL(atgep
, ATGE_TXQ_CFG
, reg
);
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
));
2360 * Configure DMA parameters.
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
);
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
));
2374 * Enable CMB/SMB timer.
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
));
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
);
2389 /* Configure RxQ. */
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
);
2400 (atgep
->atge_dma_rd_burst
>> DMA_CFG_RD_BURST_SHIFT
)) <<
2401 TXQ_CFG_TX_FIFO_BURST_SHIFT
;
2403 switch (ATGE_DID(atgep
)) {
2404 case ATGE_CHIP_AR8152V2_DEV_ID
:
2405 case ATGE_CHIP_AR8152V1_DEV_ID
:
2410 reg
|= (L1C_TXQ_CFG_TPD_BURST_DEFAULT
<<
2411 TXQ_CFG_TPD_BURST_SHIFT
) & TXQ_CFG_TPD_BURST_MASK
;
2413 reg
|= TXQ_CFG_ENHANCED_MODE
| TXQ_CFG_ENB
;
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);
2420 * Configure DMA parameters.
2422 OUTL(atgep
, ATGE_DMA_CFG
,
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
|
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. */
2436 * Disable all WOL bits as WOL can interfere normal Rx
2439 OUTL(atgep
, ATGE_WOL_CFG
, 0);
2442 * Configure Tx/Rx MACs.
2443 * - Auto-padding for short frames.
2444 * - Enable CRC generation.
2446 * Start with full-duplex/1000Mbps media. Actual reconfiguration
2447 * of MAC is followed after link establishment.
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
));
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.
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
;
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__
));
2474 reg
|= ATGE_CFG_SPEED_1000
;
2475 ATGE_DB(("%s: %s() 1G speed", atgep
->atge_name
, __func__
));
2477 switch (ATGE_MODEL(atgep
)) {
2479 reg
|= L1C_CFG_SINGLE_PAUSE_ENB
;
2483 OUTL(atgep
, ATGE_MAC_CFG
, reg
);
2485 atgep
->atge_chip_state
|= ATGE_CHIP_RUNNING
;
2488 * Set up the receive filter.
2490 atge_rxfilter(atgep
);
2493 * Acknowledge all pending interrupts and clear it.
2495 switch (ATGE_MODEL(atgep
)) {
2497 OUTL(atgep
, ATGE_INTR_MASK
, L1E_INTRS
);
2498 OUTL(atgep
, ATGE_INTR_STATUS
, 0xFFFFFFFF);
2499 OUTL(atgep
, ATGE_INTR_STATUS
, 0);
2503 OUTL(atgep
, ATGE_INTR_STATUS
, 0);
2504 OUTL(atgep
, ATGE_INTR_MASK
, atgep
->atge_intrs
);
2508 atge_mac_config(atgep
);
2510 ATGE_DB(("%s: %s() device started", atgep
->atge_name
, __func__
));
2514 * Generic functions.
2517 #define CRC32_POLY_BE 0x04c11db7
2519 atge_ether_crc(const uint8_t *addr
, int len
)
2527 for (idx
= 0; idx
< len
; idx
++) {
2528 for (data
= *addr
++, bit
= 0; bit
< 8; bit
++, data
>>= 1) {
2530 ^ ((((crc
>> 31) ^ data
) & 1) ? CRC32_POLY_BE
: 0);
2539 * Programs RX filter. We use a link-list to keep track of all multicast
2543 atge_rxfilter(atge_t
*atgep
)
2548 rxcfg
= INL(atgep
, ATGE_MAC_CFG
);
2549 rxcfg
&= ~(ATGE_CFG_ALLMULTI
| ATGE_CFG_PROMISC
);
2552 * Accept broadcast frames.
2554 rxcfg
|= ATGE_CFG_BCAST
;
2557 * We don't use Hardware VLAN tagging.
2559 rxcfg
&= ~ATGE_CFG_VLAN_TAG_STRIP
;
2561 if (atgep
->atge_filter_flags
& (ATGE_PROMISC
| ATGE_ALL_MULTICST
)) {
2564 if (atgep
->atge_filter_flags
& ATGE_PROMISC
)
2565 rxcfg
|= ATGE_CFG_PROMISC
;
2567 if (atgep
->atge_filter_flags
& ATGE_ALL_MULTICST
)
2568 rxcfg
|= ATGE_CFG_ALLMULTI
;
2570 mchash
= atgep
->atge_mchash
;
2573 atge_program_ether(atgep
);
2575 OUTL(atgep
, ATGE_MAR0
, (uint32_t)mchash
);
2576 OUTL(atgep
, ATGE_MAR1
, (uint32_t)(mchash
>> 32));
2577 OUTL(atgep
, ATGE_MAC_CFG
, rxcfg
);
2579 ATGE_DB(("%s: %s() mac_cfg is : %x, mchash : %llx",
2580 atgep
->atge_name
, __func__
, rxcfg
, mchash
));
2584 atge_device_stop(atge_t
*atgep
)
2590 * If the chip is being suspended, then don't touch the state. Caller
2591 * will take care of setting the correct state.
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
;
2599 * Collect stats for L1E. L1 chip's stats are collected by interrupt.
2601 switch (ATGE_MODEL(atgep
)) {
2603 atge_l1e_gather_stats(atgep
);
2611 * Disable interrupts.
2613 atge_disable_intrs(atgep
);
2615 switch (ATGE_MODEL(atgep
)) {
2617 /* Clear CTRL not required. */
2618 /* Stop DMA Engine not required. */
2620 * Disable queue processing.
2623 reg
= INL(atgep
, ATGE_TXQ_CFG
);
2624 reg
= reg
& ~TXQ_CFG_ENB
;
2625 OUTL(atgep
, ATGE_TXQ_CFG
, reg
);
2627 reg
= INL(atgep
, ATGE_RXQ_CFG
);
2628 reg
= reg
& ~RXQ_CFG_ENB
;
2629 OUTL(atgep
, ATGE_RXQ_CFG
, reg
);
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
);
2635 atge_l1e_stop_mac(atgep
);
2636 OUTL(atgep
, ATGE_INTR_STATUS
, 0xFFFFFFFF);
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
);
2648 * Disable queue processing.
2651 reg
= INL(atgep
, ATGE_TXQ_CFG
);
2652 reg
= reg
& ~TXQ_CFG_ENB
;
2653 OUTL(atgep
, ATGE_TXQ_CFG
, reg
);
2655 reg
= INL(atgep
, ATGE_RXQ_CFG
);
2656 reg
= reg
& ~RXQ_CFG_ENB
;
2657 OUTL(atgep
, ATGE_RXQ_CFG
, reg
);
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
);
2668 * Disable queue processing.
2671 reg
= INL(atgep
, L1C_TXQ_CFG
);
2672 reg
= reg
& ~TXQ_CFG_ENB
;
2673 OUTL(atgep
, L1C_TXQ_CFG
, reg
);
2675 reg
= INL(atgep
, ATGE_RXQ_CFG
);
2676 reg
= reg
& ~RXQ_CFG_ENB
;
2677 OUTL(atgep
, ATGE_RXQ_CFG
, reg
);
2681 for (t
= ATGE_RESET_TIMEOUT
; t
> 0; t
--) {
2682 if ((reg
= INL(atgep
, ATGE_IDLE_STATUS
)) == 0)
2688 atge_error(atgep
->atge_dip
, "%s() stopping TX/RX MAC timeout",
2694 atge_disable_intrs(atge_t
*atgep
)
2696 OUTL(atgep
, ATGE_INTR_MASK
, 0);
2697 OUTL(atgep
, ATGE_INTR_STATUS
, 0xFFFFFFFF);
2701 atge_device_init(atge_t
*atgep
)
2703 switch (ATGE_MODEL(atgep
)) {
2705 atgep
->atge_intrs
= L1E_INTRS
;
2706 atgep
->atge_int_mod
= ATGE_IM_TIMER_DEFAULT
;
2708 atge_l1e_init_tx_ring(atgep
);
2709 atge_l1e_init_rx_pages(atgep
);
2712 atgep
->atge_intrs
= L1_INTRS
| INTR_GPHY
| INTR_PHY_LINK_DOWN
|
2714 atgep
->atge_int_mod
= ATGE_IM_TIMER_DEFAULT
;
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
);
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;
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
);
2734 /* Enable all clocks. */
2735 OUTL(atgep
, ATGE_CLK_GATING_CFG
, 0);
2741 atge_device_restart(atge_t
*atgep
)
2743 ASSERT(MUTEX_HELD(&atgep
->atge_intr_lock
));
2744 ASSERT(MUTEX_HELD(&atgep
->atge_tx_lock
));
2747 * Cancel any pending I/O.
2749 atge_device_stop(atgep
);
2752 * Reset the chip to a known state.
2754 atge_device_reset(atgep
);
2757 * Initialize the ring and other descriptor like CMB/SMB/Rx return.
2759 atge_device_init(atgep
);
2764 atge_device_start(atgep
);
2769 atge_send_a_packet(atge_t
*atgep
, mblk_t
*mp
)
2772 uint32_t cflags
= 0;
2778 ASSERT(MUTEX_HELD(&atgep
->atge_tx_lock
));
2781 pktlen
= msgsize(mp
);
2782 if (pktlen
> atgep
->atge_tx_buf_len
) {
2783 atgep
->atge_macxmt_errors
++;
2785 ATGE_DB(("%s: %s() pktlen (%d) > rx_buf_len (%d)",
2786 atgep
->atge_name
, __func__
,
2787 pktlen
, atgep
->atge_rx_buf_len
));
2790 return (DDI_SUCCESS
);
2793 r
= atgep
->atge_tx_ring
;
2795 if (r
->r_avail_desc
<= 1) {
2796 atgep
->atge_noxmtbuf
++;
2797 atgep
->atge_tx_resched
= 1;
2799 ATGE_DB(("%s: %s() No transmit buf",
2800 atgep
->atge_name
, __func__
));
2802 return (DDI_FAILURE
);
2805 start
= r
->r_producer
;
2808 * Get the DMA buffer to hold a packet.
2810 buf
= (uchar_t
*)r
->r_buf_tbl
[start
]->addr
;
2813 * Copy the msg and free mp
2819 c
= (uchar_t
*)r
->r_desc_ring
->addr
;
2820 switch (ATGE_MODEL(atgep
)) {
2825 c
+= (sizeof (l1c_tx_desc_t
) * start
);
2826 txd
= (l1c_tx_desc_t
*)c
;
2828 ATGE_PUT64(r
->r_desc_ring
, &txd
->addr
,
2829 r
->r_buf_tbl
[start
]->cookie
.dmac_laddress
);
2831 ATGE_PUT32(r
->r_desc_ring
, &txd
->len
, L1C_TX_BYTES(pktlen
));
2833 cflags
|= L1C_TD_EOP
;
2834 ATGE_PUT32(r
->r_desc_ring
, &txd
->flags
, cflags
);
2839 atge_tx_desc_t
*txd
;
2841 c
+= (sizeof (atge_tx_desc_t
) * start
);
2842 txd
= (atge_tx_desc_t
*)c
;
2844 ATGE_PUT64(r
->r_desc_ring
, &txd
->addr
,
2845 r
->r_buf_tbl
[start
]->cookie
.dmac_laddress
);
2847 ATGE_PUT32(r
->r_desc_ring
, &txd
->len
, ATGE_TX_BYTES(pktlen
));
2849 cflags
|= ATGE_TD_EOP
;
2850 ATGE_PUT32(r
->r_desc_ring
, &txd
->flags
, cflags
);
2855 * Sync buffer first.
2857 DMA_SYNC(r
->r_buf_tbl
[start
], 0, pktlen
, DDI_DMA_SYNC_FORDEV
);
2860 * Increment TX producer count by one.
2862 ATGE_INC_SLOT(r
->r_producer
, ATGE_TX_RING_CNT
);
2865 * Sync descriptor table.
2867 DMA_SYNC(r
->r_desc_ring
, 0, ATGE_TX_RING_SZ
, DDI_DMA_SYNC_FORDEV
);
2870 * Program TX descriptor to send a packet.
2872 switch (ATGE_MODEL(atgep
)) {
2874 atge_l1e_send_packet(r
);
2877 atge_l1_send_packet(r
);
2880 atge_l1c_send_packet(r
);
2884 r
->r_atge
->atge_opackets
++;
2885 r
->r_atge
->atge_obytes
+= pktlen
;
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
));
2891 return (DDI_SUCCESS
);
2895 * Stream Information.
2897 DDI_DEFINE_STREAM_OPS(atge_devops
, nulldev
, nulldev
, atge_attach
, atge_detach
,
2898 nodev
, NULL
, D_MP
, NULL
, atge_quiesce
);
2901 * Module linkage information.
2903 static struct modldrv atge_modldrv
= {
2904 &mod_driverops
, /* Type of Module */
2905 "Atheros/Attansic Gb Ethernet", /* Description */
2906 &atge_devops
/* drv_dev_ops */
2909 static struct modlinkage atge_modlinkage
= {
2910 MODREV_1
, /* ml_rev */
2911 (void *)&atge_modldrv
,
2922 mac_init_ops(&atge_devops
, "atge");
2923 if ((r
= mod_install(&atge_modlinkage
)) != DDI_SUCCESS
) {
2924 mac_fini_ops(&atge_devops
);
2935 if ((r
= mod_remove(&atge_modlinkage
)) == DDI_SUCCESS
) {
2936 mac_fini_ops(&atge_devops
);
2943 _info(struct modinfo
*modinfop
)
2945 return (mod_info(&atge_modlinkage
, modinfop
));