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]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
35 /* default IPG settings */
40 * Declarations and definitions specific to the
41 * FEPS 10/100 Mbps Ethernet (hme) device.
45 * Per-Stream instance state information.
47 * Each instance is dynamically allocated at open() and free'd
48 * at close(). Each per-Stream instance points to at most one
49 * per-device structure using the sb_hmep field. All instances
50 * are threaded together into one list of active instances
51 * ordered on minor device number.
54 #define HME_2P0_REVID 0xa0 /* hme - feps. */
55 #define HME_2P1_REVID 0x20
56 #define HME_2P1_REVID_OBP 0x21
57 #define HME_1C0_REVID 0xc0 /* cheerio 1.0, hme 2.0 equiv. */
58 #define HME_2C0_REVID 0xc1 /* cheerio 2.0, hme 2.2 equiv. */
59 #define HME_REV_VERS_MASK 0x0f /* Mask to retain bits for cheerio ver */
62 ddi_dma_handle_t dmah
;
63 ddi_acc_handle_t acch
;
69 * HME Device Channel instance state information.
71 * Each instance is dynamically allocated on first attach.
74 mac_handle_t hme_mh
; /* GLDv3 handle */
76 dev_info_t
*dip
; /* associated dev_info */
77 int instance
; /* instance */
78 ulong_t pagesize
; /* btop(9F) */
80 int hme_mifpoll_enable
;
82 int hme_lance_mode_enable
;
85 uint32_t hme_lance_mode
;
90 uint_t hme_burstsizes
; /* binary encoded val */
91 uint32_t hme_config
; /* Config reg store */
93 int hme_phy_failure
; /* phy failure type */
95 int hme_64bit_xfer
; /* 64-bit Sbus xfers */
101 struct ether_addr hme_factaddr
; /* factory mac address */
102 struct ether_addr hme_ouraddr
; /* individual address */
103 uint32_t hme_addrflags
; /* address flags */
104 uint32_t hme_flags
; /* misc. flags */
105 boolean_t hme_wantw
; /* xmit: out of resources */
106 boolean_t hme_started
; /* mac layer started */
110 uint16_t hme_ladrf
[4]; /* 64 bit multicast filter */
111 uint32_t hme_ladrf_refcnt
[64];
112 boolean_t hme_promisc
;
113 uint32_t hme_multi
; /* refcount on mcast addrs */
115 struct hme_global
*hme_globregp
; /* HME global regs */
116 struct hme_etx
*hme_etxregp
; /* HME ETX regs */
117 struct hme_erx
*hme_erxregp
; /* HME ERX regs */
118 struct hme_bmac
*hme_bmacregp
; /* BigMAC registers */
119 struct hme_mif
*hme_mifregp
; /* HME transceiver */
120 unsigned char *hme_romp
; /* fcode rom pointer */
122 kmutex_t hme_xmitlock
; /* protect xmit-side fields */
123 kmutex_t hme_intrlock
; /* protect intr-side fields */
124 ddi_iblock_cookie_t hme_cookie
; /* interrupt cookie */
126 struct hme_rmd
*hme_rmdp
; /* receive descriptor ring start */
127 struct hme_tmd
*hme_tmdp
; /* transmit descriptor ring start */
129 ddi_dma_handle_t hme_rmd_dmah
;
130 ddi_acc_handle_t hme_rmd_acch
;
131 caddr_t hme_rmd_kaddr
;
132 uint32_t hme_rmd_paddr
;
134 ddi_dma_handle_t hme_tmd_dmah
;
135 ddi_acc_handle_t hme_tmd_acch
;
136 caddr_t hme_tmd_kaddr
;
137 uint32_t hme_tmd_paddr
;
139 uint64_t hme_rxindex
;
140 uint64_t hme_txindex
;
141 uint64_t hme_txreclaim
;
143 hmebuf_t
*hme_tbuf
; /* hmebuf associated with TMD */
144 hmebuf_t
*hme_rbuf
; /* hmebuf associated with RMD */
146 ddi_device_acc_attr_t hme_dev_attr
;
147 ddi_acc_handle_t hme_globregh
; /* HME global regs */
148 ddi_acc_handle_t hme_etxregh
; /* HME ETX regs */
149 ddi_acc_handle_t hme_erxregh
; /* HME ERX regs */
150 ddi_acc_handle_t hme_bmacregh
; /* BigMAC registers */
151 ddi_acc_handle_t hme_mifregh
; /* HME transceiver */
152 ddi_acc_handle_t hme_romh
; /* rom handle */
154 ddi_acc_handle_t pci_config_handle
; /* HME PCI config */
157 * DDI dma handle, kernel virtual base,
158 * and io virtual base of IOPB area.
160 ddi_dma_handle_t hme_iopbhandle
;
161 ulong_t hme_iopbkbase
;
162 uint32_t hme_iopbiobase
;
164 kstat_t
*hme_ksp
; /* kstat pointer */
165 kstat_t
*hme_intrstats
; /* kstat interrupt counter */
167 uint64_t hme_ipackets
;
169 uint64_t hme_ierrors
;
170 uint64_t hme_opackets
;
172 uint64_t hme_oerrors
;
173 uint64_t hme_multircv
; /* # multicast packets received */
174 uint64_t hme_multixmt
; /* # multicast packets for xmit */
175 uint64_t hme_brdcstrcv
; /* # broadcast packets received */
176 uint64_t hme_brdcstxmt
; /* # broadcast packets for xmit */
179 uint64_t hme_norcvbuf
; /* # rcv packets discarded */
180 uint64_t hme_noxmtbuf
; /* # xmit packets discarded */
182 uint64_t hme_align_errors
;
184 uint64_t hme_fcs_errors
;
185 uint64_t hme_defer_xmts
;
186 uint64_t hme_sqe_errors
;
190 uint64_t hme_toolong_errors
;
192 uint64_t hme_carrier_errors
;
199 uint32_t hme_nocanput
;
200 uint32_t hme_allocbfail
;
203 uint32_t hme_txlaterr
;
204 uint32_t hme_rxlaterr
;
205 uint32_t hme_slvparerr
;
206 uint32_t hme_txparerr
;
207 uint32_t hme_rxparerr
;
208 uint32_t hme_slverrack
;
209 uint32_t hme_txerrack
;
210 uint32_t hme_rxerrack
;
211 uint32_t hme_txtagerr
;
212 uint32_t hme_rxtagerr
;
215 uint32_t hme_notbufs
;
216 uint32_t hme_norbufs
;
219 * check if transmitter is hung
234 #define HMERUNNING 0x01 /* chip is initialized */
235 #define HMESUSPENDED 0x08 /* suspended interface */
236 #define HMEINITIALIZED 0x10 /* interface initialized */
238 /* Mac address flags */
240 #define HME_FACTADDR_PRESENT 0x01 /* factory MAC id present */
241 #define HME_FACTADDR_USE 0x02 /* use factory MAC id */
244 struct kstat_named hk_cvc
; /* code violation errors */
245 struct kstat_named hk_lenerr
; /* rx len errors */
246 struct kstat_named hk_buff
; /* buff errors */
247 struct kstat_named hk_missed
; /* missed/dropped packets */
248 struct kstat_named hk_nocanput
; /* nocanput errors */
249 struct kstat_named hk_allocbfail
; /* allocb failures */
250 struct kstat_named hk_babl
; /* runt errors */
251 struct kstat_named hk_tmder
; /* tmd errors */
252 struct kstat_named hk_txlaterr
; /* tx late errors */
253 struct kstat_named hk_rxlaterr
; /* rx late errors */
254 struct kstat_named hk_slvparerr
; /* slave parity errors */
255 struct kstat_named hk_txparerr
; /* tx parity errors */
256 struct kstat_named hk_rxparerr
; /* rx parity errors */
257 struct kstat_named hk_slverrack
; /* slave error acks */
258 struct kstat_named hk_txerrack
; /* tx error acks */
259 struct kstat_named hk_rxerrack
; /* rx error acks */
260 struct kstat_named hk_txtagerr
; /* tx tag error */
261 struct kstat_named hk_rxtagerr
; /* rx tag error */
262 struct kstat_named hk_eoperr
; /* eop error */
263 struct kstat_named hk_notmds
; /* tmd errors */
264 struct kstat_named hk_notbufs
; /* tx buf errors */
265 struct kstat_named hk_norbufs
; /* rx buf errors */
267 struct kstat_named hk_inits
; /* global inits */
268 struct kstat_named hk_phyfail
; /* phy failures */
270 struct kstat_named hk_asic_rev
; /* asic_rev */
273 #define HMEDRAINTIME (400000) /* # microseconds xmit drain */
275 #define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1))
276 #define ROUNDUP2(a, n) (uchar_t *)((((uintptr_t)(a)) + ((n) - 1)) & ~((n) - 1))
279 * Xmit/receive buffer structure.
280 * This structure is organized to meet the following requirements:
281 * - bb_buf starts on an HMEBURSTSIZE boundary.
282 * - hmebuf is an even multiple of HMEBURSTSIZE
283 * - bb_buf[] is large enough to contain max VLAN frame (1522) plus
284 * (3 x HMEBURSTSIZE) rounded up to the next HMEBURSTSIZE
285 * XXX What about another 128 bytes (HMEC requirement).
286 * Fast aligned copy requires both the source and destination
287 * addresses have the same offset from some N-byte boundary.
289 #define HMEBURSTSIZE (64)
290 #define HMEBURSTMASK (HMEBURSTSIZE - 1)
291 #define HMEBUFSIZE (1728)
294 * Define offset from start of bb_buf[] to point receive descriptor.
296 * - must be 14 bytes back of a 4-byte boundary so the start of
297 * the network packet is 4-byte aligned.
298 * - leave some headroom for others
300 #define HMEHEADROOM (34)
302 /* Offset for the first byte in the receive buffer */
303 #define HME_FSTBYTE_OFFSET 2
311 #endif /* _SYS_HME_H */