xref: /illumos-gate/usr/src/uts/common/io/atge/atge.h (revision 5e8715b9)
1 /*
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 /*
88  * Descriptor increment and decrment operation.
89  */
90 #define	ATGE_INC_SLOT(x, y)	\
91 	((x) = ((x) + 1) % (y))
92 
93 #define	ATGE_DEC_SLOT(x, y)	\
94 	(x = ((x + y - 1) % y))
95 
96 /*
97  * I/O instructions
98  */
99 #define	OUTB(atge, p, v)  \
100 	ddi_put8((atge)->atge_io_handle, \
101 		(void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
102 
103 #define	OUTW(atge, p, v)  \
104 	ddi_put16((atge)->atge_io_handle, \
105 		(void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
106 
107 #define	OUTL(atge, p, v)  \
108 	ddi_put32((atge)->atge_io_handle, \
109 		(void *)((caddr_t)((atge)->atge_io_regs) + (p)), v)
110 
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)))
117 
118 #define	INL(atge, p)      \
119 	ddi_get32((atge)->atge_io_handle, \
120 		(void *)(((caddr_t)(atge)->atge_io_regs) + (p)))
121 
122 #define	FLUSH(atge, reg) \
123 	(void) INL(atge, reg)
124 
125 #define	OUTL_OR(atge, reg, v) \
126 	OUTL(atge, reg, (INL(atge, reg) | v))
127 
128 #define	OUTL_AND(atge, reg, v) \
129 	OUTL(atge, reg, (INL(atge, reg) & v))
130 
131 /*
132  * Descriptor and other endianess aware access.
133  */
134 #define	ATGE_PUT64(dma, addr, v) \
135 	ddi_put64(dma->acchdl, (addr), (v))
136 
137 #define	ATGE_PUT32(dma, addr, v) \
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;
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;
195 
196 struct	atge;
197 
198 /*
199  * Structure for ring data (TX/RX).
200  */
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;
210 
211 /*
212  * L1E specific private data.
213  */
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;
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 	/*
312 	 * IO registers mapped by DDI.
313 	 */
314 	ddi_acc_handle_t	atge_io_handle;
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;
357 	uint32_t		atge_dma_rd_burst;
358 	uint32_t		atge_dma_wr_burst;
359 	int			atge_filter_flags;
360 	int			atge_chip_state;
361 
362 	/*
363 	 * Private data for the chip.
364 	 */
365 	void			*atge_private_data;
366 
367 	/*
368 	 * Buffer length.
369 	 */
370 	int			atge_rx_buf_len;
371 	int			atge_tx_buf_len;
372 
373 	/*
374 	 * Common stats.
375 	 */
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;
408 
409 /*
410  * extern functions.
411  */
412 extern	void	atge_error(dev_info_t *, char *, ...);
413 
414 /*
415  * Debugging Support.
416  */
417 #ifdef	DEBUG
418 #define	ATGE_DB(arg)	atge_debug_func arg
419 #else
420 #define	ATGE_DB(arg)
421 #endif
422 
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);
440 
441 
442 #ifdef __cplusplus
443 }
444 #endif
445 
446 #endif	/* _ATGE_H */
447