xref: /freebsd/sys/dev/cxgb/cxgb_adapter.h (revision 78d146160dc5339c9cdf7799551bcc442a6eb95b)
1b6d90eb7SKip Macy /**************************************************************************
2*4d846d26SWarner Losh SPDX-License-Identifier: BSD-2-Clause
3b6d90eb7SKip Macy 
4f2d8ff04SGeorge V. Neville-Neil Copyright (c) 2007-2009, Chelsio Inc.
5b6d90eb7SKip Macy All rights reserved.
6b6d90eb7SKip Macy 
7b6d90eb7SKip Macy Redistribution and use in source and binary forms, with or without
8b6d90eb7SKip Macy modification, are permitted provided that the following conditions are met:
9b6d90eb7SKip Macy 
10b6d90eb7SKip Macy  1. Redistributions of source code must retain the above copyright notice,
11b6d90eb7SKip Macy     this list of conditions and the following disclaimer.
12b6d90eb7SKip Macy 
13d722cab4SKip Macy  2. Neither the name of the Chelsio Corporation nor the names of its
14b6d90eb7SKip Macy     contributors may be used to endorse or promote products derived from
15b6d90eb7SKip Macy     this software without specific prior written permission.
16b6d90eb7SKip Macy 
17b6d90eb7SKip Macy THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18b6d90eb7SKip Macy AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19b6d90eb7SKip Macy IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20b6d90eb7SKip Macy ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21b6d90eb7SKip Macy LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22b6d90eb7SKip Macy CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23b6d90eb7SKip Macy SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24b6d90eb7SKip Macy INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25b6d90eb7SKip Macy CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26b6d90eb7SKip Macy ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27b6d90eb7SKip Macy POSSIBILITY OF SUCH DAMAGE.
28b6d90eb7SKip Macy 
29b6d90eb7SKip Macy ***************************************************************************/
30b6d90eb7SKip Macy 
31b6d90eb7SKip Macy 
32b6d90eb7SKip Macy #ifndef _CXGB_ADAPTER_H_
33b6d90eb7SKip Macy #define _CXGB_ADAPTER_H_
34b6d90eb7SKip Macy 
35b6d90eb7SKip Macy #include <sys/lock.h>
36b6d90eb7SKip Macy #include <sys/mutex.h>
37b6d90eb7SKip Macy #include <sys/rman.h>
38b6d90eb7SKip Macy #include <sys/mbuf.h>
39b6d90eb7SKip Macy #include <sys/socket.h>
40b6d90eb7SKip Macy #include <sys/sockio.h>
418090c9f5SKip Macy #include <sys/condvar.h>
42db7f0b97SKip Macy #include <sys/buf_ring.h>
4376039bc8SGleb Smirnoff #include <sys/taskqueue.h>
44b6d90eb7SKip Macy 
45b6d90eb7SKip Macy #include <net/ethernet.h>
46b6d90eb7SKip Macy #include <net/if.h>
4776039bc8SGleb Smirnoff #include <net/if_var.h>
48b6d90eb7SKip Macy #include <net/if_media.h>
498e10660fSKip Macy #include <net/if_dl.h>
5062b5b6ecSBjoern A. Zeeb #include <netinet/in.h>
51e83ec3e5SNavdeep Parhar #include <netinet/tcp_lro.h>
52b6d90eb7SKip Macy 
53b6d90eb7SKip Macy #include <machine/bus.h>
54b6d90eb7SKip Macy #include <machine/resource.h>
558090c9f5SKip Macy 
56b6d90eb7SKip Macy #include <dev/pci/pcireg.h>
57b6d90eb7SKip Macy #include <dev/pci/pcivar.h>
58b6d90eb7SKip Macy 
59ef72318fSKip Macy #include <cxgb_osdep.h>
60d722cab4SKip Macy 
61b6d90eb7SKip Macy struct adapter;
62b6d90eb7SKip Macy struct sge_qset;
63b6d90eb7SKip Macy extern int cxgb_debug;
64b6d90eb7SKip Macy 
65bb38cd2fSKip Macy #ifdef DEBUG_LOCKING
66bb38cd2fSKip Macy #define MTX_INIT(lock, lockname, class, flags) \
67bb38cd2fSKip Macy 	do { \
68bb38cd2fSKip Macy 		printf("initializing %s at %s:%d\n", lockname, __FILE__, __LINE__); \
69bb38cd2fSKip Macy 		mtx_init((lock), lockname, class, flags);		\
70bb38cd2fSKip Macy 	} while (0)
71bb38cd2fSKip Macy 
72bb38cd2fSKip Macy #define MTX_DESTROY(lock) \
73bb38cd2fSKip Macy 	do { \
74bb38cd2fSKip Macy 		printf("destroying %s at %s:%d\n", (lock)->lock_object.lo_name, __FILE__, __LINE__); \
75bb38cd2fSKip Macy 		mtx_destroy((lock));					\
76bb38cd2fSKip Macy 	} while (0)
77bb38cd2fSKip Macy 
78bb38cd2fSKip Macy #else
79bb38cd2fSKip Macy #define MTX_INIT mtx_init
80bb38cd2fSKip Macy #define MTX_DESTROY mtx_destroy
81bb38cd2fSKip Macy #endif
82bb38cd2fSKip Macy 
830bbdea77SGeorge V. Neville-Neil enum {
840bbdea77SGeorge V. Neville-Neil 	LF_NO = 0,
850bbdea77SGeorge V. Neville-Neil 	LF_MAYBE,
860bbdea77SGeorge V. Neville-Neil 	LF_YES
870bbdea77SGeorge V. Neville-Neil };
880bbdea77SGeorge V. Neville-Neil 
89b6d90eb7SKip Macy struct port_info {
90b6d90eb7SKip Macy 	struct adapter	*adapter;
91954712e8SJustin Hibbits 	if_t		ifp;
92b6d90eb7SKip Macy 	int		if_flags;
933f345a5dSKip Macy 	int		flags;
94b6d90eb7SKip Macy 	const struct port_type_info *port_type;
95b6d90eb7SKip Macy 	struct cphy	phy;
96b6d90eb7SKip Macy 	struct cmac	mac;
97e26e6373SNavdeep Parhar 	struct timeval	last_refreshed;
98b6d90eb7SKip Macy 	struct link_config link_config;
99b6d90eb7SKip Macy 	struct ifmedia	media;
100b6d90eb7SKip Macy 	struct mtx	lock;
1013f345a5dSKip Macy 	uint32_t	port_id;
1023f345a5dSKip Macy 	uint32_t	tx_chan;
1033f345a5dSKip Macy 	uint32_t	txpkt_intf;
1043f345a5dSKip Macy 	uint32_t        first_qset;
1058d5754afSKip Macy 	uint32_t	nqsets;
106f2d8ff04SGeorge V. Neville-Neil 	int		link_fault;
1077ac2e6c3SKip Macy 
1087ac2e6c3SKip Macy 	uint8_t		hw_addr[ETHER_ADDR_LEN];
109bd1a9fbaSNavdeep Parhar 	struct callout	link_check_ch;
110bd1a9fbaSNavdeep Parhar 	struct task	link_check_task;
111ef72318fSKip Macy 	struct task	timer_reclaim_task;
112b6d90eb7SKip Macy 	struct cdev     *port_cdev;
113bb38cd2fSKip Macy 
1148090c9f5SKip Macy #define PORT_LOCK_NAME_LEN 32
1158090c9f5SKip Macy #define PORT_NAME_LEN 32
1168090c9f5SKip Macy 	char            lockbuf[PORT_LOCK_NAME_LEN];
1178090c9f5SKip Macy 	char            namebuf[PORT_NAME_LEN];
1186792568fSNavdeep Parhar } __aligned(CACHE_LINE_SIZE);
119b6d90eb7SKip Macy 
1203f345a5dSKip Macy enum {
1213f345a5dSKip Macy 	/* adapter flags */
122b6d90eb7SKip Macy 	FULL_INIT_DONE	= (1 << 0),
123b6d90eb7SKip Macy 	USING_MSI	= (1 << 1),
124b6d90eb7SKip Macy 	USING_MSIX	= (1 << 2),
125b6d90eb7SKip Macy 	QUEUES_BOUND	= (1 << 3),
126b6d90eb7SKip Macy 	FW_UPTODATE	= (1 << 4),
127ac3a6d9cSKip Macy 	TPS_UPTODATE	= (1 << 5),
1288e10660fSKip Macy 	CXGB_SHUTDOWN	= (1 << 6),
1298e10660fSKip Macy 	CXGB_OFLD_INIT	= (1 << 7),
1308e10660fSKip Macy 	TP_PARITY_INIT	= (1 << 8),
1313f345a5dSKip Macy 	CXGB_BUSY	= (1 << 9),
13209fe6320SNavdeep Parhar 	TOM_INIT_DONE	= (1 << 10),
1333f345a5dSKip Macy 
1343f345a5dSKip Macy 	/* port flags */
1353f345a5dSKip Macy 	DOOMED		= (1 << 0),
136b6d90eb7SKip Macy };
1373f345a5dSKip Macy #define IS_DOOMED(p)	(p->flags & DOOMED)
1383f345a5dSKip Macy #define SET_DOOMED(p)	do {p->flags |= DOOMED;} while (0)
1393f345a5dSKip Macy #define IS_BUSY(sc)	(sc->flags & CXGB_BUSY)
1403f345a5dSKip Macy #define SET_BUSY(sc)	do {sc->flags |= CXGB_BUSY;} while (0)
1413f345a5dSKip Macy #define CLR_BUSY(sc)	do {sc->flags &= ~CXGB_BUSY;} while (0)
142b6d90eb7SKip Macy 
143b6d90eb7SKip Macy #define FL_Q_SIZE	4096
1448090c9f5SKip Macy #define JUMBO_Q_SIZE	1024
145489ca05bSNavdeep Parhar #define RSPQ_Q_SIZE	2048
146b6d90eb7SKip Macy #define TX_ETH_Q_SIZE	1024
14797ae3bc3SNavdeep Parhar #define TX_OFLD_Q_SIZE	1024
14897ae3bc3SNavdeep Parhar #define TX_CTRL_Q_SIZE	256
149b6d90eb7SKip Macy 
1508090c9f5SKip Macy enum { TXQ_ETH = 0,
1518090c9f5SKip Macy        TXQ_OFLD = 1,
1528090c9f5SKip Macy        TXQ_CTRL = 2, };
153b6d90eb7SKip Macy 
154b6d90eb7SKip Macy 
15560f1e276SKip Macy /*
15660f1e276SKip Macy  * work request size in bytes
15760f1e276SKip Macy  */
15860f1e276SKip Macy #define WR_LEN (WR_FLITS * 8)
1594af83c8cSKip Macy #define PIO_LEN (WR_LEN - sizeof(struct cpl_tx_pkt_lso))
16060f1e276SKip Macy 
161d722cab4SKip Macy struct lro_state {
162d722cab4SKip Macy 	unsigned short enabled;
16325292debSKip Macy 	struct lro_ctrl ctrl;
164b6d90eb7SKip Macy };
165b6d90eb7SKip Macy 
166b6d90eb7SKip Macy #define RX_BUNDLE_SIZE 8
167b6d90eb7SKip Macy 
168b6d90eb7SKip Macy struct rsp_desc;
169b6d90eb7SKip Macy 
170b6d90eb7SKip Macy struct sge_rspq {
171b6d90eb7SKip Macy 	uint32_t	credits;
172b6d90eb7SKip Macy 	uint32_t	size;
173b6d90eb7SKip Macy 	uint32_t	cidx;
174b6d90eb7SKip Macy 	uint32_t	gen;
175b6d90eb7SKip Macy 	uint32_t	polling;
176b6d90eb7SKip Macy 	uint32_t	holdoff_tmr;
177b6d90eb7SKip Macy 	uint32_t	next_holdoff;
178b6d90eb7SKip Macy 	uint32_t        imm_data;
1798e10660fSKip Macy 	uint32_t        async_notif;
180b6d90eb7SKip Macy 	uint32_t	cntxt_id;
181d722cab4SKip Macy 	uint32_t        offload_pkts;
182d722cab4SKip Macy 	uint32_t        pure_rsps;
183d722cab4SKip Macy 	uint32_t        unhandled_irqs;
184489ca05bSNavdeep Parhar 	uint32_t        starved;
185d722cab4SKip Macy 
186d722cab4SKip Macy 	bus_addr_t	phys_addr;
187b6d90eb7SKip Macy 	bus_dma_tag_t	desc_tag;
188b6d90eb7SKip Macy 	bus_dmamap_t	desc_map;
1898adc65adSKip Macy 
1908adc65adSKip Macy 	struct t3_mbuf_hdr rspq_mh;
19110b16b26SKip Macy 	struct rsp_desc	*desc;
19210b16b26SKip Macy 	struct mtx      lock;
193bb38cd2fSKip Macy #define RSPQ_NAME_LEN  32
194bb38cd2fSKip Macy 	char            lockbuf[RSPQ_NAME_LEN];
19510b16b26SKip Macy 	uint32_t	rspq_dump_start;
19610b16b26SKip Macy 	uint32_t	rspq_dump_count;
197b6d90eb7SKip Macy };
198b6d90eb7SKip Macy 
199b6d90eb7SKip Macy struct rx_desc;
200b6d90eb7SKip Macy struct rx_sw_desc;
201b6d90eb7SKip Macy 
202b6d90eb7SKip Macy struct sge_fl {
203b6d90eb7SKip Macy 	uint32_t	buf_size;
204b6d90eb7SKip Macy 	uint32_t	credits;
205b6d90eb7SKip Macy 	uint32_t	size;
206b6d90eb7SKip Macy 	uint32_t	cidx;
207b6d90eb7SKip Macy 	uint32_t	pidx;
208b6d90eb7SKip Macy 	uint32_t	gen;
2091d4942f4SNavdeep Parhar 	uint32_t	db_pending;
210b6d90eb7SKip Macy 	bus_addr_t	phys_addr;
211b6d90eb7SKip Macy 	uint32_t	cntxt_id;
212f2d8ff04SGeorge V. Neville-Neil 	uint32_t	empty;
213b6d90eb7SKip Macy 	bus_dma_tag_t	desc_tag;
214b6d90eb7SKip Macy 	bus_dmamap_t	desc_map;
215fa0521c0SKip Macy 	bus_dma_tag_t   entry_tag;
216fa0521c0SKip Macy 	uma_zone_t      zone;
21710b16b26SKip Macy 	struct rx_desc	*desc;
21810b16b26SKip Macy 	struct rx_sw_desc *sdesc;
219fa0521c0SKip Macy 	int             type;
220b6d90eb7SKip Macy };
221b6d90eb7SKip Macy 
222b6d90eb7SKip Macy struct tx_desc;
223b6d90eb7SKip Macy struct tx_sw_desc;
224b6d90eb7SKip Macy 
225b8fe6051SKip Macy #define TXQ_TRANSMITTING    0x1
226b8fe6051SKip Macy 
227b6d90eb7SKip Macy struct sge_txq {
228b6d90eb7SKip Macy 	uint64_t	flags;
229b6d90eb7SKip Macy 	uint32_t	in_use;
230b6d90eb7SKip Macy 	uint32_t	size;
231b6d90eb7SKip Macy 	uint32_t	processed;
232b6d90eb7SKip Macy 	uint32_t	cleaned;
233b6d90eb7SKip Macy 	uint32_t	stop_thres;
234b6d90eb7SKip Macy 	uint32_t	cidx;
235b6d90eb7SKip Macy 	uint32_t	pidx;
236b6d90eb7SKip Macy 	uint32_t	gen;
237b6d90eb7SKip Macy 	uint32_t	unacked;
2381d4942f4SNavdeep Parhar 	uint32_t	db_pending;
239b6d90eb7SKip Macy 	struct tx_desc	*desc;
240b6d90eb7SKip Macy 	struct tx_sw_desc *sdesc;
241b6d90eb7SKip Macy 	uint32_t	token;
242b6d90eb7SKip Macy 	bus_addr_t	phys_addr;
243b8fe6051SKip Macy 	struct task     qresume_task;
244b8fe6051SKip Macy 	struct task     qreclaim_task;
245b6d90eb7SKip Macy 	uint32_t	cntxt_id;
246b6d90eb7SKip Macy 	uint64_t	stops;
247b6d90eb7SKip Macy 	uint64_t	restarts;
248b6d90eb7SKip Macy 	bus_dma_tag_t	desc_tag;
249b6d90eb7SKip Macy 	bus_dmamap_t	desc_map;
250fa0521c0SKip Macy 	bus_dma_tag_t   entry_tag;
251c578b6acSGleb Smirnoff 	struct mbufq	sendq;
2523f345a5dSKip Macy 
253db7f0b97SKip Macy 	struct buf_ring *txq_mr;
254a02573bcSKip Macy 	struct ifaltq	*txq_ifq;
2553f345a5dSKip Macy 	struct callout	txq_timer;
2563f345a5dSKip Macy 	struct callout	txq_watchdog;
2573f345a5dSKip Macy 	uint64_t        txq_coalesced;
2588090c9f5SKip Macy 	uint32_t        txq_skipped;
2598090c9f5SKip Macy 	uint32_t        txq_enqueued;
2608d5754afSKip Macy 	uint32_t	txq_dump_start;
2618d5754afSKip Macy 	uint32_t	txq_dump_count;
2623f345a5dSKip Macy 	uint64_t	txq_direct_packets;
2633f345a5dSKip Macy 	uint64_t	txq_direct_bytes;
2643f345a5dSKip Macy 	uint64_t	txq_frees;
2658090c9f5SKip Macy 	struct sg_ent  txq_sgl[TX_MAX_SEGS / 2 + 1];
266b6d90eb7SKip Macy };
267b6d90eb7SKip Macy 
26825292debSKip Macy #define SGE_PSTAT_MAX (SGE_PSTAT_VLANINS+1)
269b6d90eb7SKip Macy 
2708090c9f5SKip Macy #define QS_EXITING              0x1
2718090c9f5SKip Macy #define QS_RUNNING              0x2
2728090c9f5SKip Macy #define QS_BOUND                0x4
2733f345a5dSKip Macy #define	QS_FLUSHING		0x8
2743f345a5dSKip Macy #define	QS_TIMEOUT		0x10
2758090c9f5SKip Macy 
276b6d90eb7SKip Macy struct sge_qset {
277b6d90eb7SKip Macy 	struct sge_rspq		rspq;
278b6d90eb7SKip Macy 	struct sge_fl		fl[SGE_RXQ_PER_SET];
279d722cab4SKip Macy 	struct lro_state        lro;
280b6d90eb7SKip Macy 	struct sge_txq		txq[SGE_TXQ_PER_SET];
281d722cab4SKip Macy 	uint32_t                txq_stopped;       /* which Tx queues are stopped */
282b6d90eb7SKip Macy 	struct port_info        *port;
28309fe6320SNavdeep Parhar 	struct adapter          *adap;
284693d746cSKip Macy 	int                     idx; /* qset # */
2858090c9f5SKip Macy 	int                     qs_flags;
2863f345a5dSKip Macy 	int			coalescing;
2878090c9f5SKip Macy 	struct cv		qs_cv;
2883f345a5dSKip Macy 	struct mtx		lock;
2898090c9f5SKip Macy #define QS_NAME_LEN 32
2908090c9f5SKip Macy 	char                    namebuf[QS_NAME_LEN];
291b6d90eb7SKip Macy };
292b6d90eb7SKip Macy 
293b6d90eb7SKip Macy struct sge {
294b6d90eb7SKip Macy 	struct sge_qset	        qs[SGE_QSETS];
295b6d90eb7SKip Macy 	struct mtx              reg_lock;
296b6d90eb7SKip Macy };
297b6d90eb7SKip Macy 
298ac3a6d9cSKip Macy struct filter_info;
299ac3a6d9cSKip Macy 
30009fe6320SNavdeep Parhar typedef int (*cpl_handler_t)(struct sge_qset *, struct rsp_desc *,
30109fe6320SNavdeep Parhar     struct mbuf *);
30209fe6320SNavdeep Parhar 
303b6d90eb7SKip Macy struct adapter {
30409fe6320SNavdeep Parhar 	SLIST_ENTRY(adapter)	link;
305b6d90eb7SKip Macy 	device_t		dev;
306b6d90eb7SKip Macy 	int			flags;
307b6d90eb7SKip Macy 
308b6d90eb7SKip Macy 	/* PCI register resources */
3097aff6d8eSKip Macy 	int			regs_rid;
310b6d90eb7SKip Macy 	struct resource		*regs_res;
3118e10660fSKip Macy 	int			udbs_rid;
3128e10660fSKip Macy 	struct resource		*udbs_res;
313b6d90eb7SKip Macy 	bus_space_handle_t	bh;
314b6d90eb7SKip Macy 	bus_space_tag_t		bt;
315b6d90eb7SKip Macy 	bus_size_t              mmio_len;
316ac6b4cf1SKip Macy 	uint32_t                link_width;
317b6d90eb7SKip Macy 
318b6d90eb7SKip Macy 	/* DMA resources */
319b6d90eb7SKip Macy 	bus_dma_tag_t		parent_dmat;
320b6d90eb7SKip Macy 	bus_dma_tag_t		rx_dmat;
321b6d90eb7SKip Macy 	bus_dma_tag_t		rx_jumbo_dmat;
322b6d90eb7SKip Macy 	bus_dma_tag_t		tx_dmat;
323b6d90eb7SKip Macy 
324b6d90eb7SKip Macy 	/* Interrupt resources */
325b6d90eb7SKip Macy 	struct resource		*irq_res;
326b6d90eb7SKip Macy 	int			irq_rid;
327b6d90eb7SKip Macy 	void			*intr_tag;
328b6d90eb7SKip Macy 
329b6d90eb7SKip Macy 	uint32_t		msix_regs_rid;
330b6d90eb7SKip Macy 	struct resource		*msix_regs_res;
331b6d90eb7SKip Macy 
332b6d90eb7SKip Macy 	struct resource		*msix_irq_res[SGE_QSETS];
333b6d90eb7SKip Macy 	int			msix_irq_rid[SGE_QSETS];
334b6d90eb7SKip Macy 	void			*msix_intr_tag[SGE_QSETS];
335ac3a6d9cSKip Macy 	uint8_t                 rxpkt_map[8]; /* maps RX_PKT interface values to port ids */
336ac3a6d9cSKip Macy 	uint8_t                 rrss_map[SGE_QSETS]; /* revers RSS map table */
3378090c9f5SKip Macy 	uint16_t                rspq_map[RSS_TABLE_SIZE];     /* maps 7-bit cookie to qidx */
3388090c9f5SKip Macy 	union {
3398090c9f5SKip Macy 		uint8_t                 fill[SGE_QSETS];
3408090c9f5SKip Macy 		uint64_t                coalesce;
3418090c9f5SKip Macy 	} u;
3428090c9f5SKip Macy 
3438090c9f5SKip Macy #define tunq_fill u.fill
3448090c9f5SKip Macy #define tunq_coalesce u.coalesce
345ac3a6d9cSKip Macy 
346ac3a6d9cSKip Macy 	struct filter_info      *filters;
347b6d90eb7SKip Macy 
348b6d90eb7SKip Macy 	/* Tasks */
349b6d90eb7SKip Macy 	struct task		slow_intr_task;
350bb38cd2fSKip Macy 	struct task		tick_task;
351b6d90eb7SKip Macy 	struct taskqueue	*tq;
352b6d90eb7SKip Macy 	struct callout		cxgb_tick_ch;
353b6d90eb7SKip Macy 	struct callout		sge_timer_ch;
354b6d90eb7SKip Macy 
355b6d90eb7SKip Macy 	/* Register lock for use by the hardware layer */
356b6d90eb7SKip Macy 	struct mtx		mdio_lock;
357ef72318fSKip Macy 	struct mtx		elmer_lock;
358b6d90eb7SKip Macy 
359b6d90eb7SKip Macy 	/* Bookkeeping for the hardware layer */
360b6d90eb7SKip Macy 	struct adapter_params  params;
361b6d90eb7SKip Macy 	unsigned int slow_intr_mask;
362b6d90eb7SKip Macy 	unsigned long irq_stats[IRQ_NUM_STATS];
363b6d90eb7SKip Macy 
3643948ad29SConrad Meyer 	unsigned		nqsets;
365b6d90eb7SKip Macy 	struct sge              sge;
366b6d90eb7SKip Macy 	struct mc7              pmrx;
367b6d90eb7SKip Macy 	struct mc7              pmtx;
368b6d90eb7SKip Macy 	struct mc7              cm;
369b6d90eb7SKip Macy 	struct mc5              mc5;
370b6d90eb7SKip Macy 
371b6d90eb7SKip Macy 	struct port_info	port[MAX_NPORTS];
372b6d90eb7SKip Macy 	device_t		portdev[MAX_NPORTS];
37309fe6320SNavdeep Parhar #ifdef TCP_OFFLOAD
37409fe6320SNavdeep Parhar 	void 			*tom_softc;
37509fe6320SNavdeep Parhar 	void 			*iwarp_softc;
37609fe6320SNavdeep Parhar #endif
377b6d90eb7SKip Macy 	char                    fw_version[64];
3780bbdea77SGeorge V. Neville-Neil 	char                    port_types[MAX_NPORTS + 1];
379b6d90eb7SKip Macy 	uint32_t                open_device_map;
38009fe6320SNavdeep Parhar #ifdef TCP_OFFLOAD
38109fe6320SNavdeep Parhar 	int			offload_map;
38209fe6320SNavdeep Parhar #endif
383b6d90eb7SKip Macy 	struct mtx              lock;
384d722cab4SKip Macy 	driver_intr_t           *cxgb_intr;
385d722cab4SKip Macy 	int                     msi_count;
386bb38cd2fSKip Macy 
387bb38cd2fSKip Macy #define ADAPTER_LOCK_NAME_LEN	32
388bb38cd2fSKip Macy 	char                    lockbuf[ADAPTER_LOCK_NAME_LEN];
389bb38cd2fSKip Macy 	char                    reglockbuf[ADAPTER_LOCK_NAME_LEN];
390bb38cd2fSKip Macy 	char                    mdiolockbuf[ADAPTER_LOCK_NAME_LEN];
391bb38cd2fSKip Macy 	char                    elmerlockbuf[ADAPTER_LOCK_NAME_LEN];
39227d1c65eSNavdeep Parhar 
39327d1c65eSNavdeep Parhar 	int			timestamp;
39409fe6320SNavdeep Parhar 
39509fe6320SNavdeep Parhar #ifdef TCP_OFFLOAD
39609fe6320SNavdeep Parhar #define NUM_CPL_HANDLERS	0xa7
39709fe6320SNavdeep Parhar 	cpl_handler_t cpl_handler[NUM_CPL_HANDLERS] __aligned(CACHE_LINE_SIZE);
39809fe6320SNavdeep Parhar #endif
399b6d90eb7SKip Macy };
400b6d90eb7SKip Macy 
401b6d90eb7SKip Macy struct t3_rx_mode {
402b6d90eb7SKip Macy 
403b6d90eb7SKip Macy 	uint32_t                idx;
404b6d90eb7SKip Macy 	struct port_info        *port;
405b6d90eb7SKip Macy };
406b6d90eb7SKip Macy 
407b6d90eb7SKip Macy #define MDIO_LOCK(adapter)	mtx_lock(&(adapter)->mdio_lock)
408b6d90eb7SKip Macy #define MDIO_UNLOCK(adapter)	mtx_unlock(&(adapter)->mdio_lock)
409ef72318fSKip Macy #define ELMR_LOCK(adapter)	mtx_lock(&(adapter)->elmer_lock)
410ef72318fSKip Macy #define ELMR_UNLOCK(adapter)	mtx_unlock(&(adapter)->elmer_lock)
411b6d90eb7SKip Macy 
412bb38cd2fSKip Macy 
413b6d90eb7SKip Macy #define PORT_LOCK(port)		     mtx_lock(&(port)->lock);
414b6d90eb7SKip Macy #define PORT_UNLOCK(port)	     mtx_unlock(&(port)->lock);
415bb38cd2fSKip Macy #define PORT_LOCK_INIT(port, name)   mtx_init(&(port)->lock, name, 0, MTX_DEF)
416bb38cd2fSKip Macy #define PORT_LOCK_DEINIT(port)       mtx_destroy(&(port)->lock)
4173f345a5dSKip Macy #define PORT_LOCK_ASSERT_NOTOWNED(port) mtx_assert(&(port)->lock, MA_NOTOWNED)
418bb38cd2fSKip Macy #define PORT_LOCK_ASSERT_OWNED(port) mtx_assert(&(port)->lock, MA_OWNED)
419b6d90eb7SKip Macy 
420b6d90eb7SKip Macy #define ADAPTER_LOCK(adap)	mtx_lock(&(adap)->lock);
421b6d90eb7SKip Macy #define ADAPTER_UNLOCK(adap)	mtx_unlock(&(adap)->lock);
422bb38cd2fSKip Macy #define ADAPTER_LOCK_INIT(adap, name) mtx_init(&(adap)->lock, name, 0, MTX_DEF)
423bb38cd2fSKip Macy #define ADAPTER_LOCK_DEINIT(adap) mtx_destroy(&(adap)->lock)
4240bbdea77SGeorge V. Neville-Neil #define ADAPTER_LOCK_ASSERT_NOTOWNED(adap) mtx_assert(&(adap)->lock, MA_NOTOWNED)
4250bbdea77SGeorge V. Neville-Neil #define ADAPTER_LOCK_ASSERT_OWNED(adap) mtx_assert(&(adap)->lock, MA_OWNED)
426b6d90eb7SKip Macy 
427b6d90eb7SKip Macy 
428b6d90eb7SKip Macy static __inline uint32_t
t3_read_reg(adapter_t * adapter,uint32_t reg_addr)429b6d90eb7SKip Macy t3_read_reg(adapter_t *adapter, uint32_t reg_addr)
430b6d90eb7SKip Macy {
431b6d90eb7SKip Macy 	return (bus_space_read_4(adapter->bt, adapter->bh, reg_addr));
432b6d90eb7SKip Macy }
433b6d90eb7SKip Macy 
434b6d90eb7SKip Macy static __inline void
t3_write_reg(adapter_t * adapter,uint32_t reg_addr,uint32_t val)435b6d90eb7SKip Macy t3_write_reg(adapter_t *adapter, uint32_t reg_addr, uint32_t val)
436b6d90eb7SKip Macy {
437b6d90eb7SKip Macy 	bus_space_write_4(adapter->bt, adapter->bh, reg_addr, val);
438b6d90eb7SKip Macy }
439b6d90eb7SKip Macy 
440b6d90eb7SKip Macy static __inline void
t3_os_pci_read_config_4(adapter_t * adapter,int reg,uint32_t * val)441b6d90eb7SKip Macy t3_os_pci_read_config_4(adapter_t *adapter, int reg, uint32_t *val)
442b6d90eb7SKip Macy {
443b6d90eb7SKip Macy 	*val = pci_read_config(adapter->dev, reg, 4);
444b6d90eb7SKip Macy }
445b6d90eb7SKip Macy 
446b6d90eb7SKip Macy static __inline void
t3_os_pci_write_config_4(adapter_t * adapter,int reg,uint32_t val)447b6d90eb7SKip Macy t3_os_pci_write_config_4(adapter_t *adapter, int reg, uint32_t val)
448b6d90eb7SKip Macy {
449b6d90eb7SKip Macy 	pci_write_config(adapter->dev, reg, val, 4);
450b6d90eb7SKip Macy }
451b6d90eb7SKip Macy 
452b6d90eb7SKip Macy static __inline void
t3_os_pci_read_config_2(adapter_t * adapter,int reg,uint16_t * val)453b6d90eb7SKip Macy t3_os_pci_read_config_2(adapter_t *adapter, int reg, uint16_t *val)
454b6d90eb7SKip Macy {
455b6d90eb7SKip Macy 	*val = pci_read_config(adapter->dev, reg, 2);
456b6d90eb7SKip Macy }
457b6d90eb7SKip Macy 
458b6d90eb7SKip Macy static __inline void
t3_os_pci_write_config_2(adapter_t * adapter,int reg,uint16_t val)459b6d90eb7SKip Macy t3_os_pci_write_config_2(adapter_t *adapter, int reg, uint16_t val)
460b6d90eb7SKip Macy {
461b6d90eb7SKip Macy 	pci_write_config(adapter->dev, reg, val, 2);
462b6d90eb7SKip Macy }
463b6d90eb7SKip Macy 
464b6d90eb7SKip Macy static __inline void
t3_init_rx_mode(struct t3_rx_mode * rm,struct port_info * port)465b6d90eb7SKip Macy t3_init_rx_mode(struct t3_rx_mode *rm, struct port_info *port)
466b6d90eb7SKip Macy {
467b6d90eb7SKip Macy 	rm->idx = 0;
468b6d90eb7SKip Macy 	rm->port = port;
469b6d90eb7SKip Macy }
470b6d90eb7SKip Macy 
471b6d90eb7SKip Macy static __inline struct port_info *
adap2pinfo(struct adapter * adap,int idx)472b6d90eb7SKip Macy adap2pinfo(struct adapter *adap, int idx)
473b6d90eb7SKip Macy {
474b6d90eb7SKip Macy 	return &adap->port[idx];
475b6d90eb7SKip Macy }
476b6d90eb7SKip Macy 
477b6d90eb7SKip Macy int t3_os_find_pci_capability(adapter_t *adapter, int cap);
478b6d90eb7SKip Macy int t3_os_pci_save_state(struct adapter *adapter);
479b6d90eb7SKip Macy int t3_os_pci_restore_state(struct adapter *adapter);
480bd1a9fbaSNavdeep Parhar void t3_os_link_intr(struct port_info *);
481b6d90eb7SKip Macy void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status,
482c01f2b83SNavdeep Parhar 			int speed, int duplex, int fc, int mac_was_reset);
4839b4de886SKip Macy void t3_os_phymod_changed(struct adapter *adap, int port_id);
484b6d90eb7SKip Macy void t3_sge_err_intr_handler(adapter_t *adapter);
48509fe6320SNavdeep Parhar #ifdef TCP_OFFLOAD
48609fe6320SNavdeep Parhar int t3_offload_tx(struct adapter *, struct mbuf *);
48709fe6320SNavdeep Parhar #endif
488b6d90eb7SKip Macy void t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]);
489b6d90eb7SKip Macy int t3_mgmt_tx(adapter_t *adap, struct mbuf *m);
49009fe6320SNavdeep Parhar int t3_register_cpl_handler(struct adapter *, int, cpl_handler_t);
491b6d90eb7SKip Macy 
492b6d90eb7SKip Macy int t3_sge_alloc(struct adapter *);
493b6d90eb7SKip Macy int t3_sge_free(struct adapter *);
494b6d90eb7SKip Macy int t3_sge_alloc_qset(adapter_t *, uint32_t, int, int, const struct qset_params *,
495b6d90eb7SKip Macy     int, struct port_info *);
4967eeb16ceSNavdeep Parhar void t3_free_sge_resources(adapter_t *, int);
497b6d90eb7SKip Macy void t3_sge_start(adapter_t *);
498d722cab4SKip Macy void t3_sge_stop(adapter_t *);
499b6d90eb7SKip Macy void t3b_intr(void *data);
500b6d90eb7SKip Macy void t3_intr_msi(void *data);
501b6d90eb7SKip Macy void t3_intr_msix(void *data);
502b6d90eb7SKip Macy 
503ef72318fSKip Macy int t3_sge_init_adapter(adapter_t *);
5049330dbc3SKip Macy int t3_sge_reset_adapter(adapter_t *);
505ef72318fSKip Macy int t3_sge_init_port(struct port_info *);
5063f345a5dSKip Macy void t3_free_tx_desc(struct sge_qset *qs, int n, int qid);
507b6d90eb7SKip Macy 
5080a704909SNavdeep Parhar void t3_rx_eth(struct adapter *adap, struct mbuf *m, int ethpad);
509b6d90eb7SKip Macy 
5108090c9f5SKip Macy void t3_add_attach_sysctls(adapter_t *sc);
5118090c9f5SKip Macy void t3_add_configured_sysctls(adapter_t *sc);
512b6d90eb7SKip Macy int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
513b6d90eb7SKip Macy     unsigned char *data);
514b6d90eb7SKip Macy void t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p);
515706cb31fSKip Macy 
516b6d90eb7SKip Macy /*
517b6d90eb7SKip Macy  * XXX figure out how we can return this to being private to sge
518b6d90eb7SKip Macy  */
519693d746cSKip Macy #define desc_reclaimable(q) ((int)((q)->processed - (q)->cleaned - TX_MAX_DESC))
520b6d90eb7SKip Macy 
521b6d90eb7SKip Macy #define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field)))
522b6d90eb7SKip Macy 
523b6d90eb7SKip Macy static __inline struct sge_qset *
fl_to_qset(struct sge_fl * q,int qidx)524b6d90eb7SKip Macy fl_to_qset(struct sge_fl *q, int qidx)
525b6d90eb7SKip Macy {
526b6d90eb7SKip Macy 	return container_of(q, struct sge_qset, fl[qidx]);
527b6d90eb7SKip Macy }
528b6d90eb7SKip Macy 
529b6d90eb7SKip Macy static __inline struct sge_qset *
rspq_to_qset(struct sge_rspq * q)530b6d90eb7SKip Macy rspq_to_qset(struct sge_rspq *q)
531b6d90eb7SKip Macy {
532b6d90eb7SKip Macy 	return container_of(q, struct sge_qset, rspq);
533b6d90eb7SKip Macy }
534b6d90eb7SKip Macy 
535b6d90eb7SKip Macy static __inline struct sge_qset *
txq_to_qset(struct sge_txq * q,int qidx)536b6d90eb7SKip Macy txq_to_qset(struct sge_txq *q, int qidx)
537b6d90eb7SKip Macy {
538b6d90eb7SKip Macy 	return container_of(q, struct sge_qset, txq[qidx]);
539b6d90eb7SKip Macy }
540b6d90eb7SKip Macy 
541b6d90eb7SKip Macy #undef container_of
542b6d90eb7SKip Macy 
54309fe6320SNavdeep Parhar #define OFFLOAD_DEVMAP_BIT (1 << MAX_NPORTS)
offload_running(adapter_t * adapter)544d722cab4SKip Macy static inline int offload_running(adapter_t *adapter)
545d722cab4SKip Macy {
546d722cab4SKip Macy         return isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
547d722cab4SKip Macy }
548d722cab4SKip Macy 
5493f345a5dSKip Macy void cxgb_tx_watchdog(void *arg);
550954712e8SJustin Hibbits int cxgb_transmit(if_t ifp, struct mbuf *m);
551954712e8SJustin Hibbits void cxgb_qflush(if_t ifp);
55209fe6320SNavdeep Parhar void t3_iterate(void (*)(struct adapter *, void *), void *);
553e26e6373SNavdeep Parhar void cxgb_refresh_stats(struct port_info *);
554eb07d67eSMark Johnston 
5557790c8c1SConrad Meyer #ifdef DEBUGNET
5567790c8c1SConrad Meyer int cxgb_debugnet_encap(struct sge_qset *qs, struct mbuf **m);
5577790c8c1SConrad Meyer int cxgb_debugnet_poll_rx(adapter_t *adap, struct sge_qset *qs);
5587790c8c1SConrad Meyer int cxgb_debugnet_poll_tx(struct sge_qset *qs);
559eb07d67eSMark Johnston #endif
560eb07d67eSMark Johnston 
561b6d90eb7SKip Macy #endif
562