2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _ATGE_H
27 #define _ATGE_H
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 #include <sys/ethernet.h>
34 #include <sys/mac_provider.h>
35 #include "atge_l1e_reg.h"
36
37 #define ATGE_PCI_REG_NUMBER 1
38
39 #define ROUNDUP(x, a) (((x) + (a) - 1) & ~((a) - 1))
40
41 /*
42 * Flags.
43 */
44 #define ATGE_FLAG_PCIE 0x0001
45 #define ATGE_FIXED_TYPE 0x0002
46 #define ATGE_MSI_TYPE 0x0004
47 #define ATGE_MSIX_TYPE 0x0008
48 #define ATGE_FLAG_FASTETHER 0x0010
49 #define ATGE_FLAG_JUMBO 0x0020
50 #define ATGE_MII_CHECK 0x0040
51
52 #define ATGE_CHIP_L1_DEV_ID 0x1048
53 #define ATGE_CHIP_L2_DEV_ID 0x2048
54 #define ATGE_CHIP_L1E_DEV_ID 0x1026
55
56 #define ATGE_PROMISC 0x001
57 #define ATGE_ALL_MULTICST 0x002
58
59 /*
60 * Timer for one second interval.
61 */
62 #define ATGE_TIMER_INTERVAL (1000 * 1000 * 1000)
63
64 /*
65 * Chip state.
66 */
67 #define ATGE_CHIP_INITIALIZED 0x0001
68 #define ATGE_CHIP_RUNNING 0x0002
69 #define ATGE_CHIP_STOPPED 0x0004
70 #define ATGE_CHIP_SUSPENDED 0x0008
71
72 #define ETHER_CRC_LEN 0x4
73
74 /*
125 ddi_put32(dma->acchdl, (addr), (v))
126
127 #define ATGE_GET32(dma, addr) \
128 ddi_get32(dma->acchdl, (addr))
129
130 #define ATGE_GET64(dma, addr) \
131 ddi_get64(dma->acchdl, (addr))
132
133 #define DMA_SYNC(dma, s, l, d) \
134 (void) ddi_dma_sync(dma->hdl, (off_t)(s), (l), d)
135
136
137 #define ATGE_ADDR_LO(x) ((uint64_t)(x) & 0xFFFFFFFF)
138 #define ATGE_ADDR_HI(x) ((uint64_t)(x) >> 32)
139
140
141 /*
142 * General purpose macros.
143 */
144 #define ATGE_MODEL(atgep) atgep->atge_model
145
146 /*
147 * Different type of chip models.
148 */
149 typedef enum {
150 ATGE_CHIP_L1 = 1,
151 ATGE_CHIP_L2,
152 ATGE_CHIP_L1E,
153 } atge_model_t;
154
155 typedef struct atge_cards {
156 uint16_t vendor_id; /* PCI vendor id */
157 uint16_t device_id; /* PCI device id */
158 char *cardname; /* Description of the card */
159 atge_model_t model; /* Model of the card */
160 } atge_cards_t;
161
162 /*
163 * Number of Descriptors for TX and RX Ring.
164 */
165 #define ATGE_TX_NUM_DESC 256
166 #define ATGE_RX_NUM_DESC 256
167
168 /*
169 * DMA Handle for all DMA work.
170 */
171 typedef struct atge_dma_data {
172 ddi_dma_handle_t hdl;
204 uint32_t atge_l1e_proc_max;
205 uint32_t atge_l1e_rx_page_cons;
206 uint32_t atge_l1e_rx_page_prods[L1E_RX_PAGES];
207 } atge_l1e_data_t;
208
209 /*
210 * L1 specific private data.
211 */
212 typedef struct atge_l1_data {
213 atge_ring_t *atge_rx_ring;
214 atge_dma_t *atge_l1_cmb;
215 atge_dma_t *atge_l1_rr;
216 atge_dma_t *atge_l1_smb;
217 int atge_l1_rr_consumers;
218 uint32_t atge_l1_intr_status;
219 uint32_t atge_l1_rx_prod_cons;
220 uint32_t atge_l1_tx_prod_cons;
221 } atge_l1_data_t;
222
223 /*
224 * TX descriptor table is same with L1, L1E and L2E chips.
225 */
226 #pragma pack(1)
227 typedef struct atge_tx_desc {
228 uint64_t addr;
229 uint32_t len;
230 uint32_t flags;
231 } atge_tx_desc_t;
232 #pragma pack()
233
234 #define ATGE_TX_RING_CNT 256
235 #define ATGE_TX_RING_SZ \
236 (sizeof (struct atge_tx_desc) * ATGE_TX_RING_CNT)
237
238 /*
239 * Private instance data structure (per-instance soft-state).
240 */
241 typedef struct atge {
242 /*
243 * Lock for the TX ring, RX ring and interrupt. In order to align
244 * these locks at 8-byte boundary, we have kept it at the beginning
245 * of atge_t.
246 */
247 kmutex_t atge_tx_lock;
248 kmutex_t atge_rx_lock;
249 kmutex_t atge_intr_lock;
250 kmutex_t atge_mii_lock;
251 kmutex_t atge_mbox_lock;
252
253 /*
254 * Instance number and devinfo pointer.
255 */
256 int atge_unit;
257 dev_info_t *atge_dip;
258 char atge_name[8];
259 atge_model_t atge_model;
260 int atge_chip_rev;
261 uint8_t atge_revid;
262
263 /*
264 * Mac handle.
265 */
266 mac_handle_t atge_mh;
267
268 /*
269 * MII layer handle.
270 */
271 mii_handle_t atge_mii;
272 link_state_t atge_link_state;
273
274 /*
275 * Config Space Handle.
276 */
277 ddi_acc_handle_t atge_conf_handle;
278
279 /*
283 caddr_t atge_io_regs;
284 uint_t atge_intrs;
285
286 /*
287 * Interrupt management structures.
288 */
289 ddi_intr_handle_t *atge_intr_handle;
290 int atge_intr_types;
291 int atge_intr_cnt;
292 uint_t atge_intr_pri;
293 int atge_intr_size;
294 int atge_intr_cap;
295
296 /*
297 * Common structures.
298 */
299 atge_ring_t *atge_tx_ring;
300 int atge_tx_resched;
301 int atge_mtu;
302 int atge_int_mod;
303 int atge_max_frame_size;
304
305
306 /*
307 * Ethernet addresses.
308 */
309 ether_addr_t atge_ether_addr;
310 ether_addr_t atge_dev_addr;
311 uint64_t atge_mchash;
312 uint32_t atge_mchash_ref_cnt[64];
313
314 /*
315 * PHY register.
316 */
317 int atge_phyaddr;
318
319 /*
320 * Flags.
321 */
322 int atge_flags;
|
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright (c) 2012 Gary Mills
23 *
24 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
26 */
27
28 #ifndef _ATGE_H
29 #define _ATGE_H
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 #include <sys/ethernet.h>
36 #include <sys/mac_provider.h>
37 #include "atge_l1e_reg.h"
38 #include "atge_l1c_reg.h"
39
40 #define ATGE_PCI_REG_NUMBER 1
41
42 #define ROUNDUP(x, a) (((x) + (a) - 1) & ~((a) - 1))
43
44 /*
45 * Flags.
46 */
47 #define ATGE_FLAG_PCIE 0x0001
48 #define ATGE_FIXED_TYPE 0x0002
49 #define ATGE_MSI_TYPE 0x0004
50 #define ATGE_MSIX_TYPE 0x0008
51 #define ATGE_FLAG_FASTETHER 0x0010
52 #define ATGE_FLAG_JUMBO 0x0020
53 #define ATGE_MII_CHECK 0x0040
54 #define ATGE_FLAG_ASPM_MON 0x0080
55 #define ATGE_FLAG_CMB_BUG 0x0100
56 #define ATGE_FLAG_SMB_BUG 0x0200
57 #define ATGE_FLAG_APS 0x1000
58
59 #define ATGE_CHIP_L1_DEV_ID 0x1048
60 #define ATGE_CHIP_L2_DEV_ID 0x2048
61 #define ATGE_CHIP_L1E_DEV_ID 0x1026
62 #define ATGE_CHIP_L1CG_DEV_ID 0x1063
63 #define ATGE_CHIP_L1CF_DEV_ID 0x1062
64 #define ATGE_CHIP_AR8151V1_DEV_ID 0x1073
65 #define ATGE_CHIP_AR8151V2_DEV_ID 0x1083
66 #define ATGE_CHIP_AR8152V1_DEV_ID 0x2060
67 #define ATGE_CHIP_AR8152V2_DEV_ID 0x2062
68
69 #define ATGE_PROMISC 0x001
70 #define ATGE_ALL_MULTICST 0x002
71
72 /*
73 * Timer for one second interval.
74 */
75 #define ATGE_TIMER_INTERVAL (1000 * 1000 * 1000)
76
77 /*
78 * Chip state.
79 */
80 #define ATGE_CHIP_INITIALIZED 0x0001
81 #define ATGE_CHIP_RUNNING 0x0002
82 #define ATGE_CHIP_STOPPED 0x0004
83 #define ATGE_CHIP_SUSPENDED 0x0008
84
85 #define ETHER_CRC_LEN 0x4
86
87 /*
138 ddi_put32(dma->acchdl, (addr), (v))
139
140 #define ATGE_GET32(dma, addr) \
141 ddi_get32(dma->acchdl, (addr))
142
143 #define ATGE_GET64(dma, addr) \
144 ddi_get64(dma->acchdl, (addr))
145
146 #define DMA_SYNC(dma, s, l, d) \
147 (void) ddi_dma_sync(dma->hdl, (off_t)(s), (l), d)
148
149
150 #define ATGE_ADDR_LO(x) ((uint64_t)(x) & 0xFFFFFFFF)
151 #define ATGE_ADDR_HI(x) ((uint64_t)(x) >> 32)
152
153
154 /*
155 * General purpose macros.
156 */
157 #define ATGE_MODEL(atgep) atgep->atge_model
158 #define ATGE_VID(atgep) atgep->atge_vid
159 #define ATGE_DID(atgep) atgep->atge_did
160
161 /*
162 * Different type of chip models.
163 */
164 typedef enum {
165 ATGE_CHIP_L1 = 1,
166 ATGE_CHIP_L2,
167 ATGE_CHIP_L1E,
168 ATGE_CHIP_L1C,
169 } atge_model_t;
170
171 typedef struct atge_cards {
172 uint16_t vendor_id; /* PCI vendor id */
173 uint16_t device_id; /* PCI device id */
174 char *cardname; /* Description of the card */
175 atge_model_t model; /* Model of the card */
176 } atge_cards_t;
177
178 /*
179 * Number of Descriptors for TX and RX Ring.
180 */
181 #define ATGE_TX_NUM_DESC 256
182 #define ATGE_RX_NUM_DESC 256
183
184 /*
185 * DMA Handle for all DMA work.
186 */
187 typedef struct atge_dma_data {
188 ddi_dma_handle_t hdl;
220 uint32_t atge_l1e_proc_max;
221 uint32_t atge_l1e_rx_page_cons;
222 uint32_t atge_l1e_rx_page_prods[L1E_RX_PAGES];
223 } atge_l1e_data_t;
224
225 /*
226 * L1 specific private data.
227 */
228 typedef struct atge_l1_data {
229 atge_ring_t *atge_rx_ring;
230 atge_dma_t *atge_l1_cmb;
231 atge_dma_t *atge_l1_rr;
232 atge_dma_t *atge_l1_smb;
233 int atge_l1_rr_consumers;
234 uint32_t atge_l1_intr_status;
235 uint32_t atge_l1_rx_prod_cons;
236 uint32_t atge_l1_tx_prod_cons;
237 } atge_l1_data_t;
238
239 /*
240 * L1C specific private data.
241 */
242 typedef struct atge_l1c_data {
243 atge_ring_t *atge_rx_ring;
244 atge_dma_t *atge_l1c_cmb;
245 atge_dma_t *atge_l1c_rr;
246 atge_dma_t *atge_l1c_smb;
247 int atge_l1c_rr_consumers;
248 uint32_t atge_l1c_intr_status;
249 uint32_t atge_l1c_rx_prod_cons;
250 uint32_t atge_l1c_tx_prod_cons;
251 } atge_l1c_data_t;
252
253 /*
254 * TX descriptor table is same with L1, L1E and L2E chips.
255 */
256 #pragma pack(1)
257 typedef struct atge_tx_desc {
258 uint64_t addr;
259 uint32_t len;
260 uint32_t flags;
261 } atge_tx_desc_t;
262 #pragma pack()
263
264 #define ATGE_TX_RING_CNT 256
265 #define ATGE_TX_RING_SZ \
266 (sizeof (struct atge_tx_desc) * ATGE_TX_RING_CNT)
267
268 /*
269 * Private instance data structure (per-instance soft-state).
270 */
271 typedef struct atge {
272 /*
273 * Lock for the TX ring, RX ring and interrupt. In order to align
274 * these locks at 8-byte boundary, we have kept it at the beginning
275 * of atge_t.
276 */
277 kmutex_t atge_tx_lock;
278 kmutex_t atge_rx_lock;
279 kmutex_t atge_intr_lock;
280 kmutex_t atge_mii_lock;
281 kmutex_t atge_mbox_lock;
282
283 /*
284 * Instance number and devinfo pointer.
285 */
286 int atge_unit;
287 dev_info_t *atge_dip;
288 char atge_name[8];
289 atge_model_t atge_model;
290 uint16_t atge_vid;
291 uint16_t atge_did;
292 int atge_chip_rev;
293 uint8_t atge_revid;
294
295 /*
296 * Mac handle.
297 */
298 mac_handle_t atge_mh;
299
300 /*
301 * MII layer handle.
302 */
303 mii_handle_t atge_mii;
304 link_state_t atge_link_state;
305
306 /*
307 * Config Space Handle.
308 */
309 ddi_acc_handle_t atge_conf_handle;
310
311 /*
315 caddr_t atge_io_regs;
316 uint_t atge_intrs;
317
318 /*
319 * Interrupt management structures.
320 */
321 ddi_intr_handle_t *atge_intr_handle;
322 int atge_intr_types;
323 int atge_intr_cnt;
324 uint_t atge_intr_pri;
325 int atge_intr_size;
326 int atge_intr_cap;
327
328 /*
329 * Common structures.
330 */
331 atge_ring_t *atge_tx_ring;
332 int atge_tx_resched;
333 int atge_mtu;
334 int atge_int_mod;
335 int atge_int_rx_mod; /* L1C */
336 int atge_int_tx_mod; /* L1C */
337 int atge_max_frame_size;
338
339
340 /*
341 * Ethernet addresses.
342 */
343 ether_addr_t atge_ether_addr;
344 ether_addr_t atge_dev_addr;
345 uint64_t atge_mchash;
346 uint32_t atge_mchash_ref_cnt[64];
347
348 /*
349 * PHY register.
350 */
351 int atge_phyaddr;
352
353 /*
354 * Flags.
355 */
356 int atge_flags;
|