Merge remote-tracking branch 'origin/master'
[unleashed/lotheac.git] / usr / src / uts / common / io / atge / atge.h
blob74f569e458f1b0fbc4419b330a23725ab9d5fc36
1 /*
2 * CDDL HEADER START
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]
19 * CDDL HEADER END
22 * Copyright (c) 2012 Gary Mills
24 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
28 #ifndef _ATGE_H
29 #define _ATGE_H
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
35 #include <sys/ethernet.h>
36 #include <sys/mac_provider.h>
37 #include "atge_l1e_reg.h"
38 #include "atge_l1c_reg.h"
40 #define ATGE_PCI_REG_NUMBER 1
42 #define ROUNDUP(x, a) (((x) + (a) - 1) & ~((a) - 1))
45 * Flags.
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
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
69 #define ATGE_PROMISC 0x001
70 #define ATGE_ALL_MULTICST 0x002
73 * Timer for one second interval.
75 #define ATGE_TIMER_INTERVAL (1000 * 1000 * 1000)
78 * Chip state.
80 #define ATGE_CHIP_INITIALIZED 0x0001
81 #define ATGE_CHIP_RUNNING 0x0002
82 #define ATGE_CHIP_STOPPED 0x0004
83 #define ATGE_CHIP_SUSPENDED 0x0008
85 #define ETHER_CRC_LEN 0x4
88 * Descriptor increment and decrment operation.
90 #define ATGE_INC_SLOT(x, y) \
91 ((x) = ((x) + 1) % (y))
93 #define ATGE_DEC_SLOT(x, y) \
94 (x = ((x + y - 1) % y))
97 * I/O instructions
99 #define OUTB(atge, p, v) \
100 ddi_put8((atge)->atge_io_handle, \
101 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
103 #define OUTW(atge, p, v) \
104 ddi_put16((atge)->atge_io_handle, \
105 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
107 #define OUTL(atge, p, v) \
108 ddi_put32((atge)->atge_io_handle, \
109 (void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
111 #define INB(atge, p) \
112 ddi_get8((atge)->atge_io_handle, \
113 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
114 #define INW(atge, p) \
115 ddi_get16((atge)->atge_io_handle, \
116 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
118 #define INL(atge, p) \
119 ddi_get32((atge)->atge_io_handle, \
120 (void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
122 #define FLUSH(atge, reg) \
123 (void) INL(atge, reg)
125 #define OUTL_OR(atge, reg, v) \
126 OUTL(atge, reg, (INL(atge, reg) | v))
128 #define OUTL_AND(atge, reg, v) \
129 OUTL(atge, reg, (INL(atge, reg) & v))
132 * Descriptor and other endianess aware access.
134 #define ATGE_PUT64(dma, addr, v) \
135 ddi_put64(dma->acchdl, (addr), (v))
137 #define ATGE_PUT32(dma, addr, v) \
138 ddi_put32(dma->acchdl, (addr), (v))
140 #define ATGE_GET32(dma, addr) \
141 ddi_get32(dma->acchdl, (addr))
143 #define ATGE_GET64(dma, addr) \
144 ddi_get64(dma->acchdl, (addr))
146 #define DMA_SYNC(dma, s, l, d) \
147 (void) ddi_dma_sync(dma->hdl, (off_t)(s), (l), d)
150 #define ATGE_ADDR_LO(x) ((uint64_t)(x) & 0xFFFFFFFF)
151 #define ATGE_ADDR_HI(x) ((uint64_t)(x) >> 32)
155 * General purpose macros.
157 #define ATGE_MODEL(atgep) atgep->atge_model
158 #define ATGE_VID(atgep) atgep->atge_vid
159 #define ATGE_DID(atgep) atgep->atge_did
162 * Different type of chip models.
164 typedef enum {
165 ATGE_CHIP_L1 = 1,
166 ATGE_CHIP_L2,
167 ATGE_CHIP_L1E,
168 ATGE_CHIP_L1C,
169 } atge_model_t;
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;
179 * Number of Descriptors for TX and RX Ring.
181 #define ATGE_TX_NUM_DESC 256
182 #define ATGE_RX_NUM_DESC 256
185 * DMA Handle for all DMA work.
187 typedef struct atge_dma_data {
188 ddi_dma_handle_t hdl;
189 ddi_acc_handle_t acchdl;
190 ddi_dma_cookie_t cookie;
191 caddr_t addr;
192 size_t len;
193 uint_t count;
194 } atge_dma_t;
196 struct atge;
199 * Structure for ring data (TX/RX).
201 typedef struct atge_ring {
202 struct atge *r_atge;
203 atge_dma_t **r_buf_tbl;
204 atge_dma_t *r_desc_ring;
205 int r_ndesc;
206 int r_consumer;
207 int r_producer;
208 int r_avail_desc;
209 } atge_ring_t;
212 * L1E specific private data.
214 typedef struct atge_l1e_data {
215 atge_dma_t **atge_l1e_rx_page;
216 atge_dma_t *atge_l1e_rx_cmb;
217 int atge_l1e_pagesize;
218 int atge_l1e_rx_curp;
219 uint16_t atge_l1e_rx_seqno;
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;
226 * L1 specific private data.
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;
240 * L1C specific private data.
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;
254 * TX descriptor table is same with L1, L1E and L2E chips.
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()
264 #define ATGE_TX_RING_CNT 256
265 #define ATGE_TX_RING_SZ \
266 (sizeof (struct atge_tx_desc) * ATGE_TX_RING_CNT)
269 * Private instance data structure (per-instance soft-state).
271 typedef struct atge {
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.
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;
284 * Instance number and devinfo pointer.
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;
296 * Mac handle.
298 mac_handle_t atge_mh;
301 * MII layer handle.
303 mii_handle_t atge_mii;
304 link_state_t atge_link_state;
307 * Config Space Handle.
309 ddi_acc_handle_t atge_conf_handle;
312 * IO registers mapped by DDI.
314 ddi_acc_handle_t atge_io_handle;
315 caddr_t atge_io_regs;
316 uint_t atge_intrs;
319 * Interrupt management structures.
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;
329 * Common structures.
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;
341 * Ethernet addresses.
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];
349 * PHY register.
351 int atge_phyaddr;
354 * Flags.
356 int atge_flags;
357 uint32_t atge_dma_rd_burst;
358 uint32_t atge_dma_wr_burst;
359 int atge_filter_flags;
360 int atge_chip_state;
363 * Private data for the chip.
365 void *atge_private_data;
368 * Buffer length.
370 int atge_rx_buf_len;
371 int atge_tx_buf_len;
374 * Common stats.
376 void *atge_hw_stats;
377 uint64_t atge_ipackets;
378 uint64_t atge_opackets;
379 uint64_t atge_rbytes;
380 uint64_t atge_obytes;
381 uint64_t atge_brdcstxmt;
382 uint64_t atge_multixmt;
383 uint64_t atge_brdcstrcv;
384 uint64_t atge_multircv;
385 unsigned atge_norcvbuf;
386 unsigned atge_errrcv;
387 unsigned atge_errxmt;
388 unsigned atge_missed;
389 unsigned atge_underflow;
390 unsigned atge_overflow;
391 unsigned atge_align_errors;
392 unsigned atge_fcs_errors;
393 unsigned atge_carrier_errors;
394 unsigned atge_collisions;
395 unsigned atge_ex_collisions;
396 unsigned atge_tx_late_collisions;
397 unsigned atge_defer_xmts;
398 unsigned atge_first_collisions;
399 unsigned atge_multi_collisions;
400 unsigned atge_sqe_errors;
401 unsigned atge_macxmt_errors;
402 unsigned atge_macrcv_errors;
403 unsigned atge_toolong_errors;
404 unsigned atge_runt;
405 unsigned atge_jabber;
406 unsigned atge_noxmtbuf;
407 } atge_t;
410 * extern functions.
412 extern void atge_error(dev_info_t *, char *, ...);
415 * Debugging Support.
417 #ifdef DEBUG
418 #define ATGE_DB(arg) atge_debug_func arg
419 #else
420 #define ATGE_DB(arg)
421 #endif
423 extern int atge_debug;
424 extern void atge_debug_func(char *, ...);
425 extern atge_dma_t *atge_alloc_a_dma_blk(atge_t *, ddi_dma_attr_t *,
426 int, int);
427 extern void atge_free_a_dma_blk(atge_dma_t *);
428 extern atge_dma_t *atge_buf_alloc(atge_t *, size_t, int);
429 extern void atge_buf_free(atge_dma_t *);
430 extern mblk_t *atge_get_mblk(int);
431 extern void atge_device_restart(atge_t *);
432 extern int atge_alloc_buffers(atge_ring_t *, size_t, size_t, int);
433 extern void atge_free_buffers(atge_ring_t *, size_t);
434 extern void atge_stop_timer(atge_t *);
435 extern void atge_start_timer(atge_t *);
436 extern void atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
437 extern uint16_t atge_mii_read(void *, uint8_t, uint8_t);
438 extern void atge_device_stop(atge_t *);
439 extern void atge_tx_reclaim(atge_t *, int);
442 #ifdef __cplusplus
444 #endif
446 #endif /* _ATGE_H */