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