1167514Skmacy/**************************************************************************
2167514Skmacy
3189643SgnnCopyright (c) 2007-2009, Chelsio Inc.
4167514SkmacyAll rights reserved.
5167514Skmacy
6167514SkmacyRedistribution and use in source and binary forms, with or without
7167514Skmacymodification, are permitted provided that the following conditions are met:
8167514Skmacy
9167514Skmacy 1. Redistributions of source code must retain the above copyright notice,
10167514Skmacy    this list of conditions and the following disclaimer.
11167514Skmacy
12169978Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its
13167514Skmacy    contributors may be used to endorse or promote products derived from
14167514Skmacy    this software without specific prior written permission.
15167514Skmacy
16167514SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17167514SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18167514SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19167514SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20167514SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21167514SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22167514SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23167514SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24167514SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25167514SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26167514SkmacyPOSSIBILITY OF SUCH DAMAGE.
27167514Skmacy
28167514Skmacy$FreeBSD$
29167514Skmacy
30167514Skmacy***************************************************************************/
31167514Skmacy
32167514Skmacy
33167514Skmacy#ifndef _CXGB_ADAPTER_H_
34167514Skmacy#define _CXGB_ADAPTER_H_
35167514Skmacy
36167514Skmacy#include <sys/lock.h>
37167514Skmacy#include <sys/mutex.h>
38167514Skmacy#include <sys/rman.h>
39167514Skmacy#include <sys/mbuf.h>
40167514Skmacy#include <sys/socket.h>
41167514Skmacy#include <sys/sockio.h>
42174708Skmacy#include <sys/condvar.h>
43185162Skmacy#include <sys/buf_ring.h>
44167514Skmacy
45167514Skmacy#include <net/ethernet.h>
46167514Skmacy#include <net/if.h>
47167514Skmacy#include <net/if_media.h>
48176472Skmacy#include <net/if_dl.h>
49238230Sbz#include <netinet/in.h>
50204274Snp#include <netinet/tcp_lro.h>
51167514Skmacy
52167514Skmacy#include <machine/bus.h>
53167514Skmacy#include <machine/resource.h>
54174708Skmacy
55167514Skmacy#include <sys/bus_dma.h>
56167514Skmacy#include <dev/pci/pcireg.h>
57167514Skmacy#include <dev/pci/pcivar.h>
58167514Skmacy
59170654Skmacy#include <cxgb_osdep.h>
60170654Skmacy#include <sys/mbufq.h>
61169978Skmacy
62167514Skmacystruct adapter;
63167514Skmacystruct sge_qset;
64167514Skmacyextern int cxgb_debug;
65167514Skmacy
66170869Skmacy#ifdef DEBUG_LOCKING
67170869Skmacy#define MTX_INIT(lock, lockname, class, flags) \
68170869Skmacy	do { \
69170869Skmacy		printf("initializing %s at %s:%d\n", lockname, __FILE__, __LINE__); \
70170869Skmacy		mtx_init((lock), lockname, class, flags);		\
71170869Skmacy	} while (0)
72170869Skmacy
73170869Skmacy#define MTX_DESTROY(lock) \
74170869Skmacy	do { \
75170869Skmacy		printf("destroying %s at %s:%d\n", (lock)->lock_object.lo_name, __FILE__, __LINE__); \
76170869Skmacy		mtx_destroy((lock));					\
77170869Skmacy	} while (0)
78170869Skmacy
79170869Skmacy#else
80170869Skmacy#define MTX_INIT mtx_init
81170869Skmacy#define MTX_DESTROY mtx_destroy
82170869Skmacy#endif
83170869Skmacy
84192540Sgnnenum {
85192540Sgnn	LF_NO = 0,
86192540Sgnn	LF_MAYBE,
87192540Sgnn	LF_YES
88192540Sgnn};
89192540Sgnn
90167514Skmacystruct port_info {
91167514Skmacy	struct adapter	*adapter;
92167514Skmacy	struct ifnet	*ifp;
93167514Skmacy	int		if_flags;
94194521Skmacy	int		flags;
95167514Skmacy	const struct port_type_info *port_type;
96167514Skmacy	struct cphy	phy;
97167514Skmacy	struct cmac	mac;
98167514Skmacy	struct link_config link_config;
99170869Skmacy	struct ifmedia	media;
100167514Skmacy	struct mtx	lock;
101194521Skmacy	uint32_t	port_id;
102194521Skmacy	uint32_t	tx_chan;
103194521Skmacy	uint32_t	txpkt_intf;
104194521Skmacy	uint32_t        first_qset;
105175174Skmacy	uint32_t	nqsets;
106189643Sgnn	int		link_fault;
107189643Sgnn
108171978Skmacy	uint8_t		hw_addr[ETHER_ADDR_LEN];
109209841Snp	struct callout	link_check_ch;
110209841Snp	struct task	link_check_task;
111170654Skmacy	struct task	timer_reclaim_task;
112167514Skmacy	struct cdev     *port_cdev;
113170869Skmacy
114174708Skmacy#define PORT_LOCK_NAME_LEN 32
115170869Skmacy#define PORT_NAME_LEN 32
116174708Skmacy	char            lockbuf[PORT_LOCK_NAME_LEN];
117174708Skmacy	char            namebuf[PORT_NAME_LEN];
118194521Skmacy} __aligned(L1_CACHE_BYTES);
119167514Skmacy
120194521Skmacyenum {
121194521Skmacy	/* adapter flags */
122167514Skmacy	FULL_INIT_DONE	= (1 << 0),
123167514Skmacy	USING_MSI	= (1 << 1),
124167514Skmacy	USING_MSIX	= (1 << 2),
125167514Skmacy	QUEUES_BOUND	= (1 << 3),
126194521Skmacy	FW_UPTODATE	= (1 << 4),
127194521Skmacy	TPS_UPTODATE	= (1 << 5),
128176472Skmacy	CXGB_SHUTDOWN	= (1 << 6),
129176472Skmacy	CXGB_OFLD_INIT	= (1 << 7),
130194521Skmacy	TP_PARITY_INIT	= (1 << 8),
131194521Skmacy	CXGB_BUSY	= (1 << 9),
132237920Snp	TOM_INIT_DONE	= (1 << 10),
133194521Skmacy
134194521Skmacy	/* port flags */
135194521Skmacy	DOOMED		= (1 << 0),
136167514Skmacy};
137194521Skmacy#define IS_DOOMED(p)	(p->flags & DOOMED)
138194521Skmacy#define SET_DOOMED(p)	do {p->flags |= DOOMED;} while (0)
139194521Skmacy#define IS_BUSY(sc)	(sc->flags & CXGB_BUSY)
140194521Skmacy#define SET_BUSY(sc)	do {sc->flags |= CXGB_BUSY;} while (0)
141194521Skmacy#define CLR_BUSY(sc)	do {sc->flags &= ~CXGB_BUSY;} while (0)
142167514Skmacy
143167514Skmacy#define FL_Q_SIZE	4096
144174708Skmacy#define JUMBO_Q_SIZE	1024
145206109Snp#define RSPQ_Q_SIZE	2048
146167514Skmacy#define TX_ETH_Q_SIZE	1024
147205950Snp#define TX_OFLD_Q_SIZE	1024
148205950Snp#define TX_CTRL_Q_SIZE	256
149167514Skmacy
150174708Skmacyenum { TXQ_ETH = 0,
151174708Skmacy       TXQ_OFLD = 1,
152174708Skmacy       TXQ_CTRL = 2, };
153170869Skmacy
154170869Skmacy
155175340Skmacy/*
156175340Skmacy * work request size in bytes
157175340Skmacy */
158175340Skmacy#define WR_LEN (WR_FLITS * 8)
159180583Skmacy#define PIO_LEN (WR_LEN - sizeof(struct cpl_tx_pkt_lso))
160175340Skmacy
161169978Skmacystruct lro_state {
162169978Skmacy	unsigned short enabled;
163181616Skmacy	struct lro_ctrl ctrl;
164167514Skmacy};
165167514Skmacy
166167514Skmacy#define RX_BUNDLE_SIZE 8
167167514Skmacy
168167514Skmacystruct rsp_desc;
169167514Skmacy
170167514Skmacystruct sge_rspq {
171167514Skmacy	uint32_t	credits;
172167514Skmacy	uint32_t	size;
173167514Skmacy	uint32_t	cidx;
174167514Skmacy	uint32_t	gen;
175167514Skmacy	uint32_t	polling;
176167514Skmacy	uint32_t	holdoff_tmr;
177167514Skmacy	uint32_t	next_holdoff;
178167514Skmacy	uint32_t        imm_data;
179176472Skmacy	uint32_t        async_notif;
180169978Skmacy	uint32_t	cntxt_id;
181169978Skmacy	uint32_t        offload_pkts;
182167514Skmacy	uint32_t        pure_rsps;
183169978Skmacy	uint32_t        unhandled_irqs;
184206109Snp	uint32_t        starved;
185169978Skmacy
186167514Skmacy	bus_addr_t	phys_addr;
187167514Skmacy	bus_dma_tag_t	desc_tag;
188167514Skmacy	bus_dmamap_t	desc_map;
189172101Skmacy
190172101Skmacy	struct t3_mbuf_hdr rspq_mh;
191175209Skmacy	struct rsp_desc	*desc;
192175209Skmacy	struct mtx      lock;
193170869Skmacy#define RSPQ_NAME_LEN  32
194170869Skmacy	char            lockbuf[RSPQ_NAME_LEN];
195175209Skmacy	uint32_t	rspq_dump_start;
196175209Skmacy	uint32_t	rspq_dump_count;
197167514Skmacy};
198167514Skmacy
199167514Skmacystruct rx_desc;
200167514Skmacystruct rx_sw_desc;
201167514Skmacy
202167514Skmacystruct sge_fl {
203167514Skmacy	uint32_t	buf_size;
204167514Skmacy	uint32_t	credits;
205167514Skmacy	uint32_t	size;
206167514Skmacy	uint32_t	cidx;
207167514Skmacy	uint32_t	pidx;
208167514Skmacy	uint32_t	gen;
209207688Snp	uint32_t	db_pending;
210167514Skmacy	bus_addr_t	phys_addr;
211167514Skmacy	uint32_t	cntxt_id;
212189643Sgnn	uint32_t	empty;
213167514Skmacy	bus_dma_tag_t	desc_tag;
214167514Skmacy	bus_dmamap_t	desc_map;
215168351Skmacy	bus_dma_tag_t   entry_tag;
216168351Skmacy	uma_zone_t      zone;
217175209Skmacy	struct rx_desc	*desc;
218175209Skmacy	struct rx_sw_desc *sdesc;
219168351Skmacy	int             type;
220167514Skmacy};
221167514Skmacy
222167514Skmacystruct tx_desc;
223167514Skmacystruct tx_sw_desc;
224167514Skmacy
225171471Skmacy#define TXQ_TRANSMITTING    0x1
226171335Skmacy
227167514Skmacystruct sge_txq {
228167514Skmacy	uint64_t	flags;
229167514Skmacy	uint32_t	in_use;
230167514Skmacy	uint32_t	size;
231167514Skmacy	uint32_t	processed;
232167514Skmacy	uint32_t	cleaned;
233167514Skmacy	uint32_t	stop_thres;
234167514Skmacy	uint32_t	cidx;
235167514Skmacy	uint32_t	pidx;
236167514Skmacy	uint32_t	gen;
237167514Skmacy	uint32_t	unacked;
238207688Snp	uint32_t	db_pending;
239167514Skmacy	struct tx_desc	*desc;
240167514Skmacy	struct tx_sw_desc *sdesc;
241167514Skmacy	uint32_t	token;
242167514Skmacy	bus_addr_t	phys_addr;
243171335Skmacy	struct task     qresume_task;
244171335Skmacy	struct task     qreclaim_task;
245167514Skmacy	uint32_t	cntxt_id;
246167514Skmacy	uint64_t	stops;
247167514Skmacy	uint64_t	restarts;
248167514Skmacy	bus_dma_tag_t	desc_tag;
249167514Skmacy	bus_dmamap_t	desc_map;
250168351Skmacy	bus_dma_tag_t   entry_tag;
251169978Skmacy	struct mbuf_head sendq;
252194521Skmacy
253185162Skmacy	struct buf_ring *txq_mr;
254185165Skmacy	struct ifaltq	*txq_ifq;
255194521Skmacy	struct callout	txq_timer;
256194521Skmacy	struct callout	txq_watchdog;
257194521Skmacy	uint64_t        txq_coalesced;
258174708Skmacy	uint32_t        txq_skipped;
259174708Skmacy	uint32_t        txq_enqueued;
260175174Skmacy	uint32_t	txq_dump_start;
261175174Skmacy	uint32_t	txq_dump_count;
262194521Skmacy	uint64_t	txq_direct_packets;
263194521Skmacy	uint64_t	txq_direct_bytes;
264194521Skmacy	uint64_t	txq_frees;
265174708Skmacy	struct sg_ent  txq_sgl[TX_MAX_SEGS / 2 + 1];
266167514Skmacy};
267167514Skmacy
268181616Skmacy#define SGE_PSTAT_MAX (SGE_PSTAT_VLANINS+1)
269167514Skmacy
270174708Skmacy#define QS_EXITING              0x1
271174708Skmacy#define QS_RUNNING              0x2
272174708Skmacy#define QS_BOUND                0x4
273194521Skmacy#define	QS_FLUSHING		0x8
274194521Skmacy#define	QS_TIMEOUT		0x10
275174708Skmacy
276167514Skmacystruct sge_qset {
277167514Skmacy	struct sge_rspq		rspq;
278167514Skmacy	struct sge_fl		fl[SGE_RXQ_PER_SET];
279169978Skmacy	struct lro_state        lro;
280167514Skmacy	struct sge_txq		txq[SGE_TXQ_PER_SET];
281169978Skmacy	uint32_t                txq_stopped;       /* which Tx queues are stopped */
282167514Skmacy	struct port_info        *port;
283237920Snp	struct adapter          *adap;
284167760Skmacy	int                     idx; /* qset # */
285174708Skmacy	int                     qs_flags;
286194521Skmacy	int			coalescing;
287174708Skmacy	struct cv		qs_cv;
288194521Skmacy	struct mtx		lock;
289174708Skmacy#define QS_NAME_LEN 32
290174708Skmacy	char                    namebuf[QS_NAME_LEN];
291167514Skmacy};
292167514Skmacy
293167514Skmacystruct sge {
294167514Skmacy	struct sge_qset	        qs[SGE_QSETS];
295167514Skmacy	struct mtx              reg_lock;
296167514Skmacy};
297167514Skmacy
298171471Skmacystruct filter_info;
299171471Skmacy
300237920Snptypedef int (*cpl_handler_t)(struct sge_qset *, struct rsp_desc *,
301237920Snp    struct mbuf *);
302237920Snp
303167514Skmacystruct adapter {
304237920Snp	SLIST_ENTRY(adapter)	link;
305167514Skmacy	device_t		dev;
306167514Skmacy	int			flags;
307194521Skmacy
308167514Skmacy	/* PCI register resources */
309171868Skmacy	int			regs_rid;
310167514Skmacy	struct resource		*regs_res;
311176472Skmacy	int			udbs_rid;
312176472Skmacy	struct resource		*udbs_res;
313167514Skmacy	bus_space_handle_t	bh;
314167514Skmacy	bus_space_tag_t		bt;
315167514Skmacy	bus_size_t              mmio_len;
316167862Skmacy	uint32_t                link_width;
317167514Skmacy
318167514Skmacy	/* DMA resources */
319167514Skmacy	bus_dma_tag_t		parent_dmat;
320167514Skmacy	bus_dma_tag_t		rx_dmat;
321167514Skmacy	bus_dma_tag_t		rx_jumbo_dmat;
322167514Skmacy	bus_dma_tag_t		tx_dmat;
323167514Skmacy
324167514Skmacy	/* Interrupt resources */
325167514Skmacy	struct resource		*irq_res;
326167514Skmacy	int			irq_rid;
327167514Skmacy	void			*intr_tag;
328167514Skmacy
329167514Skmacy	uint32_t		msix_regs_rid;
330167514Skmacy	struct resource		*msix_regs_res;
331167514Skmacy
332167514Skmacy	struct resource		*msix_irq_res[SGE_QSETS];
333167514Skmacy	int			msix_irq_rid[SGE_QSETS];
334167514Skmacy	void			*msix_intr_tag[SGE_QSETS];
335171471Skmacy	uint8_t                 rxpkt_map[8]; /* maps RX_PKT interface values to port ids */
336171471Skmacy	uint8_t                 rrss_map[SGE_QSETS]; /* revers RSS map table */
337174708Skmacy	uint16_t                rspq_map[RSS_TABLE_SIZE];     /* maps 7-bit cookie to qidx */
338174708Skmacy	union {
339174708Skmacy		uint8_t                 fill[SGE_QSETS];
340174708Skmacy		uint64_t                coalesce;
341174708Skmacy	} u;
342167514Skmacy
343174708Skmacy#define tunq_fill u.fill
344174708Skmacy#define tunq_coalesce u.coalesce
345174708Skmacy
346171471Skmacy	struct filter_info      *filters;
347171471Skmacy
348167514Skmacy	/* Tasks */
349167514Skmacy	struct task		slow_intr_task;
350170869Skmacy	struct task		tick_task;
351167514Skmacy	struct taskqueue	*tq;
352167514Skmacy	struct callout		cxgb_tick_ch;
353167514Skmacy	struct callout		sge_timer_ch;
354167514Skmacy
355167514Skmacy	/* Register lock for use by the hardware layer */
356167514Skmacy	struct mtx		mdio_lock;
357170654Skmacy	struct mtx		elmer_lock;
358167514Skmacy
359167514Skmacy	/* Bookkeeping for the hardware layer */
360167514Skmacy	struct adapter_params  params;
361167514Skmacy	unsigned int slow_intr_mask;
362167514Skmacy	unsigned long irq_stats[IRQ_NUM_STATS];
363167514Skmacy
364167514Skmacy	struct sge              sge;
365167514Skmacy	struct mc7              pmrx;
366167514Skmacy	struct mc7              pmtx;
367167514Skmacy	struct mc7              cm;
368167514Skmacy	struct mc5              mc5;
369167514Skmacy
370167514Skmacy	struct port_info	port[MAX_NPORTS];
371167514Skmacy	device_t		portdev[MAX_NPORTS];
372237920Snp#ifdef TCP_OFFLOAD
373237920Snp	void 			*tom_softc;
374237920Snp	void 			*iwarp_softc;
375237920Snp#endif
376167514Skmacy	char                    fw_version[64];
377192540Sgnn	char                    port_types[MAX_NPORTS + 1];
378167514Skmacy	uint32_t                open_device_map;
379237920Snp#ifdef TCP_OFFLOAD
380237920Snp	int			offload_map;
381237920Snp#endif
382167514Skmacy	struct mtx              lock;
383169978Skmacy	driver_intr_t           *cxgb_intr;
384169978Skmacy	int                     msi_count;
385170869Skmacy
386170869Skmacy#define ADAPTER_LOCK_NAME_LEN	32
387170869Skmacy	char                    lockbuf[ADAPTER_LOCK_NAME_LEN];
388170869Skmacy	char                    reglockbuf[ADAPTER_LOCK_NAME_LEN];
389170869Skmacy	char                    mdiolockbuf[ADAPTER_LOCK_NAME_LEN];
390170869Skmacy	char                    elmerlockbuf[ADAPTER_LOCK_NAME_LEN];
391209116Snp
392209116Snp	int			timestamp;
393237920Snp
394237920Snp#ifdef TCP_OFFLOAD
395237920Snp#define NUM_CPL_HANDLERS	0xa7
396237920Snp	cpl_handler_t cpl_handler[NUM_CPL_HANDLERS] __aligned(CACHE_LINE_SIZE);
397237920Snp#endif
398167514Skmacy};
399167514Skmacy
400167514Skmacystruct t3_rx_mode {
401167514Skmacy
402167514Skmacy	uint32_t                idx;
403167514Skmacy	struct port_info        *port;
404167514Skmacy};
405167514Skmacy
406167514Skmacy#define MDIO_LOCK(adapter)	mtx_lock(&(adapter)->mdio_lock)
407167514Skmacy#define MDIO_UNLOCK(adapter)	mtx_unlock(&(adapter)->mdio_lock)
408170654Skmacy#define ELMR_LOCK(adapter)	mtx_lock(&(adapter)->elmer_lock)
409170654Skmacy#define ELMR_UNLOCK(adapter)	mtx_unlock(&(adapter)->elmer_lock)
410167514Skmacy
411167514Skmacy
412170869Skmacy#define PORT_LOCK(port)		     mtx_lock(&(port)->lock);
413170869Skmacy#define PORT_UNLOCK(port)	     mtx_unlock(&(port)->lock);
414170869Skmacy#define PORT_LOCK_INIT(port, name)   mtx_init(&(port)->lock, name, 0, MTX_DEF)
415170869Skmacy#define PORT_LOCK_DEINIT(port)       mtx_destroy(&(port)->lock)
416194521Skmacy#define PORT_LOCK_ASSERT_NOTOWNED(port) mtx_assert(&(port)->lock, MA_NOTOWNED)
417170869Skmacy#define PORT_LOCK_ASSERT_OWNED(port) mtx_assert(&(port)->lock, MA_OWNED)
418170869Skmacy
419167514Skmacy#define ADAPTER_LOCK(adap)	mtx_lock(&(adap)->lock);
420167514Skmacy#define ADAPTER_UNLOCK(adap)	mtx_unlock(&(adap)->lock);
421170869Skmacy#define ADAPTER_LOCK_INIT(adap, name) mtx_init(&(adap)->lock, name, 0, MTX_DEF)
422170869Skmacy#define ADAPTER_LOCK_DEINIT(adap) mtx_destroy(&(adap)->lock)
423192540Sgnn#define ADAPTER_LOCK_ASSERT_NOTOWNED(adap) mtx_assert(&(adap)->lock, MA_NOTOWNED)
424192540Sgnn#define ADAPTER_LOCK_ASSERT_OWNED(adap) mtx_assert(&(adap)->lock, MA_OWNED)
425167514Skmacy
426167514Skmacy
427167514Skmacystatic __inline uint32_t
428167514Skmacyt3_read_reg(adapter_t *adapter, uint32_t reg_addr)
429167514Skmacy{
430167514Skmacy	return (bus_space_read_4(adapter->bt, adapter->bh, reg_addr));
431167514Skmacy}
432167514Skmacy
433167514Skmacystatic __inline void
434167514Skmacyt3_write_reg(adapter_t *adapter, uint32_t reg_addr, uint32_t val)
435167514Skmacy{
436167514Skmacy	bus_space_write_4(adapter->bt, adapter->bh, reg_addr, val);
437167514Skmacy}
438167514Skmacy
439167514Skmacystatic __inline void
440167514Skmacyt3_os_pci_read_config_4(adapter_t *adapter, int reg, uint32_t *val)
441167514Skmacy{
442167514Skmacy	*val = pci_read_config(adapter->dev, reg, 4);
443167514Skmacy}
444167514Skmacy
445167514Skmacystatic __inline void
446167514Skmacyt3_os_pci_write_config_4(adapter_t *adapter, int reg, uint32_t val)
447167514Skmacy{
448167514Skmacy	pci_write_config(adapter->dev, reg, val, 4);
449167514Skmacy}
450167514Skmacy
451167514Skmacystatic __inline void
452167514Skmacyt3_os_pci_read_config_2(adapter_t *adapter, int reg, uint16_t *val)
453167514Skmacy{
454167514Skmacy	*val = pci_read_config(adapter->dev, reg, 2);
455167514Skmacy}
456167514Skmacy
457167514Skmacystatic __inline void
458167514Skmacyt3_os_pci_write_config_2(adapter_t *adapter, int reg, uint16_t val)
459167514Skmacy{
460167514Skmacy	pci_write_config(adapter->dev, reg, val, 2);
461167514Skmacy}
462167514Skmacy
463167514Skmacystatic __inline uint8_t *
464167514Skmacyt3_get_next_mcaddr(struct t3_rx_mode *rm)
465167514Skmacy{
466167514Skmacy	uint8_t *macaddr = NULL;
467176472Skmacy	struct ifnet *ifp = rm->port->ifp;
468176472Skmacy	struct ifmultiaddr *ifma;
469176472Skmacy	int i = 0;
470176472Skmacy
471195071Srwatson	if_maddr_rlock(ifp);
472176472Skmacy	TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
473176472Skmacy		if (ifma->ifma_addr->sa_family != AF_LINK)
474176472Skmacy			continue;
475176472Skmacy		if (i == rm->idx) {
476176472Skmacy			macaddr = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
477176472Skmacy			break;
478176472Skmacy		}
479176472Skmacy		i++;
480176472Skmacy	}
481195071Srwatson	if_maddr_runlock(ifp);
482167514Skmacy
483167514Skmacy	rm->idx++;
484167514Skmacy	return (macaddr);
485167514Skmacy}
486167514Skmacy
487167514Skmacystatic __inline void
488167514Skmacyt3_init_rx_mode(struct t3_rx_mode *rm, struct port_info *port)
489167514Skmacy{
490167514Skmacy	rm->idx = 0;
491167514Skmacy	rm->port = port;
492167514Skmacy}
493167514Skmacy
494167514Skmacystatic __inline struct port_info *
495167514Skmacyadap2pinfo(struct adapter *adap, int idx)
496167514Skmacy{
497167514Skmacy	return &adap->port[idx];
498167514Skmacy}
499167514Skmacy
500167514Skmacyint t3_os_find_pci_capability(adapter_t *adapter, int cap);
501167514Skmacyint t3_os_pci_save_state(struct adapter *adapter);
502167514Skmacyint t3_os_pci_restore_state(struct adapter *adapter);
503209841Snpvoid t3_os_link_intr(struct port_info *);
504167514Skmacyvoid t3_os_link_changed(adapter_t *adapter, int port_id, int link_status,
505197791Snp			int speed, int duplex, int fc, int mac_was_reset);
506181614Skmacyvoid t3_os_phymod_changed(struct adapter *adap, int port_id);
507167514Skmacyvoid t3_sge_err_intr_handler(adapter_t *adapter);
508237920Snp#ifdef TCP_OFFLOAD
509237920Snpint t3_offload_tx(struct adapter *, struct mbuf *);
510237920Snp#endif
511167514Skmacyvoid t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]);
512167514Skmacyint t3_mgmt_tx(adapter_t *adap, struct mbuf *m);
513237920Snpint t3_register_cpl_handler(struct adapter *, int, cpl_handler_t);
514167514Skmacy
515167514Skmacyint t3_sge_alloc(struct adapter *);
516167514Skmacyint t3_sge_free(struct adapter *);
517167514Skmacyint t3_sge_alloc_qset(adapter_t *, uint32_t, int, int, const struct qset_params *,
518167514Skmacy    int, struct port_info *);
519219946Snpvoid t3_free_sge_resources(adapter_t *, int);
520167514Skmacyvoid t3_sge_start(adapter_t *);
521169978Skmacyvoid t3_sge_stop(adapter_t *);
522167514Skmacyvoid t3b_intr(void *data);
523167514Skmacyvoid t3_intr_msi(void *data);
524167514Skmacyvoid t3_intr_msix(void *data);
525167514Skmacy
526170654Skmacyint t3_sge_init_adapter(adapter_t *);
527175224Skmacyint t3_sge_reset_adapter(adapter_t *);
528170654Skmacyint t3_sge_init_port(struct port_info *);
529194521Skmacyvoid t3_free_tx_desc(struct sge_qset *qs, int n, int qid);
530167514Skmacy
531237925Snpvoid t3_rx_eth(struct adapter *adap, struct mbuf *m, int ethpad);
532167514Skmacy
533174708Skmacyvoid t3_add_attach_sysctls(adapter_t *sc);
534174708Skmacyvoid t3_add_configured_sysctls(adapter_t *sc);
535167514Skmacyint t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
536167514Skmacy    unsigned char *data);
537167514Skmacyvoid t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p);
538181652Skmacy
539167514Skmacy/*
540167514Skmacy * XXX figure out how we can return this to being private to sge
541167514Skmacy */
542167760Skmacy#define desc_reclaimable(q) ((int)((q)->processed - (q)->cleaned - TX_MAX_DESC))
543167514Skmacy
544174708Skmacy#define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field)))
545167514Skmacy
546167514Skmacystatic __inline struct sge_qset *
547167514Skmacyfl_to_qset(struct sge_fl *q, int qidx)
548167514Skmacy{
549167514Skmacy	return container_of(q, struct sge_qset, fl[qidx]);
550167514Skmacy}
551167514Skmacy
552167514Skmacystatic __inline struct sge_qset *
553167514Skmacyrspq_to_qset(struct sge_rspq *q)
554167514Skmacy{
555167514Skmacy	return container_of(q, struct sge_qset, rspq);
556167514Skmacy}
557167514Skmacy
558167514Skmacystatic __inline struct sge_qset *
559167514Skmacytxq_to_qset(struct sge_txq *q, int qidx)
560167514Skmacy{
561167514Skmacy	return container_of(q, struct sge_qset, txq[qidx]);
562167514Skmacy}
563167514Skmacy
564167514Skmacy#undef container_of
565167514Skmacy
566237920Snp#define OFFLOAD_DEVMAP_BIT (1 << MAX_NPORTS)
567169978Skmacystatic inline int offload_running(adapter_t *adapter)
568169978Skmacy{
569169978Skmacy        return isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
570169978Skmacy}
571169978Skmacy
572194521Skmacyvoid cxgb_tx_watchdog(void *arg);
573194521Skmacyint cxgb_transmit(struct ifnet *ifp, struct mbuf *m);
574194521Skmacyvoid cxgb_qflush(struct ifnet *ifp);
575237920Snpvoid t3_iterate(void (*)(struct adapter *, void *), void *);
576167514Skmacy#endif
577