1252206Sdavidcs/*
2252206Sdavidcs * Copyright (c) 2013-2014 Qlogic Corporation
3252206Sdavidcs * All rights reserved.
4252206Sdavidcs *
5252206Sdavidcs *  Redistribution and use in source and binary forms, with or without
6252206Sdavidcs *  modification, are permitted provided that the following conditions
7252206Sdavidcs *  are met:
8252206Sdavidcs *
9252206Sdavidcs *  1. Redistributions of source code must retain the above copyright
10252206Sdavidcs *     notice, this list of conditions and the following disclaimer.
11252206Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12252206Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13252206Sdavidcs *     documentation and/or other materials provided with the distribution.
14252206Sdavidcs *
15252206Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16252206Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17252206Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18252206Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19252206Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20252206Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21252206Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22252206Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23252206Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24252206Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25252206Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26252206Sdavidcs *
27252206Sdavidcs * $FreeBSD$
28252206Sdavidcs */
29252206Sdavidcs
30252206Sdavidcs/*
31252206Sdavidcs * File: qls_def.h
32252206Sdavidcs * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656.
33252206Sdavidcs */
34252206Sdavidcs
35252206Sdavidcs#ifndef _QLS_DEF_H_
36252206Sdavidcs#define _QLS_DEF_H_
37252206Sdavidcs
38252206Sdavidcs/*
39252206Sdavidcs * structure encapsulating a DMA buffer
40252206Sdavidcs */
41252206Sdavidcsstruct qla_dma {
42252206Sdavidcs        bus_size_t              alignment;
43252206Sdavidcs        uint32_t                size;
44252206Sdavidcs        void                    *dma_b;
45252206Sdavidcs        bus_addr_t              dma_addr;
46252206Sdavidcs        bus_dmamap_t            dma_map;
47252206Sdavidcs        bus_dma_tag_t           dma_tag;
48252206Sdavidcs};
49252206Sdavidcstypedef struct qla_dma qla_dma_t;
50252206Sdavidcs
51252206Sdavidcs/*
52252206Sdavidcs * structure encapsulating interrupt vectors
53252206Sdavidcs */
54252206Sdavidcsstruct qla_ivec {
55252206Sdavidcs	uint32_t		cq_idx;
56252206Sdavidcs	void			*ha;
57252206Sdavidcs	struct resource		*irq;
58252206Sdavidcs	void			*handle;
59252206Sdavidcs	int			irq_rid;
60252206Sdavidcs};
61252206Sdavidcstypedef struct qla_ivec qla_ivec_t;
62252206Sdavidcs
63252206Sdavidcs/*
64252206Sdavidcs * Transmit Related Definitions
65252206Sdavidcs */
66252206Sdavidcs
67252206Sdavidcs#define MAX_TX_RINGS		1
68252206Sdavidcs#define NUM_TX_DESCRIPTORS	1024
69252206Sdavidcs
70252206Sdavidcs#define QLA_MAX_SEGMENTS	64	/* maximum # of segs in a sg list */
71252206Sdavidcs#define QLA_OAL_BLK_SIZE	(sizeof (q81_txb_desc_t) * QLA_MAX_SEGMENTS)
72252206Sdavidcs
73252206Sdavidcs#define QLA_TX_OALB_TOTAL_SIZE	(NUM_TX_DESCRIPTORS * QLA_OAL_BLK_SIZE)
74252206Sdavidcs
75252206Sdavidcs#define QLA_TX_PRIVATE_BSIZE	((QLA_TX_OALB_TOTAL_SIZE + \
76252206Sdavidcs					PAGE_SIZE + \
77252206Sdavidcs					(PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1))
78252206Sdavidcs
79252206Sdavidcs#define QLA_MAX_MTU		9000
80252206Sdavidcs#define QLA_STD_FRAME_SIZE	1514
81252206Sdavidcs#define QLA_MAX_TSO_FRAME_SIZE	((64 * 1024 - 1) + 22)
82252206Sdavidcs
83252206Sdavidcs#define QL_FRAME_HDR_SIZE	(ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN +\
84252206Sdavidcs                sizeof (struct ip6_hdr) + sizeof (struct tcphdr) + 16)
85252206Sdavidcs
86252206Sdavidcsstruct qla_tx_buf {
87252206Sdavidcs	struct mbuf	*m_head;
88252206Sdavidcs	bus_dmamap_t	map;
89252206Sdavidcs
90252206Sdavidcs	/* The number of entries in the OAL is determined by QLA_MAX_SEGMENTS */
91252206Sdavidcs	bus_addr_t      oal_paddr;
92252206Sdavidcs	void		*oal_vaddr;
93252206Sdavidcs};
94252206Sdavidcstypedef struct qla_tx_buf qla_tx_buf_t;
95252206Sdavidcs
96252206Sdavidcsstruct qla_tx_ring {
97252206Sdavidcs
98252206Sdavidcs	volatile struct {
99252206Sdavidcs		uint32_t	wq_dma:1,
100252206Sdavidcs				privb_dma:1;
101252206Sdavidcs	} flags;
102252206Sdavidcs
103252206Sdavidcs	qla_dma_t		privb_dma;
104252206Sdavidcs	qla_dma_t		wq_dma;
105252206Sdavidcs
106252206Sdavidcs	qla_tx_buf_t		tx_buf[NUM_TX_DESCRIPTORS];
107252206Sdavidcs	uint64_t		count;
108252206Sdavidcs
109252206Sdavidcs	struct resource         *wq_db_addr;
110252206Sdavidcs	uint32_t		wq_db_offset;
111252206Sdavidcs
112252206Sdavidcs	q81_tx_cmd_t		*wq_vaddr;
113252206Sdavidcs	bus_addr_t		wq_paddr;
114252206Sdavidcs
115252206Sdavidcs	void			*wq_icb_vaddr;
116252206Sdavidcs	bus_addr_t		wq_icb_paddr;
117252206Sdavidcs
118252206Sdavidcs	uint32_t		*txr_cons_vaddr;
119252206Sdavidcs	bus_addr_t		txr_cons_paddr;
120252206Sdavidcs
121252206Sdavidcs	volatile uint32_t	txr_free; /* # of free entries in tx ring */
122252206Sdavidcs	volatile uint32_t	txr_next; /* # next available tx ring entry */
123252206Sdavidcs	volatile uint32_t	txr_done;
124252206Sdavidcs
125252206Sdavidcs	uint64_t		tx_frames;
126252206Sdavidcs	uint64_t		tx_tso_frames;
127252206Sdavidcs	uint64_t		tx_vlan_frames;
128252206Sdavidcs};
129252206Sdavidcstypedef struct qla_tx_ring qla_tx_ring_t;
130252206Sdavidcs
131252206Sdavidcs/*
132252206Sdavidcs * Receive Related Definitions
133252206Sdavidcs */
134252206Sdavidcs
135252206Sdavidcs#define MAX_RX_RINGS		MAX_TX_RINGS
136252206Sdavidcs
137252206Sdavidcs#define NUM_RX_DESCRIPTORS	1024
138252206Sdavidcs#define NUM_CQ_ENTRIES		NUM_RX_DESCRIPTORS
139252206Sdavidcs
140252206Sdavidcs#define QLA_LGB_SIZE		(12 * 1024)
141252206Sdavidcs#define QLA_NUM_LGB_ENTRIES	32
142252206Sdavidcs
143252206Sdavidcs#define QLA_LBQ_SIZE		(QLA_NUM_LGB_ENTRIES * sizeof(q81_bq_addr_e_t))
144252206Sdavidcs
145252206Sdavidcs#define QLA_LGBQ_AND_TABLE_SIZE	\
146252206Sdavidcs	((QLA_LBQ_SIZE + PAGE_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1))
147252206Sdavidcs
148252206Sdavidcs
149252206Sdavidcs/* Please note that Small Buffer size is determined by max mtu size */
150252206Sdavidcs#define QLA_NUM_SMB_ENTRIES	NUM_RX_DESCRIPTORS
151252206Sdavidcs
152252206Sdavidcs#define QLA_SBQ_SIZE		(QLA_NUM_SMB_ENTRIES * sizeof(q81_bq_addr_e_t))
153252206Sdavidcs
154252206Sdavidcs#define QLA_SMBQ_AND_TABLE_SIZE	\
155252206Sdavidcs	((QLA_SBQ_SIZE + PAGE_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1))
156252206Sdavidcs
157252206Sdavidcsstruct qla_rx_buf {
158252206Sdavidcs	struct mbuf	*m_head;
159252206Sdavidcs	bus_dmamap_t	map;
160252206Sdavidcs	bus_addr_t      paddr;
161252206Sdavidcs	void		*next;
162252206Sdavidcs};
163252206Sdavidcstypedef struct qla_rx_buf qla_rx_buf_t;
164252206Sdavidcs
165252206Sdavidcsstruct qla_rx_ring {
166252206Sdavidcs	volatile struct {
167252206Sdavidcs		uint32_t	cq_dma:1,
168252206Sdavidcs				lbq_dma:1,
169252206Sdavidcs				sbq_dma:1,
170252206Sdavidcs				lb_dma:1;
171252206Sdavidcs	} flags;
172252206Sdavidcs
173252206Sdavidcs	qla_dma_t		cq_dma;
174252206Sdavidcs	qla_dma_t		lbq_dma;
175252206Sdavidcs	qla_dma_t		sbq_dma;
176252206Sdavidcs	qla_dma_t		lb_dma;
177252206Sdavidcs
178252206Sdavidcs	struct lro_ctrl		lro;
179252206Sdavidcs
180252206Sdavidcs	qla_rx_buf_t		rx_buf[NUM_RX_DESCRIPTORS];
181252206Sdavidcs	qla_rx_buf_t		*rxb_free;
182252206Sdavidcs	uint32_t		rx_free;
183252206Sdavidcs	uint32_t		rx_next;
184252206Sdavidcs
185252206Sdavidcs	uint32_t		cq_db_offset;
186252206Sdavidcs
187252206Sdavidcs	void			*cq_icb_vaddr;
188252206Sdavidcs	bus_addr_t		cq_icb_paddr;
189252206Sdavidcs
190252206Sdavidcs	uint32_t		*cqi_vaddr;
191252206Sdavidcs	bus_addr_t		cqi_paddr;
192252206Sdavidcs
193252206Sdavidcs	void			*cq_base_vaddr;
194252206Sdavidcs	bus_addr_t		cq_base_paddr;
195252206Sdavidcs	uint32_t		cq_next; /* next cq entry to process */
196252206Sdavidcs
197252206Sdavidcs	void			*lbq_addr_tbl_vaddr;
198252206Sdavidcs	bus_addr_t		lbq_addr_tbl_paddr;
199252206Sdavidcs
200252206Sdavidcs	void			*lbq_vaddr;
201252206Sdavidcs	bus_addr_t		lbq_paddr;
202252206Sdavidcs	uint32_t		lbq_next; /* next entry in LBQ to process */
203252206Sdavidcs	uint32_t		lbq_free;/* # of entries in LBQ to arm */
204252206Sdavidcs	uint32_t		lbq_in; /* next entry in LBQ to arm */
205252206Sdavidcs
206252206Sdavidcs	void			*lb_vaddr;
207252206Sdavidcs	bus_addr_t		lb_paddr;
208252206Sdavidcs
209252206Sdavidcs	void			*sbq_addr_tbl_vaddr;
210252206Sdavidcs	bus_addr_t		sbq_addr_tbl_paddr;
211252206Sdavidcs
212252206Sdavidcs	void			*sbq_vaddr;
213252206Sdavidcs	bus_addr_t		sbq_paddr;
214252206Sdavidcs	uint32_t		sbq_next; /* next entry in SBQ to process */
215252206Sdavidcs	uint32_t		sbq_free;/* # of entries in SBQ to arm */
216252206Sdavidcs	uint32_t		sbq_in; /* next entry in SBQ to arm */
217252206Sdavidcs
218252206Sdavidcs	uint64_t		rx_int;
219252206Sdavidcs	uint64_t		rss_int;
220252206Sdavidcs};
221252206Sdavidcstypedef struct qla_rx_ring qla_rx_ring_t;
222252206Sdavidcs
223252206Sdavidcs
224252206Sdavidcs#define QLA_WATCHDOG_CALLOUT_TICKS	1
225252206Sdavidcs
226252206Sdavidcs/*
227252206Sdavidcs * Multicast Definitions
228252206Sdavidcs */
229252206Sdavidcstypedef struct _qla_mcast {
230252206Sdavidcs	uint16_t	rsrvd;
231252206Sdavidcs	uint8_t		addr[6];
232252206Sdavidcs} __packed qla_mcast_t;
233252206Sdavidcs
234252206Sdavidcs/*
235252206Sdavidcs * Misc. definitions
236252206Sdavidcs */
237252206Sdavidcs#define QLA_PAGE_SIZE		4096
238252206Sdavidcs
239252206Sdavidcs/*
240252206Sdavidcs * Adapter structure contains the hardware independant information of the
241252206Sdavidcs * pci function.
242252206Sdavidcs */
243252206Sdavidcsstruct qla_host {
244252206Sdavidcs        volatile struct {
245252206Sdavidcs                volatile uint32_t
246252206Sdavidcs			mpi_dma			:1,
247252206Sdavidcs			rss_dma			:1,
248252206Sdavidcs			intr_enable		:1,
249252206Sdavidcs			qla_callout_init	:1,
250252206Sdavidcs			qla_watchdog_active	:1,
251252206Sdavidcs			qla_watchdog_exit	:1,
252252206Sdavidcs			qla_watchdog_pause	:1,
253252206Sdavidcs			lro_init		:1,
254252206Sdavidcs			parent_tag		:1,
255252206Sdavidcs			lock_init		:1;
256252206Sdavidcs        } flags;
257252206Sdavidcs
258252206Sdavidcs	volatile uint32_t	hw_init;
259252206Sdavidcs
260252206Sdavidcs	volatile uint32_t	qla_watchdog_exited;
261252206Sdavidcs	volatile uint32_t	qla_watchdog_paused;
262252206Sdavidcs	volatile uint32_t	qla_initiate_recovery;
263252206Sdavidcs
264252206Sdavidcs	device_t		pci_dev;
265252206Sdavidcs
266252206Sdavidcs	uint8_t			pci_func;
267252206Sdavidcs	uint16_t		watchdog_ticks;
268252206Sdavidcs	uint8_t			resvd;
269252206Sdavidcs
270252206Sdavidcs        /* ioctl related */
271252206Sdavidcs        struct cdev             *ioctl_dev;
272252206Sdavidcs
273252206Sdavidcs	/* register mapping */
274252206Sdavidcs	struct resource		*pci_reg;
275252206Sdavidcs	int			reg_rid;
276252206Sdavidcs
277252206Sdavidcs	struct resource		*pci_reg1;
278252206Sdavidcs	int			reg_rid1;
279252206Sdavidcs
280252206Sdavidcs	int			msix_count;
281252206Sdavidcs	qla_ivec_t              irq_vec[MAX_RX_RINGS];
282252206Sdavidcs
283252206Sdavidcs	/* parent dma tag */
284252206Sdavidcs	bus_dma_tag_t           parent_tag;
285252206Sdavidcs
286252206Sdavidcs	/* interface to o.s */
287252206Sdavidcs	struct ifnet		*ifp;
288252206Sdavidcs
289252206Sdavidcs	struct ifmedia		media;
290252206Sdavidcs	uint16_t		max_frame_size;
291252206Sdavidcs	uint16_t		rsrvd0;
292252206Sdavidcs	uint32_t		msize;
293252206Sdavidcs	int			if_flags;
294252206Sdavidcs
295252206Sdavidcs	/* hardware access lock */
296252206Sdavidcs	struct mtx		hw_lock;
297252206Sdavidcs	volatile uint32_t	hw_lock_held;
298252206Sdavidcs
299252206Sdavidcs	uint32_t		vm_pgsize;
300252206Sdavidcs	/* transmit related */
301252206Sdavidcs	uint32_t		num_tx_rings;
302252206Sdavidcs	qla_tx_ring_t		tx_ring[MAX_TX_RINGS];
303252206Sdavidcs
304252206Sdavidcs	bus_dma_tag_t		tx_tag;
305252206Sdavidcs	struct task		tx_task;
306252206Sdavidcs	struct taskqueue	*tx_tq;
307252206Sdavidcs	struct callout		tx_callout;
308252206Sdavidcs	struct mtx		tx_lock;
309252206Sdavidcs
310252206Sdavidcs	/* receive related */
311252206Sdavidcs	uint32_t		num_rx_rings;
312252206Sdavidcs	qla_rx_ring_t		rx_ring[MAX_RX_RINGS];
313252206Sdavidcs	bus_dma_tag_t		rx_tag;
314252206Sdavidcs
315252206Sdavidcs	/* stats */
316252206Sdavidcs	uint32_t		err_m_getcl;
317252206Sdavidcs	uint32_t		err_m_getjcl;
318252206Sdavidcs	uint32_t		err_tx_dmamap_create;
319252206Sdavidcs	uint32_t		err_tx_dmamap_load;
320252206Sdavidcs	uint32_t		err_tx_defrag;
321252206Sdavidcs
322252206Sdavidcs	/* mac address related */
323252206Sdavidcs	uint8_t			mac_rcv_mode;
324252206Sdavidcs	uint8_t			mac_addr[ETHER_ADDR_LEN];
325252206Sdavidcs	uint32_t		nmcast;
326252206Sdavidcs	qla_mcast_t		mcast[Q8_MAX_NUM_MULTICAST_ADDRS];
327252206Sdavidcs
328252206Sdavidcs	/* Link Related */
329252206Sdavidcs        uint8_t			link_up;
330252206Sdavidcs	uint32_t		link_status;
331252206Sdavidcs	uint32_t		link_down_info;
332252206Sdavidcs	uint32_t		link_hw_info;
333252206Sdavidcs	uint32_t		link_dcbx_counters;
334252206Sdavidcs	uint32_t		link_change_counters;
335252206Sdavidcs
336252206Sdavidcs	/* Flash Related */
337252206Sdavidcs	q81_flash_t		flash;
338252206Sdavidcs
339252206Sdavidcs	/* debug stuff */
340252206Sdavidcs	volatile const char 	*qla_lock;
341252206Sdavidcs	volatile const char	*qla_unlock;
342252206Sdavidcs
343252206Sdavidcs	/* Error Recovery Related */
344252206Sdavidcs	uint32_t		err_inject;
345252206Sdavidcs	struct task		err_task;
346252206Sdavidcs	struct taskqueue	*err_tq;
347252206Sdavidcs
348252206Sdavidcs	/* Chip related */
349252206Sdavidcs	uint32_t		rev_id;
350252206Sdavidcs
351252206Sdavidcs	/* mailbox completions */
352252206Sdavidcs	uint32_t		aen[Q81_NUM_AEN_REGISTERS];
353252206Sdavidcs	uint32_t		mbox[Q81_NUM_MBX_REGISTERS];
354252206Sdavidcs	volatile uint32_t       mbx_done;
355252206Sdavidcs
356252206Sdavidcs	/* mpi dump related */
357252206Sdavidcs	qla_dma_t		mpi_dma;
358252206Sdavidcs	qla_dma_t		rss_dma;
359252206Sdavidcs
360252206Sdavidcs};
361252206Sdavidcstypedef struct qla_host qla_host_t;
362252206Sdavidcs
363252206Sdavidcs/* note that align has to be a power of 2 */
364252206Sdavidcs#define QL_ALIGN(size, align) (size + (align - 1)) & ~(align - 1);
365252206Sdavidcs#define QL_MIN(x, y) ((x < y) ? x : y)
366252206Sdavidcs
367252206Sdavidcs#define QL_RUNNING(ifp) \
368252206Sdavidcs		((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) == \
369252206Sdavidcs			IFF_DRV_RUNNING)
370252206Sdavidcs
371252206Sdavidcs/* Return 0, if identical, else 1 */
372252206Sdavidcs
373252206Sdavidcs#define QL_MAC_CMP(mac1, mac2)    \
374252206Sdavidcs	((((*(uint32_t *) mac1) == (*(uint32_t *) mac2) && \
375252206Sdavidcs	(*(uint16_t *)(mac1 + 4)) == (*(uint16_t *)(mac2 + 4)))) ? 0 : 1)
376252206Sdavidcs
377252206Sdavidcs#endif /* #ifndef _QLS_DEF_H_ */
378