Print this page
212 Atheros AR8132 / L1c Gigabit Ethernet Adapter
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/common/io/atge/atge.h
+++ new/usr/src/uts/common/io/atge/atge.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
↓ open down ↓ |
11 lines elided |
↑ open up ↑ |
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 + * Copyright (c) 2012 Gary Mills
23 + *
22 24 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 25 * Use is subject to license terms.
24 26 */
25 27
26 28 #ifndef _ATGE_H
27 29 #define _ATGE_H
28 30
29 31 #ifdef __cplusplus
30 32 extern "C" {
31 33 #endif
32 34
33 35 #include <sys/ethernet.h>
34 36 #include <sys/mac_provider.h>
35 37 #include "atge_l1e_reg.h"
38 +#include "atge_l1c_reg.h"
36 39
37 40 #define ATGE_PCI_REG_NUMBER 1
38 41
39 42 #define ROUNDUP(x, a) (((x) + (a) - 1) & ~((a) - 1))
40 43
41 44 /*
42 45 * Flags.
43 46 */
44 47 #define ATGE_FLAG_PCIE 0x0001
45 48 #define ATGE_FIXED_TYPE 0x0002
46 49 #define ATGE_MSI_TYPE 0x0004
47 50 #define ATGE_MSIX_TYPE 0x0008
48 51 #define ATGE_FLAG_FASTETHER 0x0010
49 52 #define ATGE_FLAG_JUMBO 0x0020
50 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
51 58
52 59 #define ATGE_CHIP_L1_DEV_ID 0x1048
53 60 #define ATGE_CHIP_L2_DEV_ID 0x2048
54 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
55 68
56 69 #define ATGE_PROMISC 0x001
57 70 #define ATGE_ALL_MULTICST 0x002
58 71
59 72 /*
60 73 * Timer for one second interval.
61 74 */
62 75 #define ATGE_TIMER_INTERVAL (1000 * 1000 * 1000)
63 76
64 77 /*
65 78 * Chip state.
66 79 */
67 80 #define ATGE_CHIP_INITIALIZED 0x0001
68 81 #define ATGE_CHIP_RUNNING 0x0002
69 82 #define ATGE_CHIP_STOPPED 0x0004
70 83 #define ATGE_CHIP_SUSPENDED 0x0008
71 84
72 85 #define ETHER_CRC_LEN 0x4
73 86
74 87 /*
75 88 * Descriptor increment and decrment operation.
76 89 */
77 90 #define ATGE_INC_SLOT(x, y) \
78 91 ((x) = ((x) + 1) % (y))
79 92
80 93 #define ATGE_DEC_SLOT(x, y) \
81 94 (x = ((x + y - 1) % y))
82 95
83 96 /*
84 97 * I/O instructions
85 98 */
86 99 #define OUTB(atge, p, v) \
87 100 ddi_put8((atge)->atge_io_handle, \
88 101 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
89 102
90 103 #define OUTW(atge, p, v) \
91 104 ddi_put16((atge)->atge_io_handle, \
92 105 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
93 106
94 107 #define OUTL(atge, p, v) \
95 108 ddi_put32((atge)->atge_io_handle, \
96 109 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
97 110
98 111 #define INB(atge, p) \
99 112 ddi_get8((atge)->atge_io_handle, \
100 113 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
101 114 #define INW(atge, p) \
102 115 ddi_get16((atge)->atge_io_handle, \
103 116 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
104 117
105 118 #define INL(atge, p) \
106 119 ddi_get32((atge)->atge_io_handle, \
107 120 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
108 121
109 122 #define FLUSH(atge, reg) \
110 123 (void) INL(atge, reg)
111 124
112 125 #define OUTL_OR(atge, reg, v) \
113 126 OUTL(atge, reg, (INL(atge, reg) | v))
114 127
115 128 #define OUTL_AND(atge, reg, v) \
116 129 OUTL(atge, reg, (INL(atge, reg) & v))
117 130
118 131 /*
119 132 * Descriptor and other endianess aware access.
120 133 */
121 134 #define ATGE_PUT64(dma, addr, v) \
122 135 ddi_put64(dma->acchdl, (addr), (v))
123 136
124 137 #define ATGE_PUT32(dma, addr, v) \
125 138 ddi_put32(dma->acchdl, (addr), (v))
126 139
127 140 #define ATGE_GET32(dma, addr) \
128 141 ddi_get32(dma->acchdl, (addr))
129 142
130 143 #define ATGE_GET64(dma, addr) \
131 144 ddi_get64(dma->acchdl, (addr))
132 145
133 146 #define DMA_SYNC(dma, s, l, d) \
134 147 (void) ddi_dma_sync(dma->hdl, (off_t)(s), (l), d)
↓ open down ↓ |
70 lines elided |
↑ open up ↑ |
135 148
136 149
137 150 #define ATGE_ADDR_LO(x) ((uint64_t)(x) & 0xFFFFFFFF)
138 151 #define ATGE_ADDR_HI(x) ((uint64_t)(x) >> 32)
139 152
140 153
141 154 /*
142 155 * General purpose macros.
143 156 */
144 157 #define ATGE_MODEL(atgep) atgep->atge_model
158 +#define ATGE_VID(atgep) atgep->atge_vid
159 +#define ATGE_DID(atgep) atgep->atge_did
145 160
146 161 /*
147 162 * Different type of chip models.
148 163 */
149 164 typedef enum {
150 165 ATGE_CHIP_L1 = 1,
151 166 ATGE_CHIP_L2,
152 167 ATGE_CHIP_L1E,
168 + ATGE_CHIP_L1C,
153 169 } atge_model_t;
154 170
155 171 typedef struct atge_cards {
156 172 uint16_t vendor_id; /* PCI vendor id */
157 173 uint16_t device_id; /* PCI device id */
158 174 char *cardname; /* Description of the card */
159 175 atge_model_t model; /* Model of the card */
160 176 } atge_cards_t;
161 177
162 178 /*
163 179 * Number of Descriptors for TX and RX Ring.
164 180 */
165 181 #define ATGE_TX_NUM_DESC 256
166 182 #define ATGE_RX_NUM_DESC 256
167 183
168 184 /*
169 185 * DMA Handle for all DMA work.
170 186 */
171 187 typedef struct atge_dma_data {
172 188 ddi_dma_handle_t hdl;
173 189 ddi_acc_handle_t acchdl;
174 190 ddi_dma_cookie_t cookie;
175 191 caddr_t addr;
176 192 size_t len;
177 193 uint_t count;
178 194 } atge_dma_t;
179 195
180 196 struct atge;
181 197
182 198 /*
183 199 * Structure for ring data (TX/RX).
184 200 */
185 201 typedef struct atge_ring {
186 202 struct atge *r_atge;
187 203 atge_dma_t **r_buf_tbl;
188 204 atge_dma_t *r_desc_ring;
189 205 int r_ndesc;
190 206 int r_consumer;
191 207 int r_producer;
192 208 int r_avail_desc;
193 209 } atge_ring_t;
194 210
195 211 /*
196 212 * L1E specific private data.
197 213 */
198 214 typedef struct atge_l1e_data {
199 215 atge_dma_t **atge_l1e_rx_page;
200 216 atge_dma_t *atge_l1e_rx_cmb;
201 217 int atge_l1e_pagesize;
202 218 int atge_l1e_rx_curp;
203 219 uint16_t atge_l1e_rx_seqno;
204 220 uint32_t atge_l1e_proc_max;
205 221 uint32_t atge_l1e_rx_page_cons;
206 222 uint32_t atge_l1e_rx_page_prods[L1E_RX_PAGES];
207 223 } atge_l1e_data_t;
208 224
209 225 /*
210 226 * L1 specific private data.
211 227 */
212 228 typedef struct atge_l1_data {
213 229 atge_ring_t *atge_rx_ring;
↓ open down ↓ |
51 lines elided |
↑ open up ↑ |
214 230 atge_dma_t *atge_l1_cmb;
215 231 atge_dma_t *atge_l1_rr;
216 232 atge_dma_t *atge_l1_smb;
217 233 int atge_l1_rr_consumers;
218 234 uint32_t atge_l1_intr_status;
219 235 uint32_t atge_l1_rx_prod_cons;
220 236 uint32_t atge_l1_tx_prod_cons;
221 237 } atge_l1_data_t;
222 238
223 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 +/*
224 254 * TX descriptor table is same with L1, L1E and L2E chips.
225 255 */
226 256 #pragma pack(1)
227 257 typedef struct atge_tx_desc {
228 258 uint64_t addr;
229 259 uint32_t len;
230 260 uint32_t flags;
231 261 } atge_tx_desc_t;
232 262 #pragma pack()
233 263
234 264 #define ATGE_TX_RING_CNT 256
235 265 #define ATGE_TX_RING_SZ \
236 266 (sizeof (struct atge_tx_desc) * ATGE_TX_RING_CNT)
237 267
238 268 /*
239 269 * Private instance data structure (per-instance soft-state).
240 270 */
241 271 typedef struct atge {
242 272 /*
243 273 * Lock for the TX ring, RX ring and interrupt. In order to align
244 274 * these locks at 8-byte boundary, we have kept it at the beginning
245 275 * of atge_t.
246 276 */
247 277 kmutex_t atge_tx_lock;
248 278 kmutex_t atge_rx_lock;
249 279 kmutex_t atge_intr_lock;
↓ open down ↓ |
16 lines elided |
↑ open up ↑ |
250 280 kmutex_t atge_mii_lock;
251 281 kmutex_t atge_mbox_lock;
252 282
253 283 /*
254 284 * Instance number and devinfo pointer.
255 285 */
256 286 int atge_unit;
257 287 dev_info_t *atge_dip;
258 288 char atge_name[8];
259 289 atge_model_t atge_model;
290 + uint16_t atge_vid;
291 + uint16_t atge_did;
260 292 int atge_chip_rev;
261 293 uint8_t atge_revid;
262 294
263 295 /*
264 296 * Mac handle.
265 297 */
266 298 mac_handle_t atge_mh;
267 299
268 300 /*
269 301 * MII layer handle.
270 302 */
271 303 mii_handle_t atge_mii;
272 304 link_state_t atge_link_state;
273 305
274 306 /*
275 307 * Config Space Handle.
276 308 */
277 309 ddi_acc_handle_t atge_conf_handle;
278 310
279 311 /*
280 312 * IO registers mapped by DDI.
281 313 */
282 314 ddi_acc_handle_t atge_io_handle;
283 315 caddr_t atge_io_regs;
284 316 uint_t atge_intrs;
285 317
286 318 /*
287 319 * Interrupt management structures.
288 320 */
289 321 ddi_intr_handle_t *atge_intr_handle;
290 322 int atge_intr_types;
291 323 int atge_intr_cnt;
292 324 uint_t atge_intr_pri;
↓ open down ↓ |
23 lines elided |
↑ open up ↑ |
293 325 int atge_intr_size;
294 326 int atge_intr_cap;
295 327
296 328 /*
297 329 * Common structures.
298 330 */
299 331 atge_ring_t *atge_tx_ring;
300 332 int atge_tx_resched;
301 333 int atge_mtu;
302 334 int atge_int_mod;
335 + int atge_int_rx_mod; /* L1C */
336 + int atge_int_tx_mod; /* L1C */
303 337 int atge_max_frame_size;
304 338
305 339
306 340 /*
307 341 * Ethernet addresses.
308 342 */
309 343 ether_addr_t atge_ether_addr;
310 344 ether_addr_t atge_dev_addr;
311 345 uint64_t atge_mchash;
312 346 uint32_t atge_mchash_ref_cnt[64];
313 347
314 348 /*
315 349 * PHY register.
316 350 */
317 351 int atge_phyaddr;
318 352
319 353 /*
320 354 * Flags.
321 355 */
322 356 int atge_flags;
323 357 uint32_t atge_dma_rd_burst;
324 358 uint32_t atge_dma_wr_burst;
325 359 int atge_filter_flags;
326 360 int atge_chip_state;
327 361
328 362 /*
329 363 * Private data for the chip.
330 364 */
331 365 void *atge_private_data;
332 366
333 367 /*
334 368 * Buffer length.
335 369 */
336 370 int atge_rx_buf_len;
337 371 int atge_tx_buf_len;
338 372
339 373 /*
340 374 * Common stats.
341 375 */
342 376 void *atge_hw_stats;
343 377 uint64_t atge_ipackets;
344 378 uint64_t atge_opackets;
345 379 uint64_t atge_rbytes;
346 380 uint64_t atge_obytes;
347 381 uint64_t atge_brdcstxmt;
348 382 uint64_t atge_multixmt;
349 383 uint64_t atge_brdcstrcv;
350 384 uint64_t atge_multircv;
351 385 unsigned atge_norcvbuf;
352 386 unsigned atge_errrcv;
353 387 unsigned atge_errxmt;
354 388 unsigned atge_missed;
355 389 unsigned atge_underflow;
356 390 unsigned atge_overflow;
357 391 unsigned atge_align_errors;
358 392 unsigned atge_fcs_errors;
359 393 unsigned atge_carrier_errors;
360 394 unsigned atge_collisions;
361 395 unsigned atge_ex_collisions;
362 396 unsigned atge_tx_late_collisions;
363 397 unsigned atge_defer_xmts;
364 398 unsigned atge_first_collisions;
365 399 unsigned atge_multi_collisions;
366 400 unsigned atge_sqe_errors;
367 401 unsigned atge_macxmt_errors;
368 402 unsigned atge_macrcv_errors;
369 403 unsigned atge_toolong_errors;
370 404 unsigned atge_runt;
371 405 unsigned atge_jabber;
372 406 unsigned atge_noxmtbuf;
373 407 } atge_t;
374 408
375 409 /*
376 410 * extern functions.
377 411 */
378 412 extern void atge_error(dev_info_t *, char *, ...);
379 413
380 414 /*
381 415 * Debugging Support.
382 416 */
383 417 #ifdef DEBUG
384 418 #define ATGE_DB(arg) atge_debug_func arg
385 419 #else
386 420 #define ATGE_DB(arg)
387 421 #endif
388 422
389 423 extern int atge_debug;
390 424 extern void atge_debug_func(char *, ...);
391 425 extern atge_dma_t *atge_alloc_a_dma_blk(atge_t *, ddi_dma_attr_t *,
392 426 int, int);
393 427 extern void atge_free_a_dma_blk(atge_dma_t *);
394 428 extern atge_dma_t *atge_buf_alloc(atge_t *, size_t, int);
395 429 extern void atge_buf_free(atge_dma_t *);
396 430 extern mblk_t *atge_get_mblk(int);
397 431 extern void atge_device_restart(atge_t *);
398 432 extern int atge_alloc_buffers(atge_ring_t *, size_t, size_t, int);
399 433 extern void atge_free_buffers(atge_ring_t *, size_t);
400 434 extern void atge_stop_timer(atge_t *);
401 435 extern void atge_start_timer(atge_t *);
402 436 extern void atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
403 437 extern uint16_t atge_mii_read(void *, uint8_t, uint8_t);
404 438 extern void atge_device_stop(atge_t *);
405 439 extern void atge_tx_reclaim(atge_t *, int);
406 440
407 441
408 442 #ifdef __cplusplus
409 443 }
410 444 #endif
411 445
412 446 #endif /* _ATGE_H */
↓ open down ↓ |
100 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX