1184870Syongari/*-
2184870Syongari * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org>
3184870Syongari * All rights reserved.
4184870Syongari *
5184870Syongari * Redistribution and use in source and binary forms, with or without
6184870Syongari * modification, are permitted provided that the following conditions
7184870Syongari * are met:
8184870Syongari * 1. Redistributions of source code must retain the above copyright
9184870Syongari *    notice unmodified, this list of conditions, and the following
10184870Syongari *    disclaimer.
11184870Syongari * 2. Redistributions in binary form must reproduce the above copyright
12184870Syongari *    notice, this list of conditions and the following disclaimer in the
13184870Syongari *    documentation and/or other materials provided with the distribution.
14184870Syongari *
15184870Syongari * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16184870Syongari * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17184870Syongari * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18184870Syongari * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19184870Syongari * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20184870Syongari * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21184870Syongari * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22184870Syongari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23184870Syongari * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24184870Syongari * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25184870Syongari * SUCH DAMAGE.
26184870Syongari *
27184870Syongari * $FreeBSD$
28184870Syongari */
29184870Syongari
30184870Syongari#ifndef	_IF_ALEVAR_H
31184870Syongari#define	_IF_ALEVAR_H
32184870Syongari
33184870Syongari#define	ALE_TX_RING_CNT		256	/* Should be multiple of 4. */
34184870Syongari#define	ALE_TX_RING_CNT_MIN	32
35184870Syongari#define	ALE_TX_RING_CNT_MAX	1020
36184870Syongari#define	ALE_TX_RING_ALIGN	8
37184870Syongari#define	ALE_RX_PAGE_ALIGN	32
38184870Syongari#define	ALE_RX_PAGES		2
39184870Syongari#define	ALE_CMB_ALIGN		32
40184870Syongari
41184870Syongari#define	ALE_TSO_MAXSEGSIZE	4096
42184870Syongari#define	ALE_TSO_MAXSIZE		(65535 + sizeof(struct ether_vlan_header))
43263957Syongari#define	ALE_MAXTXSEGS		35
44184870Syongari
45184870Syongari#define	ALE_ADDR_LO(x)		((uint64_t) (x) & 0xFFFFFFFF)
46184870Syongari#define	ALE_ADDR_HI(x)		((uint64_t) (x) >> 32)
47184870Syongari
48184870Syongari/* Water mark to kick reclaiming Tx buffers. */
49184870Syongari#define	ALE_TX_DESC_HIWAT	(ALE_TX_RING_CNT - ((ALE_TX_RING_CNT * 4) / 10))
50184870Syongari
51184870Syongari#define	ALE_MSI_MESSAGES	1
52184870Syongari#define	ALE_MSIX_MESSAGES	1
53184870Syongari
54184870Syongari/*
55184870Syongari * TODO : Should get real jumbo MTU size.
56184870Syongari * The hardware seems to have trouble in dealing with large
57184870Syongari * frame length. If you encounter unstability issue, use
58184870Syongari * lower MTU size.
59184870Syongari */
60184870Syongari#define	ALE_JUMBO_FRAMELEN	8132
61184870Syongari#define	ALE_JUMBO_MTU		\
62184870Syongari	(ALE_JUMBO_FRAMELEN - sizeof(struct ether_vlan_header) - ETHER_CRC_LEN)
63184870Syongari#define	ALE_MAX_FRAMELEN	(ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN)
64184870Syongari
65184870Syongari#define	ALE_DESC_INC(x, y)	((x) = ((x) + 1) % (y))
66184870Syongari
67184870Syongaristruct ale_txdesc {
68184870Syongari	struct mbuf		*tx_m;
69184870Syongari	bus_dmamap_t		tx_dmamap;
70184870Syongari};
71184870Syongari
72184870Syongaristruct ale_rx_page {
73184870Syongari	bus_dma_tag_t		page_tag;
74184870Syongari	bus_dmamap_t		page_map;
75184870Syongari	uint8_t			*page_addr;
76184870Syongari	bus_addr_t		page_paddr;
77184870Syongari	bus_dma_tag_t		cmb_tag;
78184870Syongari	bus_dmamap_t		cmb_map;
79184870Syongari	uint32_t		*cmb_addr;
80184870Syongari	bus_addr_t		cmb_paddr;
81184870Syongari	uint32_t		cons;
82184870Syongari};
83184870Syongari
84184870Syongaristruct ale_chain_data{
85184870Syongari	bus_dma_tag_t		ale_parent_tag;
86184870Syongari	bus_dma_tag_t		ale_buffer_tag;
87184870Syongari	bus_dma_tag_t		ale_tx_tag;
88184870Syongari	struct ale_txdesc	ale_txdesc[ALE_TX_RING_CNT];
89184870Syongari	bus_dma_tag_t		ale_tx_ring_tag;
90184870Syongari	bus_dmamap_t		ale_tx_ring_map;
91184870Syongari	bus_dma_tag_t		ale_rx_mblock_tag[ALE_RX_PAGES];
92184870Syongari	bus_dmamap_t		ale_rx_mblock_map[ALE_RX_PAGES];
93184870Syongari	struct tx_desc		*ale_tx_ring;
94184870Syongari	bus_addr_t		ale_tx_ring_paddr;
95184870Syongari	uint32_t		*ale_tx_cmb;
96184870Syongari	bus_addr_t		ale_tx_cmb_paddr;
97184870Syongari	bus_dma_tag_t		ale_tx_cmb_tag;
98184870Syongari	bus_dmamap_t		ale_tx_cmb_map;
99184870Syongari
100184870Syongari	uint32_t		ale_tx_prod;
101184870Syongari	uint32_t		ale_tx_cons;
102184870Syongari	int			ale_tx_cnt;
103184870Syongari	struct ale_rx_page	ale_rx_page[ALE_RX_PAGES];
104184870Syongari	int			ale_rx_curp;
105184870Syongari	uint16_t		ale_rx_seqno;
106184870Syongari};
107184870Syongari
108184870Syongari#define	ALE_TX_RING_SZ		\
109184870Syongari	(sizeof(struct tx_desc) * ALE_TX_RING_CNT)
110184870Syongari#define	ALE_RX_PAGE_SZ_MIN	(8 * 1024)
111184870Syongari#define	ALE_RX_PAGE_SZ_MAX	(1024 * 1024)
112184870Syongari#define	ALE_RX_FRAMES_PAGE	128
113184870Syongari#define	ALE_RX_PAGE_SZ		\
114184870Syongari	(roundup(ALE_MAX_FRAMELEN, ALE_RX_PAGE_ALIGN) * ALE_RX_FRAMES_PAGE)
115184870Syongari#define	ALE_TX_CMB_SZ		(sizeof(uint32_t))
116184870Syongari#define	ALE_RX_CMB_SZ		(sizeof(uint32_t))
117184870Syongari
118184870Syongari#define	ALE_PROC_MIN		(ALE_RX_FRAMES_PAGE / 4)
119184870Syongari#define	ALE_PROC_MAX		\
120184870Syongari	((ALE_RX_PAGE_SZ * ALE_RX_PAGES) / ETHER_MAX_LEN)
121184870Syongari#define	ALE_PROC_DEFAULT	(ALE_PROC_MAX / 4)
122184870Syongari
123184870Syongaristruct ale_hw_stats {
124184870Syongari	/* Rx stats. */
125184870Syongari	uint32_t rx_frames;
126184870Syongari	uint32_t rx_bcast_frames;
127184870Syongari	uint32_t rx_mcast_frames;
128184870Syongari	uint32_t rx_pause_frames;
129184870Syongari	uint32_t rx_control_frames;
130184870Syongari	uint32_t rx_crcerrs;
131184870Syongari	uint32_t rx_lenerrs;
132184870Syongari	uint64_t rx_bytes;
133184870Syongari	uint32_t rx_runts;
134184870Syongari	uint32_t rx_fragments;
135184870Syongari	uint32_t rx_pkts_64;
136184870Syongari	uint32_t rx_pkts_65_127;
137184870Syongari	uint32_t rx_pkts_128_255;
138184870Syongari	uint32_t rx_pkts_256_511;
139184870Syongari	uint32_t rx_pkts_512_1023;
140184870Syongari	uint32_t rx_pkts_1024_1518;
141184870Syongari	uint32_t rx_pkts_1519_max;
142184870Syongari	uint32_t rx_pkts_truncated;
143184870Syongari	uint32_t rx_fifo_oflows;
144184870Syongari	uint32_t rx_rrs_errs;
145184870Syongari	uint32_t rx_alignerrs;
146184870Syongari	uint64_t rx_bcast_bytes;
147184870Syongari	uint64_t rx_mcast_bytes;
148184870Syongari	uint32_t rx_pkts_filtered;
149184870Syongari	/* Tx stats. */
150184870Syongari	uint32_t tx_frames;
151184870Syongari	uint32_t tx_bcast_frames;
152184870Syongari	uint32_t tx_mcast_frames;
153184870Syongari	uint32_t tx_pause_frames;
154184870Syongari	uint32_t tx_excess_defer;
155184870Syongari	uint32_t tx_control_frames;
156184870Syongari	uint32_t tx_deferred;
157184870Syongari	uint64_t tx_bytes;
158184870Syongari	uint32_t tx_pkts_64;
159184870Syongari	uint32_t tx_pkts_65_127;
160184870Syongari	uint32_t tx_pkts_128_255;
161184870Syongari	uint32_t tx_pkts_256_511;
162184870Syongari	uint32_t tx_pkts_512_1023;
163184870Syongari	uint32_t tx_pkts_1024_1518;
164184870Syongari	uint32_t tx_pkts_1519_max;
165184870Syongari	uint32_t tx_single_colls;
166184870Syongari	uint32_t tx_multi_colls;
167184870Syongari	uint32_t tx_late_colls;
168184870Syongari	uint32_t tx_excess_colls;
169184870Syongari	uint32_t tx_abort;
170184870Syongari	uint32_t tx_underrun;
171184870Syongari	uint32_t tx_desc_underrun;
172184870Syongari	uint32_t tx_lenerrs;
173184870Syongari	uint32_t tx_pkts_truncated;
174184870Syongari	uint64_t tx_bcast_bytes;
175184870Syongari	uint64_t tx_mcast_bytes;
176184870Syongari	/* Misc. */
177184870Syongari	uint32_t reset_brk_seq;
178184870Syongari};
179184870Syongari
180184870Syongari/*
181184870Syongari * Software state per device.
182184870Syongari */
183184870Syongaristruct ale_softc {
184184870Syongari	struct ifnet 		*ale_ifp;
185184870Syongari	device_t		ale_dev;
186184870Syongari	device_t		ale_miibus;
187184870Syongari	struct resource		*ale_res[1];
188184870Syongari	struct resource_spec	*ale_res_spec;
189184870Syongari	struct resource		*ale_irq[ALE_MSI_MESSAGES];
190184870Syongari	struct resource_spec	*ale_irq_spec;
191184870Syongari	void			*ale_intrhand[ALE_MSI_MESSAGES];
192184870Syongari	int			ale_rev;
193184870Syongari	int			ale_chip_rev;
194184870Syongari	int			ale_phyaddr;
195184870Syongari	uint8_t			ale_eaddr[ETHER_ADDR_LEN];
196184870Syongari	uint32_t		ale_dma_rd_burst;
197184870Syongari	uint32_t		ale_dma_wr_burst;
198184870Syongari	int			ale_flags;
199184870Syongari#define	ALE_FLAG_PCIE		0x0001
200184870Syongari#define	ALE_FLAG_PCIX		0x0002
201184870Syongari#define	ALE_FLAG_MSI		0x0004
202184870Syongari#define	ALE_FLAG_MSIX		0x0008
203184870Syongari#define	ALE_FLAG_PMCAP		0x0010
204184870Syongari#define	ALE_FLAG_FASTETHER	0x0020
205184870Syongari#define	ALE_FLAG_JUMBO		0x0040
206184870Syongari#define	ALE_FLAG_RXCSUM_BUG	0x0080
207184870Syongari#define	ALE_FLAG_TXCSUM_BUG	0x0100
208184870Syongari#define	ALE_FLAG_TXCMB_BUG	0x0200
209184870Syongari#define	ALE_FLAG_LINK		0x8000
210184870Syongari
211184870Syongari	struct callout		ale_tick_ch;
212184870Syongari	struct ale_hw_stats	ale_stats;
213184870Syongari	struct ale_chain_data	ale_cdata;
214184870Syongari	int			ale_if_flags;
215184870Syongari	int			ale_watchdog_timer;
216184870Syongari	int			ale_process_limit;
217184870Syongari	volatile int		ale_morework;
218184870Syongari	int			ale_int_rx_mod;
219184870Syongari	int			ale_int_tx_mod;
220184870Syongari	int			ale_max_frame_size;
221184870Syongari	int			ale_pagesize;
222184870Syongari
223184870Syongari	struct task		ale_int_task;
224184870Syongari	struct taskqueue	*ale_tq;
225184870Syongari	struct mtx		ale_mtx;
226184870Syongari};
227184870Syongari
228184870Syongari/* Register access macros. */
229184870Syongari#define	CSR_WRITE_4(_sc, reg, val)	\
230184870Syongari	bus_write_4((_sc)->ale_res[0], (reg), (val))
231184870Syongari#define	CSR_WRITE_2(_sc, reg, val)	\
232184870Syongari	bus_write_2((_sc)->ale_res[0], (reg), (val))
233184870Syongari#define	CSR_WRITE_1(_sc, reg, val)	\
234184870Syongari	bus_write_1((_sc)->ale_res[0], (reg), (val))
235184870Syongari#define	CSR_READ_2(_sc, reg)		\
236184870Syongari	bus_read_2((_sc)->ale_res[0], (reg))
237184870Syongari#define	CSR_READ_4(_sc, reg)		\
238184870Syongari	bus_read_4((_sc)->ale_res[0], (reg))
239184870Syongari
240184870Syongari#define	ALE_LOCK(_sc)		mtx_lock(&(_sc)->ale_mtx)
241184870Syongari#define	ALE_UNLOCK(_sc)		mtx_unlock(&(_sc)->ale_mtx)
242184870Syongari#define	ALE_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->ale_mtx, MA_OWNED)
243184870Syongari
244184870Syongari#define	ALE_TX_TIMEOUT		5
245184870Syongari#define	ALE_RESET_TIMEOUT	100
246184870Syongari#define	ALE_TIMEOUT		1000
247184870Syongari#define	ALE_PHY_TIMEOUT		1000
248184870Syongari
249184870Syongari#endif	/* _IF_ATEVAR_H */
250