cxgb_adapter.h revision 1.1.6.2 1 1.1.6.2 yamt /**************************************************************************
2 1.1.6.2 yamt
3 1.1.6.2 yamt Copyright (c) 2007, Chelsio Inc.
4 1.1.6.2 yamt All rights reserved.
5 1.1.6.2 yamt
6 1.1.6.2 yamt Redistribution and use in source and binary forms, with or without
7 1.1.6.2 yamt modification, are permitted provided that the following conditions are met:
8 1.1.6.2 yamt
9 1.1.6.2 yamt 1. Redistributions of source code must retain the above copyright notice,
10 1.1.6.2 yamt this list of conditions and the following disclaimer.
11 1.1.6.2 yamt
12 1.1.6.2 yamt 2. Neither the name of the Chelsio Corporation nor the names of its
13 1.1.6.2 yamt contributors may be used to endorse or promote products derived from
14 1.1.6.2 yamt this software without specific prior written permission.
15 1.1.6.2 yamt
16 1.1.6.2 yamt THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 1.1.6.2 yamt AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 1.1.6.2 yamt IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 1.1.6.2 yamt ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 1.1.6.2 yamt LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1.6.2 yamt CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1.6.2 yamt SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1.6.2 yamt INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1.6.2 yamt CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1.6.2 yamt ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1.6.2 yamt POSSIBILITY OF SUCH DAMAGE.
27 1.1.6.2 yamt
28 1.1.6.2 yamt
29 1.1.6.2 yamt ***************************************************************************/
30 1.1.6.2 yamt
31 1.1.6.2 yamt
32 1.1.6.2 yamt
33 1.1.6.2 yamt #ifndef _CXGB_ADAPTER_H_
34 1.1.6.2 yamt #define _CXGB_ADAPTER_H_
35 1.1.6.2 yamt
36 1.1.6.2 yamt #include <sys/lock.h>
37 1.1.6.2 yamt #include <sys/mutex.h>
38 1.1.6.2 yamt #include <sys/mbuf.h>
39 1.1.6.2 yamt #include <sys/socket.h>
40 1.1.6.2 yamt #include <sys/sockio.h>
41 1.1.6.2 yamt
42 1.1.6.2 yamt #include <net/if.h>
43 1.1.6.2 yamt #include <net/if_ether.h>
44 1.1.6.2 yamt #include <net/if_media.h>
45 1.1.6.2 yamt
46 1.1.6.2 yamt #include <machine/bus.h>
47 1.1.6.2 yamt #include <dev/pci/pcireg.h>
48 1.1.6.2 yamt #include <dev/pci/pcivar.h>
49 1.1.6.2 yamt
50 1.1.6.2 yamt #ifdef CONFIG_DEFINED
51 1.1.6.2 yamt #include <cxgb_osdep.h>
52 1.1.6.2 yamt #include <ulp/toecore/toedev.h>
53 1.1.6.2 yamt #include <sys/mbufq.h>
54 1.1.6.2 yamt #else
55 1.1.6.2 yamt #include "cxgb_osdep.h"
56 1.1.6.2 yamt #include "cxgb_mbuf.h"
57 1.1.6.2 yamt #include "cxgb_toedev.h"
58 1.1.6.2 yamt #endif
59 1.1.6.2 yamt
60 1.1.6.2 yamt struct adapter;
61 1.1.6.2 yamt struct sge_qset;
62 1.1.6.2 yamt extern int cxgb_debug;
63 1.1.6.2 yamt
64 1.1.6.2 yamt #ifdef DEBUG_LOCKING
65 1.1.6.2 yamt #define MTX_INIT(lock, lockname, class, flags) \
66 1.1.6.2 yamt do { \
67 1.1.6.2 yamt printf("initializing %s at %s:%d\n", lockname, __FILE__, __LINE__); \
68 1.1.6.2 yamt mtx_init((lock), lockname, class, flags); \
69 1.1.6.2 yamt } while (0)
70 1.1.6.2 yamt
71 1.1.6.2 yamt #define MTX_DESTROY(lock) \
72 1.1.6.2 yamt do { \
73 1.1.6.2 yamt printf("destroying %s at %s:%d\n", (lock)->lock_object.lo_name, __FILE__, __LINE__); \
74 1.1.6.2 yamt mtx_destroy((lock)); \
75 1.1.6.2 yamt } while (0)
76 1.1.6.2 yamt
77 1.1.6.2 yamt #define SX_INIT(lock, lockname) \
78 1.1.6.2 yamt do { \
79 1.1.6.2 yamt printf("initializing %s at %s:%d\n", lockname, __FILE__, __LINE__); \
80 1.1.6.2 yamt sx_init((lock), lockname); \
81 1.1.6.2 yamt } while (0)
82 1.1.6.2 yamt
83 1.1.6.2 yamt #define SX_DESTROY(lock) \
84 1.1.6.2 yamt do { \
85 1.1.6.2 yamt printf("destroying %s at %s:%d\n", (lock)->lock_object.lo_name, __FILE__, __LINE__); \
86 1.1.6.2 yamt sx_destroy((lock)); \
87 1.1.6.2 yamt } while (0)
88 1.1.6.2 yamt #else
89 1.1.6.2 yamt #define MTX_INIT mtx_init
90 1.1.6.2 yamt #define MTX_DESTROY mtx_destroy
91 1.1.6.2 yamt #define SX_INIT sx_init
92 1.1.6.2 yamt #define SX_DESTROY sx_destroy
93 1.1.6.2 yamt #endif
94 1.1.6.2 yamt
95 1.1.6.2 yamt struct port_device {
96 1.1.6.2 yamt struct device original;
97 1.1.6.2 yamt device_t dev;
98 1.1.6.2 yamt struct adapter *parent;
99 1.1.6.2 yamt int port_number;
100 1.1.6.2 yamt };
101 1.1.6.2 yamt
102 1.1.6.2 yamt struct port_info {
103 1.1.6.2 yamt struct adapter *adapter;
104 1.1.6.2 yamt struct ifnet *ifp;
105 1.1.6.2 yamt struct port_device *pd;
106 1.1.6.2 yamt int port;
107 1.1.6.2 yamt int if_flags;
108 1.1.6.2 yamt const struct port_type_info *port_type;
109 1.1.6.2 yamt struct cphy phy;
110 1.1.6.2 yamt struct cmac mac;
111 1.1.6.2 yamt struct link_config link_config;
112 1.1.6.2 yamt struct ifmedia media;
113 1.1.6.2 yamt #ifdef USE_SX
114 1.1.6.2 yamt struct sx lock;
115 1.1.6.2 yamt #else
116 1.1.6.2 yamt struct mtx lock;
117 1.1.6.2 yamt #endif
118 1.1.6.2 yamt uint8_t port_id;
119 1.1.6.2 yamt uint8_t tx_chan;
120 1.1.6.2 yamt uint8_t txpkt_intf;
121 1.1.6.2 yamt uint8_t nqsets;
122 1.1.6.2 yamt uint8_t first_qset;
123 1.1.6.2 yamt
124 1.1.6.2 yamt uint8_t hw_addr[ETHER_ADDR_LEN];
125 1.1.6.2 yamt struct cxgb_task start_task;
126 1.1.6.2 yamt struct cxgb_task timer_reclaim_task;
127 1.1.6.2 yamt struct cdev *port_cdev;
128 1.1.6.2 yamt
129 1.1.6.2 yamt #define PORT_NAME_LEN 32
130 1.1.6.2 yamt #define TASKQ_NAME_LEN 32
131 1.1.6.2 yamt char lockbuf[PORT_NAME_LEN];
132 1.1.6.2 yamt char taskqbuf[TASKQ_NAME_LEN];
133 1.1.6.2 yamt };
134 1.1.6.2 yamt
135 1.1.6.2 yamt enum { /* adapter flags */
136 1.1.6.2 yamt FULL_INIT_DONE = (1 << 0),
137 1.1.6.2 yamt USING_MSI = (1 << 1),
138 1.1.6.2 yamt USING_MSIX = (1 << 2),
139 1.1.6.2 yamt QUEUES_BOUND = (1 << 3),
140 1.1.6.2 yamt FW_UPTODATE = (1 << 4),
141 1.1.6.2 yamt TPS_UPTODATE = (1 << 5),
142 1.1.6.2 yamt };
143 1.1.6.2 yamt
144 1.1.6.2 yamt
145 1.1.6.2 yamt #define FL_Q_SIZE 4096
146 1.1.6.2 yamt #define JUMBO_Q_SIZE 512
147 1.1.6.2 yamt #define RSPQ_Q_SIZE 1024
148 1.1.6.2 yamt #define TX_ETH_Q_SIZE 1024
149 1.1.6.2 yamt
150 1.1.6.2 yamt
151 1.1.6.2 yamt
152 1.1.6.2 yamt /*
153 1.1.6.2 yamt * Types of Tx queues in each queue set. Order here matters, do not change.
154 1.1.6.2 yamt * XXX TOE is not implemented yet, so the extra queues are just placeholders.
155 1.1.6.2 yamt */
156 1.1.6.2 yamt enum { TXQ_ETH, TXQ_OFLD, TXQ_CTRL };
157 1.1.6.2 yamt
158 1.1.6.2 yamt
159 1.1.6.2 yamt /* careful, the following are set on priv_flags and must not collide with
160 1.1.6.2 yamt * IFF_ flags!
161 1.1.6.2 yamt */
162 1.1.6.2 yamt enum {
163 1.1.6.2 yamt LRO_ACTIVE = (1 << 8),
164 1.1.6.2 yamt };
165 1.1.6.2 yamt
166 1.1.6.2 yamt /* Max concurrent LRO sessions per queue set */
167 1.1.6.2 yamt #define MAX_LRO_SES 8
168 1.1.6.2 yamt
169 1.1.6.2 yamt struct t3_lro_session {
170 1.1.6.2 yamt struct mbuf *head;
171 1.1.6.2 yamt struct mbuf *tail;
172 1.1.6.2 yamt uint32_t seq;
173 1.1.6.2 yamt uint16_t ip_len;
174 1.1.6.2 yamt uint16_t mss;
175 1.1.6.2 yamt uint16_t vtag;
176 1.1.6.2 yamt uint8_t npkts;
177 1.1.6.2 yamt };
178 1.1.6.2 yamt
179 1.1.6.2 yamt struct lro_state {
180 1.1.6.2 yamt unsigned short enabled;
181 1.1.6.2 yamt unsigned short active_idx;
182 1.1.6.2 yamt unsigned int nactive;
183 1.1.6.2 yamt struct t3_lro_session sess[MAX_LRO_SES];
184 1.1.6.2 yamt };
185 1.1.6.2 yamt
186 1.1.6.2 yamt #define RX_BUNDLE_SIZE 8
187 1.1.6.2 yamt
188 1.1.6.2 yamt struct rsp_desc;
189 1.1.6.2 yamt
190 1.1.6.2 yamt struct sge_rspq {
191 1.1.6.2 yamt uint32_t credits;
192 1.1.6.2 yamt uint32_t size;
193 1.1.6.2 yamt uint32_t cidx;
194 1.1.6.2 yamt uint32_t gen;
195 1.1.6.2 yamt uint32_t polling;
196 1.1.6.2 yamt uint32_t holdoff_tmr;
197 1.1.6.2 yamt uint32_t next_holdoff;
198 1.1.6.2 yamt uint32_t imm_data;
199 1.1.6.2 yamt struct rsp_desc *desc;
200 1.1.6.2 yamt uint32_t cntxt_id;
201 1.1.6.2 yamt struct mtx lock;
202 1.1.6.2 yamt struct mbuf *rx_head; /* offload packet receive queue head */
203 1.1.6.2 yamt struct mbuf *rx_tail; /* offload packet receive queue tail */
204 1.1.6.2 yamt
205 1.1.6.2 yamt uint32_t offload_pkts;
206 1.1.6.2 yamt uint32_t offload_bundles;
207 1.1.6.2 yamt uint32_t pure_rsps;
208 1.1.6.2 yamt uint32_t unhandled_irqs;
209 1.1.6.2 yamt
210 1.1.6.2 yamt bus_addr_t phys_addr;
211 1.1.6.2 yamt bus_dma_tag_t desc_tag;
212 1.1.6.2 yamt bus_dmamap_t desc_map;
213 1.1.6.2 yamt
214 1.1.6.2 yamt struct t3_mbuf_hdr rspq_mh;
215 1.1.6.2 yamt #define RSPQ_NAME_LEN 32
216 1.1.6.2 yamt char lockbuf[RSPQ_NAME_LEN];
217 1.1.6.2 yamt
218 1.1.6.2 yamt };
219 1.1.6.2 yamt
220 1.1.6.2 yamt #ifndef DISABLE_MBUF_IOVEC
221 1.1.6.2 yamt #define rspq_mbuf rspq_mh.mh_head
222 1.1.6.2 yamt #endif
223 1.1.6.2 yamt
224 1.1.6.2 yamt struct rx_desc;
225 1.1.6.2 yamt struct rx_sw_desc;
226 1.1.6.2 yamt
227 1.1.6.2 yamt struct sge_fl {
228 1.1.6.2 yamt uint32_t buf_size;
229 1.1.6.2 yamt uint32_t credits;
230 1.1.6.2 yamt uint32_t size;
231 1.1.6.2 yamt uint32_t cidx;
232 1.1.6.2 yamt uint32_t pidx;
233 1.1.6.2 yamt uint32_t gen;
234 1.1.6.2 yamt struct rx_desc *desc;
235 1.1.6.2 yamt struct rx_sw_desc *sdesc;
236 1.1.6.2 yamt bus_addr_t phys_addr;
237 1.1.6.2 yamt uint32_t cntxt_id;
238 1.1.6.2 yamt uint64_t empty;
239 1.1.6.2 yamt bus_dma_tag_t desc_tag;
240 1.1.6.2 yamt bus_dmamap_t desc_map;
241 1.1.6.2 yamt bus_dma_tag_t entry_tag;
242 1.1.6.2 yamt int type;
243 1.1.6.2 yamt };
244 1.1.6.2 yamt
245 1.1.6.2 yamt struct tx_desc;
246 1.1.6.2 yamt struct tx_sw_desc;
247 1.1.6.2 yamt
248 1.1.6.2 yamt #define TXQ_TRANSMITTING 0x1
249 1.1.6.2 yamt
250 1.1.6.2 yamt struct sge_txq {
251 1.1.6.2 yamt uint64_t flags;
252 1.1.6.2 yamt uint32_t in_use;
253 1.1.6.2 yamt uint32_t size;
254 1.1.6.2 yamt uint32_t processed;
255 1.1.6.2 yamt uint32_t cleaned;
256 1.1.6.2 yamt uint32_t stop_thres;
257 1.1.6.2 yamt uint32_t cidx;
258 1.1.6.2 yamt uint32_t pidx;
259 1.1.6.2 yamt uint32_t gen;
260 1.1.6.2 yamt uint32_t unacked;
261 1.1.6.2 yamt struct tx_desc *desc;
262 1.1.6.2 yamt struct tx_sw_desc *sdesc;
263 1.1.6.2 yamt uint32_t token;
264 1.1.6.2 yamt bus_addr_t phys_addr;
265 1.1.6.2 yamt struct cxgb_task qresume_task;
266 1.1.6.2 yamt struct cxgb_task qreclaim_task;
267 1.1.6.2 yamt struct port_info *port;
268 1.1.6.2 yamt uint32_t cntxt_id;
269 1.1.6.2 yamt uint64_t stops;
270 1.1.6.2 yamt uint64_t restarts;
271 1.1.6.2 yamt bus_dma_tag_t desc_tag;
272 1.1.6.2 yamt bus_dmamap_t desc_map;
273 1.1.6.2 yamt bus_dma_tag_t entry_tag;
274 1.1.6.2 yamt struct mbuf_head sendq;
275 1.1.6.2 yamt struct mtx lock;
276 1.1.6.2 yamt #define TXQ_NAME_LEN 32
277 1.1.6.2 yamt char lockbuf[TXQ_NAME_LEN];
278 1.1.6.2 yamt };
279 1.1.6.2 yamt
280 1.1.6.2 yamt
281 1.1.6.2 yamt enum {
282 1.1.6.2 yamt SGE_PSTAT_TSO, /* # of TSO requests */
283 1.1.6.2 yamt SGE_PSTAT_RX_CSUM_GOOD, /* # of successful RX csum offloads */
284 1.1.6.2 yamt SGE_PSTAT_TX_CSUM, /* # of TX checksum offloads */
285 1.1.6.2 yamt SGE_PSTAT_VLANEX, /* # of VLAN tag extractions */
286 1.1.6.2 yamt SGE_PSTAT_VLANINS, /* # of VLAN tag insertions */
287 1.1.6.2 yamt SGE_PSTATS_LRO_QUEUED, /* # of LRO appended packets */
288 1.1.6.2 yamt SGE_PSTATS_LRO_FLUSHED, /* # of LRO flushed packets */
289 1.1.6.2 yamt SGE_PSTATS_LRO_X_STREAMS, /* # of exceeded LRO contexts */
290 1.1.6.2 yamt };
291 1.1.6.2 yamt
292 1.1.6.2 yamt #define SGE_PSTAT_MAX (SGE_PSTATS_LRO_X_STREAMS+1)
293 1.1.6.2 yamt
294 1.1.6.2 yamt struct sge_qset {
295 1.1.6.2 yamt struct sge_rspq rspq;
296 1.1.6.2 yamt struct sge_fl fl[SGE_RXQ_PER_SET];
297 1.1.6.2 yamt struct lro_state lro;
298 1.1.6.2 yamt struct sge_txq txq[SGE_TXQ_PER_SET];
299 1.1.6.2 yamt uint32_t txq_stopped; /* which Tx queues are stopped */
300 1.1.6.2 yamt uint64_t port_stats[SGE_PSTAT_MAX];
301 1.1.6.2 yamt struct port_info *port;
302 1.1.6.2 yamt int idx; /* qset # */
303 1.1.6.2 yamt };
304 1.1.6.2 yamt
305 1.1.6.2 yamt struct sge {
306 1.1.6.2 yamt struct sge_qset qs[SGE_QSETS];
307 1.1.6.2 yamt struct mtx reg_lock;
308 1.1.6.2 yamt };
309 1.1.6.2 yamt
310 1.1.6.2 yamt struct filter_info;
311 1.1.6.2 yamt
312 1.1.6.2 yamt struct adapter {
313 1.1.6.2 yamt struct device original;
314 1.1.6.2 yamt device_t dev; // so we have a compatible pointer
315 1.1.6.2 yamt int flags;
316 1.1.6.2 yamt TAILQ_ENTRY(adapter) adapter_entry;
317 1.1.6.2 yamt
318 1.1.6.2 yamt /* PCI register resources */
319 1.1.6.2 yamt int regs_rid;
320 1.1.6.2 yamt struct resource *regs_res;
321 1.1.6.2 yamt bus_space_handle_t bh;
322 1.1.6.2 yamt bus_space_tag_t bt;
323 1.1.6.2 yamt bus_size_t mmio_len;
324 1.1.6.2 yamt uint32_t link_width;
325 1.1.6.2 yamt struct pci_attach_args pa;
326 1.1.6.2 yamt uint32_t bar0;
327 1.1.6.2 yamt bus_space_handle_t bar0_handle;
328 1.1.6.2 yamt pci_intr_handle_t intr_handle;
329 1.1.6.2 yamt void *intr_cookie;
330 1.1.6.2 yamt
331 1.1.6.2 yamt /* DMA resources */
332 1.1.6.2 yamt bus_dma_tag_t parent_dmat;
333 1.1.6.2 yamt bus_dma_tag_t rx_dmat;
334 1.1.6.2 yamt bus_dma_tag_t rx_jumbo_dmat;
335 1.1.6.2 yamt bus_dma_tag_t tx_dmat;
336 1.1.6.2 yamt
337 1.1.6.2 yamt /* Interrupt resources */
338 1.1.6.2 yamt int irq_rid;
339 1.1.6.2 yamt
340 1.1.6.2 yamt uint32_t msix_regs_rid;
341 1.1.6.2 yamt struct resource *msix_regs_res;
342 1.1.6.2 yamt
343 1.1.6.2 yamt struct resource *msix_irq_res[SGE_QSETS];
344 1.1.6.2 yamt int msix_irq_rid[SGE_QSETS];
345 1.1.6.2 yamt void *msix_intr_tag[SGE_QSETS];
346 1.1.6.2 yamt uint8_t rxpkt_map[8]; /* maps RX_PKT interface values to port ids */
347 1.1.6.2 yamt uint8_t rrss_map[SGE_QSETS]; /* revers RSS map table */
348 1.1.6.2 yamt
349 1.1.6.2 yamt struct filter_info *filters;
350 1.1.6.2 yamt
351 1.1.6.2 yamt /* Tasks */
352 1.1.6.2 yamt struct cxgb_task ext_intr_task;
353 1.1.6.2 yamt struct cxgb_task slow_intr_task;
354 1.1.6.2 yamt struct cxgb_task tick_task;
355 1.1.6.2 yamt struct callout cxgb_tick_ch;
356 1.1.6.2 yamt struct callout sge_timer_ch;
357 1.1.6.2 yamt
358 1.1.6.2 yamt /* Register lock for use by the hardware layer */
359 1.1.6.2 yamt struct mtx mdio_lock;
360 1.1.6.2 yamt struct mtx elmer_lock;
361 1.1.6.2 yamt
362 1.1.6.2 yamt /* Bookkeeping for the hardware layer */
363 1.1.6.2 yamt struct adapter_params params;
364 1.1.6.2 yamt unsigned int slow_intr_mask;
365 1.1.6.2 yamt unsigned long irq_stats[IRQ_NUM_STATS];
366 1.1.6.2 yamt
367 1.1.6.2 yamt struct sge sge;
368 1.1.6.2 yamt struct mc7 pmrx;
369 1.1.6.2 yamt struct mc7 pmtx;
370 1.1.6.2 yamt struct mc7 cm;
371 1.1.6.2 yamt struct mc5 mc5;
372 1.1.6.2 yamt
373 1.1.6.2 yamt struct port_info port[MAX_NPORTS];
374 1.1.6.2 yamt device_t portdev[MAX_NPORTS];
375 1.1.6.2 yamt struct toedev tdev;
376 1.1.6.2 yamt char fw_version[64];
377 1.1.6.2 yamt uint32_t open_device_map;
378 1.1.6.2 yamt uint32_t registered_device_map;
379 1.1.6.2 yamt #ifdef USE_SX
380 1.1.6.2 yamt struct sx lock;
381 1.1.6.2 yamt #else
382 1.1.6.2 yamt struct mtx lock;
383 1.1.6.2 yamt #endif
384 1.1.6.2 yamt int (*cxgb_intr)(void *);
385 1.1.6.2 yamt int msi_count;
386 1.1.6.2 yamt
387 1.1.6.2 yamt #define ADAPTER_LOCK_NAME_LEN 32
388 1.1.6.2 yamt char lockbuf[ADAPTER_LOCK_NAME_LEN];
389 1.1.6.2 yamt char reglockbuf[ADAPTER_LOCK_NAME_LEN];
390 1.1.6.2 yamt char mdiolockbuf[ADAPTER_LOCK_NAME_LEN];
391 1.1.6.2 yamt char elmerlockbuf[ADAPTER_LOCK_NAME_LEN];
392 1.1.6.2 yamt };
393 1.1.6.2 yamt
394 1.1.6.2 yamt struct t3_rx_mode {
395 1.1.6.2 yamt
396 1.1.6.2 yamt uint32_t idx;
397 1.1.6.2 yamt struct port_info *port;
398 1.1.6.2 yamt };
399 1.1.6.2 yamt
400 1.1.6.2 yamt
401 1.1.6.2 yamt #define MDIO_LOCK(adapter) mtx_lock(&(adapter)->mdio_lock)
402 1.1.6.2 yamt #define MDIO_UNLOCK(adapter) mtx_unlock(&(adapter)->mdio_lock)
403 1.1.6.2 yamt #define ELMR_LOCK(adapter) mtx_lock(&(adapter)->elmer_lock)
404 1.1.6.2 yamt #define ELMR_UNLOCK(adapter) mtx_unlock(&(adapter)->elmer_lock)
405 1.1.6.2 yamt
406 1.1.6.2 yamt
407 1.1.6.2 yamt #ifdef USE_SX
408 1.1.6.2 yamt #define PORT_LOCK(port) sx_xlock(&(port)->lock);
409 1.1.6.2 yamt #define PORT_UNLOCK(port) sx_xunlock(&(port)->lock);
410 1.1.6.2 yamt #define PORT_LOCK_INIT(port, name) SX_INIT(&(port)->lock, name)
411 1.1.6.2 yamt #define PORT_LOCK_DEINIT(port) SX_DESTROY(&(port)->lock)
412 1.1.6.2 yamt #define PORT_LOCK_ASSERT_OWNED(port) sx_assert(&(port)->lock, SA_LOCKED)
413 1.1.6.2 yamt
414 1.1.6.2 yamt #define ADAPTER_LOCK(adap) sx_xlock(&(adap)->lock);
415 1.1.6.2 yamt #define ADAPTER_UNLOCK(adap) sx_xunlock(&(adap)->lock);
416 1.1.6.2 yamt #define ADAPTER_LOCK_INIT(adap, name) SX_INIT(&(adap)->lock, name)
417 1.1.6.2 yamt #define ADAPTER_LOCK_DEINIT(adap) SX_DESTROY(&(adap)->lock)
418 1.1.6.2 yamt #define ADAPTER_LOCK_ASSERT_NOTOWNED(adap) sx_assert(&(adap)->lock, SA_UNLOCKED)
419 1.1.6.2 yamt #else
420 1.1.6.2 yamt #define PORT_LOCK(port) mtx_lock(&(port)->lock);
421 1.1.6.2 yamt #define PORT_UNLOCK(port) mtx_unlock(&(port)->lock);
422 1.1.6.2 yamt #define PORT_LOCK_INIT(port, name) mtx_init(&(port)->lock, name, 0, MTX_DEF)
423 1.1.6.2 yamt #define PORT_LOCK_DEINIT(port) mtx_destroy(&(port)->lock)
424 1.1.6.2 yamt #define PORT_LOCK_ASSERT_OWNED(port) mtx_assert(&(port)->lock, MA_OWNED)
425 1.1.6.2 yamt
426 1.1.6.2 yamt #define ADAPTER_LOCK(adap) mtx_lock(&(adap)->lock);
427 1.1.6.2 yamt #define ADAPTER_UNLOCK(adap) mtx_unlock(&(adap)->lock);
428 1.1.6.2 yamt #define ADAPTER_LOCK_INIT(adap, name) mtx_init(&(adap)->lock, name, 0, MTX_DEF)
429 1.1.6.2 yamt #define ADAPTER_LOCK_DEINIT(adap) mtx_destroy(&(adap)->lock)
430 1.1.6.2 yamt #define ADAPTER_LOCK_ASSERT_NOTOWNED(adap) mtx_assert(&(adap)->lock, MA_NOTOWNED)
431 1.1.6.2 yamt #endif
432 1.1.6.2 yamt
433 1.1.6.2 yamt
434 1.1.6.2 yamt static __inline uint32_t
435 1.1.6.2 yamt t3_read_reg(adapter_t *adapter, uint32_t reg_addr)
436 1.1.6.2 yamt {
437 1.1.6.2 yamt return (bus_space_read_4(adapter->bt, adapter->bh, reg_addr));
438 1.1.6.2 yamt }
439 1.1.6.2 yamt
440 1.1.6.2 yamt static __inline void
441 1.1.6.2 yamt t3_write_reg(adapter_t *adapter, uint32_t reg_addr, uint32_t val)
442 1.1.6.2 yamt {
443 1.1.6.2 yamt bus_space_write_4(adapter->bt, adapter->bh, reg_addr, val);
444 1.1.6.2 yamt }
445 1.1.6.2 yamt
446 1.1.6.2 yamt static __inline void
447 1.1.6.2 yamt t3_os_pci_read_config_4(adapter_t *adapter, int reg, uint32_t *val)
448 1.1.6.2 yamt {
449 1.1.6.2 yamt *val = pci_conf_read(adapter->pa.pa_pc, adapter->pa.pa_tag, reg);
450 1.1.6.2 yamt }
451 1.1.6.2 yamt
452 1.1.6.2 yamt static __inline void
453 1.1.6.2 yamt t3_os_pci_write_config_4(adapter_t *adapter, int reg, uint32_t val)
454 1.1.6.2 yamt {
455 1.1.6.2 yamt pci_conf_write(adapter->pa.pa_pc, adapter->pa.pa_tag, reg, val);
456 1.1.6.2 yamt }
457 1.1.6.2 yamt
458 1.1.6.2 yamt static __inline void
459 1.1.6.2 yamt t3_os_pci_read_config_2(adapter_t *adapter, int reg, uint16_t *val)
460 1.1.6.2 yamt {
461 1.1.6.2 yamt uint32_t temp;
462 1.1.6.2 yamt temp = pci_conf_read(adapter->pa.pa_pc, adapter->pa.pa_tag, reg&0xfc);
463 1.1.6.2 yamt if (reg&0x2)
464 1.1.6.2 yamt *val = (temp>>16)&0xffff;
465 1.1.6.2 yamt else
466 1.1.6.2 yamt *val = temp&0xffff;
467 1.1.6.2 yamt }
468 1.1.6.2 yamt
469 1.1.6.2 yamt static __inline void
470 1.1.6.2 yamt t3_os_pci_write_config_2(adapter_t *adapter, int reg, uint16_t val)
471 1.1.6.2 yamt {
472 1.1.6.2 yamt uint32_t temp = pci_conf_read(adapter->pa.pa_pc, adapter->pa.pa_tag, reg&0xfc);
473 1.1.6.2 yamt if (reg&0x2)
474 1.1.6.2 yamt temp = (temp&0xffff)|(val<<16);
475 1.1.6.2 yamt else
476 1.1.6.2 yamt temp = (temp&0xffff0000)|val;
477 1.1.6.2 yamt pci_conf_write(adapter->pa.pa_pc, adapter->pa.pa_tag, reg&0xfc, temp);
478 1.1.6.2 yamt }
479 1.1.6.2 yamt
480 1.1.6.2 yamt static __inline uint8_t *
481 1.1.6.2 yamt t3_get_next_mcaddr(struct t3_rx_mode *rm)
482 1.1.6.2 yamt {
483 1.1.6.2 yamt uint8_t *macaddr = NULL;
484 1.1.6.2 yamt
485 1.1.6.2 yamt if (rm->idx == 0)
486 1.1.6.2 yamt macaddr = rm->port->hw_addr;
487 1.1.6.2 yamt
488 1.1.6.2 yamt rm->idx++;
489 1.1.6.2 yamt return (macaddr);
490 1.1.6.2 yamt }
491 1.1.6.2 yamt
492 1.1.6.2 yamt static __inline void
493 1.1.6.2 yamt t3_init_rx_mode(struct t3_rx_mode *rm, struct port_info *port)
494 1.1.6.2 yamt {
495 1.1.6.2 yamt rm->idx = 0;
496 1.1.6.2 yamt rm->port = port;
497 1.1.6.2 yamt }
498 1.1.6.2 yamt
499 1.1.6.2 yamt static __inline struct port_info *
500 1.1.6.2 yamt adap2pinfo(struct adapter *adap, int idx)
501 1.1.6.2 yamt {
502 1.1.6.2 yamt return &adap->port[idx];
503 1.1.6.2 yamt }
504 1.1.6.2 yamt
505 1.1.6.2 yamt int t3_os_find_pci_capability(adapter_t *adapter, int cap);
506 1.1.6.2 yamt int t3_os_pci_save_state(struct adapter *adapter);
507 1.1.6.2 yamt int t3_os_pci_restore_state(struct adapter *adapter);
508 1.1.6.2 yamt void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status,
509 1.1.6.2 yamt int speed, int duplex, int fc);
510 1.1.6.2 yamt void t3_sge_err_intr_handler(adapter_t *adapter);
511 1.1.6.2 yamt int t3_offload_tx(struct toedev *, struct mbuf *);
512 1.1.6.2 yamt void t3_os_ext_intr_handler(adapter_t *adapter);
513 1.1.6.2 yamt void t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[]);
514 1.1.6.2 yamt int t3_mgmt_tx(adapter_t *adap, struct mbuf *m);
515 1.1.6.2 yamt
516 1.1.6.2 yamt
517 1.1.6.2 yamt int t3_sge_alloc(struct adapter *);
518 1.1.6.2 yamt int t3_sge_free(struct adapter *);
519 1.1.6.2 yamt int t3_sge_alloc_qset(adapter_t *, uint32_t, int, int, const struct qset_params *,
520 1.1.6.2 yamt int, struct port_info *);
521 1.1.6.2 yamt void t3_free_sge_resources(adapter_t *);
522 1.1.6.2 yamt void t3_sge_start(adapter_t *);
523 1.1.6.2 yamt void t3_sge_stop(adapter_t *);
524 1.1.6.2 yamt int t3b_intr(void *data);
525 1.1.6.2 yamt int t3_intr_msi(void *data);
526 1.1.6.2 yamt int t3_intr_msix(void *data);
527 1.1.6.2 yamt int t3_encap(struct port_info *, struct mbuf **, int *free);
528 1.1.6.2 yamt
529 1.1.6.2 yamt int t3_sge_init_adapter(adapter_t *);
530 1.1.6.2 yamt int t3_sge_init_port(struct port_info *);
531 1.1.6.2 yamt void t3_sge_deinit_sw(adapter_t *);
532 1.1.6.2 yamt
533 1.1.6.2 yamt void t3_rx_eth_lro(adapter_t *adap, struct sge_rspq *rq, struct mbuf *m,
534 1.1.6.2 yamt int ethpad, uint32_t rss_hash, uint32_t rss_csum, int lro);
535 1.1.6.2 yamt void t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad);
536 1.1.6.2 yamt void t3_lro_flush(adapter_t *adap, struct sge_qset *qs, struct lro_state *state);
537 1.1.6.2 yamt
538 1.1.6.2 yamt void t3_add_sysctls(adapter_t *sc);
539 1.1.6.2 yamt int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
540 1.1.6.2 yamt unsigned char *data);
541 1.1.6.2 yamt void t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p);
542 1.1.6.2 yamt /*
543 1.1.6.2 yamt * XXX figure out how we can return this to being private to sge
544 1.1.6.2 yamt */
545 1.1.6.2 yamt #define desc_reclaimable(q) ((int)((q)->processed - (q)->cleaned - TX_MAX_DESC))
546 1.1.6.2 yamt
547 1.1.6.2 yamt #define container_of(p, stype, field) ((stype *)(((uint8_t *)(p)) - offsetof(stype, field)))
548 1.1.6.2 yamt
549 1.1.6.2 yamt static __inline struct sge_qset *
550 1.1.6.2 yamt fl_to_qset(struct sge_fl *q, int qidx)
551 1.1.6.2 yamt {
552 1.1.6.2 yamt return container_of(q, struct sge_qset, fl[qidx]);
553 1.1.6.2 yamt }
554 1.1.6.2 yamt
555 1.1.6.2 yamt static __inline struct sge_qset *
556 1.1.6.2 yamt rspq_to_qset(struct sge_rspq *q)
557 1.1.6.2 yamt {
558 1.1.6.2 yamt return container_of(q, struct sge_qset, rspq);
559 1.1.6.2 yamt }
560 1.1.6.2 yamt
561 1.1.6.2 yamt static __inline struct sge_qset *
562 1.1.6.2 yamt txq_to_qset(struct sge_txq *q, int qidx)
563 1.1.6.2 yamt {
564 1.1.6.2 yamt return container_of(q, struct sge_qset, txq[qidx]);
565 1.1.6.2 yamt }
566 1.1.6.2 yamt
567 1.1.6.2 yamt static __inline struct adapter *
568 1.1.6.2 yamt tdev2adap(struct toedev *d)
569 1.1.6.2 yamt {
570 1.1.6.2 yamt return container_of(d, struct adapter, tdev);
571 1.1.6.2 yamt }
572 1.1.6.2 yamt
573 1.1.6.2 yamt #undef container_of
574 1.1.6.2 yamt
575 1.1.6.2 yamt #define OFFLOAD_DEVMAP_BIT 15
576 1.1.6.2 yamt static inline int offload_running(adapter_t *adapter)
577 1.1.6.2 yamt {
578 1.1.6.2 yamt return isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
579 1.1.6.2 yamt }
580 1.1.6.2 yamt
581 1.1.6.2 yamt
582 1.1.6.2 yamt #endif
583