xref: /freebsd/sys/dev/cxgbe/t4_main.c (revision 95d45410b5100e07f6f98450bcd841a8945d4726)
1 /*-
2  * Copyright (c) 2011 Chelsio Communications, Inc.
3  * All rights reserved.
4  * Written by: Navdeep Parhar <np@FreeBSD.org>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27 
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30 
31 #include "opt_inet.h"
32 #include "opt_inet6.h"
33 
34 #include <sys/param.h>
35 #include <sys/conf.h>
36 #include <sys/priv.h>
37 #include <sys/kernel.h>
38 #include <sys/bus.h>
39 #include <sys/module.h>
40 #include <sys/malloc.h>
41 #include <sys/queue.h>
42 #include <sys/taskqueue.h>
43 #include <sys/pciio.h>
44 #include <dev/pci/pcireg.h>
45 #include <dev/pci/pcivar.h>
46 #include <dev/pci/pci_private.h>
47 #include <sys/firmware.h>
48 #include <sys/sbuf.h>
49 #include <sys/smp.h>
50 #include <sys/socket.h>
51 #include <sys/sockio.h>
52 #include <sys/sysctl.h>
53 #include <net/ethernet.h>
54 #include <net/if.h>
55 #include <net/if_types.h>
56 #include <net/if_dl.h>
57 #include <net/if_vlan_var.h>
58 #if defined(__i386__) || defined(__amd64__)
59 #include <vm/vm.h>
60 #include <vm/pmap.h>
61 #endif
62 
63 #include "common/common.h"
64 #include "common/t4_msg.h"
65 #include "common/t4_regs.h"
66 #include "common/t4_regs_values.h"
67 #include "t4_ioctl.h"
68 #include "t4_l2t.h"
69 
70 /* T4 bus driver interface */
71 static int t4_probe(device_t);
72 static int t4_attach(device_t);
73 static int t4_detach(device_t);
74 static device_method_t t4_methods[] = {
75 	DEVMETHOD(device_probe,		t4_probe),
76 	DEVMETHOD(device_attach,	t4_attach),
77 	DEVMETHOD(device_detach,	t4_detach),
78 
79 	DEVMETHOD_END
80 };
81 static driver_t t4_driver = {
82 	"t4nex",
83 	t4_methods,
84 	sizeof(struct adapter)
85 };
86 
87 
88 /* T4 port (cxgbe) interface */
89 static int cxgbe_probe(device_t);
90 static int cxgbe_attach(device_t);
91 static int cxgbe_detach(device_t);
92 static device_method_t cxgbe_methods[] = {
93 	DEVMETHOD(device_probe,		cxgbe_probe),
94 	DEVMETHOD(device_attach,	cxgbe_attach),
95 	DEVMETHOD(device_detach,	cxgbe_detach),
96 	{ 0, 0 }
97 };
98 static driver_t cxgbe_driver = {
99 	"cxgbe",
100 	cxgbe_methods,
101 	sizeof(struct port_info)
102 };
103 
104 static d_ioctl_t t4_ioctl;
105 static d_open_t t4_open;
106 static d_close_t t4_close;
107 
108 static struct cdevsw t4_cdevsw = {
109        .d_version = D_VERSION,
110        .d_flags = 0,
111        .d_open = t4_open,
112        .d_close = t4_close,
113        .d_ioctl = t4_ioctl,
114        .d_name = "t4nex",
115 };
116 
117 /* T5 bus driver interface */
118 static int t5_probe(device_t);
119 static device_method_t t5_methods[] = {
120 	DEVMETHOD(device_probe,		t5_probe),
121 	DEVMETHOD(device_attach,	t4_attach),
122 	DEVMETHOD(device_detach,	t4_detach),
123 
124 	DEVMETHOD_END
125 };
126 static driver_t t5_driver = {
127 	"t5nex",
128 	t5_methods,
129 	sizeof(struct adapter)
130 };
131 
132 
133 /* T5 port (cxl) interface */
134 static driver_t cxl_driver = {
135 	"cxl",
136 	cxgbe_methods,
137 	sizeof(struct port_info)
138 };
139 
140 static struct cdevsw t5_cdevsw = {
141        .d_version = D_VERSION,
142        .d_flags = 0,
143        .d_open = t4_open,
144        .d_close = t4_close,
145        .d_ioctl = t4_ioctl,
146        .d_name = "t5nex",
147 };
148 
149 /* ifnet + media interface */
150 static void cxgbe_init(void *);
151 static int cxgbe_ioctl(struct ifnet *, unsigned long, caddr_t);
152 static int cxgbe_transmit(struct ifnet *, struct mbuf *);
153 static void cxgbe_qflush(struct ifnet *);
154 static int cxgbe_media_change(struct ifnet *);
155 static void cxgbe_media_status(struct ifnet *, struct ifmediareq *);
156 
157 MALLOC_DEFINE(M_CXGBE, "cxgbe", "Chelsio T4/T5 Ethernet driver and services");
158 
159 /*
160  * Correct lock order when you need to acquire multiple locks is t4_list_lock,
161  * then ADAPTER_LOCK, then t4_uld_list_lock.
162  */
163 static struct sx t4_list_lock;
164 SLIST_HEAD(, adapter) t4_list;
165 #ifdef TCP_OFFLOAD
166 static struct sx t4_uld_list_lock;
167 SLIST_HEAD(, uld_info) t4_uld_list;
168 #endif
169 
170 /*
171  * Tunables.  See tweak_tunables() too.
172  *
173  * Each tunable is set to a default value here if it's known at compile-time.
174  * Otherwise it is set to -1 as an indication to tweak_tunables() that it should
175  * provide a reasonable default when the driver is loaded.
176  *
177  * Tunables applicable to both T4 and T5 are under hw.cxgbe.  Those specific to
178  * T5 are under hw.cxl.
179  */
180 
181 /*
182  * Number of queues for tx and rx, 10G and 1G, NIC and offload.
183  */
184 #define NTXQ_10G 16
185 static int t4_ntxq10g = -1;
186 TUNABLE_INT("hw.cxgbe.ntxq10g", &t4_ntxq10g);
187 
188 #define NRXQ_10G 8
189 static int t4_nrxq10g = -1;
190 TUNABLE_INT("hw.cxgbe.nrxq10g", &t4_nrxq10g);
191 
192 #define NTXQ_1G 4
193 static int t4_ntxq1g = -1;
194 TUNABLE_INT("hw.cxgbe.ntxq1g", &t4_ntxq1g);
195 
196 #define NRXQ_1G 2
197 static int t4_nrxq1g = -1;
198 TUNABLE_INT("hw.cxgbe.nrxq1g", &t4_nrxq1g);
199 
200 static int t4_rsrv_noflowq = 0;
201 TUNABLE_INT("hw.cxgbe.rsrv_noflowq", &t4_rsrv_noflowq);
202 
203 #ifdef TCP_OFFLOAD
204 #define NOFLDTXQ_10G 8
205 static int t4_nofldtxq10g = -1;
206 TUNABLE_INT("hw.cxgbe.nofldtxq10g", &t4_nofldtxq10g);
207 
208 #define NOFLDRXQ_10G 2
209 static int t4_nofldrxq10g = -1;
210 TUNABLE_INT("hw.cxgbe.nofldrxq10g", &t4_nofldrxq10g);
211 
212 #define NOFLDTXQ_1G 2
213 static int t4_nofldtxq1g = -1;
214 TUNABLE_INT("hw.cxgbe.nofldtxq1g", &t4_nofldtxq1g);
215 
216 #define NOFLDRXQ_1G 1
217 static int t4_nofldrxq1g = -1;
218 TUNABLE_INT("hw.cxgbe.nofldrxq1g", &t4_nofldrxq1g);
219 #endif
220 
221 #ifdef DEV_NETMAP
222 #define NNMTXQ_10G 2
223 static int t4_nnmtxq10g = -1;
224 TUNABLE_INT("hw.cxgbe.nnmtxq10g", &t4_nnmtxq10g);
225 
226 #define NNMRXQ_10G 2
227 static int t4_nnmrxq10g = -1;
228 TUNABLE_INT("hw.cxgbe.nnmrxq10g", &t4_nnmrxq10g);
229 
230 #define NNMTXQ_1G 1
231 static int t4_nnmtxq1g = -1;
232 TUNABLE_INT("hw.cxgbe.nnmtxq1g", &t4_nnmtxq1g);
233 
234 #define NNMRXQ_1G 1
235 static int t4_nnmrxq1g = -1;
236 TUNABLE_INT("hw.cxgbe.nnmrxq1g", &t4_nnmrxq1g);
237 #endif
238 
239 /*
240  * Holdoff parameters for 10G and 1G ports.
241  */
242 #define TMR_IDX_10G 1
243 static int t4_tmr_idx_10g = TMR_IDX_10G;
244 TUNABLE_INT("hw.cxgbe.holdoff_timer_idx_10G", &t4_tmr_idx_10g);
245 
246 #define PKTC_IDX_10G (-1)
247 static int t4_pktc_idx_10g = PKTC_IDX_10G;
248 TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_10G", &t4_pktc_idx_10g);
249 
250 #define TMR_IDX_1G 1
251 static int t4_tmr_idx_1g = TMR_IDX_1G;
252 TUNABLE_INT("hw.cxgbe.holdoff_timer_idx_1G", &t4_tmr_idx_1g);
253 
254 #define PKTC_IDX_1G (-1)
255 static int t4_pktc_idx_1g = PKTC_IDX_1G;
256 TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_1G", &t4_pktc_idx_1g);
257 
258 /*
259  * Size (# of entries) of each tx and rx queue.
260  */
261 static unsigned int t4_qsize_txq = TX_EQ_QSIZE;
262 TUNABLE_INT("hw.cxgbe.qsize_txq", &t4_qsize_txq);
263 
264 static unsigned int t4_qsize_rxq = RX_IQ_QSIZE;
265 TUNABLE_INT("hw.cxgbe.qsize_rxq", &t4_qsize_rxq);
266 
267 /*
268  * Interrupt types allowed (bits 0, 1, 2 = INTx, MSI, MSI-X respectively).
269  */
270 static int t4_intr_types = INTR_MSIX | INTR_MSI | INTR_INTX;
271 TUNABLE_INT("hw.cxgbe.interrupt_types", &t4_intr_types);
272 
273 /*
274  * Configuration file.
275  */
276 #define DEFAULT_CF	"default"
277 #define FLASH_CF	"flash"
278 #define UWIRE_CF	"uwire"
279 #define FPGA_CF		"fpga"
280 static char t4_cfg_file[32] = DEFAULT_CF;
281 TUNABLE_STR("hw.cxgbe.config_file", t4_cfg_file, sizeof(t4_cfg_file));
282 
283 /*
284  * Firmware auto-install by driver during attach (0, 1, 2 = prohibited, allowed,
285  * encouraged respectively).
286  */
287 static unsigned int t4_fw_install = 1;
288 TUNABLE_INT("hw.cxgbe.fw_install", &t4_fw_install);
289 
290 /*
291  * ASIC features that will be used.  Disable the ones you don't want so that the
292  * chip resources aren't wasted on features that will not be used.
293  */
294 static int t4_linkcaps_allowed = 0;	/* No DCBX, PPP, etc. by default */
295 TUNABLE_INT("hw.cxgbe.linkcaps_allowed", &t4_linkcaps_allowed);
296 
297 static int t4_niccaps_allowed = FW_CAPS_CONFIG_NIC;
298 TUNABLE_INT("hw.cxgbe.niccaps_allowed", &t4_niccaps_allowed);
299 
300 static int t4_toecaps_allowed = -1;
301 TUNABLE_INT("hw.cxgbe.toecaps_allowed", &t4_toecaps_allowed);
302 
303 static int t4_rdmacaps_allowed = 0;
304 TUNABLE_INT("hw.cxgbe.rdmacaps_allowed", &t4_rdmacaps_allowed);
305 
306 static int t4_iscsicaps_allowed = 0;
307 TUNABLE_INT("hw.cxgbe.iscsicaps_allowed", &t4_iscsicaps_allowed);
308 
309 static int t4_fcoecaps_allowed = 0;
310 TUNABLE_INT("hw.cxgbe.fcoecaps_allowed", &t4_fcoecaps_allowed);
311 
312 static int t5_write_combine = 0;
313 TUNABLE_INT("hw.cxl.write_combine", &t5_write_combine);
314 
315 struct intrs_and_queues {
316 	uint16_t intr_type;	/* INTx, MSI, or MSI-X */
317 	uint16_t nirq;		/* Total # of vectors */
318 	uint16_t intr_flags_10g;/* Interrupt flags for each 10G port */
319 	uint16_t intr_flags_1g;	/* Interrupt flags for each 1G port */
320 	uint16_t ntxq10g;	/* # of NIC txq's for each 10G port */
321 	uint16_t nrxq10g;	/* # of NIC rxq's for each 10G port */
322 	uint16_t ntxq1g;	/* # of NIC txq's for each 1G port */
323 	uint16_t nrxq1g;	/* # of NIC rxq's for each 1G port */
324 	uint16_t rsrv_noflowq;	/* Flag whether to reserve queue 0 */
325 #ifdef TCP_OFFLOAD
326 	uint16_t nofldtxq10g;	/* # of TOE txq's for each 10G port */
327 	uint16_t nofldrxq10g;	/* # of TOE rxq's for each 10G port */
328 	uint16_t nofldtxq1g;	/* # of TOE txq's for each 1G port */
329 	uint16_t nofldrxq1g;	/* # of TOE rxq's for each 1G port */
330 #endif
331 #ifdef DEV_NETMAP
332 	uint16_t nnmtxq10g;	/* # of netmap txq's for each 10G port */
333 	uint16_t nnmrxq10g;	/* # of netmap rxq's for each 10G port */
334 	uint16_t nnmtxq1g;	/* # of netmap txq's for each 1G port */
335 	uint16_t nnmrxq1g;	/* # of netmap rxq's for each 1G port */
336 #endif
337 };
338 
339 struct filter_entry {
340         uint32_t valid:1;	/* filter allocated and valid */
341         uint32_t locked:1;	/* filter is administratively locked */
342         uint32_t pending:1;	/* filter action is pending firmware reply */
343 	uint32_t smtidx:8;	/* Source MAC Table index for smac */
344 	struct l2t_entry *l2t;	/* Layer Two Table entry for dmac */
345 
346         struct t4_filter_specification fs;
347 };
348 
349 static int map_bars_0_and_4(struct adapter *);
350 static int map_bar_2(struct adapter *);
351 static void setup_memwin(struct adapter *);
352 static int validate_mem_range(struct adapter *, uint32_t, int);
353 static int fwmtype_to_hwmtype(int);
354 static int validate_mt_off_len(struct adapter *, int, uint32_t, int,
355     uint32_t *);
356 static void memwin_info(struct adapter *, int, uint32_t *, uint32_t *);
357 static uint32_t position_memwin(struct adapter *, int, uint32_t);
358 static int cfg_itype_and_nqueues(struct adapter *, int, int,
359     struct intrs_and_queues *);
360 static int prep_firmware(struct adapter *);
361 static int partition_resources(struct adapter *, const struct firmware *,
362     const char *);
363 static int get_params__pre_init(struct adapter *);
364 static int get_params__post_init(struct adapter *);
365 static int set_params__post_init(struct adapter *);
366 static void t4_set_desc(struct adapter *);
367 static void build_medialist(struct port_info *, struct ifmedia *);
368 static int cxgbe_init_synchronized(struct port_info *);
369 static int cxgbe_uninit_synchronized(struct port_info *);
370 static int setup_intr_handlers(struct adapter *);
371 static void quiesce_eq(struct adapter *, struct sge_eq *);
372 static void quiesce_iq(struct adapter *, struct sge_iq *);
373 static void quiesce_fl(struct adapter *, struct sge_fl *);
374 static int t4_alloc_irq(struct adapter *, struct irq *, int rid,
375     driver_intr_t *, void *, char *);
376 static int t4_free_irq(struct adapter *, struct irq *);
377 static void reg_block_dump(struct adapter *, uint8_t *, unsigned int,
378     unsigned int);
379 static void t4_get_regs(struct adapter *, struct t4_regdump *, uint8_t *);
380 static void cxgbe_tick(void *);
381 static void cxgbe_vlan_config(void *, struct ifnet *, uint16_t);
382 static int cpl_not_handled(struct sge_iq *, const struct rss_header *,
383     struct mbuf *);
384 static int an_not_handled(struct sge_iq *, const struct rsp_ctrl *);
385 static int fw_msg_not_handled(struct adapter *, const __be64 *);
386 static int t4_sysctls(struct adapter *);
387 static int cxgbe_sysctls(struct port_info *);
388 static int sysctl_int_array(SYSCTL_HANDLER_ARGS);
389 static int sysctl_bitfield(SYSCTL_HANDLER_ARGS);
390 static int sysctl_btphy(SYSCTL_HANDLER_ARGS);
391 static int sysctl_noflowq(SYSCTL_HANDLER_ARGS);
392 static int sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS);
393 static int sysctl_holdoff_pktc_idx(SYSCTL_HANDLER_ARGS);
394 static int sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS);
395 static int sysctl_qsize_txq(SYSCTL_HANDLER_ARGS);
396 static int sysctl_handle_t4_reg64(SYSCTL_HANDLER_ARGS);
397 static int sysctl_temperature(SYSCTL_HANDLER_ARGS);
398 #ifdef SBUF_DRAIN
399 static int sysctl_cctrl(SYSCTL_HANDLER_ARGS);
400 static int sysctl_cim_ibq_obq(SYSCTL_HANDLER_ARGS);
401 static int sysctl_cim_la(SYSCTL_HANDLER_ARGS);
402 static int sysctl_cim_ma_la(SYSCTL_HANDLER_ARGS);
403 static int sysctl_cim_pif_la(SYSCTL_HANDLER_ARGS);
404 static int sysctl_cim_qcfg(SYSCTL_HANDLER_ARGS);
405 static int sysctl_cpl_stats(SYSCTL_HANDLER_ARGS);
406 static int sysctl_ddp_stats(SYSCTL_HANDLER_ARGS);
407 static int sysctl_devlog(SYSCTL_HANDLER_ARGS);
408 static int sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS);
409 static int sysctl_hw_sched(SYSCTL_HANDLER_ARGS);
410 static int sysctl_lb_stats(SYSCTL_HANDLER_ARGS);
411 static int sysctl_linkdnrc(SYSCTL_HANDLER_ARGS);
412 static int sysctl_meminfo(SYSCTL_HANDLER_ARGS);
413 static int sysctl_mps_tcam(SYSCTL_HANDLER_ARGS);
414 static int sysctl_path_mtus(SYSCTL_HANDLER_ARGS);
415 static int sysctl_pm_stats(SYSCTL_HANDLER_ARGS);
416 static int sysctl_rdma_stats(SYSCTL_HANDLER_ARGS);
417 static int sysctl_tcp_stats(SYSCTL_HANDLER_ARGS);
418 static int sysctl_tids(SYSCTL_HANDLER_ARGS);
419 static int sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS);
420 static int sysctl_tp_la(SYSCTL_HANDLER_ARGS);
421 static int sysctl_tx_rate(SYSCTL_HANDLER_ARGS);
422 static int sysctl_ulprx_la(SYSCTL_HANDLER_ARGS);
423 static int sysctl_wcwr_stats(SYSCTL_HANDLER_ARGS);
424 #endif
425 static inline void txq_start(struct ifnet *, struct sge_txq *);
426 static uint32_t fconf_to_mode(uint32_t);
427 static uint32_t mode_to_fconf(uint32_t);
428 static uint32_t fspec_to_fconf(struct t4_filter_specification *);
429 static int get_filter_mode(struct adapter *, uint32_t *);
430 static int set_filter_mode(struct adapter *, uint32_t);
431 static inline uint64_t get_filter_hits(struct adapter *, uint32_t);
432 static int get_filter(struct adapter *, struct t4_filter *);
433 static int set_filter(struct adapter *, struct t4_filter *);
434 static int del_filter(struct adapter *, struct t4_filter *);
435 static void clear_filter(struct filter_entry *);
436 static int set_filter_wr(struct adapter *, int);
437 static int del_filter_wr(struct adapter *, int);
438 static int get_sge_context(struct adapter *, struct t4_sge_context *);
439 static int load_fw(struct adapter *, struct t4_data *);
440 static int read_card_mem(struct adapter *, int, struct t4_mem_range *);
441 static int read_i2c(struct adapter *, struct t4_i2c_data *);
442 static int set_sched_class(struct adapter *, struct t4_sched_params *);
443 static int set_sched_queue(struct adapter *, struct t4_sched_queue *);
444 #ifdef TCP_OFFLOAD
445 static int toe_capability(struct port_info *, int);
446 #endif
447 static int mod_event(module_t, int, void *);
448 
449 struct {
450 	uint16_t device;
451 	char *desc;
452 } t4_pciids[] = {
453 	{0xa000, "Chelsio Terminator 4 FPGA"},
454 	{0x4400, "Chelsio T440-dbg"},
455 	{0x4401, "Chelsio T420-CR"},
456 	{0x4402, "Chelsio T422-CR"},
457 	{0x4403, "Chelsio T440-CR"},
458 	{0x4404, "Chelsio T420-BCH"},
459 	{0x4405, "Chelsio T440-BCH"},
460 	{0x4406, "Chelsio T440-CH"},
461 	{0x4407, "Chelsio T420-SO"},
462 	{0x4408, "Chelsio T420-CX"},
463 	{0x4409, "Chelsio T420-BT"},
464 	{0x440a, "Chelsio T404-BT"},
465 	{0x440e, "Chelsio T440-LP-CR"},
466 }, t5_pciids[] = {
467 	{0xb000, "Chelsio Terminator 5 FPGA"},
468 	{0x5400, "Chelsio T580-dbg"},
469 	{0x5401,  "Chelsio T520-CR"},		/* 2 x 10G */
470 	{0x5402,  "Chelsio T522-CR"},		/* 2 x 10G, 2 X 1G */
471 	{0x5403,  "Chelsio T540-CR"},		/* 4 x 10G */
472 	{0x5407,  "Chelsio T520-SO"},		/* 2 x 10G, nomem */
473 	{0x5409,  "Chelsio T520-BT"},		/* 2 x 10GBaseT */
474 	{0x540a,  "Chelsio T504-BT"},		/* 4 x 1G */
475 	{0x540d,  "Chelsio T580-CR"},		/* 2 x 40G */
476 	{0x540e,  "Chelsio T540-LP-CR"},	/* 4 x 10G */
477 	{0x5410,  "Chelsio T580-LP-CR"},	/* 2 x 40G */
478 	{0x5411,  "Chelsio T520-LL-CR"},	/* 2 x 10G */
479 	{0x5412,  "Chelsio T560-CR"},		/* 1 x 40G, 2 x 10G */
480 	{0x5414,  "Chelsio T580-LP-SO-CR"},	/* 2 x 40G, nomem */
481 #ifdef notyet
482 	{0x5404,  "Chelsio T520-BCH"},
483 	{0x5405,  "Chelsio T540-BCH"},
484 	{0x5406,  "Chelsio T540-CH"},
485 	{0x5408,  "Chelsio T520-CX"},
486 	{0x540b,  "Chelsio B520-SR"},
487 	{0x540c,  "Chelsio B504-BT"},
488 	{0x540f,  "Chelsio Amsterdam"},
489 	{0x5413,  "Chelsio T580-CHR"},
490 #endif
491 };
492 
493 #ifdef TCP_OFFLOAD
494 /*
495  * service_iq() has an iq and needs the fl.  Offset of fl from the iq should be
496  * exactly the same for both rxq and ofld_rxq.
497  */
498 CTASSERT(offsetof(struct sge_ofld_rxq, iq) == offsetof(struct sge_rxq, iq));
499 CTASSERT(offsetof(struct sge_ofld_rxq, fl) == offsetof(struct sge_rxq, fl));
500 #endif
501 
502 /* No easy way to include t4_msg.h before adapter.h so we check this way */
503 CTASSERT(nitems(((struct adapter *)0)->cpl_handler) == NUM_CPL_CMDS);
504 CTASSERT(nitems(((struct adapter *)0)->fw_msg_handler) == NUM_FW6_TYPES);
505 
506 CTASSERT(sizeof(struct cluster_metadata) <= CL_METADATA_SIZE);
507 
508 static int
509 t4_probe(device_t dev)
510 {
511 	int i;
512 	uint16_t v = pci_get_vendor(dev);
513 	uint16_t d = pci_get_device(dev);
514 	uint8_t f = pci_get_function(dev);
515 
516 	if (v != PCI_VENDOR_ID_CHELSIO)
517 		return (ENXIO);
518 
519 	/* Attach only to PF0 of the FPGA */
520 	if (d == 0xa000 && f != 0)
521 		return (ENXIO);
522 
523 	for (i = 0; i < nitems(t4_pciids); i++) {
524 		if (d == t4_pciids[i].device) {
525 			device_set_desc(dev, t4_pciids[i].desc);
526 			return (BUS_PROBE_DEFAULT);
527 		}
528 	}
529 
530 	return (ENXIO);
531 }
532 
533 static int
534 t5_probe(device_t dev)
535 {
536 	int i;
537 	uint16_t v = pci_get_vendor(dev);
538 	uint16_t d = pci_get_device(dev);
539 	uint8_t f = pci_get_function(dev);
540 
541 	if (v != PCI_VENDOR_ID_CHELSIO)
542 		return (ENXIO);
543 
544 	/* Attach only to PF0 of the FPGA */
545 	if (d == 0xb000 && f != 0)
546 		return (ENXIO);
547 
548 	for (i = 0; i < nitems(t5_pciids); i++) {
549 		if (d == t5_pciids[i].device) {
550 			device_set_desc(dev, t5_pciids[i].desc);
551 			return (BUS_PROBE_DEFAULT);
552 		}
553 	}
554 
555 	return (ENXIO);
556 }
557 
558 static int
559 t4_attach(device_t dev)
560 {
561 	struct adapter *sc;
562 	int rc = 0, i, n10g, n1g, rqidx, tqidx;
563 	struct intrs_and_queues iaq;
564 	struct sge *s;
565 #ifdef TCP_OFFLOAD
566 	int ofld_rqidx, ofld_tqidx;
567 #endif
568 #ifdef DEV_NETMAP
569 	int nm_rqidx, nm_tqidx;
570 #endif
571 	const char *pcie_ts;
572 
573 	sc = device_get_softc(dev);
574 	sc->dev = dev;
575 
576 	pci_enable_busmaster(dev);
577 	if (pci_find_cap(dev, PCIY_EXPRESS, &i) == 0) {
578 		uint32_t v;
579 
580 		pci_set_max_read_req(dev, 4096);
581 		v = pci_read_config(dev, i + PCIER_DEVICE_CTL, 2);
582 		v |= PCIEM_CTL_RELAXED_ORD_ENABLE;
583 		pci_write_config(dev, i + PCIER_DEVICE_CTL, v, 2);
584 	}
585 
586 	sc->traceq = -1;
587 	mtx_init(&sc->ifp_lock, sc->ifp_lockname, 0, MTX_DEF);
588 	snprintf(sc->ifp_lockname, sizeof(sc->ifp_lockname), "%s tracer",
589 	    device_get_nameunit(dev));
590 
591 	snprintf(sc->lockname, sizeof(sc->lockname), "%s",
592 	    device_get_nameunit(dev));
593 	mtx_init(&sc->sc_lock, sc->lockname, 0, MTX_DEF);
594 	sx_xlock(&t4_list_lock);
595 	SLIST_INSERT_HEAD(&t4_list, sc, link);
596 	sx_xunlock(&t4_list_lock);
597 
598 	mtx_init(&sc->sfl_lock, "starving freelists", 0, MTX_DEF);
599 	TAILQ_INIT(&sc->sfl);
600 	callout_init(&sc->sfl_callout, CALLOUT_MPSAFE);
601 
602 	rc = map_bars_0_and_4(sc);
603 	if (rc != 0)
604 		goto done; /* error message displayed already */
605 
606 	/*
607 	 * This is the real PF# to which we're attaching.  Works from within PCI
608 	 * passthrough environments too, where pci_get_function() could return a
609 	 * different PF# depending on the passthrough configuration.  We need to
610 	 * use the real PF# in all our communication with the firmware.
611 	 */
612 	sc->pf = G_SOURCEPF(t4_read_reg(sc, A_PL_WHOAMI));
613 	sc->mbox = sc->pf;
614 
615 	memset(sc->chan_map, 0xff, sizeof(sc->chan_map));
616 	sc->an_handler = an_not_handled;
617 	for (i = 0; i < nitems(sc->cpl_handler); i++)
618 		sc->cpl_handler[i] = cpl_not_handled;
619 	for (i = 0; i < nitems(sc->fw_msg_handler); i++)
620 		sc->fw_msg_handler[i] = fw_msg_not_handled;
621 	t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, t4_filter_rpl);
622 	t4_register_cpl_handler(sc, CPL_TRACE_PKT, t4_trace_pkt);
623 	t4_register_cpl_handler(sc, CPL_TRACE_PKT_T5, t5_trace_pkt);
624 	t4_init_sge_cpl_handlers(sc);
625 
626 	/* Prepare the adapter for operation */
627 	rc = -t4_prep_adapter(sc);
628 	if (rc != 0) {
629 		device_printf(dev, "failed to prepare adapter: %d.\n", rc);
630 		goto done;
631 	}
632 
633 	/*
634 	 * Do this really early, with the memory windows set up even before the
635 	 * character device.  The userland tool's register i/o and mem read
636 	 * will work even in "recovery mode".
637 	 */
638 	setup_memwin(sc);
639 	sc->cdev = make_dev(is_t4(sc) ? &t4_cdevsw : &t5_cdevsw,
640 	    device_get_unit(dev), UID_ROOT, GID_WHEEL, 0600, "%s",
641 	    device_get_nameunit(dev));
642 	if (sc->cdev == NULL)
643 		device_printf(dev, "failed to create nexus char device.\n");
644 	else
645 		sc->cdev->si_drv1 = sc;
646 
647 	/* Go no further if recovery mode has been requested. */
648 	if (TUNABLE_INT_FETCH("hw.cxgbe.sos", &i) && i != 0) {
649 		device_printf(dev, "recovery mode.\n");
650 		goto done;
651 	}
652 
653 	/* Prepare the firmware for operation */
654 	rc = prep_firmware(sc);
655 	if (rc != 0)
656 		goto done; /* error message displayed already */
657 
658 	rc = get_params__post_init(sc);
659 	if (rc != 0)
660 		goto done; /* error message displayed already */
661 
662 	rc = set_params__post_init(sc);
663 	if (rc != 0)
664 		goto done; /* error message displayed already */
665 
666 	rc = map_bar_2(sc);
667 	if (rc != 0)
668 		goto done; /* error message displayed already */
669 
670 	rc = t4_create_dma_tag(sc);
671 	if (rc != 0)
672 		goto done; /* error message displayed already */
673 
674 	/*
675 	 * First pass over all the ports - allocate VIs and initialize some
676 	 * basic parameters like mac address, port type, etc.  We also figure
677 	 * out whether a port is 10G or 1G and use that information when
678 	 * calculating how many interrupts to attempt to allocate.
679 	 */
680 	n10g = n1g = 0;
681 	for_each_port(sc, i) {
682 		struct port_info *pi;
683 
684 		pi = malloc(sizeof(*pi), M_CXGBE, M_ZERO | M_WAITOK);
685 		sc->port[i] = pi;
686 
687 		/* These must be set before t4_port_init */
688 		pi->adapter = sc;
689 		pi->port_id = i;
690 
691 		/* Allocate the vi and initialize parameters like mac addr */
692 		rc = -t4_port_init(pi, sc->mbox, sc->pf, 0);
693 		if (rc != 0) {
694 			device_printf(dev, "unable to initialize port %d: %d\n",
695 			    i, rc);
696 			free(pi, M_CXGBE);
697 			sc->port[i] = NULL;
698 			goto done;
699 		}
700 		rc = -t4_link_start(sc, sc->mbox, pi->tx_chan, &pi->link_cfg);
701 		if (rc != 0) {
702 			device_printf(dev, "port %d l1cfg failed: %d\n", i, rc);
703 			free(pi, M_CXGBE);
704 			sc->port[i] = NULL;
705 			goto done;
706 		}
707 
708 		snprintf(pi->lockname, sizeof(pi->lockname), "%sp%d",
709 		    device_get_nameunit(dev), i);
710 		mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF);
711 		sc->chan_map[pi->tx_chan] = i;
712 
713 		if (is_10G_port(pi) || is_40G_port(pi)) {
714 			n10g++;
715 			pi->tmr_idx = t4_tmr_idx_10g;
716 			pi->pktc_idx = t4_pktc_idx_10g;
717 		} else {
718 			n1g++;
719 			pi->tmr_idx = t4_tmr_idx_1g;
720 			pi->pktc_idx = t4_pktc_idx_1g;
721 		}
722 
723 		pi->xact_addr_filt = -1;
724 		pi->linkdnrc = -1;
725 
726 		pi->qsize_rxq = t4_qsize_rxq;
727 		pi->qsize_txq = t4_qsize_txq;
728 
729 		pi->dev = device_add_child(dev, is_t4(sc) ? "cxgbe" : "cxl", -1);
730 		if (pi->dev == NULL) {
731 			device_printf(dev,
732 			    "failed to add device for port %d.\n", i);
733 			rc = ENXIO;
734 			goto done;
735 		}
736 		device_set_softc(pi->dev, pi);
737 	}
738 
739 	/*
740 	 * Interrupt type, # of interrupts, # of rx/tx queues, etc.
741 	 */
742 	rc = cfg_itype_and_nqueues(sc, n10g, n1g, &iaq);
743 	if (rc != 0)
744 		goto done; /* error message displayed already */
745 
746 	sc->intr_type = iaq.intr_type;
747 	sc->intr_count = iaq.nirq;
748 
749 	s = &sc->sge;
750 	s->nrxq = n10g * iaq.nrxq10g + n1g * iaq.nrxq1g;
751 	s->ntxq = n10g * iaq.ntxq10g + n1g * iaq.ntxq1g;
752 	s->neq = s->ntxq + s->nrxq;	/* the free list in an rxq is an eq */
753 	s->neq += sc->params.nports + 1;/* ctrl queues: 1 per port + 1 mgmt */
754 	s->niq = s->nrxq + 1;		/* 1 extra for firmware event queue */
755 #ifdef TCP_OFFLOAD
756 	if (is_offload(sc)) {
757 		s->nofldrxq = n10g * iaq.nofldrxq10g + n1g * iaq.nofldrxq1g;
758 		s->nofldtxq = n10g * iaq.nofldtxq10g + n1g * iaq.nofldtxq1g;
759 		s->neq += s->nofldtxq + s->nofldrxq;
760 		s->niq += s->nofldrxq;
761 
762 		s->ofld_rxq = malloc(s->nofldrxq * sizeof(struct sge_ofld_rxq),
763 		    M_CXGBE, M_ZERO | M_WAITOK);
764 		s->ofld_txq = malloc(s->nofldtxq * sizeof(struct sge_wrq),
765 		    M_CXGBE, M_ZERO | M_WAITOK);
766 	}
767 #endif
768 #ifdef DEV_NETMAP
769 	s->nnmrxq = n10g * iaq.nnmrxq10g + n1g * iaq.nnmrxq1g;
770 	s->nnmtxq = n10g * iaq.nnmtxq10g + n1g * iaq.nnmtxq1g;
771 	s->neq += s->nnmtxq + s->nnmrxq;
772 	s->niq += s->nnmrxq;
773 
774 	s->nm_rxq = malloc(s->nnmrxq * sizeof(struct sge_nm_rxq),
775 	    M_CXGBE, M_ZERO | M_WAITOK);
776 	s->nm_txq = malloc(s->nnmtxq * sizeof(struct sge_nm_txq),
777 	    M_CXGBE, M_ZERO | M_WAITOK);
778 #endif
779 
780 	s->ctrlq = malloc(sc->params.nports * sizeof(struct sge_wrq), M_CXGBE,
781 	    M_ZERO | M_WAITOK);
782 	s->rxq = malloc(s->nrxq * sizeof(struct sge_rxq), M_CXGBE,
783 	    M_ZERO | M_WAITOK);
784 	s->txq = malloc(s->ntxq * sizeof(struct sge_txq), M_CXGBE,
785 	    M_ZERO | M_WAITOK);
786 	s->iqmap = malloc(s->niq * sizeof(struct sge_iq *), M_CXGBE,
787 	    M_ZERO | M_WAITOK);
788 	s->eqmap = malloc(s->neq * sizeof(struct sge_eq *), M_CXGBE,
789 	    M_ZERO | M_WAITOK);
790 
791 	sc->irq = malloc(sc->intr_count * sizeof(struct irq), M_CXGBE,
792 	    M_ZERO | M_WAITOK);
793 
794 	t4_init_l2t(sc, M_WAITOK);
795 
796 	/*
797 	 * Second pass over the ports.  This time we know the number of rx and
798 	 * tx queues that each port should get.
799 	 */
800 	rqidx = tqidx = 0;
801 #ifdef TCP_OFFLOAD
802 	ofld_rqidx = ofld_tqidx = 0;
803 #endif
804 #ifdef DEV_NETMAP
805 	nm_rqidx = nm_tqidx = 0;
806 #endif
807 	for_each_port(sc, i) {
808 		struct port_info *pi = sc->port[i];
809 
810 		if (pi == NULL)
811 			continue;
812 
813 		pi->first_rxq = rqidx;
814 		pi->first_txq = tqidx;
815 		if (is_10G_port(pi) || is_40G_port(pi)) {
816 			pi->flags |= iaq.intr_flags_10g;
817 			pi->nrxq = iaq.nrxq10g;
818 			pi->ntxq = iaq.ntxq10g;
819 		} else {
820 			pi->flags |= iaq.intr_flags_1g;
821 			pi->nrxq = iaq.nrxq1g;
822 			pi->ntxq = iaq.ntxq1g;
823 		}
824 
825 		if (pi->ntxq > 1)
826 			pi->rsrv_noflowq = iaq.rsrv_noflowq ? 1 : 0;
827 		else
828 			pi->rsrv_noflowq = 0;
829 
830 		rqidx += pi->nrxq;
831 		tqidx += pi->ntxq;
832 #ifdef TCP_OFFLOAD
833 		if (is_offload(sc)) {
834 			pi->first_ofld_rxq = ofld_rqidx;
835 			pi->first_ofld_txq = ofld_tqidx;
836 			if (is_10G_port(pi) || is_40G_port(pi)) {
837 				pi->nofldrxq = iaq.nofldrxq10g;
838 				pi->nofldtxq = iaq.nofldtxq10g;
839 			} else {
840 				pi->nofldrxq = iaq.nofldrxq1g;
841 				pi->nofldtxq = iaq.nofldtxq1g;
842 			}
843 			ofld_rqidx += pi->nofldrxq;
844 			ofld_tqidx += pi->nofldtxq;
845 		}
846 #endif
847 #ifdef DEV_NETMAP
848 		pi->first_nm_rxq = nm_rqidx;
849 		pi->first_nm_txq = nm_tqidx;
850 		if (is_10G_port(pi) || is_40G_port(pi)) {
851 			pi->nnmrxq = iaq.nnmrxq10g;
852 			pi->nnmtxq = iaq.nnmtxq10g;
853 		} else {
854 			pi->nnmrxq = iaq.nnmrxq1g;
855 			pi->nnmtxq = iaq.nnmtxq1g;
856 		}
857 		nm_rqidx += pi->nnmrxq;
858 		nm_tqidx += pi->nnmtxq;
859 #endif
860 	}
861 
862 	rc = setup_intr_handlers(sc);
863 	if (rc != 0) {
864 		device_printf(dev,
865 		    "failed to setup interrupt handlers: %d\n", rc);
866 		goto done;
867 	}
868 
869 	rc = bus_generic_attach(dev);
870 	if (rc != 0) {
871 		device_printf(dev,
872 		    "failed to attach all child ports: %d\n", rc);
873 		goto done;
874 	}
875 
876 	switch (sc->params.pci.speed) {
877 		case 0x1:
878 			pcie_ts = "2.5";
879 			break;
880 		case 0x2:
881 			pcie_ts = "5.0";
882 			break;
883 		case 0x3:
884 			pcie_ts = "8.0";
885 			break;
886 		default:
887 			pcie_ts = "??";
888 			break;
889 	}
890 	device_printf(dev,
891 	    "PCIe x%d (%s GTS/s) (%d), %d ports, %d %s interrupt%s, %d eq, %d iq\n",
892 	    sc->params.pci.width, pcie_ts, sc->params.pci.speed,
893 	    sc->params.nports, sc->intr_count,
894 	    sc->intr_type == INTR_MSIX ? "MSI-X" :
895 	    (sc->intr_type == INTR_MSI ? "MSI" : "INTx"),
896 	    sc->intr_count > 1 ? "s" : "", sc->sge.neq, sc->sge.niq);
897 
898 	t4_set_desc(sc);
899 
900 done:
901 	if (rc != 0 && sc->cdev) {
902 		/* cdev was created and so cxgbetool works; recover that way. */
903 		device_printf(dev,
904 		    "error during attach, adapter is now in recovery mode.\n");
905 		rc = 0;
906 	}
907 
908 	if (rc != 0)
909 		t4_detach(dev);
910 	else
911 		t4_sysctls(sc);
912 
913 	return (rc);
914 }
915 
916 /*
917  * Idempotent
918  */
919 static int
920 t4_detach(device_t dev)
921 {
922 	struct adapter *sc;
923 	struct port_info *pi;
924 	int i, rc;
925 
926 	sc = device_get_softc(dev);
927 
928 	if (sc->flags & FULL_INIT_DONE)
929 		t4_intr_disable(sc);
930 
931 	if (sc->cdev) {
932 		destroy_dev(sc->cdev);
933 		sc->cdev = NULL;
934 	}
935 
936 	rc = bus_generic_detach(dev);
937 	if (rc) {
938 		device_printf(dev,
939 		    "failed to detach child devices: %d\n", rc);
940 		return (rc);
941 	}
942 
943 	for (i = 0; i < sc->intr_count; i++)
944 		t4_free_irq(sc, &sc->irq[i]);
945 
946 	for (i = 0; i < MAX_NPORTS; i++) {
947 		pi = sc->port[i];
948 		if (pi) {
949 			t4_free_vi(sc, sc->mbox, sc->pf, 0, pi->viid);
950 			if (pi->dev)
951 				device_delete_child(dev, pi->dev);
952 
953 			mtx_destroy(&pi->pi_lock);
954 			free(pi, M_CXGBE);
955 		}
956 	}
957 
958 	if (sc->flags & FULL_INIT_DONE)
959 		adapter_full_uninit(sc);
960 
961 	if (sc->flags & FW_OK)
962 		t4_fw_bye(sc, sc->mbox);
963 
964 	if (sc->intr_type == INTR_MSI || sc->intr_type == INTR_MSIX)
965 		pci_release_msi(dev);
966 
967 	if (sc->regs_res)
968 		bus_release_resource(dev, SYS_RES_MEMORY, sc->regs_rid,
969 		    sc->regs_res);
970 
971 	if (sc->udbs_res)
972 		bus_release_resource(dev, SYS_RES_MEMORY, sc->udbs_rid,
973 		    sc->udbs_res);
974 
975 	if (sc->msix_res)
976 		bus_release_resource(dev, SYS_RES_MEMORY, sc->msix_rid,
977 		    sc->msix_res);
978 
979 	if (sc->l2t)
980 		t4_free_l2t(sc->l2t);
981 
982 #ifdef TCP_OFFLOAD
983 	free(sc->sge.ofld_rxq, M_CXGBE);
984 	free(sc->sge.ofld_txq, M_CXGBE);
985 #endif
986 #ifdef DEV_NETMAP
987 	free(sc->sge.nm_rxq, M_CXGBE);
988 	free(sc->sge.nm_txq, M_CXGBE);
989 #endif
990 	free(sc->irq, M_CXGBE);
991 	free(sc->sge.rxq, M_CXGBE);
992 	free(sc->sge.txq, M_CXGBE);
993 	free(sc->sge.ctrlq, M_CXGBE);
994 	free(sc->sge.iqmap, M_CXGBE);
995 	free(sc->sge.eqmap, M_CXGBE);
996 	free(sc->tids.ftid_tab, M_CXGBE);
997 	t4_destroy_dma_tag(sc);
998 	if (mtx_initialized(&sc->sc_lock)) {
999 		sx_xlock(&t4_list_lock);
1000 		SLIST_REMOVE(&t4_list, sc, adapter, link);
1001 		sx_xunlock(&t4_list_lock);
1002 		mtx_destroy(&sc->sc_lock);
1003 	}
1004 
1005 	if (mtx_initialized(&sc->tids.ftid_lock))
1006 		mtx_destroy(&sc->tids.ftid_lock);
1007 	if (mtx_initialized(&sc->sfl_lock))
1008 		mtx_destroy(&sc->sfl_lock);
1009 	if (mtx_initialized(&sc->ifp_lock))
1010 		mtx_destroy(&sc->ifp_lock);
1011 
1012 	bzero(sc, sizeof(*sc));
1013 
1014 	return (0);
1015 }
1016 
1017 static int
1018 cxgbe_probe(device_t dev)
1019 {
1020 	char buf[128];
1021 	struct port_info *pi = device_get_softc(dev);
1022 
1023 	snprintf(buf, sizeof(buf), "port %d", pi->port_id);
1024 	device_set_desc_copy(dev, buf);
1025 
1026 	return (BUS_PROBE_DEFAULT);
1027 }
1028 
1029 #define T4_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \
1030     IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \
1031     IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6 | IFCAP_HWSTATS)
1032 #define T4_CAP_ENABLE (T4_CAP)
1033 
1034 static int
1035 cxgbe_attach(device_t dev)
1036 {
1037 	struct port_info *pi = device_get_softc(dev);
1038 	struct ifnet *ifp;
1039 	char *s;
1040 	int n, o;
1041 
1042 	/* Allocate an ifnet and set it up */
1043 	ifp = if_alloc(IFT_ETHER);
1044 	if (ifp == NULL) {
1045 		device_printf(dev, "Cannot allocate ifnet\n");
1046 		return (ENOMEM);
1047 	}
1048 	pi->ifp = ifp;
1049 	ifp->if_softc = pi;
1050 
1051 	callout_init(&pi->tick, CALLOUT_MPSAFE);
1052 
1053 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1054 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1055 
1056 	ifp->if_init = cxgbe_init;
1057 	ifp->if_ioctl = cxgbe_ioctl;
1058 	ifp->if_transmit = cxgbe_transmit;
1059 	ifp->if_qflush = cxgbe_qflush;
1060 
1061 	ifp->if_capabilities = T4_CAP;
1062 #ifdef TCP_OFFLOAD
1063 	if (is_offload(pi->adapter))
1064 		ifp->if_capabilities |= IFCAP_TOE;
1065 #endif
1066 	ifp->if_capenable = T4_CAP_ENABLE;
1067 	ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO |
1068 	    CSUM_UDP_IPV6 | CSUM_TCP_IPV6;
1069 
1070 	/* Initialize ifmedia for this port */
1071 	ifmedia_init(&pi->media, IFM_IMASK, cxgbe_media_change,
1072 	    cxgbe_media_status);
1073 	build_medialist(pi, &pi->media);
1074 
1075 	pi->vlan_c = EVENTHANDLER_REGISTER(vlan_config, cxgbe_vlan_config, ifp,
1076 	    EVENTHANDLER_PRI_ANY);
1077 
1078 	ether_ifattach(ifp, pi->hw_addr);
1079 
1080 	n = 128;
1081 	s = malloc(n, M_CXGBE, M_WAITOK);
1082 	o = snprintf(s, n, "%d txq, %d rxq (NIC)", pi->ntxq, pi->nrxq);
1083 	MPASS(n > o);
1084 #ifdef TCP_OFFLOAD
1085 	if (is_offload(pi->adapter)) {
1086 		o += snprintf(s + o, n - o, "; %d txq, %d rxq (TOE)",
1087 		    pi->nofldtxq, pi->nofldrxq);
1088 		MPASS(n > o);
1089 	}
1090 #endif
1091 #ifdef DEV_NETMAP
1092 	o += snprintf(s + o, n - o, "; %d txq, %d rxq (netmap)", pi->nnmtxq,
1093 	    pi->nnmrxq);
1094 	MPASS(n > o);
1095 #endif
1096 	device_printf(dev, "%s\n", s);
1097 	free(s, M_CXGBE);
1098 
1099 #ifdef DEV_NETMAP
1100 	/* nm_media handled here to keep implementation private to this file */
1101 	ifmedia_init(&pi->nm_media, IFM_IMASK, cxgbe_media_change,
1102 	    cxgbe_media_status);
1103 	build_medialist(pi, &pi->nm_media);
1104 	create_netmap_ifnet(pi);	/* logs errors it something fails */
1105 #endif
1106 	cxgbe_sysctls(pi);
1107 
1108 	return (0);
1109 }
1110 
1111 static int
1112 cxgbe_detach(device_t dev)
1113 {
1114 	struct port_info *pi = device_get_softc(dev);
1115 	struct adapter *sc = pi->adapter;
1116 	struct ifnet *ifp = pi->ifp;
1117 
1118 	/* Tell if_ioctl and if_init that the port is going away */
1119 	ADAPTER_LOCK(sc);
1120 	SET_DOOMED(pi);
1121 	wakeup(&sc->flags);
1122 	while (IS_BUSY(sc))
1123 		mtx_sleep(&sc->flags, &sc->sc_lock, 0, "t4detach", 0);
1124 	SET_BUSY(sc);
1125 #ifdef INVARIANTS
1126 	sc->last_op = "t4detach";
1127 	sc->last_op_thr = curthread;
1128 #endif
1129 	ADAPTER_UNLOCK(sc);
1130 
1131 	if (pi->flags & HAS_TRACEQ) {
1132 		sc->traceq = -1;	/* cloner should not create ifnet */
1133 		t4_tracer_port_detach(sc);
1134 	}
1135 
1136 	if (pi->vlan_c)
1137 		EVENTHANDLER_DEREGISTER(vlan_config, pi->vlan_c);
1138 
1139 	PORT_LOCK(pi);
1140 	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1141 	callout_stop(&pi->tick);
1142 	PORT_UNLOCK(pi);
1143 	callout_drain(&pi->tick);
1144 
1145 	/* Let detach proceed even if these fail. */
1146 	cxgbe_uninit_synchronized(pi);
1147 	port_full_uninit(pi);
1148 
1149 	ifmedia_removeall(&pi->media);
1150 	ether_ifdetach(pi->ifp);
1151 	if_free(pi->ifp);
1152 
1153 #ifdef DEV_NETMAP
1154 	/* XXXNM: equivalent of cxgbe_uninit_synchronized to ifdown nm_ifp */
1155 	destroy_netmap_ifnet(pi);
1156 #endif
1157 
1158 	ADAPTER_LOCK(sc);
1159 	CLR_BUSY(sc);
1160 	wakeup(&sc->flags);
1161 	ADAPTER_UNLOCK(sc);
1162 
1163 	return (0);
1164 }
1165 
1166 static void
1167 cxgbe_init(void *arg)
1168 {
1169 	struct port_info *pi = arg;
1170 	struct adapter *sc = pi->adapter;
1171 
1172 	if (begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4init") != 0)
1173 		return;
1174 	cxgbe_init_synchronized(pi);
1175 	end_synchronized_op(sc, 0);
1176 }
1177 
1178 static int
1179 cxgbe_ioctl(struct ifnet *ifp, unsigned long cmd, caddr_t data)
1180 {
1181 	int rc = 0, mtu, flags;
1182 	struct port_info *pi = ifp->if_softc;
1183 	struct adapter *sc = pi->adapter;
1184 	struct ifreq *ifr = (struct ifreq *)data;
1185 	uint32_t mask;
1186 
1187 	switch (cmd) {
1188 	case SIOCSIFMTU:
1189 		mtu = ifr->ifr_mtu;
1190 		if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO))
1191 			return (EINVAL);
1192 
1193 		rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4mtu");
1194 		if (rc)
1195 			return (rc);
1196 		ifp->if_mtu = mtu;
1197 		if (pi->flags & PORT_INIT_DONE) {
1198 			t4_update_fl_bufsize(ifp);
1199 			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1200 				rc = update_mac_settings(ifp, XGMAC_MTU);
1201 		}
1202 		end_synchronized_op(sc, 0);
1203 		break;
1204 
1205 	case SIOCSIFFLAGS:
1206 		rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4flg");
1207 		if (rc)
1208 			return (rc);
1209 
1210 		if (ifp->if_flags & IFF_UP) {
1211 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1212 				flags = pi->if_flags;
1213 				if ((ifp->if_flags ^ flags) &
1214 				    (IFF_PROMISC | IFF_ALLMULTI)) {
1215 					rc = update_mac_settings(ifp,
1216 					    XGMAC_PROMISC | XGMAC_ALLMULTI);
1217 				}
1218 			} else
1219 				rc = cxgbe_init_synchronized(pi);
1220 			pi->if_flags = ifp->if_flags;
1221 		} else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1222 			rc = cxgbe_uninit_synchronized(pi);
1223 		end_synchronized_op(sc, 0);
1224 		break;
1225 
1226 	case SIOCADDMULTI:
1227 	case SIOCDELMULTI: /* these two are called with a mutex held :-( */
1228 		rc = begin_synchronized_op(sc, pi, HOLD_LOCK, "t4multi");
1229 		if (rc)
1230 			return (rc);
1231 		if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1232 			rc = update_mac_settings(ifp, XGMAC_MCADDRS);
1233 		end_synchronized_op(sc, LOCK_HELD);
1234 		break;
1235 
1236 	case SIOCSIFCAP:
1237 		rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4cap");
1238 		if (rc)
1239 			return (rc);
1240 
1241 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1242 		if (mask & IFCAP_TXCSUM) {
1243 			ifp->if_capenable ^= IFCAP_TXCSUM;
1244 			ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
1245 
1246 			if (IFCAP_TSO4 & ifp->if_capenable &&
1247 			    !(IFCAP_TXCSUM & ifp->if_capenable)) {
1248 				ifp->if_capenable &= ~IFCAP_TSO4;
1249 				if_printf(ifp,
1250 				    "tso4 disabled due to -txcsum.\n");
1251 			}
1252 		}
1253 		if (mask & IFCAP_TXCSUM_IPV6) {
1254 			ifp->if_capenable ^= IFCAP_TXCSUM_IPV6;
1255 			ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6);
1256 
1257 			if (IFCAP_TSO6 & ifp->if_capenable &&
1258 			    !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
1259 				ifp->if_capenable &= ~IFCAP_TSO6;
1260 				if_printf(ifp,
1261 				    "tso6 disabled due to -txcsum6.\n");
1262 			}
1263 		}
1264 		if (mask & IFCAP_RXCSUM)
1265 			ifp->if_capenable ^= IFCAP_RXCSUM;
1266 		if (mask & IFCAP_RXCSUM_IPV6)
1267 			ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
1268 
1269 		/*
1270 		 * Note that we leave CSUM_TSO alone (it is always set).  The
1271 		 * kernel takes both IFCAP_TSOx and CSUM_TSO into account before
1272 		 * sending a TSO request our way, so it's sufficient to toggle
1273 		 * IFCAP_TSOx only.
1274 		 */
1275 		if (mask & IFCAP_TSO4) {
1276 			if (!(IFCAP_TSO4 & ifp->if_capenable) &&
1277 			    !(IFCAP_TXCSUM & ifp->if_capenable)) {
1278 				if_printf(ifp, "enable txcsum first.\n");
1279 				rc = EAGAIN;
1280 				goto fail;
1281 			}
1282 			ifp->if_capenable ^= IFCAP_TSO4;
1283 		}
1284 		if (mask & IFCAP_TSO6) {
1285 			if (!(IFCAP_TSO6 & ifp->if_capenable) &&
1286 			    !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
1287 				if_printf(ifp, "enable txcsum6 first.\n");
1288 				rc = EAGAIN;
1289 				goto fail;
1290 			}
1291 			ifp->if_capenable ^= IFCAP_TSO6;
1292 		}
1293 		if (mask & IFCAP_LRO) {
1294 #if defined(INET) || defined(INET6)
1295 			int i;
1296 			struct sge_rxq *rxq;
1297 
1298 			ifp->if_capenable ^= IFCAP_LRO;
1299 			for_each_rxq(pi, i, rxq) {
1300 				if (ifp->if_capenable & IFCAP_LRO)
1301 					rxq->iq.flags |= IQ_LRO_ENABLED;
1302 				else
1303 					rxq->iq.flags &= ~IQ_LRO_ENABLED;
1304 			}
1305 #endif
1306 		}
1307 #ifdef TCP_OFFLOAD
1308 		if (mask & IFCAP_TOE) {
1309 			int enable = (ifp->if_capenable ^ mask) & IFCAP_TOE;
1310 
1311 			rc = toe_capability(pi, enable);
1312 			if (rc != 0)
1313 				goto fail;
1314 
1315 			ifp->if_capenable ^= mask;
1316 		}
1317 #endif
1318 		if (mask & IFCAP_VLAN_HWTAGGING) {
1319 			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1320 			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1321 				rc = update_mac_settings(ifp, XGMAC_VLANEX);
1322 		}
1323 		if (mask & IFCAP_VLAN_MTU) {
1324 			ifp->if_capenable ^= IFCAP_VLAN_MTU;
1325 
1326 			/* Need to find out how to disable auto-mtu-inflation */
1327 		}
1328 		if (mask & IFCAP_VLAN_HWTSO)
1329 			ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
1330 		if (mask & IFCAP_VLAN_HWCSUM)
1331 			ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
1332 
1333 #ifdef VLAN_CAPABILITIES
1334 		VLAN_CAPABILITIES(ifp);
1335 #endif
1336 fail:
1337 		end_synchronized_op(sc, 0);
1338 		break;
1339 
1340 	case SIOCSIFMEDIA:
1341 	case SIOCGIFMEDIA:
1342 		ifmedia_ioctl(ifp, ifr, &pi->media, cmd);
1343 		break;
1344 
1345 	default:
1346 		rc = ether_ioctl(ifp, cmd, data);
1347 	}
1348 
1349 	return (rc);
1350 }
1351 
1352 static int
1353 cxgbe_transmit(struct ifnet *ifp, struct mbuf *m)
1354 {
1355 	struct port_info *pi = ifp->if_softc;
1356 	struct adapter *sc = pi->adapter;
1357 	struct sge_txq *txq = &sc->sge.txq[pi->first_txq];
1358 	struct buf_ring *br;
1359 	int rc;
1360 
1361 	M_ASSERTPKTHDR(m);
1362 
1363 	if (__predict_false(pi->link_cfg.link_ok == 0)) {
1364 		m_freem(m);
1365 		return (ENETDOWN);
1366 	}
1367 
1368 	if (m->m_flags & M_FLOWID)
1369 		txq += ((m->m_pkthdr.flowid % (pi->ntxq - pi->rsrv_noflowq))
1370 		    + pi->rsrv_noflowq);
1371 	br = txq->br;
1372 
1373 	if (TXQ_TRYLOCK(txq) == 0) {
1374 		struct sge_eq *eq = &txq->eq;
1375 
1376 		/*
1377 		 * It is possible that t4_eth_tx finishes up and releases the
1378 		 * lock between the TRYLOCK above and the drbr_enqueue here.  We
1379 		 * need to make sure that this mbuf doesn't just sit there in
1380 		 * the drbr.
1381 		 */
1382 
1383 		rc = drbr_enqueue(ifp, br, m);
1384 		if (rc == 0 && callout_pending(&eq->tx_callout) == 0 &&
1385 		    !(eq->flags & EQ_DOOMED))
1386 			callout_reset(&eq->tx_callout, 1, t4_tx_callout, eq);
1387 		return (rc);
1388 	}
1389 
1390 	/*
1391 	 * txq->m is the mbuf that is held up due to a temporary shortage of
1392 	 * resources and it should be put on the wire first.  Then what's in
1393 	 * drbr and finally the mbuf that was just passed in to us.
1394 	 *
1395 	 * Return code should indicate the fate of the mbuf that was passed in
1396 	 * this time.
1397 	 */
1398 
1399 	TXQ_LOCK_ASSERT_OWNED(txq);
1400 	if (drbr_needs_enqueue(ifp, br) || txq->m) {
1401 
1402 		/* Queued for transmission. */
1403 
1404 		rc = drbr_enqueue(ifp, br, m);
1405 		m = txq->m ? txq->m : drbr_dequeue(ifp, br);
1406 		(void) t4_eth_tx(ifp, txq, m);
1407 		TXQ_UNLOCK(txq);
1408 		return (rc);
1409 	}
1410 
1411 	/* Direct transmission. */
1412 	rc = t4_eth_tx(ifp, txq, m);
1413 	if (rc != 0 && txq->m)
1414 		rc = 0;	/* held, will be transmitted soon (hopefully) */
1415 
1416 	TXQ_UNLOCK(txq);
1417 	return (rc);
1418 }
1419 
1420 static void
1421 cxgbe_qflush(struct ifnet *ifp)
1422 {
1423 	struct port_info *pi = ifp->if_softc;
1424 	struct sge_txq *txq;
1425 	int i;
1426 	struct mbuf *m;
1427 
1428 	/* queues do not exist if !PORT_INIT_DONE. */
1429 	if (pi->flags & PORT_INIT_DONE) {
1430 		for_each_txq(pi, i, txq) {
1431 			TXQ_LOCK(txq);
1432 			m_freem(txq->m);
1433 			txq->m = NULL;
1434 			while ((m = buf_ring_dequeue_sc(txq->br)) != NULL)
1435 				m_freem(m);
1436 			TXQ_UNLOCK(txq);
1437 		}
1438 	}
1439 	if_qflush(ifp);
1440 }
1441 
1442 static int
1443 cxgbe_media_change(struct ifnet *ifp)
1444 {
1445 	struct port_info *pi = ifp->if_softc;
1446 
1447 	device_printf(pi->dev, "%s unimplemented.\n", __func__);
1448 
1449 	return (EOPNOTSUPP);
1450 }
1451 
1452 static void
1453 cxgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1454 {
1455 	struct port_info *pi = ifp->if_softc;
1456 	struct ifmedia *media = NULL;
1457 	struct ifmedia_entry *cur;
1458 	int speed = pi->link_cfg.speed;
1459 	int data = (pi->port_type << 8) | pi->mod_type;
1460 
1461 	if (ifp == pi->ifp)
1462 		media = &pi->media;
1463 #ifdef DEV_NETMAP
1464 	else if (ifp == pi->nm_ifp)
1465 		media = &pi->nm_media;
1466 #endif
1467 	MPASS(media != NULL);
1468 
1469 	cur = media->ifm_cur;
1470 	if (cur->ifm_data != data) {
1471 		build_medialist(pi, media);
1472 		cur = media->ifm_cur;
1473 	}
1474 
1475 	ifmr->ifm_status = IFM_AVALID;
1476 	if (!pi->link_cfg.link_ok)
1477 		return;
1478 
1479 	ifmr->ifm_status |= IFM_ACTIVE;
1480 
1481 	/* active and current will differ iff current media is autoselect. */
1482 	if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
1483 		return;
1484 
1485 	ifmr->ifm_active = IFM_ETHER | IFM_FDX;
1486 	if (speed == SPEED_10000)
1487 		ifmr->ifm_active |= IFM_10G_T;
1488 	else if (speed == SPEED_1000)
1489 		ifmr->ifm_active |= IFM_1000_T;
1490 	else if (speed == SPEED_100)
1491 		ifmr->ifm_active |= IFM_100_TX;
1492 	else if (speed == SPEED_10)
1493 		ifmr->ifm_active |= IFM_10_T;
1494 	else
1495 		KASSERT(0, ("%s: link up but speed unknown (%u)", __func__,
1496 			    speed));
1497 }
1498 
1499 void
1500 t4_fatal_err(struct adapter *sc)
1501 {
1502 	t4_set_reg_field(sc, A_SGE_CONTROL, F_GLOBALENABLE, 0);
1503 	t4_intr_disable(sc);
1504 	log(LOG_EMERG, "%s: encountered fatal error, adapter stopped.\n",
1505 	    device_get_nameunit(sc->dev));
1506 }
1507 
1508 static int
1509 map_bars_0_and_4(struct adapter *sc)
1510 {
1511 	sc->regs_rid = PCIR_BAR(0);
1512 	sc->regs_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
1513 	    &sc->regs_rid, RF_ACTIVE);
1514 	if (sc->regs_res == NULL) {
1515 		device_printf(sc->dev, "cannot map registers.\n");
1516 		return (ENXIO);
1517 	}
1518 	sc->bt = rman_get_bustag(sc->regs_res);
1519 	sc->bh = rman_get_bushandle(sc->regs_res);
1520 	sc->mmio_len = rman_get_size(sc->regs_res);
1521 	setbit(&sc->doorbells, DOORBELL_KDB);
1522 
1523 	sc->msix_rid = PCIR_BAR(4);
1524 	sc->msix_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
1525 	    &sc->msix_rid, RF_ACTIVE);
1526 	if (sc->msix_res == NULL) {
1527 		device_printf(sc->dev, "cannot map MSI-X BAR.\n");
1528 		return (ENXIO);
1529 	}
1530 
1531 	return (0);
1532 }
1533 
1534 static int
1535 map_bar_2(struct adapter *sc)
1536 {
1537 
1538 	/*
1539 	 * T4: only iWARP driver uses the userspace doorbells.  There is no need
1540 	 * to map it if RDMA is disabled.
1541 	 */
1542 	if (is_t4(sc) && sc->rdmacaps == 0)
1543 		return (0);
1544 
1545 	sc->udbs_rid = PCIR_BAR(2);
1546 	sc->udbs_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
1547 	    &sc->udbs_rid, RF_ACTIVE);
1548 	if (sc->udbs_res == NULL) {
1549 		device_printf(sc->dev, "cannot map doorbell BAR.\n");
1550 		return (ENXIO);
1551 	}
1552 	sc->udbs_base = rman_get_virtual(sc->udbs_res);
1553 
1554 	if (is_t5(sc)) {
1555 		setbit(&sc->doorbells, DOORBELL_UDB);
1556 #if defined(__i386__) || defined(__amd64__)
1557 		if (t5_write_combine) {
1558 			int rc;
1559 
1560 			/*
1561 			 * Enable write combining on BAR2.  This is the
1562 			 * userspace doorbell BAR and is split into 128B
1563 			 * (UDBS_SEG_SIZE) doorbell regions, each associated
1564 			 * with an egress queue.  The first 64B has the doorbell
1565 			 * and the second 64B can be used to submit a tx work
1566 			 * request with an implicit doorbell.
1567 			 */
1568 
1569 			rc = pmap_change_attr((vm_offset_t)sc->udbs_base,
1570 			    rman_get_size(sc->udbs_res), PAT_WRITE_COMBINING);
1571 			if (rc == 0) {
1572 				clrbit(&sc->doorbells, DOORBELL_UDB);
1573 				setbit(&sc->doorbells, DOORBELL_WCWR);
1574 				setbit(&sc->doorbells, DOORBELL_UDBWC);
1575 			} else {
1576 				device_printf(sc->dev,
1577 				    "couldn't enable write combining: %d\n",
1578 				    rc);
1579 			}
1580 
1581 			t4_write_reg(sc, A_SGE_STAT_CFG,
1582 			    V_STATSOURCE_T5(7) | V_STATMODE(0));
1583 		}
1584 #endif
1585 	}
1586 
1587 	return (0);
1588 }
1589 
1590 static const struct memwin t4_memwin[] = {
1591 	{ MEMWIN0_BASE, MEMWIN0_APERTURE },
1592 	{ MEMWIN1_BASE, MEMWIN1_APERTURE },
1593 	{ MEMWIN2_BASE_T4, MEMWIN2_APERTURE_T4 }
1594 };
1595 
1596 static const struct memwin t5_memwin[] = {
1597 	{ MEMWIN0_BASE, MEMWIN0_APERTURE },
1598 	{ MEMWIN1_BASE, MEMWIN1_APERTURE },
1599 	{ MEMWIN2_BASE_T5, MEMWIN2_APERTURE_T5 },
1600 };
1601 
1602 static void
1603 setup_memwin(struct adapter *sc)
1604 {
1605 	const struct memwin *mw;
1606 	int i, n;
1607 	uint32_t bar0;
1608 
1609 	if (is_t4(sc)) {
1610 		/*
1611 		 * Read low 32b of bar0 indirectly via the hardware backdoor
1612 		 * mechanism.  Works from within PCI passthrough environments
1613 		 * too, where rman_get_start() can return a different value.  We
1614 		 * need to program the T4 memory window decoders with the actual
1615 		 * addresses that will be coming across the PCIe link.
1616 		 */
1617 		bar0 = t4_hw_pci_read_cfg4(sc, PCIR_BAR(0));
1618 		bar0 &= (uint32_t) PCIM_BAR_MEM_BASE;
1619 
1620 		mw = &t4_memwin[0];
1621 		n = nitems(t4_memwin);
1622 	} else {
1623 		/* T5 uses the relative offset inside the PCIe BAR */
1624 		bar0 = 0;
1625 
1626 		mw = &t5_memwin[0];
1627 		n = nitems(t5_memwin);
1628 	}
1629 
1630 	for (i = 0; i < n; i++, mw++) {
1631 		t4_write_reg(sc,
1632 		    PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, i),
1633 		    (mw->base + bar0) | V_BIR(0) |
1634 		    V_WINDOW(ilog2(mw->aperture) - 10));
1635 	}
1636 
1637 	/* flush */
1638 	t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2));
1639 }
1640 
1641 /*
1642  * Verify that the memory range specified by the addr/len pair is valid and lies
1643  * entirely within a single region (EDCx or MCx).
1644  */
1645 static int
1646 validate_mem_range(struct adapter *sc, uint32_t addr, int len)
1647 {
1648 	uint32_t em, addr_len, maddr, mlen;
1649 
1650 	/* Memory can only be accessed in naturally aligned 4 byte units */
1651 	if (addr & 3 || len & 3 || len == 0)
1652 		return (EINVAL);
1653 
1654 	/* Enabled memories */
1655 	em = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
1656 	if (em & F_EDRAM0_ENABLE) {
1657 		addr_len = t4_read_reg(sc, A_MA_EDRAM0_BAR);
1658 		maddr = G_EDRAM0_BASE(addr_len) << 20;
1659 		mlen = G_EDRAM0_SIZE(addr_len) << 20;
1660 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1661 		    addr + len <= maddr + mlen)
1662 			return (0);
1663 	}
1664 	if (em & F_EDRAM1_ENABLE) {
1665 		addr_len = t4_read_reg(sc, A_MA_EDRAM1_BAR);
1666 		maddr = G_EDRAM1_BASE(addr_len) << 20;
1667 		mlen = G_EDRAM1_SIZE(addr_len) << 20;
1668 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1669 		    addr + len <= maddr + mlen)
1670 			return (0);
1671 	}
1672 	if (em & F_EXT_MEM_ENABLE) {
1673 		addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
1674 		maddr = G_EXT_MEM_BASE(addr_len) << 20;
1675 		mlen = G_EXT_MEM_SIZE(addr_len) << 20;
1676 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1677 		    addr + len <= maddr + mlen)
1678 			return (0);
1679 	}
1680 	if (!is_t4(sc) && em & F_EXT_MEM1_ENABLE) {
1681 		addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
1682 		maddr = G_EXT_MEM1_BASE(addr_len) << 20;
1683 		mlen = G_EXT_MEM1_SIZE(addr_len) << 20;
1684 		if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1685 		    addr + len <= maddr + mlen)
1686 			return (0);
1687 	}
1688 
1689 	return (EFAULT);
1690 }
1691 
1692 static int
1693 fwmtype_to_hwmtype(int mtype)
1694 {
1695 
1696 	switch (mtype) {
1697 	case FW_MEMTYPE_EDC0:
1698 		return (MEM_EDC0);
1699 	case FW_MEMTYPE_EDC1:
1700 		return (MEM_EDC1);
1701 	case FW_MEMTYPE_EXTMEM:
1702 		return (MEM_MC0);
1703 	case FW_MEMTYPE_EXTMEM1:
1704 		return (MEM_MC1);
1705 	default:
1706 		panic("%s: cannot translate fw mtype %d.", __func__, mtype);
1707 	}
1708 }
1709 
1710 /*
1711  * Verify that the memory range specified by the memtype/offset/len pair is
1712  * valid and lies entirely within the memtype specified.  The global address of
1713  * the start of the range is returned in addr.
1714  */
1715 static int
1716 validate_mt_off_len(struct adapter *sc, int mtype, uint32_t off, int len,
1717     uint32_t *addr)
1718 {
1719 	uint32_t em, addr_len, maddr, mlen;
1720 
1721 	/* Memory can only be accessed in naturally aligned 4 byte units */
1722 	if (off & 3 || len & 3 || len == 0)
1723 		return (EINVAL);
1724 
1725 	em = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
1726 	switch (fwmtype_to_hwmtype(mtype)) {
1727 	case MEM_EDC0:
1728 		if (!(em & F_EDRAM0_ENABLE))
1729 			return (EINVAL);
1730 		addr_len = t4_read_reg(sc, A_MA_EDRAM0_BAR);
1731 		maddr = G_EDRAM0_BASE(addr_len) << 20;
1732 		mlen = G_EDRAM0_SIZE(addr_len) << 20;
1733 		break;
1734 	case MEM_EDC1:
1735 		if (!(em & F_EDRAM1_ENABLE))
1736 			return (EINVAL);
1737 		addr_len = t4_read_reg(sc, A_MA_EDRAM1_BAR);
1738 		maddr = G_EDRAM1_BASE(addr_len) << 20;
1739 		mlen = G_EDRAM1_SIZE(addr_len) << 20;
1740 		break;
1741 	case MEM_MC:
1742 		if (!(em & F_EXT_MEM_ENABLE))
1743 			return (EINVAL);
1744 		addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
1745 		maddr = G_EXT_MEM_BASE(addr_len) << 20;
1746 		mlen = G_EXT_MEM_SIZE(addr_len) << 20;
1747 		break;
1748 	case MEM_MC1:
1749 		if (is_t4(sc) || !(em & F_EXT_MEM1_ENABLE))
1750 			return (EINVAL);
1751 		addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
1752 		maddr = G_EXT_MEM1_BASE(addr_len) << 20;
1753 		mlen = G_EXT_MEM1_SIZE(addr_len) << 20;
1754 		break;
1755 	default:
1756 		return (EINVAL);
1757 	}
1758 
1759 	if (mlen > 0 && off < mlen && off + len <= mlen) {
1760 		*addr = maddr + off;	/* global address */
1761 		return (0);
1762 	}
1763 
1764 	return (EFAULT);
1765 }
1766 
1767 static void
1768 memwin_info(struct adapter *sc, int win, uint32_t *base, uint32_t *aperture)
1769 {
1770 	const struct memwin *mw;
1771 
1772 	if (is_t4(sc)) {
1773 		KASSERT(win >= 0 && win < nitems(t4_memwin),
1774 		    ("%s: incorrect memwin# (%d)", __func__, win));
1775 		mw = &t4_memwin[win];
1776 	} else {
1777 		KASSERT(win >= 0 && win < nitems(t5_memwin),
1778 		    ("%s: incorrect memwin# (%d)", __func__, win));
1779 		mw = &t5_memwin[win];
1780 	}
1781 
1782 	if (base != NULL)
1783 		*base = mw->base;
1784 	if (aperture != NULL)
1785 		*aperture = mw->aperture;
1786 }
1787 
1788 /*
1789  * Positions the memory window such that it can be used to access the specified
1790  * address in the chip's address space.  The return value is the offset of addr
1791  * from the start of the window.
1792  */
1793 static uint32_t
1794 position_memwin(struct adapter *sc, int n, uint32_t addr)
1795 {
1796 	uint32_t start, pf;
1797 	uint32_t reg;
1798 
1799 	KASSERT(n >= 0 && n <= 3,
1800 	    ("%s: invalid window %d.", __func__, n));
1801 	KASSERT((addr & 3) == 0,
1802 	    ("%s: addr (0x%x) is not at a 4B boundary.", __func__, addr));
1803 
1804 	if (is_t4(sc)) {
1805 		pf = 0;
1806 		start = addr & ~0xf;	/* start must be 16B aligned */
1807 	} else {
1808 		pf = V_PFNUM(sc->pf);
1809 		start = addr & ~0x7f;	/* start must be 128B aligned */
1810 	}
1811 	reg = PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, n);
1812 
1813 	t4_write_reg(sc, reg, start | pf);
1814 	t4_read_reg(sc, reg);
1815 
1816 	return (addr - start);
1817 }
1818 
1819 static int
1820 cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g,
1821     struct intrs_and_queues *iaq)
1822 {
1823 	int rc, itype, navail, nrxq10g, nrxq1g, n;
1824 	int nofldrxq10g = 0, nofldrxq1g = 0;
1825 	int nnmrxq10g = 0, nnmrxq1g = 0;
1826 
1827 	bzero(iaq, sizeof(*iaq));
1828 
1829 	iaq->ntxq10g = t4_ntxq10g;
1830 	iaq->ntxq1g = t4_ntxq1g;
1831 	iaq->nrxq10g = nrxq10g = t4_nrxq10g;
1832 	iaq->nrxq1g = nrxq1g = t4_nrxq1g;
1833 	iaq->rsrv_noflowq = t4_rsrv_noflowq;
1834 #ifdef TCP_OFFLOAD
1835 	if (is_offload(sc)) {
1836 		iaq->nofldtxq10g = t4_nofldtxq10g;
1837 		iaq->nofldtxq1g = t4_nofldtxq1g;
1838 		iaq->nofldrxq10g = nofldrxq10g = t4_nofldrxq10g;
1839 		iaq->nofldrxq1g = nofldrxq1g = t4_nofldrxq1g;
1840 	}
1841 #endif
1842 #ifdef DEV_NETMAP
1843 	iaq->nnmtxq10g = t4_nnmtxq10g;
1844 	iaq->nnmtxq1g = t4_nnmtxq1g;
1845 	iaq->nnmrxq10g = nnmrxq10g = t4_nnmrxq10g;
1846 	iaq->nnmrxq1g = nnmrxq1g = t4_nnmrxq1g;
1847 #endif
1848 
1849 	for (itype = INTR_MSIX; itype; itype >>= 1) {
1850 
1851 		if ((itype & t4_intr_types) == 0)
1852 			continue;	/* not allowed */
1853 
1854 		if (itype == INTR_MSIX)
1855 			navail = pci_msix_count(sc->dev);
1856 		else if (itype == INTR_MSI)
1857 			navail = pci_msi_count(sc->dev);
1858 		else
1859 			navail = 1;
1860 restart:
1861 		if (navail == 0)
1862 			continue;
1863 
1864 		iaq->intr_type = itype;
1865 		iaq->intr_flags_10g = 0;
1866 		iaq->intr_flags_1g = 0;
1867 
1868 		/*
1869 		 * Best option: an interrupt vector for errors, one for the
1870 		 * firmware event queue, and one for every rxq (NIC, TOE, and
1871 		 * netmap).
1872 		 */
1873 		iaq->nirq = T4_EXTRA_INTR;
1874 		iaq->nirq += n10g * (nrxq10g + nofldrxq10g + nnmrxq10g);
1875 		iaq->nirq += n1g * (nrxq1g + nofldrxq1g + nnmrxq1g);
1876 		if (iaq->nirq <= navail &&
1877 		    (itype != INTR_MSI || powerof2(iaq->nirq))) {
1878 			iaq->intr_flags_10g = INTR_ALL;
1879 			iaq->intr_flags_1g = INTR_ALL;
1880 			goto allocate;
1881 		}
1882 
1883 		/*
1884 		 * Second best option: a vector for errors, one for the firmware
1885 		 * event queue, and vectors for either all the NIC rx queues or
1886 		 * all the TOE rx queues.  The queues that don't get vectors
1887 		 * will forward their interrupts to those that do.
1888 		 *
1889 		 * Note: netmap rx queues cannot be created early and so they
1890 		 * can't be setup to receive forwarded interrupts for others.
1891 		 */
1892 		iaq->nirq = T4_EXTRA_INTR;
1893 		if (nrxq10g >= nofldrxq10g) {
1894 			iaq->intr_flags_10g = INTR_RXQ;
1895 			iaq->nirq += n10g * nrxq10g;
1896 #ifdef DEV_NETMAP
1897 			iaq->nnmrxq10g = min(nnmrxq10g, nrxq10g);
1898 #endif
1899 		} else {
1900 			iaq->intr_flags_10g = INTR_OFLD_RXQ;
1901 			iaq->nirq += n10g * nofldrxq10g;
1902 #ifdef DEV_NETMAP
1903 			iaq->nnmrxq10g = min(nnmrxq10g, nofldrxq10g);
1904 #endif
1905 		}
1906 		if (nrxq1g >= nofldrxq1g) {
1907 			iaq->intr_flags_1g = INTR_RXQ;
1908 			iaq->nirq += n1g * nrxq1g;
1909 #ifdef DEV_NETMAP
1910 			iaq->nnmrxq1g = min(nnmrxq1g, nrxq1g);
1911 #endif
1912 		} else {
1913 			iaq->intr_flags_1g = INTR_OFLD_RXQ;
1914 			iaq->nirq += n1g * nofldrxq1g;
1915 #ifdef DEV_NETMAP
1916 			iaq->nnmrxq1g = min(nnmrxq1g, nofldrxq1g);
1917 #endif
1918 		}
1919 		if (iaq->nirq <= navail &&
1920 		    (itype != INTR_MSI || powerof2(iaq->nirq)))
1921 			goto allocate;
1922 
1923 		/*
1924 		 * Next best option: an interrupt vector for errors, one for the
1925 		 * firmware event queue, and at least one per port.  At this
1926 		 * point we know we'll have to downsize nrxq and/or nofldrxq
1927 		 * and/or nnmrxq to fit what's available to us.
1928 		 */
1929 		iaq->nirq = T4_EXTRA_INTR;
1930 		iaq->nirq += n10g + n1g;
1931 		if (iaq->nirq <= navail) {
1932 			int leftover = navail - iaq->nirq;
1933 
1934 			if (n10g > 0) {
1935 				int target = max(nrxq10g, nofldrxq10g);
1936 
1937 				iaq->intr_flags_10g = nrxq10g >= nofldrxq10g ?
1938 				    INTR_RXQ : INTR_OFLD_RXQ;
1939 
1940 				n = 1;
1941 				while (n < target && leftover >= n10g) {
1942 					leftover -= n10g;
1943 					iaq->nirq += n10g;
1944 					n++;
1945 				}
1946 				iaq->nrxq10g = min(n, nrxq10g);
1947 #ifdef TCP_OFFLOAD
1948 				iaq->nofldrxq10g = min(n, nofldrxq10g);
1949 #endif
1950 #ifdef DEV_NETMAP
1951 				iaq->nnmrxq10g = min(n, nnmrxq10g);
1952 #endif
1953 			}
1954 
1955 			if (n1g > 0) {
1956 				int target = max(nrxq1g, nofldrxq1g);
1957 
1958 				iaq->intr_flags_1g = nrxq1g >= nofldrxq1g ?
1959 				    INTR_RXQ : INTR_OFLD_RXQ;
1960 
1961 				n = 1;
1962 				while (n < target && leftover >= n1g) {
1963 					leftover -= n1g;
1964 					iaq->nirq += n1g;
1965 					n++;
1966 				}
1967 				iaq->nrxq1g = min(n, nrxq1g);
1968 #ifdef TCP_OFFLOAD
1969 				iaq->nofldrxq1g = min(n, nofldrxq1g);
1970 #endif
1971 #ifdef DEV_NETMAP
1972 				iaq->nnmrxq1g = min(n, nnmrxq1g);
1973 #endif
1974 			}
1975 
1976 			if (itype != INTR_MSI || powerof2(iaq->nirq))
1977 				goto allocate;
1978 		}
1979 
1980 		/*
1981 		 * Least desirable option: one interrupt vector for everything.
1982 		 */
1983 		iaq->nirq = iaq->nrxq10g = iaq->nrxq1g = 1;
1984 		iaq->intr_flags_10g = iaq->intr_flags_1g = 0;
1985 #ifdef TCP_OFFLOAD
1986 		if (is_offload(sc))
1987 			iaq->nofldrxq10g = iaq->nofldrxq1g = 1;
1988 #endif
1989 #ifdef DEV_NETMAP
1990 		iaq->nnmrxq10g = iaq->nnmrxq1g = 1;
1991 #endif
1992 
1993 allocate:
1994 		navail = iaq->nirq;
1995 		rc = 0;
1996 		if (itype == INTR_MSIX)
1997 			rc = pci_alloc_msix(sc->dev, &navail);
1998 		else if (itype == INTR_MSI)
1999 			rc = pci_alloc_msi(sc->dev, &navail);
2000 
2001 		if (rc == 0) {
2002 			if (navail == iaq->nirq)
2003 				return (0);
2004 
2005 			/*
2006 			 * Didn't get the number requested.  Use whatever number
2007 			 * the kernel is willing to allocate (it's in navail).
2008 			 */
2009 			device_printf(sc->dev, "fewer vectors than requested, "
2010 			    "type=%d, req=%d, rcvd=%d; will downshift req.\n",
2011 			    itype, iaq->nirq, navail);
2012 			pci_release_msi(sc->dev);
2013 			goto restart;
2014 		}
2015 
2016 		device_printf(sc->dev,
2017 		    "failed to allocate vectors:%d, type=%d, req=%d, rcvd=%d\n",
2018 		    itype, rc, iaq->nirq, navail);
2019 	}
2020 
2021 	device_printf(sc->dev,
2022 	    "failed to find a usable interrupt type.  "
2023 	    "allowed=%d, msi-x=%d, msi=%d, intx=1", t4_intr_types,
2024 	    pci_msix_count(sc->dev), pci_msi_count(sc->dev));
2025 
2026 	return (ENXIO);
2027 }
2028 
2029 #define FW_VERSION(chip) ( \
2030     V_FW_HDR_FW_VER_MAJOR(chip##FW_VERSION_MAJOR) | \
2031     V_FW_HDR_FW_VER_MINOR(chip##FW_VERSION_MINOR) | \
2032     V_FW_HDR_FW_VER_MICRO(chip##FW_VERSION_MICRO) | \
2033     V_FW_HDR_FW_VER_BUILD(chip##FW_VERSION_BUILD))
2034 #define FW_INTFVER(chip, intf) (chip##FW_HDR_INTFVER_##intf)
2035 
2036 struct fw_info {
2037 	uint8_t chip;
2038 	char *kld_name;
2039 	char *fw_mod_name;
2040 	struct fw_hdr fw_hdr;	/* XXX: waste of space, need a sparse struct */
2041 } fw_info[] = {
2042 	{
2043 		.chip = CHELSIO_T4,
2044 		.kld_name = "t4fw_cfg",
2045 		.fw_mod_name = "t4fw",
2046 		.fw_hdr = {
2047 			.chip = FW_HDR_CHIP_T4,
2048 			.fw_ver = htobe32_const(FW_VERSION(T4)),
2049 			.intfver_nic = FW_INTFVER(T4, NIC),
2050 			.intfver_vnic = FW_INTFVER(T4, VNIC),
2051 			.intfver_ofld = FW_INTFVER(T4, OFLD),
2052 			.intfver_ri = FW_INTFVER(T4, RI),
2053 			.intfver_iscsipdu = FW_INTFVER(T4, ISCSIPDU),
2054 			.intfver_iscsi = FW_INTFVER(T4, ISCSI),
2055 			.intfver_fcoepdu = FW_INTFVER(T4, FCOEPDU),
2056 			.intfver_fcoe = FW_INTFVER(T4, FCOE),
2057 		},
2058 	}, {
2059 		.chip = CHELSIO_T5,
2060 		.kld_name = "t5fw_cfg",
2061 		.fw_mod_name = "t5fw",
2062 		.fw_hdr = {
2063 			.chip = FW_HDR_CHIP_T5,
2064 			.fw_ver = htobe32_const(FW_VERSION(T5)),
2065 			.intfver_nic = FW_INTFVER(T5, NIC),
2066 			.intfver_vnic = FW_INTFVER(T5, VNIC),
2067 			.intfver_ofld = FW_INTFVER(T5, OFLD),
2068 			.intfver_ri = FW_INTFVER(T5, RI),
2069 			.intfver_iscsipdu = FW_INTFVER(T5, ISCSIPDU),
2070 			.intfver_iscsi = FW_INTFVER(T5, ISCSI),
2071 			.intfver_fcoepdu = FW_INTFVER(T5, FCOEPDU),
2072 			.intfver_fcoe = FW_INTFVER(T5, FCOE),
2073 		},
2074 	}
2075 };
2076 
2077 static struct fw_info *
2078 find_fw_info(int chip)
2079 {
2080 	int i;
2081 
2082 	for (i = 0; i < nitems(fw_info); i++) {
2083 		if (fw_info[i].chip == chip)
2084 			return (&fw_info[i]);
2085 	}
2086 	return (NULL);
2087 }
2088 
2089 /*
2090  * Is the given firmware API compatible with the one the driver was compiled
2091  * with?
2092  */
2093 static int
2094 fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2)
2095 {
2096 
2097 	/* short circuit if it's the exact same firmware version */
2098 	if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver)
2099 		return (1);
2100 
2101 	/*
2102 	 * XXX: Is this too conservative?  Perhaps I should limit this to the
2103 	 * features that are supported in the driver.
2104 	 */
2105 #define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x)
2106 	if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) &&
2107 	    SAME_INTF(ofld) && SAME_INTF(ri) && SAME_INTF(iscsipdu) &&
2108 	    SAME_INTF(iscsi) && SAME_INTF(fcoepdu) && SAME_INTF(fcoe))
2109 		return (1);
2110 #undef SAME_INTF
2111 
2112 	return (0);
2113 }
2114 
2115 /*
2116  * The firmware in the KLD is usable, but should it be installed?  This routine
2117  * explains itself in detail if it indicates the KLD firmware should be
2118  * installed.
2119  */
2120 static int
2121 should_install_kld_fw(struct adapter *sc, int card_fw_usable, int k, int c)
2122 {
2123 	const char *reason;
2124 
2125 	if (!card_fw_usable) {
2126 		reason = "incompatible or unusable";
2127 		goto install;
2128 	}
2129 
2130 	if (k > c) {
2131 		reason = "older than the version bundled with this driver";
2132 		goto install;
2133 	}
2134 
2135 	if (t4_fw_install == 2 && k != c) {
2136 		reason = "different than the version bundled with this driver";
2137 		goto install;
2138 	}
2139 
2140 	return (0);
2141 
2142 install:
2143 	if (t4_fw_install == 0) {
2144 		device_printf(sc->dev, "firmware on card (%u.%u.%u.%u) is %s, "
2145 		    "but the driver is prohibited from installing a different "
2146 		    "firmware on the card.\n",
2147 		    G_FW_HDR_FW_VER_MAJOR(c), G_FW_HDR_FW_VER_MINOR(c),
2148 		    G_FW_HDR_FW_VER_MICRO(c), G_FW_HDR_FW_VER_BUILD(c), reason);
2149 
2150 		return (0);
2151 	}
2152 
2153 	device_printf(sc->dev, "firmware on card (%u.%u.%u.%u) is %s, "
2154 	    "installing firmware %u.%u.%u.%u on card.\n",
2155 	    G_FW_HDR_FW_VER_MAJOR(c), G_FW_HDR_FW_VER_MINOR(c),
2156 	    G_FW_HDR_FW_VER_MICRO(c), G_FW_HDR_FW_VER_BUILD(c), reason,
2157 	    G_FW_HDR_FW_VER_MAJOR(k), G_FW_HDR_FW_VER_MINOR(k),
2158 	    G_FW_HDR_FW_VER_MICRO(k), G_FW_HDR_FW_VER_BUILD(k));
2159 
2160 	return (1);
2161 }
2162 /*
2163  * Establish contact with the firmware and determine if we are the master driver
2164  * or not, and whether we are responsible for chip initialization.
2165  */
2166 static int
2167 prep_firmware(struct adapter *sc)
2168 {
2169 	const struct firmware *fw = NULL, *default_cfg;
2170 	int rc, pf, card_fw_usable, kld_fw_usable, need_fw_reset = 1;
2171 	enum dev_state state;
2172 	struct fw_info *fw_info;
2173 	struct fw_hdr *card_fw;		/* fw on the card */
2174 	const struct fw_hdr *kld_fw;	/* fw in the KLD */
2175 	const struct fw_hdr *drv_fw;	/* fw header the driver was compiled
2176 					   against */
2177 
2178 	/* Contact firmware. */
2179 	rc = t4_fw_hello(sc, sc->mbox, sc->mbox, MASTER_MAY, &state);
2180 	if (rc < 0 || state == DEV_STATE_ERR) {
2181 		rc = -rc;
2182 		device_printf(sc->dev,
2183 		    "failed to connect to the firmware: %d, %d.\n", rc, state);
2184 		return (rc);
2185 	}
2186 	pf = rc;
2187 	if (pf == sc->mbox)
2188 		sc->flags |= MASTER_PF;
2189 	else if (state == DEV_STATE_UNINIT) {
2190 		/*
2191 		 * We didn't get to be the master so we definitely won't be
2192 		 * configuring the chip.  It's a bug if someone else hasn't
2193 		 * configured it already.
2194 		 */
2195 		device_printf(sc->dev, "couldn't be master(%d), "
2196 		    "device not already initialized either(%d).\n", rc, state);
2197 		return (EDOOFUS);
2198 	}
2199 
2200 	/* This is the firmware whose headers the driver was compiled against */
2201 	fw_info = find_fw_info(chip_id(sc));
2202 	if (fw_info == NULL) {
2203 		device_printf(sc->dev,
2204 		    "unable to look up firmware information for chip %d.\n",
2205 		    chip_id(sc));
2206 		return (EINVAL);
2207 	}
2208 	drv_fw = &fw_info->fw_hdr;
2209 
2210 	/*
2211 	 * The firmware KLD contains many modules.  The KLD name is also the
2212 	 * name of the module that contains the default config file.
2213 	 */
2214 	default_cfg = firmware_get(fw_info->kld_name);
2215 
2216 	/* Read the header of the firmware on the card */
2217 	card_fw = malloc(sizeof(*card_fw), M_CXGBE, M_ZERO | M_WAITOK);
2218 	rc = -t4_read_flash(sc, FLASH_FW_START,
2219 	    sizeof (*card_fw) / sizeof (uint32_t), (uint32_t *)card_fw, 1);
2220 	if (rc == 0)
2221 		card_fw_usable = fw_compatible(drv_fw, (const void*)card_fw);
2222 	else {
2223 		device_printf(sc->dev,
2224 		    "Unable to read card's firmware header: %d\n", rc);
2225 		card_fw_usable = 0;
2226 	}
2227 
2228 	/* This is the firmware in the KLD */
2229 	fw = firmware_get(fw_info->fw_mod_name);
2230 	if (fw != NULL) {
2231 		kld_fw = (const void *)fw->data;
2232 		kld_fw_usable = fw_compatible(drv_fw, kld_fw);
2233 	} else {
2234 		kld_fw = NULL;
2235 		kld_fw_usable = 0;
2236 	}
2237 
2238 	if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver &&
2239 	    (!kld_fw_usable || kld_fw->fw_ver == drv_fw->fw_ver)) {
2240 		/*
2241 		 * Common case: the firmware on the card is an exact match and
2242 		 * the KLD is an exact match too, or the KLD is
2243 		 * absent/incompatible.  Note that t4_fw_install = 2 is ignored
2244 		 * here -- use cxgbetool loadfw if you want to reinstall the
2245 		 * same firmware as the one on the card.
2246 		 */
2247 	} else if (kld_fw_usable && state == DEV_STATE_UNINIT &&
2248 	    should_install_kld_fw(sc, card_fw_usable, be32toh(kld_fw->fw_ver),
2249 	    be32toh(card_fw->fw_ver))) {
2250 
2251 		rc = -t4_fw_upgrade(sc, sc->mbox, fw->data, fw->datasize, 0);
2252 		if (rc != 0) {
2253 			device_printf(sc->dev,
2254 			    "failed to install firmware: %d\n", rc);
2255 			goto done;
2256 		}
2257 
2258 		/* Installed successfully, update the cached header too. */
2259 		memcpy(card_fw, kld_fw, sizeof(*card_fw));
2260 		card_fw_usable = 1;
2261 		need_fw_reset = 0;	/* already reset as part of load_fw */
2262 	}
2263 
2264 	if (!card_fw_usable) {
2265 		uint32_t d, c, k;
2266 
2267 		d = ntohl(drv_fw->fw_ver);
2268 		c = ntohl(card_fw->fw_ver);
2269 		k = kld_fw ? ntohl(kld_fw->fw_ver) : 0;
2270 
2271 		device_printf(sc->dev, "Cannot find a usable firmware: "
2272 		    "fw_install %d, chip state %d, "
2273 		    "driver compiled with %d.%d.%d.%d, "
2274 		    "card has %d.%d.%d.%d, KLD has %d.%d.%d.%d\n",
2275 		    t4_fw_install, state,
2276 		    G_FW_HDR_FW_VER_MAJOR(d), G_FW_HDR_FW_VER_MINOR(d),
2277 		    G_FW_HDR_FW_VER_MICRO(d), G_FW_HDR_FW_VER_BUILD(d),
2278 		    G_FW_HDR_FW_VER_MAJOR(c), G_FW_HDR_FW_VER_MINOR(c),
2279 		    G_FW_HDR_FW_VER_MICRO(c), G_FW_HDR_FW_VER_BUILD(c),
2280 		    G_FW_HDR_FW_VER_MAJOR(k), G_FW_HDR_FW_VER_MINOR(k),
2281 		    G_FW_HDR_FW_VER_MICRO(k), G_FW_HDR_FW_VER_BUILD(k));
2282 		rc = EINVAL;
2283 		goto done;
2284 	}
2285 
2286 	/* We're using whatever's on the card and it's known to be good. */
2287 	sc->params.fw_vers = ntohl(card_fw->fw_ver);
2288 	snprintf(sc->fw_version, sizeof(sc->fw_version), "%u.%u.%u.%u",
2289 	    G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers),
2290 	    G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers),
2291 	    G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers),
2292 	    G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers));
2293 	t4_get_tp_version(sc, &sc->params.tp_vers);
2294 
2295 	/* Reset device */
2296 	if (need_fw_reset &&
2297 	    (rc = -t4_fw_reset(sc, sc->mbox, F_PIORSTMODE | F_PIORST)) != 0) {
2298 		device_printf(sc->dev, "firmware reset failed: %d.\n", rc);
2299 		if (rc != ETIMEDOUT && rc != EIO)
2300 			t4_fw_bye(sc, sc->mbox);
2301 		goto done;
2302 	}
2303 	sc->flags |= FW_OK;
2304 
2305 	rc = get_params__pre_init(sc);
2306 	if (rc != 0)
2307 		goto done; /* error message displayed already */
2308 
2309 	/* Partition adapter resources as specified in the config file. */
2310 	if (state == DEV_STATE_UNINIT) {
2311 
2312 		KASSERT(sc->flags & MASTER_PF,
2313 		    ("%s: trying to change chip settings when not master.",
2314 		    __func__));
2315 
2316 		rc = partition_resources(sc, default_cfg, fw_info->kld_name);
2317 		if (rc != 0)
2318 			goto done;	/* error message displayed already */
2319 
2320 		t4_tweak_chip_settings(sc);
2321 
2322 		/* get basic stuff going */
2323 		rc = -t4_fw_initialize(sc, sc->mbox);
2324 		if (rc != 0) {
2325 			device_printf(sc->dev, "fw init failed: %d.\n", rc);
2326 			goto done;
2327 		}
2328 	} else {
2329 		snprintf(sc->cfg_file, sizeof(sc->cfg_file), "pf%d", pf);
2330 		sc->cfcsum = 0;
2331 	}
2332 
2333 done:
2334 	free(card_fw, M_CXGBE);
2335 	if (fw != NULL)
2336 		firmware_put(fw, FIRMWARE_UNLOAD);
2337 	if (default_cfg != NULL)
2338 		firmware_put(default_cfg, FIRMWARE_UNLOAD);
2339 
2340 	return (rc);
2341 }
2342 
2343 #define FW_PARAM_DEV(param) \
2344 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | \
2345 	 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_##param))
2346 #define FW_PARAM_PFVF(param) \
2347 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_PFVF) | \
2348 	 V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_PFVF_##param))
2349 
2350 /*
2351  * Partition chip resources for use between various PFs, VFs, etc.
2352  */
2353 static int
2354 partition_resources(struct adapter *sc, const struct firmware *default_cfg,
2355     const char *name_prefix)
2356 {
2357 	const struct firmware *cfg = NULL;
2358 	int rc = 0;
2359 	struct fw_caps_config_cmd caps;
2360 	uint32_t mtype, moff, finicsum, cfcsum;
2361 
2362 	/*
2363 	 * Figure out what configuration file to use.  Pick the default config
2364 	 * file for the card if the user hasn't specified one explicitly.
2365 	 */
2366 	snprintf(sc->cfg_file, sizeof(sc->cfg_file), "%s", t4_cfg_file);
2367 	if (strncmp(t4_cfg_file, DEFAULT_CF, sizeof(t4_cfg_file)) == 0) {
2368 		/* Card specific overrides go here. */
2369 		if (pci_get_device(sc->dev) == 0x440a)
2370 			snprintf(sc->cfg_file, sizeof(sc->cfg_file), UWIRE_CF);
2371 		if (is_fpga(sc))
2372 			snprintf(sc->cfg_file, sizeof(sc->cfg_file), FPGA_CF);
2373 	}
2374 
2375 	/*
2376 	 * We need to load another module if the profile is anything except
2377 	 * "default" or "flash".
2378 	 */
2379 	if (strncmp(sc->cfg_file, DEFAULT_CF, sizeof(sc->cfg_file)) != 0 &&
2380 	    strncmp(sc->cfg_file, FLASH_CF, sizeof(sc->cfg_file)) != 0) {
2381 		char s[32];
2382 
2383 		snprintf(s, sizeof(s), "%s_%s", name_prefix, sc->cfg_file);
2384 		cfg = firmware_get(s);
2385 		if (cfg == NULL) {
2386 			if (default_cfg != NULL) {
2387 				device_printf(sc->dev,
2388 				    "unable to load module \"%s\" for "
2389 				    "configuration profile \"%s\", will use "
2390 				    "the default config file instead.\n",
2391 				    s, sc->cfg_file);
2392 				snprintf(sc->cfg_file, sizeof(sc->cfg_file),
2393 				    "%s", DEFAULT_CF);
2394 			} else {
2395 				device_printf(sc->dev,
2396 				    "unable to load module \"%s\" for "
2397 				    "configuration profile \"%s\", will use "
2398 				    "the config file on the card's flash "
2399 				    "instead.\n", s, sc->cfg_file);
2400 				snprintf(sc->cfg_file, sizeof(sc->cfg_file),
2401 				    "%s", FLASH_CF);
2402 			}
2403 		}
2404 	}
2405 
2406 	if (strncmp(sc->cfg_file, DEFAULT_CF, sizeof(sc->cfg_file)) == 0 &&
2407 	    default_cfg == NULL) {
2408 		device_printf(sc->dev,
2409 		    "default config file not available, will use the config "
2410 		    "file on the card's flash instead.\n");
2411 		snprintf(sc->cfg_file, sizeof(sc->cfg_file), "%s", FLASH_CF);
2412 	}
2413 
2414 	if (strncmp(sc->cfg_file, FLASH_CF, sizeof(sc->cfg_file)) != 0) {
2415 		u_int cflen, i, n;
2416 		const uint32_t *cfdata;
2417 		uint32_t param, val, addr, off, mw_base, mw_aperture;
2418 
2419 		KASSERT(cfg != NULL || default_cfg != NULL,
2420 		    ("%s: no config to upload", __func__));
2421 
2422 		/*
2423 		 * Ask the firmware where it wants us to upload the config file.
2424 		 */
2425 		param = FW_PARAM_DEV(CF);
2426 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
2427 		if (rc != 0) {
2428 			/* No support for config file?  Shouldn't happen. */
2429 			device_printf(sc->dev,
2430 			    "failed to query config file location: %d.\n", rc);
2431 			goto done;
2432 		}
2433 		mtype = G_FW_PARAMS_PARAM_Y(val);
2434 		moff = G_FW_PARAMS_PARAM_Z(val) << 16;
2435 
2436 		/*
2437 		 * XXX: sheer laziness.  We deliberately added 4 bytes of
2438 		 * useless stuffing/comments at the end of the config file so
2439 		 * it's ok to simply throw away the last remaining bytes when
2440 		 * the config file is not an exact multiple of 4.  This also
2441 		 * helps with the validate_mt_off_len check.
2442 		 */
2443 		if (cfg != NULL) {
2444 			cflen = cfg->datasize & ~3;
2445 			cfdata = cfg->data;
2446 		} else {
2447 			cflen = default_cfg->datasize & ~3;
2448 			cfdata = default_cfg->data;
2449 		}
2450 
2451 		if (cflen > FLASH_CFG_MAX_SIZE) {
2452 			device_printf(sc->dev,
2453 			    "config file too long (%d, max allowed is %d).  "
2454 			    "Will try to use the config on the card, if any.\n",
2455 			    cflen, FLASH_CFG_MAX_SIZE);
2456 			goto use_config_on_flash;
2457 		}
2458 
2459 		rc = validate_mt_off_len(sc, mtype, moff, cflen, &addr);
2460 		if (rc != 0) {
2461 			device_printf(sc->dev,
2462 			    "%s: addr (%d/0x%x) or len %d is not valid: %d.  "
2463 			    "Will try to use the config on the card, if any.\n",
2464 			    __func__, mtype, moff, cflen, rc);
2465 			goto use_config_on_flash;
2466 		}
2467 
2468 		memwin_info(sc, 2, &mw_base, &mw_aperture);
2469 		while (cflen) {
2470 			off = position_memwin(sc, 2, addr);
2471 			n = min(cflen, mw_aperture - off);
2472 			for (i = 0; i < n; i += 4)
2473 				t4_write_reg(sc, mw_base + off + i, *cfdata++);
2474 			cflen -= n;
2475 			addr += n;
2476 		}
2477 	} else {
2478 use_config_on_flash:
2479 		mtype = FW_MEMTYPE_FLASH;
2480 		moff = t4_flash_cfg_addr(sc);
2481 	}
2482 
2483 	bzero(&caps, sizeof(caps));
2484 	caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
2485 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
2486 	caps.cfvalid_to_len16 = htobe32(F_FW_CAPS_CONFIG_CMD_CFVALID |
2487 	    V_FW_CAPS_CONFIG_CMD_MEMTYPE_CF(mtype) |
2488 	    V_FW_CAPS_CONFIG_CMD_MEMADDR64K_CF(moff >> 16) | FW_LEN16(caps));
2489 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), &caps);
2490 	if (rc != 0) {
2491 		device_printf(sc->dev,
2492 		    "failed to pre-process config file: %d "
2493 		    "(mtype %d, moff 0x%x).\n", rc, mtype, moff);
2494 		goto done;
2495 	}
2496 
2497 	finicsum = be32toh(caps.finicsum);
2498 	cfcsum = be32toh(caps.cfcsum);
2499 	if (finicsum != cfcsum) {
2500 		device_printf(sc->dev,
2501 		    "WARNING: config file checksum mismatch: %08x %08x\n",
2502 		    finicsum, cfcsum);
2503 	}
2504 	sc->cfcsum = cfcsum;
2505 
2506 #define LIMIT_CAPS(x) do { \
2507 	caps.x &= htobe16(t4_##x##_allowed); \
2508 } while (0)
2509 
2510 	/*
2511 	 * Let the firmware know what features will (not) be used so it can tune
2512 	 * things accordingly.
2513 	 */
2514 	LIMIT_CAPS(linkcaps);
2515 	LIMIT_CAPS(niccaps);
2516 	LIMIT_CAPS(toecaps);
2517 	LIMIT_CAPS(rdmacaps);
2518 	LIMIT_CAPS(iscsicaps);
2519 	LIMIT_CAPS(fcoecaps);
2520 #undef LIMIT_CAPS
2521 
2522 	caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
2523 	    F_FW_CMD_REQUEST | F_FW_CMD_WRITE);
2524 	caps.cfvalid_to_len16 = htobe32(FW_LEN16(caps));
2525 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), NULL);
2526 	if (rc != 0) {
2527 		device_printf(sc->dev,
2528 		    "failed to process config file: %d.\n", rc);
2529 	}
2530 done:
2531 	if (cfg != NULL)
2532 		firmware_put(cfg, FIRMWARE_UNLOAD);
2533 	return (rc);
2534 }
2535 
2536 /*
2537  * Retrieve parameters that are needed (or nice to have) very early.
2538  */
2539 static int
2540 get_params__pre_init(struct adapter *sc)
2541 {
2542 	int rc;
2543 	uint32_t param[2], val[2];
2544 	struct fw_devlog_cmd cmd;
2545 	struct devlog_params *dlog = &sc->params.devlog;
2546 
2547 	param[0] = FW_PARAM_DEV(PORTVEC);
2548 	param[1] = FW_PARAM_DEV(CCLK);
2549 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
2550 	if (rc != 0) {
2551 		device_printf(sc->dev,
2552 		    "failed to query parameters (pre_init): %d.\n", rc);
2553 		return (rc);
2554 	}
2555 
2556 	sc->params.portvec = val[0];
2557 	sc->params.nports = bitcount32(val[0]);
2558 	sc->params.vpd.cclk = val[1];
2559 
2560 	/* Read device log parameters. */
2561 	bzero(&cmd, sizeof(cmd));
2562 	cmd.op_to_write = htobe32(V_FW_CMD_OP(FW_DEVLOG_CMD) |
2563 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
2564 	cmd.retval_len16 = htobe32(FW_LEN16(cmd));
2565 	rc = -t4_wr_mbox(sc, sc->mbox, &cmd, sizeof(cmd), &cmd);
2566 	if (rc != 0) {
2567 		device_printf(sc->dev,
2568 		    "failed to get devlog parameters: %d.\n", rc);
2569 		bzero(dlog, sizeof (*dlog));
2570 		rc = 0;	/* devlog isn't critical for device operation */
2571 	} else {
2572 		val[0] = be32toh(cmd.memtype_devlog_memaddr16_devlog);
2573 		dlog->memtype = G_FW_DEVLOG_CMD_MEMTYPE_DEVLOG(val[0]);
2574 		dlog->start = G_FW_DEVLOG_CMD_MEMADDR16_DEVLOG(val[0]) << 4;
2575 		dlog->size = be32toh(cmd.memsize_devlog);
2576 	}
2577 
2578 	return (rc);
2579 }
2580 
2581 /*
2582  * Retrieve various parameters that are of interest to the driver.  The device
2583  * has been initialized by the firmware at this point.
2584  */
2585 static int
2586 get_params__post_init(struct adapter *sc)
2587 {
2588 	int rc;
2589 	uint32_t param[7], val[7];
2590 	struct fw_caps_config_cmd caps;
2591 
2592 	param[0] = FW_PARAM_PFVF(IQFLINT_START);
2593 	param[1] = FW_PARAM_PFVF(EQ_START);
2594 	param[2] = FW_PARAM_PFVF(FILTER_START);
2595 	param[3] = FW_PARAM_PFVF(FILTER_END);
2596 	param[4] = FW_PARAM_PFVF(L2T_START);
2597 	param[5] = FW_PARAM_PFVF(L2T_END);
2598 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2599 	if (rc != 0) {
2600 		device_printf(sc->dev,
2601 		    "failed to query parameters (post_init): %d.\n", rc);
2602 		return (rc);
2603 	}
2604 
2605 	sc->sge.iq_start = val[0];
2606 	sc->sge.eq_start = val[1];
2607 	sc->tids.ftid_base = val[2];
2608 	sc->tids.nftids = val[3] - val[2] + 1;
2609 	sc->params.ftid_min = val[2];
2610 	sc->params.ftid_max = val[3];
2611 	sc->vres.l2t.start = val[4];
2612 	sc->vres.l2t.size = val[5] - val[4] + 1;
2613 	KASSERT(sc->vres.l2t.size <= L2T_SIZE,
2614 	    ("%s: L2 table size (%u) larger than expected (%u)",
2615 	    __func__, sc->vres.l2t.size, L2T_SIZE));
2616 
2617 	/* get capabilites */
2618 	bzero(&caps, sizeof(caps));
2619 	caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
2620 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
2621 	caps.cfvalid_to_len16 = htobe32(FW_LEN16(caps));
2622 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), &caps);
2623 	if (rc != 0) {
2624 		device_printf(sc->dev,
2625 		    "failed to get card capabilities: %d.\n", rc);
2626 		return (rc);
2627 	}
2628 
2629 #define READ_CAPS(x) do { \
2630 	sc->x = htobe16(caps.x); \
2631 } while (0)
2632 	READ_CAPS(linkcaps);
2633 	READ_CAPS(niccaps);
2634 	READ_CAPS(toecaps);
2635 	READ_CAPS(rdmacaps);
2636 	READ_CAPS(iscsicaps);
2637 	READ_CAPS(fcoecaps);
2638 
2639 	if (sc->niccaps & FW_CAPS_CONFIG_NIC_ETHOFLD) {
2640 		param[0] = FW_PARAM_PFVF(ETHOFLD_START);
2641 		param[1] = FW_PARAM_PFVF(ETHOFLD_END);
2642 		param[2] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ);
2643 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 3, param, val);
2644 		if (rc != 0) {
2645 			device_printf(sc->dev,
2646 			    "failed to query NIC parameters: %d.\n", rc);
2647 			return (rc);
2648 		}
2649 		sc->tids.etid_base = val[0];
2650 		sc->params.etid_min = val[0];
2651 		sc->tids.netids = val[1] - val[0] + 1;
2652 		sc->params.netids = sc->tids.netids;
2653 		sc->params.eo_wr_cred = val[2];
2654 		sc->params.ethoffload = 1;
2655 	}
2656 
2657 	if (sc->toecaps) {
2658 		/* query offload-related parameters */
2659 		param[0] = FW_PARAM_DEV(NTID);
2660 		param[1] = FW_PARAM_PFVF(SERVER_START);
2661 		param[2] = FW_PARAM_PFVF(SERVER_END);
2662 		param[3] = FW_PARAM_PFVF(TDDP_START);
2663 		param[4] = FW_PARAM_PFVF(TDDP_END);
2664 		param[5] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ);
2665 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2666 		if (rc != 0) {
2667 			device_printf(sc->dev,
2668 			    "failed to query TOE parameters: %d.\n", rc);
2669 			return (rc);
2670 		}
2671 		sc->tids.ntids = val[0];
2672 		sc->tids.natids = min(sc->tids.ntids / 2, MAX_ATIDS);
2673 		sc->tids.stid_base = val[1];
2674 		sc->tids.nstids = val[2] - val[1] + 1;
2675 		sc->vres.ddp.start = val[3];
2676 		sc->vres.ddp.size = val[4] - val[3] + 1;
2677 		sc->params.ofldq_wr_cred = val[5];
2678 		sc->params.offload = 1;
2679 	}
2680 	if (sc->rdmacaps) {
2681 		param[0] = FW_PARAM_PFVF(STAG_START);
2682 		param[1] = FW_PARAM_PFVF(STAG_END);
2683 		param[2] = FW_PARAM_PFVF(RQ_START);
2684 		param[3] = FW_PARAM_PFVF(RQ_END);
2685 		param[4] = FW_PARAM_PFVF(PBL_START);
2686 		param[5] = FW_PARAM_PFVF(PBL_END);
2687 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2688 		if (rc != 0) {
2689 			device_printf(sc->dev,
2690 			    "failed to query RDMA parameters(1): %d.\n", rc);
2691 			return (rc);
2692 		}
2693 		sc->vres.stag.start = val[0];
2694 		sc->vres.stag.size = val[1] - val[0] + 1;
2695 		sc->vres.rq.start = val[2];
2696 		sc->vres.rq.size = val[3] - val[2] + 1;
2697 		sc->vres.pbl.start = val[4];
2698 		sc->vres.pbl.size = val[5] - val[4] + 1;
2699 
2700 		param[0] = FW_PARAM_PFVF(SQRQ_START);
2701 		param[1] = FW_PARAM_PFVF(SQRQ_END);
2702 		param[2] = FW_PARAM_PFVF(CQ_START);
2703 		param[3] = FW_PARAM_PFVF(CQ_END);
2704 		param[4] = FW_PARAM_PFVF(OCQ_START);
2705 		param[5] = FW_PARAM_PFVF(OCQ_END);
2706 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2707 		if (rc != 0) {
2708 			device_printf(sc->dev,
2709 			    "failed to query RDMA parameters(2): %d.\n", rc);
2710 			return (rc);
2711 		}
2712 		sc->vres.qp.start = val[0];
2713 		sc->vres.qp.size = val[1] - val[0] + 1;
2714 		sc->vres.cq.start = val[2];
2715 		sc->vres.cq.size = val[3] - val[2] + 1;
2716 		sc->vres.ocq.start = val[4];
2717 		sc->vres.ocq.size = val[5] - val[4] + 1;
2718 	}
2719 	if (sc->iscsicaps) {
2720 		param[0] = FW_PARAM_PFVF(ISCSI_START);
2721 		param[1] = FW_PARAM_PFVF(ISCSI_END);
2722 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
2723 		if (rc != 0) {
2724 			device_printf(sc->dev,
2725 			    "failed to query iSCSI parameters: %d.\n", rc);
2726 			return (rc);
2727 		}
2728 		sc->vres.iscsi.start = val[0];
2729 		sc->vres.iscsi.size = val[1] - val[0] + 1;
2730 	}
2731 
2732 	/*
2733 	 * We've got the params we wanted to query via the firmware.  Now grab
2734 	 * some others directly from the chip.
2735 	 */
2736 	rc = t4_read_chip_settings(sc);
2737 
2738 	return (rc);
2739 }
2740 
2741 static int
2742 set_params__post_init(struct adapter *sc)
2743 {
2744 	uint32_t param, val;
2745 
2746 	/* ask for encapsulated CPLs */
2747 	param = FW_PARAM_PFVF(CPLFW4MSG_ENCAP);
2748 	val = 1;
2749 	(void)t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
2750 
2751 	return (0);
2752 }
2753 
2754 #undef FW_PARAM_PFVF
2755 #undef FW_PARAM_DEV
2756 
2757 static void
2758 t4_set_desc(struct adapter *sc)
2759 {
2760 	char buf[128];
2761 	struct adapter_params *p = &sc->params;
2762 
2763 	snprintf(buf, sizeof(buf), "Chelsio %s %sNIC (rev %d), S/N:%s, "
2764 	    "P/N:%s, E/C:%s", p->vpd.id, is_offload(sc) ? "R" : "",
2765 	    chip_rev(sc), p->vpd.sn, p->vpd.pn, p->vpd.ec);
2766 
2767 	device_set_desc_copy(sc->dev, buf);
2768 }
2769 
2770 static void
2771 build_medialist(struct port_info *pi, struct ifmedia *media)
2772 {
2773 	int data, m;
2774 
2775 	PORT_LOCK(pi);
2776 
2777 	ifmedia_removeall(media);
2778 
2779 	m = IFM_ETHER | IFM_FDX;
2780 	data = (pi->port_type << 8) | pi->mod_type;
2781 
2782 	switch(pi->port_type) {
2783 	case FW_PORT_TYPE_BT_XFI:
2784 		ifmedia_add(media, m | IFM_10G_T, data, NULL);
2785 		break;
2786 
2787 	case FW_PORT_TYPE_BT_XAUI:
2788 		ifmedia_add(media, m | IFM_10G_T, data, NULL);
2789 		/* fall through */
2790 
2791 	case FW_PORT_TYPE_BT_SGMII:
2792 		ifmedia_add(media, m | IFM_1000_T, data, NULL);
2793 		ifmedia_add(media, m | IFM_100_TX, data, NULL);
2794 		ifmedia_add(media, IFM_ETHER | IFM_AUTO, data, NULL);
2795 		ifmedia_set(media, IFM_ETHER | IFM_AUTO);
2796 		break;
2797 
2798 	case FW_PORT_TYPE_CX4:
2799 		ifmedia_add(media, m | IFM_10G_CX4, data, NULL);
2800 		ifmedia_set(media, m | IFM_10G_CX4);
2801 		break;
2802 
2803 	case FW_PORT_TYPE_QSFP_10G:
2804 	case FW_PORT_TYPE_SFP:
2805 	case FW_PORT_TYPE_FIBER_XFI:
2806 	case FW_PORT_TYPE_FIBER_XAUI:
2807 		switch (pi->mod_type) {
2808 
2809 		case FW_PORT_MOD_TYPE_LR:
2810 			ifmedia_add(media, m | IFM_10G_LR, data, NULL);
2811 			ifmedia_set(media, m | IFM_10G_LR);
2812 			break;
2813 
2814 		case FW_PORT_MOD_TYPE_SR:
2815 			ifmedia_add(media, m | IFM_10G_SR, data, NULL);
2816 			ifmedia_set(media, m | IFM_10G_SR);
2817 			break;
2818 
2819 		case FW_PORT_MOD_TYPE_LRM:
2820 			ifmedia_add(media, m | IFM_10G_LRM, data, NULL);
2821 			ifmedia_set(media, m | IFM_10G_LRM);
2822 			break;
2823 
2824 		case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
2825 		case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
2826 			ifmedia_add(media, m | IFM_10G_TWINAX, data, NULL);
2827 			ifmedia_set(media, m | IFM_10G_TWINAX);
2828 			break;
2829 
2830 		case FW_PORT_MOD_TYPE_NONE:
2831 			m &= ~IFM_FDX;
2832 			ifmedia_add(media, m | IFM_NONE, data, NULL);
2833 			ifmedia_set(media, m | IFM_NONE);
2834 			break;
2835 
2836 		case FW_PORT_MOD_TYPE_NA:
2837 		case FW_PORT_MOD_TYPE_ER:
2838 		default:
2839 			device_printf(pi->dev,
2840 			    "unknown port_type (%d), mod_type (%d)\n",
2841 			    pi->port_type, pi->mod_type);
2842 			ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
2843 			ifmedia_set(media, m | IFM_UNKNOWN);
2844 			break;
2845 		}
2846 		break;
2847 
2848 	case FW_PORT_TYPE_QSFP:
2849 		switch (pi->mod_type) {
2850 
2851 		case FW_PORT_MOD_TYPE_LR:
2852 			ifmedia_add(media, m | IFM_40G_LR4, data, NULL);
2853 			ifmedia_set(media, m | IFM_40G_LR4);
2854 			break;
2855 
2856 		case FW_PORT_MOD_TYPE_SR:
2857 			ifmedia_add(media, m | IFM_40G_SR4, data, NULL);
2858 			ifmedia_set(media, m | IFM_40G_SR4);
2859 			break;
2860 
2861 		case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
2862 		case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
2863 			ifmedia_add(media, m | IFM_40G_CR4, data, NULL);
2864 			ifmedia_set(media, m | IFM_40G_CR4);
2865 			break;
2866 
2867 		case FW_PORT_MOD_TYPE_NONE:
2868 			m &= ~IFM_FDX;
2869 			ifmedia_add(media, m | IFM_NONE, data, NULL);
2870 			ifmedia_set(media, m | IFM_NONE);
2871 			break;
2872 
2873 		default:
2874 			device_printf(pi->dev,
2875 			    "unknown port_type (%d), mod_type (%d)\n",
2876 			    pi->port_type, pi->mod_type);
2877 			ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
2878 			ifmedia_set(media, m | IFM_UNKNOWN);
2879 			break;
2880 		}
2881 		break;
2882 
2883 	default:
2884 		device_printf(pi->dev,
2885 		    "unknown port_type (%d), mod_type (%d)\n", pi->port_type,
2886 		    pi->mod_type);
2887 		ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
2888 		ifmedia_set(media, m | IFM_UNKNOWN);
2889 		break;
2890 	}
2891 
2892 	PORT_UNLOCK(pi);
2893 }
2894 
2895 #define FW_MAC_EXACT_CHUNK	7
2896 
2897 /*
2898  * Program the port's XGMAC based on parameters in ifnet.  The caller also
2899  * indicates which parameters should be programmed (the rest are left alone).
2900  */
2901 int
2902 update_mac_settings(struct ifnet *ifp, int flags)
2903 {
2904 	int rc = 0;
2905 	struct port_info *pi = ifp->if_softc;
2906 	struct adapter *sc = pi->adapter;
2907 	int mtu = -1, promisc = -1, allmulti = -1, vlanex = -1;
2908 	uint16_t viid = 0xffff;
2909 	int16_t *xact_addr_filt = NULL;
2910 
2911 	ASSERT_SYNCHRONIZED_OP(sc);
2912 	KASSERT(flags, ("%s: not told what to update.", __func__));
2913 
2914 	if (ifp == pi->ifp) {
2915 		viid = pi->viid;
2916 		xact_addr_filt = &pi->xact_addr_filt;
2917 	}
2918 #ifdef DEV_NETMAP
2919 	else if (ifp == pi->nm_ifp) {
2920 		viid = pi->nm_viid;
2921 		xact_addr_filt = &pi->nm_xact_addr_filt;
2922 	}
2923 #endif
2924 	if (flags & XGMAC_MTU)
2925 		mtu = ifp->if_mtu;
2926 
2927 	if (flags & XGMAC_PROMISC)
2928 		promisc = ifp->if_flags & IFF_PROMISC ? 1 : 0;
2929 
2930 	if (flags & XGMAC_ALLMULTI)
2931 		allmulti = ifp->if_flags & IFF_ALLMULTI ? 1 : 0;
2932 
2933 	if (flags & XGMAC_VLANEX)
2934 		vlanex = ifp->if_capenable & IFCAP_VLAN_HWTAGGING ? 1 : 0;
2935 
2936 	if (flags & (XGMAC_MTU|XGMAC_PROMISC|XGMAC_ALLMULTI|XGMAC_VLANEX)) {
2937 		rc = -t4_set_rxmode(sc, sc->mbox, viid, mtu, promisc, allmulti,
2938 		    1, vlanex, false);
2939 		if (rc) {
2940 			if_printf(ifp, "set_rxmode (%x) failed: %d\n", flags,
2941 			    rc);
2942 			return (rc);
2943 		}
2944 	}
2945 
2946 	if (flags & XGMAC_UCADDR) {
2947 		uint8_t ucaddr[ETHER_ADDR_LEN];
2948 
2949 		bcopy(IF_LLADDR(ifp), ucaddr, sizeof(ucaddr));
2950 		rc = t4_change_mac(sc, sc->mbox, viid, *xact_addr_filt, ucaddr,
2951 		    true, true);
2952 		if (rc < 0) {
2953 			rc = -rc;
2954 			if_printf(ifp, "change_mac failed: %d\n", rc);
2955 			return (rc);
2956 		} else {
2957 			*xact_addr_filt = rc;
2958 			rc = 0;
2959 		}
2960 	}
2961 
2962 	if (flags & XGMAC_MCADDRS) {
2963 		const uint8_t *mcaddr[FW_MAC_EXACT_CHUNK];
2964 		int del = 1;
2965 		uint64_t hash = 0;
2966 		struct ifmultiaddr *ifma;
2967 		int i = 0, j;
2968 
2969 		if_maddr_rlock(ifp);
2970 		TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2971 			if (ifma->ifma_addr->sa_family != AF_LINK)
2972 				continue;
2973 			mcaddr[i++] =
2974 			    LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
2975 
2976 			if (i == FW_MAC_EXACT_CHUNK) {
2977 				rc = t4_alloc_mac_filt(sc, sc->mbox, viid, del,
2978 				    i, mcaddr, NULL, &hash, 0);
2979 				if (rc < 0) {
2980 					rc = -rc;
2981 					for (j = 0; j < i; j++) {
2982 						if_printf(ifp,
2983 						    "failed to add mc address"
2984 						    " %02x:%02x:%02x:"
2985 						    "%02x:%02x:%02x rc=%d\n",
2986 						    mcaddr[j][0], mcaddr[j][1],
2987 						    mcaddr[j][2], mcaddr[j][3],
2988 						    mcaddr[j][4], mcaddr[j][5],
2989 						    rc);
2990 					}
2991 					goto mcfail;
2992 				}
2993 				del = 0;
2994 				i = 0;
2995 			}
2996 		}
2997 		if (i > 0) {
2998 			rc = t4_alloc_mac_filt(sc, sc->mbox, viid, del, i,
2999 			    mcaddr, NULL, &hash, 0);
3000 			if (rc < 0) {
3001 				rc = -rc;
3002 				for (j = 0; j < i; j++) {
3003 					if_printf(ifp,
3004 					    "failed to add mc address"
3005 					    " %02x:%02x:%02x:"
3006 					    "%02x:%02x:%02x rc=%d\n",
3007 					    mcaddr[j][0], mcaddr[j][1],
3008 					    mcaddr[j][2], mcaddr[j][3],
3009 					    mcaddr[j][4], mcaddr[j][5],
3010 					    rc);
3011 				}
3012 				goto mcfail;
3013 			}
3014 		}
3015 
3016 		rc = -t4_set_addr_hash(sc, sc->mbox, viid, 0, hash, 0);
3017 		if (rc != 0)
3018 			if_printf(ifp, "failed to set mc address hash: %d", rc);
3019 mcfail:
3020 		if_maddr_runlock(ifp);
3021 	}
3022 
3023 	return (rc);
3024 }
3025 
3026 int
3027 begin_synchronized_op(struct adapter *sc, struct port_info *pi, int flags,
3028     char *wmesg)
3029 {
3030 	int rc, pri;
3031 
3032 #ifdef WITNESS
3033 	/* the caller thinks it's ok to sleep, but is it really? */
3034 	if (flags & SLEEP_OK)
3035 		pause("t4slptst", 1);
3036 #endif
3037 
3038 	if (INTR_OK)
3039 		pri = PCATCH;
3040 	else
3041 		pri = 0;
3042 
3043 	ADAPTER_LOCK(sc);
3044 	for (;;) {
3045 
3046 		if (pi && IS_DOOMED(pi)) {
3047 			rc = ENXIO;
3048 			goto done;
3049 		}
3050 
3051 		if (!IS_BUSY(sc)) {
3052 			rc = 0;
3053 			break;
3054 		}
3055 
3056 		if (!(flags & SLEEP_OK)) {
3057 			rc = EBUSY;
3058 			goto done;
3059 		}
3060 
3061 		if (mtx_sleep(&sc->flags, &sc->sc_lock, pri, wmesg, 0)) {
3062 			rc = EINTR;
3063 			goto done;
3064 		}
3065 	}
3066 
3067 	KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
3068 	SET_BUSY(sc);
3069 #ifdef INVARIANTS
3070 	sc->last_op = wmesg;
3071 	sc->last_op_thr = curthread;
3072 #endif
3073 
3074 done:
3075 	if (!(flags & HOLD_LOCK) || rc)
3076 		ADAPTER_UNLOCK(sc);
3077 
3078 	return (rc);
3079 }
3080 
3081 void
3082 end_synchronized_op(struct adapter *sc, int flags)
3083 {
3084 
3085 	if (flags & LOCK_HELD)
3086 		ADAPTER_LOCK_ASSERT_OWNED(sc);
3087 	else
3088 		ADAPTER_LOCK(sc);
3089 
3090 	KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
3091 	CLR_BUSY(sc);
3092 	wakeup(&sc->flags);
3093 	ADAPTER_UNLOCK(sc);
3094 }
3095 
3096 static int
3097 cxgbe_init_synchronized(struct port_info *pi)
3098 {
3099 	struct adapter *sc = pi->adapter;
3100 	struct ifnet *ifp = pi->ifp;
3101 	int rc = 0;
3102 
3103 	ASSERT_SYNCHRONIZED_OP(sc);
3104 
3105 	if (isset(&sc->open_device_map, pi->port_id)) {
3106 		KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING,
3107 		    ("mismatch between open_device_map and if_drv_flags"));
3108 		return (0);	/* already running */
3109 	}
3110 
3111 	if (!(sc->flags & FULL_INIT_DONE) &&
3112 	    ((rc = adapter_full_init(sc)) != 0))
3113 		return (rc);	/* error message displayed already */
3114 
3115 	if (!(pi->flags & PORT_INIT_DONE) &&
3116 	    ((rc = port_full_init(pi)) != 0))
3117 		return (rc); /* error message displayed already */
3118 
3119 	rc = update_mac_settings(ifp, XGMAC_ALL);
3120 	if (rc)
3121 		goto done;	/* error message displayed already */
3122 
3123 	rc = -t4_enable_vi(sc, sc->mbox, pi->viid, true, true);
3124 	if (rc != 0) {
3125 		if_printf(ifp, "enable_vi failed: %d\n", rc);
3126 		goto done;
3127 	}
3128 
3129 	/*
3130 	 * The first iq of the first port to come up is used for tracing.
3131 	 */
3132 	if (sc->traceq < 0) {
3133 		sc->traceq = sc->sge.rxq[pi->first_rxq].iq.abs_id;
3134 		t4_write_reg(sc, is_t4(sc) ?  A_MPS_TRC_RSS_CONTROL :
3135 		    A_MPS_T5_TRC_RSS_CONTROL, V_RSSCONTROL(pi->tx_chan) |
3136 		    V_QUEUENUMBER(sc->traceq));
3137 		pi->flags |= HAS_TRACEQ;
3138 	}
3139 
3140 	/* all ok */
3141 	setbit(&sc->open_device_map, pi->port_id);
3142 	PORT_LOCK(pi);
3143 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
3144 	PORT_UNLOCK(pi);
3145 
3146 	callout_reset(&pi->tick, hz, cxgbe_tick, pi);
3147 done:
3148 	if (rc != 0)
3149 		cxgbe_uninit_synchronized(pi);
3150 
3151 	return (rc);
3152 }
3153 
3154 /*
3155  * Idempotent.
3156  */
3157 static int
3158 cxgbe_uninit_synchronized(struct port_info *pi)
3159 {
3160 	struct adapter *sc = pi->adapter;
3161 	struct ifnet *ifp = pi->ifp;
3162 	int rc;
3163 
3164 	ASSERT_SYNCHRONIZED_OP(sc);
3165 
3166 	/*
3167 	 * Disable the VI so that all its data in either direction is discarded
3168 	 * by the MPS.  Leave everything else (the queues, interrupts, and 1Hz
3169 	 * tick) intact as the TP can deliver negative advice or data that it's
3170 	 * holding in its RAM (for an offloaded connection) even after the VI is
3171 	 * disabled.
3172 	 */
3173 	rc = -t4_enable_vi(sc, sc->mbox, pi->viid, false, false);
3174 	if (rc) {
3175 		if_printf(ifp, "disable_vi failed: %d\n", rc);
3176 		return (rc);
3177 	}
3178 
3179 	clrbit(&sc->open_device_map, pi->port_id);
3180 	PORT_LOCK(pi);
3181 	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
3182 	PORT_UNLOCK(pi);
3183 
3184 	pi->link_cfg.link_ok = 0;
3185 	pi->link_cfg.speed = 0;
3186 	pi->linkdnrc = -1;
3187 	t4_os_link_changed(sc, pi->port_id, 0, -1);
3188 
3189 	return (0);
3190 }
3191 
3192 /*
3193  * It is ok for this function to fail midway and return right away.  t4_detach
3194  * will walk the entire sc->irq list and clean up whatever is valid.
3195  */
3196 static int
3197 setup_intr_handlers(struct adapter *sc)
3198 {
3199 	int rc, rid, p, q;
3200 	char s[8];
3201 	struct irq *irq;
3202 	struct port_info *pi;
3203 	struct sge_rxq *rxq;
3204 #ifdef TCP_OFFLOAD
3205 	struct sge_ofld_rxq *ofld_rxq;
3206 #endif
3207 #ifdef DEV_NETMAP
3208 	struct sge_nm_rxq *nm_rxq;
3209 #endif
3210 
3211 	/*
3212 	 * Setup interrupts.
3213 	 */
3214 	irq = &sc->irq[0];
3215 	rid = sc->intr_type == INTR_INTX ? 0 : 1;
3216 	if (sc->intr_count == 1)
3217 		return (t4_alloc_irq(sc, irq, rid, t4_intr_all, sc, "all"));
3218 
3219 	/* Multiple interrupts. */
3220 	KASSERT(sc->intr_count >= T4_EXTRA_INTR + sc->params.nports,
3221 	    ("%s: too few intr.", __func__));
3222 
3223 	/* The first one is always error intr */
3224 	rc = t4_alloc_irq(sc, irq, rid, t4_intr_err, sc, "err");
3225 	if (rc != 0)
3226 		return (rc);
3227 	irq++;
3228 	rid++;
3229 
3230 	/* The second one is always the firmware event queue */
3231 	rc = t4_alloc_irq(sc, irq, rid, t4_intr_evt, &sc->sge.fwq, "evt");
3232 	if (rc != 0)
3233 		return (rc);
3234 	irq++;
3235 	rid++;
3236 
3237 	for_each_port(sc, p) {
3238 		pi = sc->port[p];
3239 
3240 		if (pi->flags & INTR_RXQ) {
3241 			for_each_rxq(pi, q, rxq) {
3242 				snprintf(s, sizeof(s), "%d.%d", p, q);
3243 				rc = t4_alloc_irq(sc, irq, rid, t4_intr, rxq,
3244 				    s);
3245 				if (rc != 0)
3246 					return (rc);
3247 				irq++;
3248 				rid++;
3249 			}
3250 		}
3251 #ifdef TCP_OFFLOAD
3252 		if (pi->flags & INTR_OFLD_RXQ) {
3253 			for_each_ofld_rxq(pi, q, ofld_rxq) {
3254 				snprintf(s, sizeof(s), "%d,%d", p, q);
3255 				rc = t4_alloc_irq(sc, irq, rid, t4_intr,
3256 				    ofld_rxq, s);
3257 				if (rc != 0)
3258 					return (rc);
3259 				irq++;
3260 				rid++;
3261 			}
3262 		}
3263 #endif
3264 #ifdef DEV_NETMAP
3265 		if (pi->flags & INTR_NM_RXQ) {
3266 			for_each_nm_rxq(pi, q, nm_rxq) {
3267 				snprintf(s, sizeof(s), "%d-%d", p, q);
3268 				rc = t4_alloc_irq(sc, irq, rid, t4_nm_intr,
3269 				    nm_rxq, s);
3270 				if (rc != 0)
3271 					return (rc);
3272 				irq++;
3273 				rid++;
3274 			}
3275 		}
3276 #endif
3277 	}
3278 	MPASS(irq == &sc->irq[sc->intr_count]);
3279 
3280 	return (0);
3281 }
3282 
3283 int
3284 adapter_full_init(struct adapter *sc)
3285 {
3286 	int rc, i;
3287 
3288 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
3289 	KASSERT((sc->flags & FULL_INIT_DONE) == 0,
3290 	    ("%s: FULL_INIT_DONE already", __func__));
3291 
3292 	/*
3293 	 * queues that belong to the adapter (not any particular port).
3294 	 */
3295 	rc = t4_setup_adapter_queues(sc);
3296 	if (rc != 0)
3297 		goto done;
3298 
3299 	for (i = 0; i < nitems(sc->tq); i++) {
3300 		sc->tq[i] = taskqueue_create("t4 taskq", M_NOWAIT,
3301 		    taskqueue_thread_enqueue, &sc->tq[i]);
3302 		if (sc->tq[i] == NULL) {
3303 			device_printf(sc->dev,
3304 			    "failed to allocate task queue %d\n", i);
3305 			rc = ENOMEM;
3306 			goto done;
3307 		}
3308 		taskqueue_start_threads(&sc->tq[i], 1, PI_NET, "%s tq%d",
3309 		    device_get_nameunit(sc->dev), i);
3310 	}
3311 
3312 	t4_intr_enable(sc);
3313 	sc->flags |= FULL_INIT_DONE;
3314 done:
3315 	if (rc != 0)
3316 		adapter_full_uninit(sc);
3317 
3318 	return (rc);
3319 }
3320 
3321 int
3322 adapter_full_uninit(struct adapter *sc)
3323 {
3324 	int i;
3325 
3326 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
3327 
3328 	t4_teardown_adapter_queues(sc);
3329 
3330 	for (i = 0; i < nitems(sc->tq) && sc->tq[i]; i++) {
3331 		taskqueue_free(sc->tq[i]);
3332 		sc->tq[i] = NULL;
3333 	}
3334 
3335 	sc->flags &= ~FULL_INIT_DONE;
3336 
3337 	return (0);
3338 }
3339 
3340 int
3341 port_full_init(struct port_info *pi)
3342 {
3343 	struct adapter *sc = pi->adapter;
3344 	struct ifnet *ifp = pi->ifp;
3345 	uint16_t *rss;
3346 	struct sge_rxq *rxq;
3347 	int rc, i, j;
3348 
3349 	ASSERT_SYNCHRONIZED_OP(sc);
3350 	KASSERT((pi->flags & PORT_INIT_DONE) == 0,
3351 	    ("%s: PORT_INIT_DONE already", __func__));
3352 
3353 	sysctl_ctx_init(&pi->ctx);
3354 	pi->flags |= PORT_SYSCTL_CTX;
3355 
3356 	/*
3357 	 * Allocate tx/rx/fl queues for this port.
3358 	 */
3359 	rc = t4_setup_port_queues(pi);
3360 	if (rc != 0)
3361 		goto done;	/* error message displayed already */
3362 
3363 	/*
3364 	 * Setup RSS for this port.  Save a copy of the RSS table for later use.
3365 	 */
3366 	rss = malloc(pi->rss_size * sizeof (*rss), M_CXGBE, M_ZERO | M_WAITOK);
3367 	for (i = 0; i < pi->rss_size;) {
3368 		for_each_rxq(pi, j, rxq) {
3369 			rss[i++] = rxq->iq.abs_id;
3370 			if (i == pi->rss_size)
3371 				break;
3372 		}
3373 	}
3374 
3375 	rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0, pi->rss_size, rss,
3376 	    pi->rss_size);
3377 	if (rc != 0) {
3378 		if_printf(ifp, "rss_config failed: %d\n", rc);
3379 		goto done;
3380 	}
3381 
3382 	pi->rss = rss;
3383 	pi->flags |= PORT_INIT_DONE;
3384 done:
3385 	if (rc != 0)
3386 		port_full_uninit(pi);
3387 
3388 	return (rc);
3389 }
3390 
3391 /*
3392  * Idempotent.
3393  */
3394 int
3395 port_full_uninit(struct port_info *pi)
3396 {
3397 	struct adapter *sc = pi->adapter;
3398 	int i;
3399 	struct sge_rxq *rxq;
3400 	struct sge_txq *txq;
3401 #ifdef TCP_OFFLOAD
3402 	struct sge_ofld_rxq *ofld_rxq;
3403 	struct sge_wrq *ofld_txq;
3404 #endif
3405 
3406 	if (pi->flags & PORT_INIT_DONE) {
3407 
3408 		/* Need to quiesce queues.  XXX: ctrl queues? */
3409 
3410 		for_each_txq(pi, i, txq) {
3411 			quiesce_eq(sc, &txq->eq);
3412 		}
3413 
3414 #ifdef TCP_OFFLOAD
3415 		for_each_ofld_txq(pi, i, ofld_txq) {
3416 			quiesce_eq(sc, &ofld_txq->eq);
3417 		}
3418 #endif
3419 
3420 		for_each_rxq(pi, i, rxq) {
3421 			quiesce_iq(sc, &rxq->iq);
3422 			quiesce_fl(sc, &rxq->fl);
3423 		}
3424 
3425 #ifdef TCP_OFFLOAD
3426 		for_each_ofld_rxq(pi, i, ofld_rxq) {
3427 			quiesce_iq(sc, &ofld_rxq->iq);
3428 			quiesce_fl(sc, &ofld_rxq->fl);
3429 		}
3430 #endif
3431 		free(pi->rss, M_CXGBE);
3432 	}
3433 
3434 	t4_teardown_port_queues(pi);
3435 	pi->flags &= ~PORT_INIT_DONE;
3436 
3437 	return (0);
3438 }
3439 
3440 static void
3441 quiesce_eq(struct adapter *sc, struct sge_eq *eq)
3442 {
3443 	EQ_LOCK(eq);
3444 	eq->flags |= EQ_DOOMED;
3445 
3446 	/*
3447 	 * Wait for the response to a credit flush if one's
3448 	 * pending.
3449 	 */
3450 	while (eq->flags & EQ_CRFLUSHED)
3451 		mtx_sleep(eq, &eq->eq_lock, 0, "crflush", 0);
3452 	EQ_UNLOCK(eq);
3453 
3454 	callout_drain(&eq->tx_callout);	/* XXX: iffy */
3455 	pause("callout", 10);		/* Still iffy */
3456 
3457 	taskqueue_drain(sc->tq[eq->tx_chan], &eq->tx_task);
3458 }
3459 
3460 static void
3461 quiesce_iq(struct adapter *sc, struct sge_iq *iq)
3462 {
3463 	(void) sc;	/* unused */
3464 
3465 	/* Synchronize with the interrupt handler */
3466 	while (!atomic_cmpset_int(&iq->state, IQS_IDLE, IQS_DISABLED))
3467 		pause("iqfree", 1);
3468 }
3469 
3470 static void
3471 quiesce_fl(struct adapter *sc, struct sge_fl *fl)
3472 {
3473 	mtx_lock(&sc->sfl_lock);
3474 	FL_LOCK(fl);
3475 	fl->flags |= FL_DOOMED;
3476 	FL_UNLOCK(fl);
3477 	mtx_unlock(&sc->sfl_lock);
3478 
3479 	callout_drain(&sc->sfl_callout);
3480 	KASSERT((fl->flags & FL_STARVING) == 0,
3481 	    ("%s: still starving", __func__));
3482 }
3483 
3484 static int
3485 t4_alloc_irq(struct adapter *sc, struct irq *irq, int rid,
3486     driver_intr_t *handler, void *arg, char *name)
3487 {
3488 	int rc;
3489 
3490 	irq->rid = rid;
3491 	irq->res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &irq->rid,
3492 	    RF_SHAREABLE | RF_ACTIVE);
3493 	if (irq->res == NULL) {
3494 		device_printf(sc->dev,
3495 		    "failed to allocate IRQ for rid %d, name %s.\n", rid, name);
3496 		return (ENOMEM);
3497 	}
3498 
3499 	rc = bus_setup_intr(sc->dev, irq->res, INTR_MPSAFE | INTR_TYPE_NET,
3500 	    NULL, handler, arg, &irq->tag);
3501 	if (rc != 0) {
3502 		device_printf(sc->dev,
3503 		    "failed to setup interrupt for rid %d, name %s: %d\n",
3504 		    rid, name, rc);
3505 	} else if (name)
3506 		bus_describe_intr(sc->dev, irq->res, irq->tag, name);
3507 
3508 	return (rc);
3509 }
3510 
3511 static int
3512 t4_free_irq(struct adapter *sc, struct irq *irq)
3513 {
3514 	if (irq->tag)
3515 		bus_teardown_intr(sc->dev, irq->res, irq->tag);
3516 	if (irq->res)
3517 		bus_release_resource(sc->dev, SYS_RES_IRQ, irq->rid, irq->res);
3518 
3519 	bzero(irq, sizeof(*irq));
3520 
3521 	return (0);
3522 }
3523 
3524 static void
3525 reg_block_dump(struct adapter *sc, uint8_t *buf, unsigned int start,
3526     unsigned int end)
3527 {
3528 	uint32_t *p = (uint32_t *)(buf + start);
3529 
3530 	for ( ; start <= end; start += sizeof(uint32_t))
3531 		*p++ = t4_read_reg(sc, start);
3532 }
3533 
3534 static void
3535 t4_get_regs(struct adapter *sc, struct t4_regdump *regs, uint8_t *buf)
3536 {
3537 	int i, n;
3538 	const unsigned int *reg_ranges;
3539 	static const unsigned int t4_reg_ranges[] = {
3540 		0x1008, 0x1108,
3541 		0x1180, 0x11b4,
3542 		0x11fc, 0x123c,
3543 		0x1300, 0x173c,
3544 		0x1800, 0x18fc,
3545 		0x3000, 0x30d8,
3546 		0x30e0, 0x5924,
3547 		0x5960, 0x59d4,
3548 		0x5a00, 0x5af8,
3549 		0x6000, 0x6098,
3550 		0x6100, 0x6150,
3551 		0x6200, 0x6208,
3552 		0x6240, 0x6248,
3553 		0x6280, 0x6338,
3554 		0x6370, 0x638c,
3555 		0x6400, 0x643c,
3556 		0x6500, 0x6524,
3557 		0x6a00, 0x6a38,
3558 		0x6a60, 0x6a78,
3559 		0x6b00, 0x6b84,
3560 		0x6bf0, 0x6c84,
3561 		0x6cf0, 0x6d84,
3562 		0x6df0, 0x6e84,
3563 		0x6ef0, 0x6f84,
3564 		0x6ff0, 0x7084,
3565 		0x70f0, 0x7184,
3566 		0x71f0, 0x7284,
3567 		0x72f0, 0x7384,
3568 		0x73f0, 0x7450,
3569 		0x7500, 0x7530,
3570 		0x7600, 0x761c,
3571 		0x7680, 0x76cc,
3572 		0x7700, 0x7798,
3573 		0x77c0, 0x77fc,
3574 		0x7900, 0x79fc,
3575 		0x7b00, 0x7c38,
3576 		0x7d00, 0x7efc,
3577 		0x8dc0, 0x8e1c,
3578 		0x8e30, 0x8e78,
3579 		0x8ea0, 0x8f6c,
3580 		0x8fc0, 0x9074,
3581 		0x90fc, 0x90fc,
3582 		0x9400, 0x9458,
3583 		0x9600, 0x96bc,
3584 		0x9800, 0x9808,
3585 		0x9820, 0x983c,
3586 		0x9850, 0x9864,
3587 		0x9c00, 0x9c6c,
3588 		0x9c80, 0x9cec,
3589 		0x9d00, 0x9d6c,
3590 		0x9d80, 0x9dec,
3591 		0x9e00, 0x9e6c,
3592 		0x9e80, 0x9eec,
3593 		0x9f00, 0x9f6c,
3594 		0x9f80, 0x9fec,
3595 		0xd004, 0xd03c,
3596 		0xdfc0, 0xdfe0,
3597 		0xe000, 0xea7c,
3598 		0xf000, 0x11110,
3599 		0x11118, 0x11190,
3600 		0x19040, 0x1906c,
3601 		0x19078, 0x19080,
3602 		0x1908c, 0x19124,
3603 		0x19150, 0x191b0,
3604 		0x191d0, 0x191e8,
3605 		0x19238, 0x1924c,
3606 		0x193f8, 0x19474,
3607 		0x19490, 0x194f8,
3608 		0x19800, 0x19f30,
3609 		0x1a000, 0x1a06c,
3610 		0x1a0b0, 0x1a120,
3611 		0x1a128, 0x1a138,
3612 		0x1a190, 0x1a1c4,
3613 		0x1a1fc, 0x1a1fc,
3614 		0x1e040, 0x1e04c,
3615 		0x1e284, 0x1e28c,
3616 		0x1e2c0, 0x1e2c0,
3617 		0x1e2e0, 0x1e2e0,
3618 		0x1e300, 0x1e384,
3619 		0x1e3c0, 0x1e3c8,
3620 		0x1e440, 0x1e44c,
3621 		0x1e684, 0x1e68c,
3622 		0x1e6c0, 0x1e6c0,
3623 		0x1e6e0, 0x1e6e0,
3624 		0x1e700, 0x1e784,
3625 		0x1e7c0, 0x1e7c8,
3626 		0x1e840, 0x1e84c,
3627 		0x1ea84, 0x1ea8c,
3628 		0x1eac0, 0x1eac0,
3629 		0x1eae0, 0x1eae0,
3630 		0x1eb00, 0x1eb84,
3631 		0x1ebc0, 0x1ebc8,
3632 		0x1ec40, 0x1ec4c,
3633 		0x1ee84, 0x1ee8c,
3634 		0x1eec0, 0x1eec0,
3635 		0x1eee0, 0x1eee0,
3636 		0x1ef00, 0x1ef84,
3637 		0x1efc0, 0x1efc8,
3638 		0x1f040, 0x1f04c,
3639 		0x1f284, 0x1f28c,
3640 		0x1f2c0, 0x1f2c0,
3641 		0x1f2e0, 0x1f2e0,
3642 		0x1f300, 0x1f384,
3643 		0x1f3c0, 0x1f3c8,
3644 		0x1f440, 0x1f44c,
3645 		0x1f684, 0x1f68c,
3646 		0x1f6c0, 0x1f6c0,
3647 		0x1f6e0, 0x1f6e0,
3648 		0x1f700, 0x1f784,
3649 		0x1f7c0, 0x1f7c8,
3650 		0x1f840, 0x1f84c,
3651 		0x1fa84, 0x1fa8c,
3652 		0x1fac0, 0x1fac0,
3653 		0x1fae0, 0x1fae0,
3654 		0x1fb00, 0x1fb84,
3655 		0x1fbc0, 0x1fbc8,
3656 		0x1fc40, 0x1fc4c,
3657 		0x1fe84, 0x1fe8c,
3658 		0x1fec0, 0x1fec0,
3659 		0x1fee0, 0x1fee0,
3660 		0x1ff00, 0x1ff84,
3661 		0x1ffc0, 0x1ffc8,
3662 		0x20000, 0x2002c,
3663 		0x20100, 0x2013c,
3664 		0x20190, 0x201c8,
3665 		0x20200, 0x20318,
3666 		0x20400, 0x20528,
3667 		0x20540, 0x20614,
3668 		0x21000, 0x21040,
3669 		0x2104c, 0x21060,
3670 		0x210c0, 0x210ec,
3671 		0x21200, 0x21268,
3672 		0x21270, 0x21284,
3673 		0x212fc, 0x21388,
3674 		0x21400, 0x21404,
3675 		0x21500, 0x21518,
3676 		0x2152c, 0x2153c,
3677 		0x21550, 0x21554,
3678 		0x21600, 0x21600,
3679 		0x21608, 0x21628,
3680 		0x21630, 0x2163c,
3681 		0x21700, 0x2171c,
3682 		0x21780, 0x2178c,
3683 		0x21800, 0x21c38,
3684 		0x21c80, 0x21d7c,
3685 		0x21e00, 0x21e04,
3686 		0x22000, 0x2202c,
3687 		0x22100, 0x2213c,
3688 		0x22190, 0x221c8,
3689 		0x22200, 0x22318,
3690 		0x22400, 0x22528,
3691 		0x22540, 0x22614,
3692 		0x23000, 0x23040,
3693 		0x2304c, 0x23060,
3694 		0x230c0, 0x230ec,
3695 		0x23200, 0x23268,
3696 		0x23270, 0x23284,
3697 		0x232fc, 0x23388,
3698 		0x23400, 0x23404,
3699 		0x23500, 0x23518,
3700 		0x2352c, 0x2353c,
3701 		0x23550, 0x23554,
3702 		0x23600, 0x23600,
3703 		0x23608, 0x23628,
3704 		0x23630, 0x2363c,
3705 		0x23700, 0x2371c,
3706 		0x23780, 0x2378c,
3707 		0x23800, 0x23c38,
3708 		0x23c80, 0x23d7c,
3709 		0x23e00, 0x23e04,
3710 		0x24000, 0x2402c,
3711 		0x24100, 0x2413c,
3712 		0x24190, 0x241c8,
3713 		0x24200, 0x24318,
3714 		0x24400, 0x24528,
3715 		0x24540, 0x24614,
3716 		0x25000, 0x25040,
3717 		0x2504c, 0x25060,
3718 		0x250c0, 0x250ec,
3719 		0x25200, 0x25268,
3720 		0x25270, 0x25284,
3721 		0x252fc, 0x25388,
3722 		0x25400, 0x25404,
3723 		0x25500, 0x25518,
3724 		0x2552c, 0x2553c,
3725 		0x25550, 0x25554,
3726 		0x25600, 0x25600,
3727 		0x25608, 0x25628,
3728 		0x25630, 0x2563c,
3729 		0x25700, 0x2571c,
3730 		0x25780, 0x2578c,
3731 		0x25800, 0x25c38,
3732 		0x25c80, 0x25d7c,
3733 		0x25e00, 0x25e04,
3734 		0x26000, 0x2602c,
3735 		0x26100, 0x2613c,
3736 		0x26190, 0x261c8,
3737 		0x26200, 0x26318,
3738 		0x26400, 0x26528,
3739 		0x26540, 0x26614,
3740 		0x27000, 0x27040,
3741 		0x2704c, 0x27060,
3742 		0x270c0, 0x270ec,
3743 		0x27200, 0x27268,
3744 		0x27270, 0x27284,
3745 		0x272fc, 0x27388,
3746 		0x27400, 0x27404,
3747 		0x27500, 0x27518,
3748 		0x2752c, 0x2753c,
3749 		0x27550, 0x27554,
3750 		0x27600, 0x27600,
3751 		0x27608, 0x27628,
3752 		0x27630, 0x2763c,
3753 		0x27700, 0x2771c,
3754 		0x27780, 0x2778c,
3755 		0x27800, 0x27c38,
3756 		0x27c80, 0x27d7c,
3757 		0x27e00, 0x27e04
3758 	};
3759 	static const unsigned int t5_reg_ranges[] = {
3760 		0x1008, 0x1148,
3761 		0x1180, 0x11b4,
3762 		0x11fc, 0x123c,
3763 		0x1280, 0x173c,
3764 		0x1800, 0x18fc,
3765 		0x3000, 0x3028,
3766 		0x3060, 0x30d8,
3767 		0x30e0, 0x30fc,
3768 		0x3140, 0x357c,
3769 		0x35a8, 0x35cc,
3770 		0x35ec, 0x35ec,
3771 		0x3600, 0x5624,
3772 		0x56cc, 0x575c,
3773 		0x580c, 0x5814,
3774 		0x5890, 0x58bc,
3775 		0x5940, 0x59dc,
3776 		0x59fc, 0x5a18,
3777 		0x5a60, 0x5a9c,
3778 		0x5b94, 0x5bfc,
3779 		0x6000, 0x6040,
3780 		0x6058, 0x614c,
3781 		0x7700, 0x7798,
3782 		0x77c0, 0x78fc,
3783 		0x7b00, 0x7c54,
3784 		0x7d00, 0x7efc,
3785 		0x8dc0, 0x8de0,
3786 		0x8df8, 0x8e84,
3787 		0x8ea0, 0x8f84,
3788 		0x8fc0, 0x90f8,
3789 		0x9400, 0x9470,
3790 		0x9600, 0x96f4,
3791 		0x9800, 0x9808,
3792 		0x9820, 0x983c,
3793 		0x9850, 0x9864,
3794 		0x9c00, 0x9c6c,
3795 		0x9c80, 0x9cec,
3796 		0x9d00, 0x9d6c,
3797 		0x9d80, 0x9dec,
3798 		0x9e00, 0x9e6c,
3799 		0x9e80, 0x9eec,
3800 		0x9f00, 0x9f6c,
3801 		0x9f80, 0xa020,
3802 		0xd004, 0xd03c,
3803 		0xdfc0, 0xdfe0,
3804 		0xe000, 0x11088,
3805 		0x1109c, 0x11110,
3806 		0x11118, 0x1117c,
3807 		0x11190, 0x11204,
3808 		0x19040, 0x1906c,
3809 		0x19078, 0x19080,
3810 		0x1908c, 0x19124,
3811 		0x19150, 0x191b0,
3812 		0x191d0, 0x191e8,
3813 		0x19238, 0x19290,
3814 		0x193f8, 0x19474,
3815 		0x19490, 0x194cc,
3816 		0x194f0, 0x194f8,
3817 		0x19c00, 0x19c60,
3818 		0x19c94, 0x19e10,
3819 		0x19e50, 0x19f34,
3820 		0x19f40, 0x19f50,
3821 		0x19f90, 0x19fe4,
3822 		0x1a000, 0x1a06c,
3823 		0x1a0b0, 0x1a120,
3824 		0x1a128, 0x1a138,
3825 		0x1a190, 0x1a1c4,
3826 		0x1a1fc, 0x1a1fc,
3827 		0x1e008, 0x1e00c,
3828 		0x1e040, 0x1e04c,
3829 		0x1e284, 0x1e290,
3830 		0x1e2c0, 0x1e2c0,
3831 		0x1e2e0, 0x1e2e0,
3832 		0x1e300, 0x1e384,
3833 		0x1e3c0, 0x1e3c8,
3834 		0x1e408, 0x1e40c,
3835 		0x1e440, 0x1e44c,
3836 		0x1e684, 0x1e690,
3837 		0x1e6c0, 0x1e6c0,
3838 		0x1e6e0, 0x1e6e0,
3839 		0x1e700, 0x1e784,
3840 		0x1e7c0, 0x1e7c8,
3841 		0x1e808, 0x1e80c,
3842 		0x1e840, 0x1e84c,
3843 		0x1ea84, 0x1ea90,
3844 		0x1eac0, 0x1eac0,
3845 		0x1eae0, 0x1eae0,
3846 		0x1eb00, 0x1eb84,
3847 		0x1ebc0, 0x1ebc8,
3848 		0x1ec08, 0x1ec0c,
3849 		0x1ec40, 0x1ec4c,
3850 		0x1ee84, 0x1ee90,
3851 		0x1eec0, 0x1eec0,
3852 		0x1eee0, 0x1eee0,
3853 		0x1ef00, 0x1ef84,
3854 		0x1efc0, 0x1efc8,
3855 		0x1f008, 0x1f00c,
3856 		0x1f040, 0x1f04c,
3857 		0x1f284, 0x1f290,
3858 		0x1f2c0, 0x1f2c0,
3859 		0x1f2e0, 0x1f2e0,
3860 		0x1f300, 0x1f384,
3861 		0x1f3c0, 0x1f3c8,
3862 		0x1f408, 0x1f40c,
3863 		0x1f440, 0x1f44c,
3864 		0x1f684, 0x1f690,
3865 		0x1f6c0, 0x1f6c0,
3866 		0x1f6e0, 0x1f6e0,
3867 		0x1f700, 0x1f784,
3868 		0x1f7c0, 0x1f7c8,
3869 		0x1f808, 0x1f80c,
3870 		0x1f840, 0x1f84c,
3871 		0x1fa84, 0x1fa90,
3872 		0x1fac0, 0x1fac0,
3873 		0x1fae0, 0x1fae0,
3874 		0x1fb00, 0x1fb84,
3875 		0x1fbc0, 0x1fbc8,
3876 		0x1fc08, 0x1fc0c,
3877 		0x1fc40, 0x1fc4c,
3878 		0x1fe84, 0x1fe90,
3879 		0x1fec0, 0x1fec0,
3880 		0x1fee0, 0x1fee0,
3881 		0x1ff00, 0x1ff84,
3882 		0x1ffc0, 0x1ffc8,
3883 		0x30000, 0x30030,
3884 		0x30100, 0x30144,
3885 		0x30190, 0x301d0,
3886 		0x30200, 0x30318,
3887 		0x30400, 0x3052c,
3888 		0x30540, 0x3061c,
3889 		0x30800, 0x30834,
3890 		0x308c0, 0x30908,
3891 		0x30910, 0x309ac,
3892 		0x30a00, 0x30a2c,
3893 		0x30a44, 0x30a50,
3894 		0x30a74, 0x30c24,
3895 		0x30d00, 0x30d00,
3896 		0x30d08, 0x30d14,
3897 		0x30d1c, 0x30d20,
3898 		0x30d3c, 0x30d50,
3899 		0x31200, 0x3120c,
3900 		0x31220, 0x31220,
3901 		0x31240, 0x31240,
3902 		0x31600, 0x3160c,
3903 		0x31a00, 0x31a1c,
3904 		0x31e00, 0x31e20,
3905 		0x31e38, 0x31e3c,
3906 		0x31e80, 0x31e80,
3907 		0x31e88, 0x31ea8,
3908 		0x31eb0, 0x31eb4,
3909 		0x31ec8, 0x31ed4,
3910 		0x31fb8, 0x32004,
3911 		0x32200, 0x32200,
3912 		0x32208, 0x32240,
3913 		0x32248, 0x32280,
3914 		0x32288, 0x322c0,
3915 		0x322c8, 0x322fc,
3916 		0x32600, 0x32630,
3917 		0x32a00, 0x32abc,
3918 		0x32b00, 0x32b70,
3919 		0x33000, 0x33048,
3920 		0x33060, 0x3309c,
3921 		0x330f0, 0x33148,
3922 		0x33160, 0x3319c,
3923 		0x331f0, 0x332e4,
3924 		0x332f8, 0x333e4,
3925 		0x333f8, 0x33448,
3926 		0x33460, 0x3349c,
3927 		0x334f0, 0x33548,
3928 		0x33560, 0x3359c,
3929 		0x335f0, 0x336e4,
3930 		0x336f8, 0x337e4,
3931 		0x337f8, 0x337fc,
3932 		0x33814, 0x33814,
3933 		0x3382c, 0x3382c,
3934 		0x33880, 0x3388c,
3935 		0x338e8, 0x338ec,
3936 		0x33900, 0x33948,
3937 		0x33960, 0x3399c,
3938 		0x339f0, 0x33ae4,
3939 		0x33af8, 0x33b10,
3940 		0x33b28, 0x33b28,
3941 		0x33b3c, 0x33b50,
3942 		0x33bf0, 0x33c10,
3943 		0x33c28, 0x33c28,
3944 		0x33c3c, 0x33c50,
3945 		0x33cf0, 0x33cfc,
3946 		0x34000, 0x34030,
3947 		0x34100, 0x34144,
3948 		0x34190, 0x341d0,
3949 		0x34200, 0x34318,
3950 		0x34400, 0x3452c,
3951 		0x34540, 0x3461c,
3952 		0x34800, 0x34834,
3953 		0x348c0, 0x34908,
3954 		0x34910, 0x349ac,
3955 		0x34a00, 0x34a2c,
3956 		0x34a44, 0x34a50,
3957 		0x34a74, 0x34c24,
3958 		0x34d00, 0x34d00,
3959 		0x34d08, 0x34d14,
3960 		0x34d1c, 0x34d20,
3961 		0x34d3c, 0x34d50,
3962 		0x35200, 0x3520c,
3963 		0x35220, 0x35220,
3964 		0x35240, 0x35240,
3965 		0x35600, 0x3560c,
3966 		0x35a00, 0x35a1c,
3967 		0x35e00, 0x35e20,
3968 		0x35e38, 0x35e3c,
3969 		0x35e80, 0x35e80,
3970 		0x35e88, 0x35ea8,
3971 		0x35eb0, 0x35eb4,
3972 		0x35ec8, 0x35ed4,
3973 		0x35fb8, 0x36004,
3974 		0x36200, 0x36200,
3975 		0x36208, 0x36240,
3976 		0x36248, 0x36280,
3977 		0x36288, 0x362c0,
3978 		0x362c8, 0x362fc,
3979 		0x36600, 0x36630,
3980 		0x36a00, 0x36abc,
3981 		0x36b00, 0x36b70,
3982 		0x37000, 0x37048,
3983 		0x37060, 0x3709c,
3984 		0x370f0, 0x37148,
3985 		0x37160, 0x3719c,
3986 		0x371f0, 0x372e4,
3987 		0x372f8, 0x373e4,
3988 		0x373f8, 0x37448,
3989 		0x37460, 0x3749c,
3990 		0x374f0, 0x37548,
3991 		0x37560, 0x3759c,
3992 		0x375f0, 0x376e4,
3993 		0x376f8, 0x377e4,
3994 		0x377f8, 0x377fc,
3995 		0x37814, 0x37814,
3996 		0x3782c, 0x3782c,
3997 		0x37880, 0x3788c,
3998 		0x378e8, 0x378ec,
3999 		0x37900, 0x37948,
4000 		0x37960, 0x3799c,
4001 		0x379f0, 0x37ae4,
4002 		0x37af8, 0x37b10,
4003 		0x37b28, 0x37b28,
4004 		0x37b3c, 0x37b50,
4005 		0x37bf0, 0x37c10,
4006 		0x37c28, 0x37c28,
4007 		0x37c3c, 0x37c50,
4008 		0x37cf0, 0x37cfc,
4009 		0x38000, 0x38030,
4010 		0x38100, 0x38144,
4011 		0x38190, 0x381d0,
4012 		0x38200, 0x38318,
4013 		0x38400, 0x3852c,
4014 		0x38540, 0x3861c,
4015 		0x38800, 0x38834,
4016 		0x388c0, 0x38908,
4017 		0x38910, 0x389ac,
4018 		0x38a00, 0x38a2c,
4019 		0x38a44, 0x38a50,
4020 		0x38a74, 0x38c24,
4021 		0x38d00, 0x38d00,
4022 		0x38d08, 0x38d14,
4023 		0x38d1c, 0x38d20,
4024 		0x38d3c, 0x38d50,
4025 		0x39200, 0x3920c,
4026 		0x39220, 0x39220,
4027 		0x39240, 0x39240,
4028 		0x39600, 0x3960c,
4029 		0x39a00, 0x39a1c,
4030 		0x39e00, 0x39e20,
4031 		0x39e38, 0x39e3c,
4032 		0x39e80, 0x39e80,
4033 		0x39e88, 0x39ea8,
4034 		0x39eb0, 0x39eb4,
4035 		0x39ec8, 0x39ed4,
4036 		0x39fb8, 0x3a004,
4037 		0x3a200, 0x3a200,
4038 		0x3a208, 0x3a240,
4039 		0x3a248, 0x3a280,
4040 		0x3a288, 0x3a2c0,
4041 		0x3a2c8, 0x3a2fc,
4042 		0x3a600, 0x3a630,
4043 		0x3aa00, 0x3aabc,
4044 		0x3ab00, 0x3ab70,
4045 		0x3b000, 0x3b048,
4046 		0x3b060, 0x3b09c,
4047 		0x3b0f0, 0x3b148,
4048 		0x3b160, 0x3b19c,
4049 		0x3b1f0, 0x3b2e4,
4050 		0x3b2f8, 0x3b3e4,
4051 		0x3b3f8, 0x3b448,
4052 		0x3b460, 0x3b49c,
4053 		0x3b4f0, 0x3b548,
4054 		0x3b560, 0x3b59c,
4055 		0x3b5f0, 0x3b6e4,
4056 		0x3b6f8, 0x3b7e4,
4057 		0x3b7f8, 0x3b7fc,
4058 		0x3b814, 0x3b814,
4059 		0x3b82c, 0x3b82c,
4060 		0x3b880, 0x3b88c,
4061 		0x3b8e8, 0x3b8ec,
4062 		0x3b900, 0x3b948,
4063 		0x3b960, 0x3b99c,
4064 		0x3b9f0, 0x3bae4,
4065 		0x3baf8, 0x3bb10,
4066 		0x3bb28, 0x3bb28,
4067 		0x3bb3c, 0x3bb50,
4068 		0x3bbf0, 0x3bc10,
4069 		0x3bc28, 0x3bc28,
4070 		0x3bc3c, 0x3bc50,
4071 		0x3bcf0, 0x3bcfc,
4072 		0x3c000, 0x3c030,
4073 		0x3c100, 0x3c144,
4074 		0x3c190, 0x3c1d0,
4075 		0x3c200, 0x3c318,
4076 		0x3c400, 0x3c52c,
4077 		0x3c540, 0x3c61c,
4078 		0x3c800, 0x3c834,
4079 		0x3c8c0, 0x3c908,
4080 		0x3c910, 0x3c9ac,
4081 		0x3ca00, 0x3ca2c,
4082 		0x3ca44, 0x3ca50,
4083 		0x3ca74, 0x3cc24,
4084 		0x3cd00, 0x3cd00,
4085 		0x3cd08, 0x3cd14,
4086 		0x3cd1c, 0x3cd20,
4087 		0x3cd3c, 0x3cd50,
4088 		0x3d200, 0x3d20c,
4089 		0x3d220, 0x3d220,
4090 		0x3d240, 0x3d240,
4091 		0x3d600, 0x3d60c,
4092 		0x3da00, 0x3da1c,
4093 		0x3de00, 0x3de20,
4094 		0x3de38, 0x3de3c,
4095 		0x3de80, 0x3de80,
4096 		0x3de88, 0x3dea8,
4097 		0x3deb0, 0x3deb4,
4098 		0x3dec8, 0x3ded4,
4099 		0x3dfb8, 0x3e004,
4100 		0x3e200, 0x3e200,
4101 		0x3e208, 0x3e240,
4102 		0x3e248, 0x3e280,
4103 		0x3e288, 0x3e2c0,
4104 		0x3e2c8, 0x3e2fc,
4105 		0x3e600, 0x3e630,
4106 		0x3ea00, 0x3eabc,
4107 		0x3eb00, 0x3eb70,
4108 		0x3f000, 0x3f048,
4109 		0x3f060, 0x3f09c,
4110 		0x3f0f0, 0x3f148,
4111 		0x3f160, 0x3f19c,
4112 		0x3f1f0, 0x3f2e4,
4113 		0x3f2f8, 0x3f3e4,
4114 		0x3f3f8, 0x3f448,
4115 		0x3f460, 0x3f49c,
4116 		0x3f4f0, 0x3f548,
4117 		0x3f560, 0x3f59c,
4118 		0x3f5f0, 0x3f6e4,
4119 		0x3f6f8, 0x3f7e4,
4120 		0x3f7f8, 0x3f7fc,
4121 		0x3f814, 0x3f814,
4122 		0x3f82c, 0x3f82c,
4123 		0x3f880, 0x3f88c,
4124 		0x3f8e8, 0x3f8ec,
4125 		0x3f900, 0x3f948,
4126 		0x3f960, 0x3f99c,
4127 		0x3f9f0, 0x3fae4,
4128 		0x3faf8, 0x3fb10,
4129 		0x3fb28, 0x3fb28,
4130 		0x3fb3c, 0x3fb50,
4131 		0x3fbf0, 0x3fc10,
4132 		0x3fc28, 0x3fc28,
4133 		0x3fc3c, 0x3fc50,
4134 		0x3fcf0, 0x3fcfc,
4135 		0x40000, 0x4000c,
4136 		0x40040, 0x40068,
4137 		0x4007c, 0x40144,
4138 		0x40180, 0x4018c,
4139 		0x40200, 0x40298,
4140 		0x402ac, 0x4033c,
4141 		0x403f8, 0x403fc,
4142 		0x41304, 0x413c4,
4143 		0x41400, 0x4141c,
4144 		0x41480, 0x414d0,
4145 		0x44000, 0x44078,
4146 		0x440c0, 0x44278,
4147 		0x442c0, 0x44478,
4148 		0x444c0, 0x44678,
4149 		0x446c0, 0x44878,
4150 		0x448c0, 0x449fc,
4151 		0x45000, 0x45068,
4152 		0x45080, 0x45084,
4153 		0x450a0, 0x450b0,
4154 		0x45200, 0x45268,
4155 		0x45280, 0x45284,
4156 		0x452a0, 0x452b0,
4157 		0x460c0, 0x460e4,
4158 		0x47000, 0x4708c,
4159 		0x47200, 0x47250,
4160 		0x47400, 0x47420,
4161 		0x47600, 0x47618,
4162 		0x47800, 0x47814,
4163 		0x48000, 0x4800c,
4164 		0x48040, 0x48068,
4165 		0x4807c, 0x48144,
4166 		0x48180, 0x4818c,
4167 		0x48200, 0x48298,
4168 		0x482ac, 0x4833c,
4169 		0x483f8, 0x483fc,
4170 		0x49304, 0x493c4,
4171 		0x49400, 0x4941c,
4172 		0x49480, 0x494d0,
4173 		0x4c000, 0x4c078,
4174 		0x4c0c0, 0x4c278,
4175 		0x4c2c0, 0x4c478,
4176 		0x4c4c0, 0x4c678,
4177 		0x4c6c0, 0x4c878,
4178 		0x4c8c0, 0x4c9fc,
4179 		0x4d000, 0x4d068,
4180 		0x4d080, 0x4d084,
4181 		0x4d0a0, 0x4d0b0,
4182 		0x4d200, 0x4d268,
4183 		0x4d280, 0x4d284,
4184 		0x4d2a0, 0x4d2b0,
4185 		0x4e0c0, 0x4e0e4,
4186 		0x4f000, 0x4f08c,
4187 		0x4f200, 0x4f250,
4188 		0x4f400, 0x4f420,
4189 		0x4f600, 0x4f618,
4190 		0x4f800, 0x4f814,
4191 		0x50000, 0x500cc,
4192 		0x50400, 0x50400,
4193 		0x50800, 0x508cc,
4194 		0x50c00, 0x50c00,
4195 		0x51000, 0x5101c,
4196 		0x51300, 0x51308,
4197 	};
4198 
4199 	if (is_t4(sc)) {
4200 		reg_ranges = &t4_reg_ranges[0];
4201 		n = nitems(t4_reg_ranges);
4202 	} else {
4203 		reg_ranges = &t5_reg_ranges[0];
4204 		n = nitems(t5_reg_ranges);
4205 	}
4206 
4207 	regs->version = chip_id(sc) | chip_rev(sc) << 10;
4208 	for (i = 0; i < n; i += 2)
4209 		reg_block_dump(sc, buf, reg_ranges[i], reg_ranges[i + 1]);
4210 }
4211 
4212 static void
4213 cxgbe_tick(void *arg)
4214 {
4215 	struct port_info *pi = arg;
4216 	struct adapter *sc = pi->adapter;
4217 	struct ifnet *ifp = pi->ifp;
4218 	struct sge_txq *txq;
4219 	int i, drops;
4220 	struct port_stats *s = &pi->stats;
4221 
4222 	PORT_LOCK(pi);
4223 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
4224 		PORT_UNLOCK(pi);
4225 		return;	/* without scheduling another callout */
4226 	}
4227 
4228 	t4_get_port_stats(sc, pi->tx_chan, s);
4229 
4230 	ifp->if_opackets = s->tx_frames - s->tx_pause;
4231 	ifp->if_ipackets = s->rx_frames - s->rx_pause;
4232 	ifp->if_obytes = s->tx_octets - s->tx_pause * 64;
4233 	ifp->if_ibytes = s->rx_octets - s->rx_pause * 64;
4234 	ifp->if_omcasts = s->tx_mcast_frames - s->tx_pause;
4235 	ifp->if_imcasts = s->rx_mcast_frames - s->rx_pause;
4236 	ifp->if_iqdrops = s->rx_ovflow0 + s->rx_ovflow1 + s->rx_ovflow2 +
4237 	    s->rx_ovflow3 + s->rx_trunc0 + s->rx_trunc1 + s->rx_trunc2 +
4238 	    s->rx_trunc3;
4239 	for (i = 0; i < 4; i++) {
4240 		if (pi->rx_chan_map & (1 << i)) {
4241 			uint32_t v;
4242 
4243 			/*
4244 			 * XXX: indirect reads from the same ADDR/DATA pair can
4245 			 * race with each other.
4246 			 */
4247 			t4_read_indirect(sc, A_TP_MIB_INDEX, A_TP_MIB_DATA, &v,
4248 			    1, A_TP_MIB_TNL_CNG_DROP_0 + i);
4249 			ifp->if_iqdrops += v;
4250 		}
4251 	}
4252 
4253 	drops = s->tx_drop;
4254 	for_each_txq(pi, i, txq)
4255 		drops += txq->br->br_drops;
4256 	ifp->if_oqdrops = drops;
4257 
4258 	ifp->if_oerrors = s->tx_error_frames;
4259 	ifp->if_ierrors = s->rx_jabber + s->rx_runt + s->rx_too_long +
4260 	    s->rx_fcs_err + s->rx_len_err;
4261 
4262 	callout_schedule(&pi->tick, hz);
4263 	PORT_UNLOCK(pi);
4264 }
4265 
4266 static void
4267 cxgbe_vlan_config(void *arg, struct ifnet *ifp, uint16_t vid)
4268 {
4269 	struct ifnet *vlan;
4270 
4271 	if (arg != ifp || ifp->if_type != IFT_ETHER)
4272 		return;
4273 
4274 	vlan = VLAN_DEVAT(ifp, vid);
4275 	VLAN_SETCOOKIE(vlan, ifp);
4276 }
4277 
4278 static int
4279 cpl_not_handled(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
4280 {
4281 
4282 #ifdef INVARIANTS
4283 	panic("%s: opcode 0x%02x on iq %p with payload %p",
4284 	    __func__, rss->opcode, iq, m);
4285 #else
4286 	log(LOG_ERR, "%s: opcode 0x%02x on iq %p with payload %p\n",
4287 	    __func__, rss->opcode, iq, m);
4288 	m_freem(m);
4289 #endif
4290 	return (EDOOFUS);
4291 }
4292 
4293 int
4294 t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h)
4295 {
4296 	uintptr_t *loc, new;
4297 
4298 	if (opcode >= nitems(sc->cpl_handler))
4299 		return (EINVAL);
4300 
4301 	new = h ? (uintptr_t)h : (uintptr_t)cpl_not_handled;
4302 	loc = (uintptr_t *) &sc->cpl_handler[opcode];
4303 	atomic_store_rel_ptr(loc, new);
4304 
4305 	return (0);
4306 }
4307 
4308 static int
4309 an_not_handled(struct sge_iq *iq, const struct rsp_ctrl *ctrl)
4310 {
4311 
4312 #ifdef INVARIANTS
4313 	panic("%s: async notification on iq %p (ctrl %p)", __func__, iq, ctrl);
4314 #else
4315 	log(LOG_ERR, "%s: async notification on iq %p (ctrl %p)\n",
4316 	    __func__, iq, ctrl);
4317 #endif
4318 	return (EDOOFUS);
4319 }
4320 
4321 int
4322 t4_register_an_handler(struct adapter *sc, an_handler_t h)
4323 {
4324 	uintptr_t *loc, new;
4325 
4326 	new = h ? (uintptr_t)h : (uintptr_t)an_not_handled;
4327 	loc = (uintptr_t *) &sc->an_handler;
4328 	atomic_store_rel_ptr(loc, new);
4329 
4330 	return (0);
4331 }
4332 
4333 static int
4334 fw_msg_not_handled(struct adapter *sc, const __be64 *rpl)
4335 {
4336 	const struct cpl_fw6_msg *cpl =
4337 	    __containerof(rpl, struct cpl_fw6_msg, data[0]);
4338 
4339 #ifdef INVARIANTS
4340 	panic("%s: fw_msg type %d", __func__, cpl->type);
4341 #else
4342 	log(LOG_ERR, "%s: fw_msg type %d\n", __func__, cpl->type);
4343 #endif
4344 	return (EDOOFUS);
4345 }
4346 
4347 int
4348 t4_register_fw_msg_handler(struct adapter *sc, int type, fw_msg_handler_t h)
4349 {
4350 	uintptr_t *loc, new;
4351 
4352 	if (type >= nitems(sc->fw_msg_handler))
4353 		return (EINVAL);
4354 
4355 	/*
4356 	 * These are dispatched by the handler for FW{4|6}_CPL_MSG using the CPL
4357 	 * handler dispatch table.  Reject any attempt to install a handler for
4358 	 * this subtype.
4359 	 */
4360 	if (type == FW_TYPE_RSSCPL || type == FW6_TYPE_RSSCPL)
4361 		return (EINVAL);
4362 
4363 	new = h ? (uintptr_t)h : (uintptr_t)fw_msg_not_handled;
4364 	loc = (uintptr_t *) &sc->fw_msg_handler[type];
4365 	atomic_store_rel_ptr(loc, new);
4366 
4367 	return (0);
4368 }
4369 
4370 static int
4371 t4_sysctls(struct adapter *sc)
4372 {
4373 	struct sysctl_ctx_list *ctx;
4374 	struct sysctl_oid *oid;
4375 	struct sysctl_oid_list *children, *c0;
4376 	static char *caps[] = {
4377 		"\20\1PPP\2QFC\3DCBX",			/* caps[0] linkcaps */
4378 		"\20\1NIC\2VM\3IDS\4UM\5UM_ISGL"	/* caps[1] niccaps */
4379 		    "\6HASHFILTER\7ETHOFLD",
4380 		"\20\1TOE",				/* caps[2] toecaps */
4381 		"\20\1RDDP\2RDMAC",			/* caps[3] rdmacaps */
4382 		"\20\1INITIATOR_PDU\2TARGET_PDU"	/* caps[4] iscsicaps */
4383 		    "\3INITIATOR_CNXOFLD\4TARGET_CNXOFLD"
4384 		    "\5INITIATOR_SSNOFLD\6TARGET_SSNOFLD",
4385 		"\20\1INITIATOR\2TARGET\3CTRL_OFLD"	/* caps[5] fcoecaps */
4386 		    "\4PO_INITIAOR\5PO_TARGET"
4387 	};
4388 	static char *doorbells = {"\20\1UDB\2WCWR\3UDBWC\4KDB"};
4389 
4390 	ctx = device_get_sysctl_ctx(sc->dev);
4391 
4392 	/*
4393 	 * dev.t4nex.X.
4394 	 */
4395 	oid = device_get_sysctl_tree(sc->dev);
4396 	c0 = children = SYSCTL_CHILDREN(oid);
4397 
4398 	sc->sc_do_rxcopy = 1;
4399 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "do_rx_copy", CTLFLAG_RW,
4400 	    &sc->sc_do_rxcopy, 1, "Do RX copy of small frames");
4401 
4402 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nports", CTLFLAG_RD, NULL,
4403 	    sc->params.nports, "# of ports");
4404 
4405 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "hw_revision", CTLFLAG_RD,
4406 	    NULL, chip_rev(sc), "chip hardware revision");
4407 
4408 	SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "firmware_version",
4409 	    CTLFLAG_RD, &sc->fw_version, 0, "firmware version");
4410 
4411 	SYSCTL_ADD_STRING(ctx, children, OID_AUTO, "cf",
4412 	    CTLFLAG_RD, &sc->cfg_file, 0, "configuration file");
4413 
4414 	SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "cfcsum", CTLFLAG_RD, NULL,
4415 	    sc->cfcsum, "config file checksum");
4416 
4417 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "doorbells",
4418 	    CTLTYPE_STRING | CTLFLAG_RD, doorbells, sc->doorbells,
4419 	    sysctl_bitfield, "A", "available doorbells");
4420 
4421 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "linkcaps",
4422 	    CTLTYPE_STRING | CTLFLAG_RD, caps[0], sc->linkcaps,
4423 	    sysctl_bitfield, "A", "available link capabilities");
4424 
4425 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "niccaps",
4426 	    CTLTYPE_STRING | CTLFLAG_RD, caps[1], sc->niccaps,
4427 	    sysctl_bitfield, "A", "available NIC capabilities");
4428 
4429 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "toecaps",
4430 	    CTLTYPE_STRING | CTLFLAG_RD, caps[2], sc->toecaps,
4431 	    sysctl_bitfield, "A", "available TCP offload capabilities");
4432 
4433 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rdmacaps",
4434 	    CTLTYPE_STRING | CTLFLAG_RD, caps[3], sc->rdmacaps,
4435 	    sysctl_bitfield, "A", "available RDMA capabilities");
4436 
4437 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "iscsicaps",
4438 	    CTLTYPE_STRING | CTLFLAG_RD, caps[4], sc->iscsicaps,
4439 	    sysctl_bitfield, "A", "available iSCSI capabilities");
4440 
4441 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fcoecaps",
4442 	    CTLTYPE_STRING | CTLFLAG_RD, caps[5], sc->fcoecaps,
4443 	    sysctl_bitfield, "A", "available FCoE capabilities");
4444 
4445 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "core_clock", CTLFLAG_RD, NULL,
4446 	    sc->params.vpd.cclk, "core clock frequency (in KHz)");
4447 
4448 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_timers",
4449 	    CTLTYPE_STRING | CTLFLAG_RD, sc->sge.timer_val,
4450 	    sizeof(sc->sge.timer_val), sysctl_int_array, "A",
4451 	    "interrupt holdoff timer values (us)");
4452 
4453 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pkt_counts",
4454 	    CTLTYPE_STRING | CTLFLAG_RD, sc->sge.counter_val,
4455 	    sizeof(sc->sge.counter_val), sysctl_int_array, "A",
4456 	    "interrupt holdoff packet counter values");
4457 
4458 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nfilters", CTLFLAG_RD,
4459 	    NULL, sc->tids.nftids, "number of filters");
4460 
4461 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature", CTLTYPE_INT |
4462 	    CTLFLAG_RD, sc, 0, sysctl_temperature, "I",
4463 	    "chip temperature (in Celsius)");
4464 
4465 	t4_sge_sysctls(sc, ctx, children);
4466 
4467 	sc->lro_timeout = 100;
4468 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "lro_timeout", CTLFLAG_RW,
4469 	    &sc->lro_timeout, 0, "lro inactive-flush timeout (in us)");
4470 
4471 #ifdef SBUF_DRAIN
4472 	/*
4473 	 * dev.t4nex.X.misc.  Marked CTLFLAG_SKIP to avoid information overload.
4474 	 */
4475 	oid = SYSCTL_ADD_NODE(ctx, c0, OID_AUTO, "misc",
4476 	    CTLFLAG_RD | CTLFLAG_SKIP, NULL,
4477 	    "logs and miscellaneous information");
4478 	children = SYSCTL_CHILDREN(oid);
4479 
4480 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cctrl",
4481 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4482 	    sysctl_cctrl, "A", "congestion control");
4483 
4484 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_tp0",
4485 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4486 	    sysctl_cim_ibq_obq, "A", "CIM IBQ 0 (TP0)");
4487 
4488 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_tp1",
4489 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 1,
4490 	    sysctl_cim_ibq_obq, "A", "CIM IBQ 1 (TP1)");
4491 
4492 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_ulp",
4493 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 2,
4494 	    sysctl_cim_ibq_obq, "A", "CIM IBQ 2 (ULP)");
4495 
4496 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_sge0",
4497 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 3,
4498 	    sysctl_cim_ibq_obq, "A", "CIM IBQ 3 (SGE0)");
4499 
4500 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_sge1",
4501 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 4,
4502 	    sysctl_cim_ibq_obq, "A", "CIM IBQ 4 (SGE1)");
4503 
4504 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_ncsi",
4505 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 5,
4506 	    sysctl_cim_ibq_obq, "A", "CIM IBQ 5 (NCSI)");
4507 
4508 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_la",
4509 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4510 	    sysctl_cim_la, "A", "CIM logic analyzer");
4511 
4512 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ma_la",
4513 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4514 	    sysctl_cim_ma_la, "A", "CIM MA logic analyzer");
4515 
4516 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp0",
4517 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0 + CIM_NUM_IBQ,
4518 	    sysctl_cim_ibq_obq, "A", "CIM OBQ 0 (ULP0)");
4519 
4520 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp1",
4521 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 1 + CIM_NUM_IBQ,
4522 	    sysctl_cim_ibq_obq, "A", "CIM OBQ 1 (ULP1)");
4523 
4524 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp2",
4525 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 2 + CIM_NUM_IBQ,
4526 	    sysctl_cim_ibq_obq, "A", "CIM OBQ 2 (ULP2)");
4527 
4528 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp3",
4529 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 3 + CIM_NUM_IBQ,
4530 	    sysctl_cim_ibq_obq, "A", "CIM OBQ 3 (ULP3)");
4531 
4532 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge",
4533 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 4 + CIM_NUM_IBQ,
4534 	    sysctl_cim_ibq_obq, "A", "CIM OBQ 4 (SGE)");
4535 
4536 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ncsi",
4537 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 5 + CIM_NUM_IBQ,
4538 	    sysctl_cim_ibq_obq, "A", "CIM OBQ 5 (NCSI)");
4539 
4540 	if (is_t5(sc)) {
4541 		SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge0_rx",
4542 		    CTLTYPE_STRING | CTLFLAG_RD, sc, 6 + CIM_NUM_IBQ,
4543 		    sysctl_cim_ibq_obq, "A", "CIM OBQ 6 (SGE0-RX)");
4544 
4545 		SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge1_rx",
4546 		    CTLTYPE_STRING | CTLFLAG_RD, sc, 7 + CIM_NUM_IBQ,
4547 		    sysctl_cim_ibq_obq, "A", "CIM OBQ 7 (SGE1-RX)");
4548 	}
4549 
4550 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_pif_la",
4551 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4552 	    sysctl_cim_pif_la, "A", "CIM PIF logic analyzer");
4553 
4554 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_qcfg",
4555 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4556 	    sysctl_cim_qcfg, "A", "CIM queue configuration");
4557 
4558 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cpl_stats",
4559 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4560 	    sysctl_cpl_stats, "A", "CPL statistics");
4561 
4562 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ddp_stats",
4563 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4564 	    sysctl_ddp_stats, "A", "DDP statistics");
4565 
4566 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "devlog",
4567 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4568 	    sysctl_devlog, "A", "firmware's device log");
4569 
4570 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fcoe_stats",
4571 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4572 	    sysctl_fcoe_stats, "A", "FCoE statistics");
4573 
4574 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "hw_sched",
4575 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4576 	    sysctl_hw_sched, "A", "hardware scheduler ");
4577 
4578 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "l2t",
4579 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4580 	    sysctl_l2t, "A", "hardware L2 table");
4581 
4582 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "lb_stats",
4583 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4584 	    sysctl_lb_stats, "A", "loopback statistics");
4585 
4586 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "meminfo",
4587 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4588 	    sysctl_meminfo, "A", "memory regions");
4589 
4590 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "mps_tcam",
4591 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4592 	    sysctl_mps_tcam, "A", "MPS TCAM entries");
4593 
4594 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "path_mtus",
4595 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4596 	    sysctl_path_mtus, "A", "path MTUs");
4597 
4598 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "pm_stats",
4599 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4600 	    sysctl_pm_stats, "A", "PM statistics");
4601 
4602 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rdma_stats",
4603 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4604 	    sysctl_rdma_stats, "A", "RDMA statistics");
4605 
4606 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tcp_stats",
4607 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4608 	    sysctl_tcp_stats, "A", "TCP statistics");
4609 
4610 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tids",
4611 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4612 	    sysctl_tids, "A", "TID information");
4613 
4614 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_err_stats",
4615 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4616 	    sysctl_tp_err_stats, "A", "TP error statistics");
4617 
4618 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_la",
4619 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4620 	    sysctl_tp_la, "A", "TP logic analyzer");
4621 
4622 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_rate",
4623 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4624 	    sysctl_tx_rate, "A", "Tx rate");
4625 
4626 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ulprx_la",
4627 	    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4628 	    sysctl_ulprx_la, "A", "ULPRX logic analyzer");
4629 
4630 	if (is_t5(sc)) {
4631 		SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "wcwr_stats",
4632 		    CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4633 		    sysctl_wcwr_stats, "A", "write combined work requests");
4634 	}
4635 #endif
4636 
4637 #ifdef TCP_OFFLOAD
4638 	if (is_offload(sc)) {
4639 		/*
4640 		 * dev.t4nex.X.toe.
4641 		 */
4642 		oid = SYSCTL_ADD_NODE(ctx, c0, OID_AUTO, "toe", CTLFLAG_RD,
4643 		    NULL, "TOE parameters");
4644 		children = SYSCTL_CHILDREN(oid);
4645 
4646 		sc->tt.sndbuf = 256 * 1024;
4647 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "sndbuf", CTLFLAG_RW,
4648 		    &sc->tt.sndbuf, 0, "max hardware send buffer size");
4649 
4650 		sc->tt.ddp = 0;
4651 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ddp", CTLFLAG_RW,
4652 		    &sc->tt.ddp, 0, "DDP allowed");
4653 
4654 		sc->tt.indsz = G_INDICATESIZE(t4_read_reg(sc, A_TP_PARA_REG5));
4655 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "indsz", CTLFLAG_RW,
4656 		    &sc->tt.indsz, 0, "DDP max indicate size allowed");
4657 
4658 		sc->tt.ddp_thres =
4659 		    G_RXCOALESCESIZE(t4_read_reg(sc, A_TP_PARA_REG2));
4660 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ddp_thres", CTLFLAG_RW,
4661 		    &sc->tt.ddp_thres, 0, "DDP threshold");
4662 
4663 		sc->tt.rx_coalesce = 1;
4664 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "rx_coalesce",
4665 		    CTLFLAG_RW, &sc->tt.rx_coalesce, 0, "receive coalescing");
4666 	}
4667 #endif
4668 
4669 
4670 	return (0);
4671 }
4672 
4673 static int
4674 cxgbe_sysctls(struct port_info *pi)
4675 {
4676 	struct sysctl_ctx_list *ctx;
4677 	struct sysctl_oid *oid;
4678 	struct sysctl_oid_list *children;
4679 	struct adapter *sc = pi->adapter;
4680 
4681 	ctx = device_get_sysctl_ctx(pi->dev);
4682 
4683 	/*
4684 	 * dev.cxgbe.X.
4685 	 */
4686 	oid = device_get_sysctl_tree(pi->dev);
4687 	children = SYSCTL_CHILDREN(oid);
4688 
4689 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "linkdnrc", CTLTYPE_STRING |
4690 	   CTLFLAG_RD, pi, 0, sysctl_linkdnrc, "A", "reason why link is down");
4691 	if (pi->port_type == FW_PORT_TYPE_BT_XAUI) {
4692 		SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature",
4693 		    CTLTYPE_INT | CTLFLAG_RD, pi, 0, sysctl_btphy, "I",
4694 		    "PHY temperature (in Celsius)");
4695 		SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fw_version",
4696 		    CTLTYPE_INT | CTLFLAG_RD, pi, 1, sysctl_btphy, "I",
4697 		    "PHY firmware version");
4698 	}
4699 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nrxq", CTLFLAG_RD,
4700 	    &pi->nrxq, 0, "# of rx queues");
4701 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ntxq", CTLFLAG_RD,
4702 	    &pi->ntxq, 0, "# of tx queues");
4703 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_rxq", CTLFLAG_RD,
4704 	    &pi->first_rxq, 0, "index of first rx queue");
4705 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_txq", CTLFLAG_RD,
4706 	    &pi->first_txq, 0, "index of first tx queue");
4707 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rsrv_noflowq", CTLTYPE_INT |
4708 	    CTLFLAG_RW, pi, 0, sysctl_noflowq, "IU",
4709 	    "Reserve queue 0 for non-flowid packets");
4710 
4711 #ifdef TCP_OFFLOAD
4712 	if (is_offload(sc)) {
4713 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldrxq", CTLFLAG_RD,
4714 		    &pi->nofldrxq, 0,
4715 		    "# of rx queues for offloaded TCP connections");
4716 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldtxq", CTLFLAG_RD,
4717 		    &pi->nofldtxq, 0,
4718 		    "# of tx queues for offloaded TCP connections");
4719 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_rxq",
4720 		    CTLFLAG_RD, &pi->first_ofld_rxq, 0,
4721 		    "index of first TOE rx queue");
4722 		SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_txq",
4723 		    CTLFLAG_RD, &pi->first_ofld_txq, 0,
4724 		    "index of first TOE tx queue");
4725 	}
4726 #endif
4727 #ifdef DEV_NETMAP
4728 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nnmrxq", CTLFLAG_RD,
4729 	    &pi->nnmrxq, 0, "# of rx queues for netmap");
4730 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nnmtxq", CTLFLAG_RD,
4731 	    &pi->nnmtxq, 0, "# of tx queues for netmap");
4732 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_nm_rxq",
4733 	    CTLFLAG_RD, &pi->first_nm_rxq, 0,
4734 	    "index of first netmap rx queue");
4735 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_nm_txq",
4736 	    CTLFLAG_RD, &pi->first_nm_txq, 0,
4737 	    "index of first netmap tx queue");
4738 #endif
4739 
4740 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_tmr_idx",
4741 	    CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_holdoff_tmr_idx, "I",
4742 	    "holdoff timer index");
4743 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pktc_idx",
4744 	    CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_holdoff_pktc_idx, "I",
4745 	    "holdoff packet counter index");
4746 
4747 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_rxq",
4748 	    CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_qsize_rxq, "I",
4749 	    "rx queue size");
4750 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_txq",
4751 	    CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_qsize_txq, "I",
4752 	    "tx queue size");
4753 
4754 	/*
4755 	 * dev.cxgbe.X.stats.
4756 	 */
4757 	oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "stats", CTLFLAG_RD,
4758 	    NULL, "port statistics");
4759 	children = SYSCTL_CHILDREN(oid);
4760 
4761 #define SYSCTL_ADD_T4_REG64(pi, name, desc, reg) \
4762 	SYSCTL_ADD_OID(ctx, children, OID_AUTO, name, \
4763 	    CTLTYPE_U64 | CTLFLAG_RD, sc, reg, \
4764 	    sysctl_handle_t4_reg64, "QU", desc)
4765 
4766 	SYSCTL_ADD_T4_REG64(pi, "tx_octets", "# of octets in good frames",
4767 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BYTES_L));
4768 	SYSCTL_ADD_T4_REG64(pi, "tx_frames", "total # of good frames",
4769 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_FRAMES_L));
4770 	SYSCTL_ADD_T4_REG64(pi, "tx_bcast_frames", "# of broadcast frames",
4771 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BCAST_L));
4772 	SYSCTL_ADD_T4_REG64(pi, "tx_mcast_frames", "# of multicast frames",
4773 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_MCAST_L));
4774 	SYSCTL_ADD_T4_REG64(pi, "tx_ucast_frames", "# of unicast frames",
4775 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_UCAST_L));
4776 	SYSCTL_ADD_T4_REG64(pi, "tx_error_frames", "# of error frames",
4777 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_ERROR_L));
4778 	SYSCTL_ADD_T4_REG64(pi, "tx_frames_64",
4779 	    "# of tx frames in this range",
4780 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_64B_L));
4781 	SYSCTL_ADD_T4_REG64(pi, "tx_frames_65_127",
4782 	    "# of tx frames in this range",
4783 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_65B_127B_L));
4784 	SYSCTL_ADD_T4_REG64(pi, "tx_frames_128_255",
4785 	    "# of tx frames in this range",
4786 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_128B_255B_L));
4787 	SYSCTL_ADD_T4_REG64(pi, "tx_frames_256_511",
4788 	    "# of tx frames in this range",
4789 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_256B_511B_L));
4790 	SYSCTL_ADD_T4_REG64(pi, "tx_frames_512_1023",
4791 	    "# of tx frames in this range",
4792 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_512B_1023B_L));
4793 	SYSCTL_ADD_T4_REG64(pi, "tx_frames_1024_1518",
4794 	    "# of tx frames in this range",
4795 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1024B_1518B_L));
4796 	SYSCTL_ADD_T4_REG64(pi, "tx_frames_1519_max",
4797 	    "# of tx frames in this range",
4798 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1519B_MAX_L));
4799 	SYSCTL_ADD_T4_REG64(pi, "tx_drop", "# of dropped tx frames",
4800 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_DROP_L));
4801 	SYSCTL_ADD_T4_REG64(pi, "tx_pause", "# of pause frames transmitted",
4802 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PAUSE_L));
4803 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp0", "# of PPP prio 0 frames transmitted",
4804 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP0_L));
4805 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp1", "# of PPP prio 1 frames transmitted",
4806 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP1_L));
4807 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp2", "# of PPP prio 2 frames transmitted",
4808 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP2_L));
4809 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp3", "# of PPP prio 3 frames transmitted",
4810 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP3_L));
4811 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp4", "# of PPP prio 4 frames transmitted",
4812 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP4_L));
4813 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp5", "# of PPP prio 5 frames transmitted",
4814 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP5_L));
4815 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp6", "# of PPP prio 6 frames transmitted",
4816 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP6_L));
4817 	SYSCTL_ADD_T4_REG64(pi, "tx_ppp7", "# of PPP prio 7 frames transmitted",
4818 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP7_L));
4819 
4820 	SYSCTL_ADD_T4_REG64(pi, "rx_octets", "# of octets in good frames",
4821 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BYTES_L));
4822 	SYSCTL_ADD_T4_REG64(pi, "rx_frames", "total # of good frames",
4823 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_FRAMES_L));
4824 	SYSCTL_ADD_T4_REG64(pi, "rx_bcast_frames", "# of broadcast frames",
4825 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BCAST_L));
4826 	SYSCTL_ADD_T4_REG64(pi, "rx_mcast_frames", "# of multicast frames",
4827 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MCAST_L));
4828 	SYSCTL_ADD_T4_REG64(pi, "rx_ucast_frames", "# of unicast frames",
4829 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_UCAST_L));
4830 	SYSCTL_ADD_T4_REG64(pi, "rx_too_long", "# of frames exceeding MTU",
4831 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L));
4832 	SYSCTL_ADD_T4_REG64(pi, "rx_jabber", "# of jabber frames",
4833 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L));
4834 	SYSCTL_ADD_T4_REG64(pi, "rx_fcs_err",
4835 	    "# of frames received with bad FCS",
4836 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L));
4837 	SYSCTL_ADD_T4_REG64(pi, "rx_len_err",
4838 	    "# of frames received with length error",
4839 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L));
4840 	SYSCTL_ADD_T4_REG64(pi, "rx_symbol_err", "symbol errors",
4841 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L));
4842 	SYSCTL_ADD_T4_REG64(pi, "rx_runt", "# of short frames received",
4843 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LESS_64B_L));
4844 	SYSCTL_ADD_T4_REG64(pi, "rx_frames_64",
4845 	    "# of rx frames in this range",
4846 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_64B_L));
4847 	SYSCTL_ADD_T4_REG64(pi, "rx_frames_65_127",
4848 	    "# of rx frames in this range",
4849 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_65B_127B_L));
4850 	SYSCTL_ADD_T4_REG64(pi, "rx_frames_128_255",
4851 	    "# of rx frames in this range",
4852 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_128B_255B_L));
4853 	SYSCTL_ADD_T4_REG64(pi, "rx_frames_256_511",
4854 	    "# of rx frames in this range",
4855 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_256B_511B_L));
4856 	SYSCTL_ADD_T4_REG64(pi, "rx_frames_512_1023",
4857 	    "# of rx frames in this range",
4858 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_512B_1023B_L));
4859 	SYSCTL_ADD_T4_REG64(pi, "rx_frames_1024_1518",
4860 	    "# of rx frames in this range",
4861 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1024B_1518B_L));
4862 	SYSCTL_ADD_T4_REG64(pi, "rx_frames_1519_max",
4863 	    "# of rx frames in this range",
4864 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1519B_MAX_L));
4865 	SYSCTL_ADD_T4_REG64(pi, "rx_pause", "# of pause frames received",
4866 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PAUSE_L));
4867 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp0", "# of PPP prio 0 frames received",
4868 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP0_L));
4869 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp1", "# of PPP prio 1 frames received",
4870 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP1_L));
4871 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp2", "# of PPP prio 2 frames received",
4872 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP2_L));
4873 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp3", "# of PPP prio 3 frames received",
4874 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP3_L));
4875 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp4", "# of PPP prio 4 frames received",
4876 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP4_L));
4877 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp5", "# of PPP prio 5 frames received",
4878 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP5_L));
4879 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp6", "# of PPP prio 6 frames received",
4880 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP6_L));
4881 	SYSCTL_ADD_T4_REG64(pi, "rx_ppp7", "# of PPP prio 7 frames received",
4882 	    PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP7_L));
4883 
4884 #undef SYSCTL_ADD_T4_REG64
4885 
4886 #define SYSCTL_ADD_T4_PORTSTAT(name, desc) \
4887 	SYSCTL_ADD_UQUAD(ctx, children, OID_AUTO, #name, CTLFLAG_RD, \
4888 	    &pi->stats.name, desc)
4889 
4890 	/* We get these from port_stats and they may be stale by upto 1s */
4891 	SYSCTL_ADD_T4_PORTSTAT(rx_ovflow0,
4892 	    "# drops due to buffer-group 0 overflows");
4893 	SYSCTL_ADD_T4_PORTSTAT(rx_ovflow1,
4894 	    "# drops due to buffer-group 1 overflows");
4895 	SYSCTL_ADD_T4_PORTSTAT(rx_ovflow2,
4896 	    "# drops due to buffer-group 2 overflows");
4897 	SYSCTL_ADD_T4_PORTSTAT(rx_ovflow3,
4898 	    "# drops due to buffer-group 3 overflows");
4899 	SYSCTL_ADD_T4_PORTSTAT(rx_trunc0,
4900 	    "# of buffer-group 0 truncated packets");
4901 	SYSCTL_ADD_T4_PORTSTAT(rx_trunc1,
4902 	    "# of buffer-group 1 truncated packets");
4903 	SYSCTL_ADD_T4_PORTSTAT(rx_trunc2,
4904 	    "# of buffer-group 2 truncated packets");
4905 	SYSCTL_ADD_T4_PORTSTAT(rx_trunc3,
4906 	    "# of buffer-group 3 truncated packets");
4907 
4908 #undef SYSCTL_ADD_T4_PORTSTAT
4909 
4910 	return (0);
4911 }
4912 
4913 static int
4914 sysctl_int_array(SYSCTL_HANDLER_ARGS)
4915 {
4916 	int rc, *i;
4917 	struct sbuf sb;
4918 
4919 	sbuf_new(&sb, NULL, 32, SBUF_AUTOEXTEND);
4920 	for (i = arg1; arg2; arg2 -= sizeof(int), i++)
4921 		sbuf_printf(&sb, "%d ", *i);
4922 	sbuf_trim(&sb);
4923 	sbuf_finish(&sb);
4924 	rc = sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req);
4925 	sbuf_delete(&sb);
4926 	return (rc);
4927 }
4928 
4929 static int
4930 sysctl_bitfield(SYSCTL_HANDLER_ARGS)
4931 {
4932 	int rc;
4933 	struct sbuf *sb;
4934 
4935 	rc = sysctl_wire_old_buffer(req, 0);
4936 	if (rc != 0)
4937 		return(rc);
4938 
4939 	sb = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4940 	if (sb == NULL)
4941 		return (ENOMEM);
4942 
4943 	sbuf_printf(sb, "%b", (int)arg2, (char *)arg1);
4944 	rc = sbuf_finish(sb);
4945 	sbuf_delete(sb);
4946 
4947 	return (rc);
4948 }
4949 
4950 static int
4951 sysctl_btphy(SYSCTL_HANDLER_ARGS)
4952 {
4953 	struct port_info *pi = arg1;
4954 	int op = arg2;
4955 	struct adapter *sc = pi->adapter;
4956 	u_int v;
4957 	int rc;
4958 
4959 	rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4btt");
4960 	if (rc)
4961 		return (rc);
4962 	/* XXX: magic numbers */
4963 	rc = -t4_mdio_rd(sc, sc->mbox, pi->mdio_addr, 0x1e, op ? 0x20 : 0xc820,
4964 	    &v);
4965 	end_synchronized_op(sc, 0);
4966 	if (rc)
4967 		return (rc);
4968 	if (op == 0)
4969 		v /= 256;
4970 
4971 	rc = sysctl_handle_int(oidp, &v, 0, req);
4972 	return (rc);
4973 }
4974 
4975 static int
4976 sysctl_noflowq(SYSCTL_HANDLER_ARGS)
4977 {
4978 	struct port_info *pi = arg1;
4979 	int rc, val;
4980 
4981 	val = pi->rsrv_noflowq;
4982 	rc = sysctl_handle_int(oidp, &val, 0, req);
4983 	if (rc != 0 || req->newptr == NULL)
4984 		return (rc);
4985 
4986 	if ((val >= 1) && (pi->ntxq > 1))
4987 		pi->rsrv_noflowq = 1;
4988 	else
4989 		pi->rsrv_noflowq = 0;
4990 
4991 	return (rc);
4992 }
4993 
4994 static int
4995 sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS)
4996 {
4997 	struct port_info *pi = arg1;
4998 	struct adapter *sc = pi->adapter;
4999 	int idx, rc, i;
5000 	struct sge_rxq *rxq;
5001 #ifdef TCP_OFFLOAD
5002 	struct sge_ofld_rxq *ofld_rxq;
5003 #endif
5004 	uint8_t v;
5005 
5006 	idx = pi->tmr_idx;
5007 
5008 	rc = sysctl_handle_int(oidp, &idx, 0, req);
5009 	if (rc != 0 || req->newptr == NULL)
5010 		return (rc);
5011 
5012 	if (idx < 0 || idx >= SGE_NTIMERS)
5013 		return (EINVAL);
5014 
5015 	rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5016 	    "t4tmr");
5017 	if (rc)
5018 		return (rc);
5019 
5020 	v = V_QINTR_TIMER_IDX(idx) | V_QINTR_CNT_EN(pi->pktc_idx != -1);
5021 	for_each_rxq(pi, i, rxq) {
5022 #ifdef atomic_store_rel_8
5023 		atomic_store_rel_8(&rxq->iq.intr_params, v);
5024 #else
5025 		rxq->iq.intr_params = v;
5026 #endif
5027 	}
5028 #ifdef TCP_OFFLOAD
5029 	for_each_ofld_rxq(pi, i, ofld_rxq) {
5030 #ifdef atomic_store_rel_8
5031 		atomic_store_rel_8(&ofld_rxq->iq.intr_params, v);
5032 #else
5033 		ofld_rxq->iq.intr_params = v;
5034 #endif
5035 	}
5036 #endif
5037 	pi->tmr_idx = idx;
5038 
5039 	end_synchronized_op(sc, LOCK_HELD);
5040 	return (0);
5041 }
5042 
5043 static int
5044 sysctl_holdoff_pktc_idx(SYSCTL_HANDLER_ARGS)
5045 {
5046 	struct port_info *pi = arg1;
5047 	struct adapter *sc = pi->adapter;
5048 	int idx, rc;
5049 
5050 	idx = pi->pktc_idx;
5051 
5052 	rc = sysctl_handle_int(oidp, &idx, 0, req);
5053 	if (rc != 0 || req->newptr == NULL)
5054 		return (rc);
5055 
5056 	if (idx < -1 || idx >= SGE_NCOUNTERS)
5057 		return (EINVAL);
5058 
5059 	rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5060 	    "t4pktc");
5061 	if (rc)
5062 		return (rc);
5063 
5064 	if (pi->flags & PORT_INIT_DONE)
5065 		rc = EBUSY; /* cannot be changed once the queues are created */
5066 	else
5067 		pi->pktc_idx = idx;
5068 
5069 	end_synchronized_op(sc, LOCK_HELD);
5070 	return (rc);
5071 }
5072 
5073 static int
5074 sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS)
5075 {
5076 	struct port_info *pi = arg1;
5077 	struct adapter *sc = pi->adapter;
5078 	int qsize, rc;
5079 
5080 	qsize = pi->qsize_rxq;
5081 
5082 	rc = sysctl_handle_int(oidp, &qsize, 0, req);
5083 	if (rc != 0 || req->newptr == NULL)
5084 		return (rc);
5085 
5086 	if (qsize < 128 || (qsize & 7))
5087 		return (EINVAL);
5088 
5089 	rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5090 	    "t4rxqs");
5091 	if (rc)
5092 		return (rc);
5093 
5094 	if (pi->flags & PORT_INIT_DONE)
5095 		rc = EBUSY; /* cannot be changed once the queues are created */
5096 	else
5097 		pi->qsize_rxq = qsize;
5098 
5099 	end_synchronized_op(sc, LOCK_HELD);
5100 	return (rc);
5101 }
5102 
5103 static int
5104 sysctl_qsize_txq(SYSCTL_HANDLER_ARGS)
5105 {
5106 	struct port_info *pi = arg1;
5107 	struct adapter *sc = pi->adapter;
5108 	int qsize, rc;
5109 
5110 	qsize = pi->qsize_txq;
5111 
5112 	rc = sysctl_handle_int(oidp, &qsize, 0, req);
5113 	if (rc != 0 || req->newptr == NULL)
5114 		return (rc);
5115 
5116 	/* bufring size must be powerof2 */
5117 	if (qsize < 128 || !powerof2(qsize))
5118 		return (EINVAL);
5119 
5120 	rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5121 	    "t4txqs");
5122 	if (rc)
5123 		return (rc);
5124 
5125 	if (pi->flags & PORT_INIT_DONE)
5126 		rc = EBUSY; /* cannot be changed once the queues are created */
5127 	else
5128 		pi->qsize_txq = qsize;
5129 
5130 	end_synchronized_op(sc, LOCK_HELD);
5131 	return (rc);
5132 }
5133 
5134 static int
5135 sysctl_handle_t4_reg64(SYSCTL_HANDLER_ARGS)
5136 {
5137 	struct adapter *sc = arg1;
5138 	int reg = arg2;
5139 	uint64_t val;
5140 
5141 	val = t4_read_reg64(sc, reg);
5142 
5143 	return (sysctl_handle_64(oidp, &val, 0, req));
5144 }
5145 
5146 static int
5147 sysctl_temperature(SYSCTL_HANDLER_ARGS)
5148 {
5149 	struct adapter *sc = arg1;
5150 	int rc, t;
5151 	uint32_t param, val;
5152 
5153 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4temp");
5154 	if (rc)
5155 		return (rc);
5156 	param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
5157 	    V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_DIAG) |
5158 	    V_FW_PARAMS_PARAM_Y(FW_PARAM_DEV_DIAG_TMP);
5159 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
5160 	end_synchronized_op(sc, 0);
5161 	if (rc)
5162 		return (rc);
5163 
5164 	/* unknown is returned as 0 but we display -1 in that case */
5165 	t = val == 0 ? -1 : val;
5166 
5167 	rc = sysctl_handle_int(oidp, &t, 0, req);
5168 	return (rc);
5169 }
5170 
5171 #ifdef SBUF_DRAIN
5172 static int
5173 sysctl_cctrl(SYSCTL_HANDLER_ARGS)
5174 {
5175 	struct adapter *sc = arg1;
5176 	struct sbuf *sb;
5177 	int rc, i;
5178 	uint16_t incr[NMTUS][NCCTRL_WIN];
5179 	static const char *dec_fac[] = {
5180 		"0.5", "0.5625", "0.625", "0.6875", "0.75", "0.8125", "0.875",
5181 		"0.9375"
5182 	};
5183 
5184 	rc = sysctl_wire_old_buffer(req, 0);
5185 	if (rc != 0)
5186 		return (rc);
5187 
5188 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5189 	if (sb == NULL)
5190 		return (ENOMEM);
5191 
5192 	t4_read_cong_tbl(sc, incr);
5193 
5194 	for (i = 0; i < NCCTRL_WIN; ++i) {
5195 		sbuf_printf(sb, "%2d: %4u %4u %4u %4u %4u %4u %4u %4u\n", i,
5196 		    incr[0][i], incr[1][i], incr[2][i], incr[3][i], incr[4][i],
5197 		    incr[5][i], incr[6][i], incr[7][i]);
5198 		sbuf_printf(sb, "%8u %4u %4u %4u %4u %4u %4u %4u %5u %s\n",
5199 		    incr[8][i], incr[9][i], incr[10][i], incr[11][i],
5200 		    incr[12][i], incr[13][i], incr[14][i], incr[15][i],
5201 		    sc->params.a_wnd[i], dec_fac[sc->params.b_wnd[i]]);
5202 	}
5203 
5204 	rc = sbuf_finish(sb);
5205 	sbuf_delete(sb);
5206 
5207 	return (rc);
5208 }
5209 
5210 static const char *qname[CIM_NUM_IBQ + CIM_NUM_OBQ_T5] = {
5211 	"TP0", "TP1", "ULP", "SGE0", "SGE1", "NC-SI",	/* ibq's */
5212 	"ULP0", "ULP1", "ULP2", "ULP3", "SGE", "NC-SI",	/* obq's */
5213 	"SGE0-RX", "SGE1-RX"	/* additional obq's (T5 onwards) */
5214 };
5215 
5216 static int
5217 sysctl_cim_ibq_obq(SYSCTL_HANDLER_ARGS)
5218 {
5219 	struct adapter *sc = arg1;
5220 	struct sbuf *sb;
5221 	int rc, i, n, qid = arg2;
5222 	uint32_t *buf, *p;
5223 	char *qtype;
5224 	u_int cim_num_obq = is_t4(sc) ? CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
5225 
5226 	KASSERT(qid >= 0 && qid < CIM_NUM_IBQ + cim_num_obq,
5227 	    ("%s: bad qid %d\n", __func__, qid));
5228 
5229 	if (qid < CIM_NUM_IBQ) {
5230 		/* inbound queue */
5231 		qtype = "IBQ";
5232 		n = 4 * CIM_IBQ_SIZE;
5233 		buf = malloc(n * sizeof(uint32_t), M_CXGBE, M_ZERO | M_WAITOK);
5234 		rc = t4_read_cim_ibq(sc, qid, buf, n);
5235 	} else {
5236 		/* outbound queue */
5237 		qtype = "OBQ";
5238 		qid -= CIM_NUM_IBQ;
5239 		n = 4 * cim_num_obq * CIM_OBQ_SIZE;
5240 		buf = malloc(n * sizeof(uint32_t), M_CXGBE, M_ZERO | M_WAITOK);
5241 		rc = t4_read_cim_obq(sc, qid, buf, n);
5242 	}
5243 
5244 	if (rc < 0) {
5245 		rc = -rc;
5246 		goto done;
5247 	}
5248 	n = rc * sizeof(uint32_t);	/* rc has # of words actually read */
5249 
5250 	rc = sysctl_wire_old_buffer(req, 0);
5251 	if (rc != 0)
5252 		goto done;
5253 
5254 	sb = sbuf_new_for_sysctl(NULL, NULL, PAGE_SIZE, req);
5255 	if (sb == NULL) {
5256 		rc = ENOMEM;
5257 		goto done;
5258 	}
5259 
5260 	sbuf_printf(sb, "%s%d %s", qtype , qid, qname[arg2]);
5261 	for (i = 0, p = buf; i < n; i += 16, p += 4)
5262 		sbuf_printf(sb, "\n%#06x: %08x %08x %08x %08x", i, p[0], p[1],
5263 		    p[2], p[3]);
5264 
5265 	rc = sbuf_finish(sb);
5266 	sbuf_delete(sb);
5267 done:
5268 	free(buf, M_CXGBE);
5269 	return (rc);
5270 }
5271 
5272 static int
5273 sysctl_cim_la(SYSCTL_HANDLER_ARGS)
5274 {
5275 	struct adapter *sc = arg1;
5276 	u_int cfg;
5277 	struct sbuf *sb;
5278 	uint32_t *buf, *p;
5279 	int rc;
5280 
5281 	rc = -t4_cim_read(sc, A_UP_UP_DBG_LA_CFG, 1, &cfg);
5282 	if (rc != 0)
5283 		return (rc);
5284 
5285 	rc = sysctl_wire_old_buffer(req, 0);
5286 	if (rc != 0)
5287 		return (rc);
5288 
5289 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5290 	if (sb == NULL)
5291 		return (ENOMEM);
5292 
5293 	buf = malloc(sc->params.cim_la_size * sizeof(uint32_t), M_CXGBE,
5294 	    M_ZERO | M_WAITOK);
5295 
5296 	rc = -t4_cim_read_la(sc, buf, NULL);
5297 	if (rc != 0)
5298 		goto done;
5299 
5300 	sbuf_printf(sb, "Status   Data      PC%s",
5301 	    cfg & F_UPDBGLACAPTPCONLY ? "" :
5302 	    "     LS0Stat  LS0Addr             LS0Data");
5303 
5304 	KASSERT((sc->params.cim_la_size & 7) == 0,
5305 	    ("%s: p will walk off the end of buf", __func__));
5306 
5307 	for (p = buf; p < &buf[sc->params.cim_la_size]; p += 8) {
5308 		if (cfg & F_UPDBGLACAPTPCONLY) {
5309 			sbuf_printf(sb, "\n  %02x   %08x %08x", p[5] & 0xff,
5310 			    p[6], p[7]);
5311 			sbuf_printf(sb, "\n  %02x   %02x%06x %02x%06x",
5312 			    (p[3] >> 8) & 0xff, p[3] & 0xff, p[4] >> 8,
5313 			    p[4] & 0xff, p[5] >> 8);
5314 			sbuf_printf(sb, "\n  %02x   %x%07x %x%07x",
5315 			    (p[0] >> 4) & 0xff, p[0] & 0xf, p[1] >> 4,
5316 			    p[1] & 0xf, p[2] >> 4);
5317 		} else {
5318 			sbuf_printf(sb,
5319 			    "\n  %02x   %x%07x %x%07x %08x %08x "
5320 			    "%08x%08x%08x%08x",
5321 			    (p[0] >> 4) & 0xff, p[0] & 0xf, p[1] >> 4,
5322 			    p[1] & 0xf, p[2] >> 4, p[2] & 0xf, p[3], p[4], p[5],
5323 			    p[6], p[7]);
5324 		}
5325 	}
5326 
5327 	rc = sbuf_finish(sb);
5328 	sbuf_delete(sb);
5329 done:
5330 	free(buf, M_CXGBE);
5331 	return (rc);
5332 }
5333 
5334 static int
5335 sysctl_cim_ma_la(SYSCTL_HANDLER_ARGS)
5336 {
5337 	struct adapter *sc = arg1;
5338 	u_int i;
5339 	struct sbuf *sb;
5340 	uint32_t *buf, *p;
5341 	int rc;
5342 
5343 	rc = sysctl_wire_old_buffer(req, 0);
5344 	if (rc != 0)
5345 		return (rc);
5346 
5347 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5348 	if (sb == NULL)
5349 		return (ENOMEM);
5350 
5351 	buf = malloc(2 * CIM_MALA_SIZE * 5 * sizeof(uint32_t), M_CXGBE,
5352 	    M_ZERO | M_WAITOK);
5353 
5354 	t4_cim_read_ma_la(sc, buf, buf + 5 * CIM_MALA_SIZE);
5355 	p = buf;
5356 
5357 	for (i = 0; i < CIM_MALA_SIZE; i++, p += 5) {
5358 		sbuf_printf(sb, "\n%02x%08x%08x%08x%08x", p[4], p[3], p[2],
5359 		    p[1], p[0]);
5360 	}
5361 
5362 	sbuf_printf(sb, "\n\nCnt ID Tag UE       Data       RDY VLD");
5363 	for (i = 0; i < CIM_MALA_SIZE; i++, p += 5) {
5364 		sbuf_printf(sb, "\n%3u %2u  %x   %u %08x%08x  %u   %u",
5365 		    (p[2] >> 10) & 0xff, (p[2] >> 7) & 7,
5366 		    (p[2] >> 3) & 0xf, (p[2] >> 2) & 1,
5367 		    (p[1] >> 2) | ((p[2] & 3) << 30),
5368 		    (p[0] >> 2) | ((p[1] & 3) << 30), (p[0] >> 1) & 1,
5369 		    p[0] & 1);
5370 	}
5371 
5372 	rc = sbuf_finish(sb);
5373 	sbuf_delete(sb);
5374 	free(buf, M_CXGBE);
5375 	return (rc);
5376 }
5377 
5378 static int
5379 sysctl_cim_pif_la(SYSCTL_HANDLER_ARGS)
5380 {
5381 	struct adapter *sc = arg1;
5382 	u_int i;
5383 	struct sbuf *sb;
5384 	uint32_t *buf, *p;
5385 	int rc;
5386 
5387 	rc = sysctl_wire_old_buffer(req, 0);
5388 	if (rc != 0)
5389 		return (rc);
5390 
5391 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5392 	if (sb == NULL)
5393 		return (ENOMEM);
5394 
5395 	buf = malloc(2 * CIM_PIFLA_SIZE * 6 * sizeof(uint32_t), M_CXGBE,
5396 	    M_ZERO | M_WAITOK);
5397 
5398 	t4_cim_read_pif_la(sc, buf, buf + 6 * CIM_PIFLA_SIZE, NULL, NULL);
5399 	p = buf;
5400 
5401 	sbuf_printf(sb, "Cntl ID DataBE   Addr                 Data");
5402 	for (i = 0; i < CIM_MALA_SIZE; i++, p += 6) {
5403 		sbuf_printf(sb, "\n %02x  %02x  %04x  %08x %08x%08x%08x%08x",
5404 		    (p[5] >> 22) & 0xff, (p[5] >> 16) & 0x3f, p[5] & 0xffff,
5405 		    p[4], p[3], p[2], p[1], p[0]);
5406 	}
5407 
5408 	sbuf_printf(sb, "\n\nCntl ID               Data");
5409 	for (i = 0; i < CIM_MALA_SIZE; i++, p += 6) {
5410 		sbuf_printf(sb, "\n %02x  %02x %08x%08x%08x%08x",
5411 		    (p[4] >> 6) & 0xff, p[4] & 0x3f, p[3], p[2], p[1], p[0]);
5412 	}
5413 
5414 	rc = sbuf_finish(sb);
5415 	sbuf_delete(sb);
5416 	free(buf, M_CXGBE);
5417 	return (rc);
5418 }
5419 
5420 static int
5421 sysctl_cim_qcfg(SYSCTL_HANDLER_ARGS)
5422 {
5423 	struct adapter *sc = arg1;
5424 	struct sbuf *sb;
5425 	int rc, i;
5426 	uint16_t base[CIM_NUM_IBQ + CIM_NUM_OBQ_T5];
5427 	uint16_t size[CIM_NUM_IBQ + CIM_NUM_OBQ_T5];
5428 	uint16_t thres[CIM_NUM_IBQ];
5429 	uint32_t obq_wr[2 * CIM_NUM_OBQ_T5], *wr = obq_wr;
5430 	uint32_t stat[4 * (CIM_NUM_IBQ + CIM_NUM_OBQ_T5)], *p = stat;
5431 	u_int cim_num_obq, ibq_rdaddr, obq_rdaddr, nq;
5432 
5433 	if (is_t4(sc)) {
5434 		cim_num_obq = CIM_NUM_OBQ;
5435 		ibq_rdaddr = A_UP_IBQ_0_RDADDR;
5436 		obq_rdaddr = A_UP_OBQ_0_REALADDR;
5437 	} else {
5438 		cim_num_obq = CIM_NUM_OBQ_T5;
5439 		ibq_rdaddr = A_UP_IBQ_0_SHADOW_RDADDR;
5440 		obq_rdaddr = A_UP_OBQ_0_SHADOW_REALADDR;
5441 	}
5442 	nq = CIM_NUM_IBQ + cim_num_obq;
5443 
5444 	rc = -t4_cim_read(sc, ibq_rdaddr, 4 * nq, stat);
5445 	if (rc == 0)
5446 		rc = -t4_cim_read(sc, obq_rdaddr, 2 * cim_num_obq, obq_wr);
5447 	if (rc != 0)
5448 		return (rc);
5449 
5450 	t4_read_cimq_cfg(sc, base, size, thres);
5451 
5452 	rc = sysctl_wire_old_buffer(req, 0);
5453 	if (rc != 0)
5454 		return (rc);
5455 
5456 	sb = sbuf_new_for_sysctl(NULL, NULL, PAGE_SIZE, req);
5457 	if (sb == NULL)
5458 		return (ENOMEM);
5459 
5460 	sbuf_printf(sb, "Queue  Base  Size Thres RdPtr WrPtr  SOP  EOP Avail");
5461 
5462 	for (i = 0; i < CIM_NUM_IBQ; i++, p += 4)
5463 		sbuf_printf(sb, "\n%7s %5x %5u %5u %6x  %4x %4u %4u %5u",
5464 		    qname[i], base[i], size[i], thres[i], G_IBQRDADDR(p[0]),
5465 		    G_IBQWRADDR(p[1]), G_QUESOPCNT(p[3]), G_QUEEOPCNT(p[3]),
5466 		    G_QUEREMFLITS(p[2]) * 16);
5467 	for ( ; i < nq; i++, p += 4, wr += 2)
5468 		sbuf_printf(sb, "\n%7s %5x %5u %12x  %4x %4u %4u %5u", qname[i],
5469 		    base[i], size[i], G_QUERDADDR(p[0]) & 0x3fff,
5470 		    wr[0] - base[i], G_QUESOPCNT(p[3]), G_QUEEOPCNT(p[3]),
5471 		    G_QUEREMFLITS(p[2]) * 16);
5472 
5473 	rc = sbuf_finish(sb);
5474 	sbuf_delete(sb);
5475 
5476 	return (rc);
5477 }
5478 
5479 static int
5480 sysctl_cpl_stats(SYSCTL_HANDLER_ARGS)
5481 {
5482 	struct adapter *sc = arg1;
5483 	struct sbuf *sb;
5484 	int rc;
5485 	struct tp_cpl_stats stats;
5486 
5487 	rc = sysctl_wire_old_buffer(req, 0);
5488 	if (rc != 0)
5489 		return (rc);
5490 
5491 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5492 	if (sb == NULL)
5493 		return (ENOMEM);
5494 
5495 	t4_tp_get_cpl_stats(sc, &stats);
5496 
5497 	sbuf_printf(sb, "                 channel 0  channel 1  channel 2  "
5498 	    "channel 3\n");
5499 	sbuf_printf(sb, "CPL requests:   %10u %10u %10u %10u\n",
5500 		   stats.req[0], stats.req[1], stats.req[2], stats.req[3]);
5501 	sbuf_printf(sb, "CPL responses:  %10u %10u %10u %10u",
5502 		   stats.rsp[0], stats.rsp[1], stats.rsp[2], stats.rsp[3]);
5503 
5504 	rc = sbuf_finish(sb);
5505 	sbuf_delete(sb);
5506 
5507 	return (rc);
5508 }
5509 
5510 static int
5511 sysctl_ddp_stats(SYSCTL_HANDLER_ARGS)
5512 {
5513 	struct adapter *sc = arg1;
5514 	struct sbuf *sb;
5515 	int rc;
5516 	struct tp_usm_stats stats;
5517 
5518 	rc = sysctl_wire_old_buffer(req, 0);
5519 	if (rc != 0)
5520 		return(rc);
5521 
5522 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5523 	if (sb == NULL)
5524 		return (ENOMEM);
5525 
5526 	t4_get_usm_stats(sc, &stats);
5527 
5528 	sbuf_printf(sb, "Frames: %u\n", stats.frames);
5529 	sbuf_printf(sb, "Octets: %ju\n", stats.octets);
5530 	sbuf_printf(sb, "Drops:  %u", stats.drops);
5531 
5532 	rc = sbuf_finish(sb);
5533 	sbuf_delete(sb);
5534 
5535 	return (rc);
5536 }
5537 
5538 const char *devlog_level_strings[] = {
5539 	[FW_DEVLOG_LEVEL_EMERG]		= "EMERG",
5540 	[FW_DEVLOG_LEVEL_CRIT]		= "CRIT",
5541 	[FW_DEVLOG_LEVEL_ERR]		= "ERR",
5542 	[FW_DEVLOG_LEVEL_NOTICE]	= "NOTICE",
5543 	[FW_DEVLOG_LEVEL_INFO]		= "INFO",
5544 	[FW_DEVLOG_LEVEL_DEBUG]		= "DEBUG"
5545 };
5546 
5547 const char *devlog_facility_strings[] = {
5548 	[FW_DEVLOG_FACILITY_CORE]	= "CORE",
5549 	[FW_DEVLOG_FACILITY_CF]		= "CF",
5550 	[FW_DEVLOG_FACILITY_SCHED]	= "SCHED",
5551 	[FW_DEVLOG_FACILITY_TIMER]	= "TIMER",
5552 	[FW_DEVLOG_FACILITY_RES]	= "RES",
5553 	[FW_DEVLOG_FACILITY_HW]		= "HW",
5554 	[FW_DEVLOG_FACILITY_FLR]	= "FLR",
5555 	[FW_DEVLOG_FACILITY_DMAQ]	= "DMAQ",
5556 	[FW_DEVLOG_FACILITY_PHY]	= "PHY",
5557 	[FW_DEVLOG_FACILITY_MAC]	= "MAC",
5558 	[FW_DEVLOG_FACILITY_PORT]	= "PORT",
5559 	[FW_DEVLOG_FACILITY_VI]		= "VI",
5560 	[FW_DEVLOG_FACILITY_FILTER]	= "FILTER",
5561 	[FW_DEVLOG_FACILITY_ACL]	= "ACL",
5562 	[FW_DEVLOG_FACILITY_TM]		= "TM",
5563 	[FW_DEVLOG_FACILITY_QFC]	= "QFC",
5564 	[FW_DEVLOG_FACILITY_DCB]	= "DCB",
5565 	[FW_DEVLOG_FACILITY_ETH]	= "ETH",
5566 	[FW_DEVLOG_FACILITY_OFLD]	= "OFLD",
5567 	[FW_DEVLOG_FACILITY_RI]		= "RI",
5568 	[FW_DEVLOG_FACILITY_ISCSI]	= "ISCSI",
5569 	[FW_DEVLOG_FACILITY_FCOE]	= "FCOE",
5570 	[FW_DEVLOG_FACILITY_FOISCSI]	= "FOISCSI",
5571 	[FW_DEVLOG_FACILITY_FOFCOE]	= "FOFCOE"
5572 };
5573 
5574 static int
5575 sysctl_devlog(SYSCTL_HANDLER_ARGS)
5576 {
5577 	struct adapter *sc = arg1;
5578 	struct devlog_params *dparams = &sc->params.devlog;
5579 	struct fw_devlog_e *buf, *e;
5580 	int i, j, rc, nentries, first = 0, m;
5581 	struct sbuf *sb;
5582 	uint64_t ftstamp = UINT64_MAX;
5583 
5584 	if (dparams->start == 0) {
5585 		dparams->memtype = FW_MEMTYPE_EDC0;
5586 		dparams->start = 0x84000;
5587 		dparams->size = 32768;
5588 	}
5589 
5590 	nentries = dparams->size / sizeof(struct fw_devlog_e);
5591 
5592 	buf = malloc(dparams->size, M_CXGBE, M_NOWAIT);
5593 	if (buf == NULL)
5594 		return (ENOMEM);
5595 
5596 	m = fwmtype_to_hwmtype(dparams->memtype);
5597 	rc = -t4_mem_read(sc, m, dparams->start, dparams->size, (void *)buf);
5598 	if (rc != 0)
5599 		goto done;
5600 
5601 	for (i = 0; i < nentries; i++) {
5602 		e = &buf[i];
5603 
5604 		if (e->timestamp == 0)
5605 			break;	/* end */
5606 
5607 		e->timestamp = be64toh(e->timestamp);
5608 		e->seqno = be32toh(e->seqno);
5609 		for (j = 0; j < 8; j++)
5610 			e->params[j] = be32toh(e->params[j]);
5611 
5612 		if (e->timestamp < ftstamp) {
5613 			ftstamp = e->timestamp;
5614 			first = i;
5615 		}
5616 	}
5617 
5618 	if (buf[first].timestamp == 0)
5619 		goto done;	/* nothing in the log */
5620 
5621 	rc = sysctl_wire_old_buffer(req, 0);
5622 	if (rc != 0)
5623 		goto done;
5624 
5625 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5626 	if (sb == NULL) {
5627 		rc = ENOMEM;
5628 		goto done;
5629 	}
5630 	sbuf_printf(sb, "%10s  %15s  %8s  %8s  %s\n",
5631 	    "Seq#", "Tstamp", "Level", "Facility", "Message");
5632 
5633 	i = first;
5634 	do {
5635 		e = &buf[i];
5636 		if (e->timestamp == 0)
5637 			break;	/* end */
5638 
5639 		sbuf_printf(sb, "%10d  %15ju  %8s  %8s  ",
5640 		    e->seqno, e->timestamp,
5641 		    (e->level < nitems(devlog_level_strings) ?
5642 			devlog_level_strings[e->level] : "UNKNOWN"),
5643 		    (e->facility < nitems(devlog_facility_strings) ?
5644 			devlog_facility_strings[e->facility] : "UNKNOWN"));
5645 		sbuf_printf(sb, e->fmt, e->params[0], e->params[1],
5646 		    e->params[2], e->params[3], e->params[4],
5647 		    e->params[5], e->params[6], e->params[7]);
5648 
5649 		if (++i == nentries)
5650 			i = 0;
5651 	} while (i != first);
5652 
5653 	rc = sbuf_finish(sb);
5654 	sbuf_delete(sb);
5655 done:
5656 	free(buf, M_CXGBE);
5657 	return (rc);
5658 }
5659 
5660 static int
5661 sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS)
5662 {
5663 	struct adapter *sc = arg1;
5664 	struct sbuf *sb;
5665 	int rc;
5666 	struct tp_fcoe_stats stats[4];
5667 
5668 	rc = sysctl_wire_old_buffer(req, 0);
5669 	if (rc != 0)
5670 		return (rc);
5671 
5672 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5673 	if (sb == NULL)
5674 		return (ENOMEM);
5675 
5676 	t4_get_fcoe_stats(sc, 0, &stats[0]);
5677 	t4_get_fcoe_stats(sc, 1, &stats[1]);
5678 	t4_get_fcoe_stats(sc, 2, &stats[2]);
5679 	t4_get_fcoe_stats(sc, 3, &stats[3]);
5680 
5681 	sbuf_printf(sb, "                   channel 0        channel 1        "
5682 	    "channel 2        channel 3\n");
5683 	sbuf_printf(sb, "octetsDDP:  %16ju %16ju %16ju %16ju\n",
5684 	    stats[0].octetsDDP, stats[1].octetsDDP, stats[2].octetsDDP,
5685 	    stats[3].octetsDDP);
5686 	sbuf_printf(sb, "framesDDP:  %16u %16u %16u %16u\n", stats[0].framesDDP,
5687 	    stats[1].framesDDP, stats[2].framesDDP, stats[3].framesDDP);
5688 	sbuf_printf(sb, "framesDrop: %16u %16u %16u %16u",
5689 	    stats[0].framesDrop, stats[1].framesDrop, stats[2].framesDrop,
5690 	    stats[3].framesDrop);
5691 
5692 	rc = sbuf_finish(sb);
5693 	sbuf_delete(sb);
5694 
5695 	return (rc);
5696 }
5697 
5698 static int
5699 sysctl_hw_sched(SYSCTL_HANDLER_ARGS)
5700 {
5701 	struct adapter *sc = arg1;
5702 	struct sbuf *sb;
5703 	int rc, i;
5704 	unsigned int map, kbps, ipg, mode;
5705 	unsigned int pace_tab[NTX_SCHED];
5706 
5707 	rc = sysctl_wire_old_buffer(req, 0);
5708 	if (rc != 0)
5709 		return (rc);
5710 
5711 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5712 	if (sb == NULL)
5713 		return (ENOMEM);
5714 
5715 	map = t4_read_reg(sc, A_TP_TX_MOD_QUEUE_REQ_MAP);
5716 	mode = G_TIMERMODE(t4_read_reg(sc, A_TP_MOD_CONFIG));
5717 	t4_read_pace_tbl(sc, pace_tab);
5718 
5719 	sbuf_printf(sb, "Scheduler  Mode   Channel  Rate (Kbps)   "
5720 	    "Class IPG (0.1 ns)   Flow IPG (us)");
5721 
5722 	for (i = 0; i < NTX_SCHED; ++i, map >>= 2) {
5723 		t4_get_tx_sched(sc, i, &kbps, &ipg);
5724 		sbuf_printf(sb, "\n    %u      %-5s     %u     ", i,
5725 		    (mode & (1 << i)) ? "flow" : "class", map & 3);
5726 		if (kbps)
5727 			sbuf_printf(sb, "%9u     ", kbps);
5728 		else
5729 			sbuf_printf(sb, " disabled     ");
5730 
5731 		if (ipg)
5732 			sbuf_printf(sb, "%13u        ", ipg);
5733 		else
5734 			sbuf_printf(sb, "     disabled        ");
5735 
5736 		if (pace_tab[i])
5737 			sbuf_printf(sb, "%10u", pace_tab[i]);
5738 		else
5739 			sbuf_printf(sb, "  disabled");
5740 	}
5741 
5742 	rc = sbuf_finish(sb);
5743 	sbuf_delete(sb);
5744 
5745 	return (rc);
5746 }
5747 
5748 static int
5749 sysctl_lb_stats(SYSCTL_HANDLER_ARGS)
5750 {
5751 	struct adapter *sc = arg1;
5752 	struct sbuf *sb;
5753 	int rc, i, j;
5754 	uint64_t *p0, *p1;
5755 	struct lb_port_stats s[2];
5756 	static const char *stat_name[] = {
5757 		"OctetsOK:", "FramesOK:", "BcastFrames:", "McastFrames:",
5758 		"UcastFrames:", "ErrorFrames:", "Frames64:", "Frames65To127:",
5759 		"Frames128To255:", "Frames256To511:", "Frames512To1023:",
5760 		"Frames1024To1518:", "Frames1519ToMax:", "FramesDropped:",
5761 		"BG0FramesDropped:", "BG1FramesDropped:", "BG2FramesDropped:",
5762 		"BG3FramesDropped:", "BG0FramesTrunc:", "BG1FramesTrunc:",
5763 		"BG2FramesTrunc:", "BG3FramesTrunc:"
5764 	};
5765 
5766 	rc = sysctl_wire_old_buffer(req, 0);
5767 	if (rc != 0)
5768 		return (rc);
5769 
5770 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5771 	if (sb == NULL)
5772 		return (ENOMEM);
5773 
5774 	memset(s, 0, sizeof(s));
5775 
5776 	for (i = 0; i < 4; i += 2) {
5777 		t4_get_lb_stats(sc, i, &s[0]);
5778 		t4_get_lb_stats(sc, i + 1, &s[1]);
5779 
5780 		p0 = &s[0].octets;
5781 		p1 = &s[1].octets;
5782 		sbuf_printf(sb, "%s                       Loopback %u"
5783 		    "           Loopback %u", i == 0 ? "" : "\n", i, i + 1);
5784 
5785 		for (j = 0; j < nitems(stat_name); j++)
5786 			sbuf_printf(sb, "\n%-17s %20ju %20ju", stat_name[j],
5787 				   *p0++, *p1++);
5788 	}
5789 
5790 	rc = sbuf_finish(sb);
5791 	sbuf_delete(sb);
5792 
5793 	return (rc);
5794 }
5795 
5796 static int
5797 sysctl_linkdnrc(SYSCTL_HANDLER_ARGS)
5798 {
5799 	int rc = 0;
5800 	struct port_info *pi = arg1;
5801 	struct sbuf *sb;
5802 	static const char *linkdnreasons[] = {
5803 		"non-specific", "remote fault", "autoneg failed", "reserved3",
5804 		"PHY overheated", "unknown", "rx los", "reserved7"
5805 	};
5806 
5807 	rc = sysctl_wire_old_buffer(req, 0);
5808 	if (rc != 0)
5809 		return(rc);
5810 	sb = sbuf_new_for_sysctl(NULL, NULL, 64, req);
5811 	if (sb == NULL)
5812 		return (ENOMEM);
5813 
5814 	if (pi->linkdnrc < 0)
5815 		sbuf_printf(sb, "n/a");
5816 	else if (pi->linkdnrc < nitems(linkdnreasons))
5817 		sbuf_printf(sb, "%s", linkdnreasons[pi->linkdnrc]);
5818 	else
5819 		sbuf_printf(sb, "%d", pi->linkdnrc);
5820 
5821 	rc = sbuf_finish(sb);
5822 	sbuf_delete(sb);
5823 
5824 	return (rc);
5825 }
5826 
5827 struct mem_desc {
5828 	unsigned int base;
5829 	unsigned int limit;
5830 	unsigned int idx;
5831 };
5832 
5833 static int
5834 mem_desc_cmp(const void *a, const void *b)
5835 {
5836 	return ((const struct mem_desc *)a)->base -
5837 	       ((const struct mem_desc *)b)->base;
5838 }
5839 
5840 static void
5841 mem_region_show(struct sbuf *sb, const char *name, unsigned int from,
5842     unsigned int to)
5843 {
5844 	unsigned int size;
5845 
5846 	size = to - from + 1;
5847 	if (size == 0)
5848 		return;
5849 
5850 	/* XXX: need humanize_number(3) in libkern for a more readable 'size' */
5851 	sbuf_printf(sb, "%-15s %#x-%#x [%u]\n", name, from, to, size);
5852 }
5853 
5854 static int
5855 sysctl_meminfo(SYSCTL_HANDLER_ARGS)
5856 {
5857 	struct adapter *sc = arg1;
5858 	struct sbuf *sb;
5859 	int rc, i, n;
5860 	uint32_t lo, hi, used, alloc;
5861 	static const char *memory[] = {"EDC0:", "EDC1:", "MC:", "MC0:", "MC1:"};
5862 	static const char *region[] = {
5863 		"DBQ contexts:", "IMSG contexts:", "FLM cache:", "TCBs:",
5864 		"Pstructs:", "Timers:", "Rx FL:", "Tx FL:", "Pstruct FL:",
5865 		"Tx payload:", "Rx payload:", "LE hash:", "iSCSI region:",
5866 		"TDDP region:", "TPT region:", "STAG region:", "RQ region:",
5867 		"RQUDP region:", "PBL region:", "TXPBL region:",
5868 		"DBVFIFO region:", "ULPRX state:", "ULPTX state:",
5869 		"On-chip queues:"
5870 	};
5871 	struct mem_desc avail[4];
5872 	struct mem_desc mem[nitems(region) + 3];	/* up to 3 holes */
5873 	struct mem_desc *md = mem;
5874 
5875 	rc = sysctl_wire_old_buffer(req, 0);
5876 	if (rc != 0)
5877 		return (rc);
5878 
5879 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5880 	if (sb == NULL)
5881 		return (ENOMEM);
5882 
5883 	for (i = 0; i < nitems(mem); i++) {
5884 		mem[i].limit = 0;
5885 		mem[i].idx = i;
5886 	}
5887 
5888 	/* Find and sort the populated memory ranges */
5889 	i = 0;
5890 	lo = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
5891 	if (lo & F_EDRAM0_ENABLE) {
5892 		hi = t4_read_reg(sc, A_MA_EDRAM0_BAR);
5893 		avail[i].base = G_EDRAM0_BASE(hi) << 20;
5894 		avail[i].limit = avail[i].base + (G_EDRAM0_SIZE(hi) << 20);
5895 		avail[i].idx = 0;
5896 		i++;
5897 	}
5898 	if (lo & F_EDRAM1_ENABLE) {
5899 		hi = t4_read_reg(sc, A_MA_EDRAM1_BAR);
5900 		avail[i].base = G_EDRAM1_BASE(hi) << 20;
5901 		avail[i].limit = avail[i].base + (G_EDRAM1_SIZE(hi) << 20);
5902 		avail[i].idx = 1;
5903 		i++;
5904 	}
5905 	if (lo & F_EXT_MEM_ENABLE) {
5906 		hi = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
5907 		avail[i].base = G_EXT_MEM_BASE(hi) << 20;
5908 		avail[i].limit = avail[i].base +
5909 		    (G_EXT_MEM_SIZE(hi) << 20);
5910 		avail[i].idx = is_t4(sc) ? 2 : 3;	/* Call it MC for T4 */
5911 		i++;
5912 	}
5913 	if (!is_t4(sc) && lo & F_EXT_MEM1_ENABLE) {
5914 		hi = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
5915 		avail[i].base = G_EXT_MEM1_BASE(hi) << 20;
5916 		avail[i].limit = avail[i].base +
5917 		    (G_EXT_MEM1_SIZE(hi) << 20);
5918 		avail[i].idx = 4;
5919 		i++;
5920 	}
5921 	if (!i)                                    /* no memory available */
5922 		return 0;
5923 	qsort(avail, i, sizeof(struct mem_desc), mem_desc_cmp);
5924 
5925 	(md++)->base = t4_read_reg(sc, A_SGE_DBQ_CTXT_BADDR);
5926 	(md++)->base = t4_read_reg(sc, A_SGE_IMSG_CTXT_BADDR);
5927 	(md++)->base = t4_read_reg(sc, A_SGE_FLM_CACHE_BADDR);
5928 	(md++)->base = t4_read_reg(sc, A_TP_CMM_TCB_BASE);
5929 	(md++)->base = t4_read_reg(sc, A_TP_CMM_MM_BASE);
5930 	(md++)->base = t4_read_reg(sc, A_TP_CMM_TIMER_BASE);
5931 	(md++)->base = t4_read_reg(sc, A_TP_CMM_MM_RX_FLST_BASE);
5932 	(md++)->base = t4_read_reg(sc, A_TP_CMM_MM_TX_FLST_BASE);
5933 	(md++)->base = t4_read_reg(sc, A_TP_CMM_MM_PS_FLST_BASE);
5934 
5935 	/* the next few have explicit upper bounds */
5936 	md->base = t4_read_reg(sc, A_TP_PMM_TX_BASE);
5937 	md->limit = md->base - 1 +
5938 		    t4_read_reg(sc, A_TP_PMM_TX_PAGE_SIZE) *
5939 		    G_PMTXMAXPAGE(t4_read_reg(sc, A_TP_PMM_TX_MAX_PAGE));
5940 	md++;
5941 
5942 	md->base = t4_read_reg(sc, A_TP_PMM_RX_BASE);
5943 	md->limit = md->base - 1 +
5944 		    t4_read_reg(sc, A_TP_PMM_RX_PAGE_SIZE) *
5945 		    G_PMRXMAXPAGE(t4_read_reg(sc, A_TP_PMM_RX_MAX_PAGE));
5946 	md++;
5947 
5948 	if (t4_read_reg(sc, A_LE_DB_CONFIG) & F_HASHEN) {
5949 		hi = t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4;
5950 		md->base = t4_read_reg(sc, A_LE_DB_HASH_TID_BASE);
5951 		md->limit = (sc->tids.ntids - hi) * 16 + md->base - 1;
5952 	} else {
5953 		md->base = 0;
5954 		md->idx = nitems(region);  /* hide it */
5955 	}
5956 	md++;
5957 
5958 #define ulp_region(reg) \
5959 	md->base = t4_read_reg(sc, A_ULP_ ## reg ## _LLIMIT);\
5960 	(md++)->limit = t4_read_reg(sc, A_ULP_ ## reg ## _ULIMIT)
5961 
5962 	ulp_region(RX_ISCSI);
5963 	ulp_region(RX_TDDP);
5964 	ulp_region(TX_TPT);
5965 	ulp_region(RX_STAG);
5966 	ulp_region(RX_RQ);
5967 	ulp_region(RX_RQUDP);
5968 	ulp_region(RX_PBL);
5969 	ulp_region(TX_PBL);
5970 #undef ulp_region
5971 
5972 	md->base = 0;
5973 	md->idx = nitems(region);
5974 	if (!is_t4(sc) && t4_read_reg(sc, A_SGE_CONTROL2) & F_VFIFO_ENABLE) {
5975 		md->base = G_BASEADDR(t4_read_reg(sc, A_SGE_DBVFIFO_BADDR));
5976 		md->limit = md->base + (G_DBVFIFO_SIZE((t4_read_reg(sc,
5977 		    A_SGE_DBVFIFO_SIZE))) << 2) - 1;
5978 	}
5979 	md++;
5980 
5981 	md->base = t4_read_reg(sc, A_ULP_RX_CTX_BASE);
5982 	md->limit = md->base + sc->tids.ntids - 1;
5983 	md++;
5984 	md->base = t4_read_reg(sc, A_ULP_TX_ERR_TABLE_BASE);
5985 	md->limit = md->base + sc->tids.ntids - 1;
5986 	md++;
5987 
5988 	md->base = sc->vres.ocq.start;
5989 	if (sc->vres.ocq.size)
5990 		md->limit = md->base + sc->vres.ocq.size - 1;
5991 	else
5992 		md->idx = nitems(region);  /* hide it */
5993 	md++;
5994 
5995 	/* add any address-space holes, there can be up to 3 */
5996 	for (n = 0; n < i - 1; n++)
5997 		if (avail[n].limit < avail[n + 1].base)
5998 			(md++)->base = avail[n].limit;
5999 	if (avail[n].limit)
6000 		(md++)->base = avail[n].limit;
6001 
6002 	n = md - mem;
6003 	qsort(mem, n, sizeof(struct mem_desc), mem_desc_cmp);
6004 
6005 	for (lo = 0; lo < i; lo++)
6006 		mem_region_show(sb, memory[avail[lo].idx], avail[lo].base,
6007 				avail[lo].limit - 1);
6008 
6009 	sbuf_printf(sb, "\n");
6010 	for (i = 0; i < n; i++) {
6011 		if (mem[i].idx >= nitems(region))
6012 			continue;                        /* skip holes */
6013 		if (!mem[i].limit)
6014 			mem[i].limit = i < n - 1 ? mem[i + 1].base - 1 : ~0;
6015 		mem_region_show(sb, region[mem[i].idx], mem[i].base,
6016 				mem[i].limit);
6017 	}
6018 
6019 	sbuf_printf(sb, "\n");
6020 	lo = t4_read_reg(sc, A_CIM_SDRAM_BASE_ADDR);
6021 	hi = t4_read_reg(sc, A_CIM_SDRAM_ADDR_SIZE) + lo - 1;
6022 	mem_region_show(sb, "uP RAM:", lo, hi);
6023 
6024 	lo = t4_read_reg(sc, A_CIM_EXTMEM2_BASE_ADDR);
6025 	hi = t4_read_reg(sc, A_CIM_EXTMEM2_ADDR_SIZE) + lo - 1;
6026 	mem_region_show(sb, "uP Extmem2:", lo, hi);
6027 
6028 	lo = t4_read_reg(sc, A_TP_PMM_RX_MAX_PAGE);
6029 	sbuf_printf(sb, "\n%u Rx pages of size %uKiB for %u channels\n",
6030 		   G_PMRXMAXPAGE(lo),
6031 		   t4_read_reg(sc, A_TP_PMM_RX_PAGE_SIZE) >> 10,
6032 		   (lo & F_PMRXNUMCHN) ? 2 : 1);
6033 
6034 	lo = t4_read_reg(sc, A_TP_PMM_TX_MAX_PAGE);
6035 	hi = t4_read_reg(sc, A_TP_PMM_TX_PAGE_SIZE);
6036 	sbuf_printf(sb, "%u Tx pages of size %u%ciB for %u channels\n",
6037 		   G_PMTXMAXPAGE(lo),
6038 		   hi >= (1 << 20) ? (hi >> 20) : (hi >> 10),
6039 		   hi >= (1 << 20) ? 'M' : 'K', 1 << G_PMTXNUMCHN(lo));
6040 	sbuf_printf(sb, "%u p-structs\n",
6041 		   t4_read_reg(sc, A_TP_CMM_MM_MAX_PSTRUCT));
6042 
6043 	for (i = 0; i < 4; i++) {
6044 		lo = t4_read_reg(sc, A_MPS_RX_PG_RSV0 + i * 4);
6045 		if (is_t4(sc)) {
6046 			used = G_USED(lo);
6047 			alloc = G_ALLOC(lo);
6048 		} else {
6049 			used = G_T5_USED(lo);
6050 			alloc = G_T5_ALLOC(lo);
6051 		}
6052 		sbuf_printf(sb, "\nPort %d using %u pages out of %u allocated",
6053 			   i, used, alloc);
6054 	}
6055 	for (i = 0; i < 4; i++) {
6056 		lo = t4_read_reg(sc, A_MPS_RX_PG_RSV4 + i * 4);
6057 		if (is_t4(sc)) {
6058 			used = G_USED(lo);
6059 			alloc = G_ALLOC(lo);
6060 		} else {
6061 			used = G_T5_USED(lo);
6062 			alloc = G_T5_ALLOC(lo);
6063 		}
6064 		sbuf_printf(sb,
6065 			   "\nLoopback %d using %u pages out of %u allocated",
6066 			   i, used, alloc);
6067 	}
6068 
6069 	rc = sbuf_finish(sb);
6070 	sbuf_delete(sb);
6071 
6072 	return (rc);
6073 }
6074 
6075 static inline void
6076 tcamxy2valmask(uint64_t x, uint64_t y, uint8_t *addr, uint64_t *mask)
6077 {
6078 	*mask = x | y;
6079 	y = htobe64(y);
6080 	memcpy(addr, (char *)&y + 2, ETHER_ADDR_LEN);
6081 }
6082 
6083 static int
6084 sysctl_mps_tcam(SYSCTL_HANDLER_ARGS)
6085 {
6086 	struct adapter *sc = arg1;
6087 	struct sbuf *sb;
6088 	int rc, i, n;
6089 
6090 	rc = sysctl_wire_old_buffer(req, 0);
6091 	if (rc != 0)
6092 		return (rc);
6093 
6094 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6095 	if (sb == NULL)
6096 		return (ENOMEM);
6097 
6098 	sbuf_printf(sb,
6099 	    "Idx  Ethernet address     Mask     Vld Ports PF"
6100 	    "  VF              Replication             P0 P1 P2 P3  ML");
6101 	n = is_t4(sc) ? NUM_MPS_CLS_SRAM_L_INSTANCES :
6102 	    NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
6103 	for (i = 0; i < n; i++) {
6104 		uint64_t tcamx, tcamy, mask;
6105 		uint32_t cls_lo, cls_hi;
6106 		uint8_t addr[ETHER_ADDR_LEN];
6107 
6108 		tcamy = t4_read_reg64(sc, MPS_CLS_TCAM_Y_L(i));
6109 		tcamx = t4_read_reg64(sc, MPS_CLS_TCAM_X_L(i));
6110 		cls_lo = t4_read_reg(sc, MPS_CLS_SRAM_L(i));
6111 		cls_hi = t4_read_reg(sc, MPS_CLS_SRAM_H(i));
6112 
6113 		if (tcamx & tcamy)
6114 			continue;
6115 
6116 		tcamxy2valmask(tcamx, tcamy, addr, &mask);
6117 		sbuf_printf(sb, "\n%3u %02x:%02x:%02x:%02x:%02x:%02x %012jx"
6118 			   "  %c   %#x%4u%4d", i, addr[0], addr[1], addr[2],
6119 			   addr[3], addr[4], addr[5], (uintmax_t)mask,
6120 			   (cls_lo & F_SRAM_VLD) ? 'Y' : 'N',
6121 			   G_PORTMAP(cls_hi), G_PF(cls_lo),
6122 			   (cls_lo & F_VF_VALID) ? G_VF(cls_lo) : -1);
6123 
6124 		if (cls_lo & F_REPLICATE) {
6125 			struct fw_ldst_cmd ldst_cmd;
6126 
6127 			memset(&ldst_cmd, 0, sizeof(ldst_cmd));
6128 			ldst_cmd.op_to_addrspace =
6129 			    htobe32(V_FW_CMD_OP(FW_LDST_CMD) |
6130 				F_FW_CMD_REQUEST | F_FW_CMD_READ |
6131 				V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_MPS));
6132 			ldst_cmd.cycles_to_len16 = htobe32(FW_LEN16(ldst_cmd));
6133 			ldst_cmd.u.mps.fid_ctl =
6134 			    htobe16(V_FW_LDST_CMD_FID(FW_LDST_MPS_RPLC) |
6135 				V_FW_LDST_CMD_CTL(i));
6136 
6137 			rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK,
6138 			    "t4mps");
6139 			if (rc)
6140 				break;
6141 			rc = -t4_wr_mbox(sc, sc->mbox, &ldst_cmd,
6142 			    sizeof(ldst_cmd), &ldst_cmd);
6143 			end_synchronized_op(sc, 0);
6144 
6145 			if (rc != 0) {
6146 				sbuf_printf(sb,
6147 				    " ------------ error %3u ------------", rc);
6148 				rc = 0;
6149 			} else {
6150 				sbuf_printf(sb, " %08x %08x %08x %08x",
6151 				    be32toh(ldst_cmd.u.mps.rplc127_96),
6152 				    be32toh(ldst_cmd.u.mps.rplc95_64),
6153 				    be32toh(ldst_cmd.u.mps.rplc63_32),
6154 				    be32toh(ldst_cmd.u.mps.rplc31_0));
6155 			}
6156 		} else
6157 			sbuf_printf(sb, "%36s", "");
6158 
6159 		sbuf_printf(sb, "%4u%3u%3u%3u %#3x", G_SRAM_PRIO0(cls_lo),
6160 		    G_SRAM_PRIO1(cls_lo), G_SRAM_PRIO2(cls_lo),
6161 		    G_SRAM_PRIO3(cls_lo), (cls_lo >> S_MULTILISTEN0) & 0xf);
6162 	}
6163 
6164 	if (rc)
6165 		(void) sbuf_finish(sb);
6166 	else
6167 		rc = sbuf_finish(sb);
6168 	sbuf_delete(sb);
6169 
6170 	return (rc);
6171 }
6172 
6173 static int
6174 sysctl_path_mtus(SYSCTL_HANDLER_ARGS)
6175 {
6176 	struct adapter *sc = arg1;
6177 	struct sbuf *sb;
6178 	int rc;
6179 	uint16_t mtus[NMTUS];
6180 
6181 	rc = sysctl_wire_old_buffer(req, 0);
6182 	if (rc != 0)
6183 		return (rc);
6184 
6185 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6186 	if (sb == NULL)
6187 		return (ENOMEM);
6188 
6189 	t4_read_mtu_tbl(sc, mtus, NULL);
6190 
6191 	sbuf_printf(sb, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
6192 	    mtus[0], mtus[1], mtus[2], mtus[3], mtus[4], mtus[5], mtus[6],
6193 	    mtus[7], mtus[8], mtus[9], mtus[10], mtus[11], mtus[12], mtus[13],
6194 	    mtus[14], mtus[15]);
6195 
6196 	rc = sbuf_finish(sb);
6197 	sbuf_delete(sb);
6198 
6199 	return (rc);
6200 }
6201 
6202 static int
6203 sysctl_pm_stats(SYSCTL_HANDLER_ARGS)
6204 {
6205 	struct adapter *sc = arg1;
6206 	struct sbuf *sb;
6207 	int rc, i;
6208 	uint32_t cnt[PM_NSTATS];
6209 	uint64_t cyc[PM_NSTATS];
6210 	static const char *rx_stats[] = {
6211 		"Read:", "Write bypass:", "Write mem:", "Flush:"
6212 	};
6213 	static const char *tx_stats[] = {
6214 		"Read:", "Write bypass:", "Write mem:", "Bypass + mem:"
6215 	};
6216 
6217 	rc = sysctl_wire_old_buffer(req, 0);
6218 	if (rc != 0)
6219 		return (rc);
6220 
6221 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6222 	if (sb == NULL)
6223 		return (ENOMEM);
6224 
6225 	t4_pmtx_get_stats(sc, cnt, cyc);
6226 	sbuf_printf(sb, "                Tx pcmds             Tx bytes");
6227 	for (i = 0; i < ARRAY_SIZE(tx_stats); i++)
6228 		sbuf_printf(sb, "\n%-13s %10u %20ju", tx_stats[i], cnt[i],
6229 		    cyc[i]);
6230 
6231 	t4_pmrx_get_stats(sc, cnt, cyc);
6232 	sbuf_printf(sb, "\n                Rx pcmds             Rx bytes");
6233 	for (i = 0; i < ARRAY_SIZE(rx_stats); i++)
6234 		sbuf_printf(sb, "\n%-13s %10u %20ju", rx_stats[i], cnt[i],
6235 		    cyc[i]);
6236 
6237 	rc = sbuf_finish(sb);
6238 	sbuf_delete(sb);
6239 
6240 	return (rc);
6241 }
6242 
6243 static int
6244 sysctl_rdma_stats(SYSCTL_HANDLER_ARGS)
6245 {
6246 	struct adapter *sc = arg1;
6247 	struct sbuf *sb;
6248 	int rc;
6249 	struct tp_rdma_stats stats;
6250 
6251 	rc = sysctl_wire_old_buffer(req, 0);
6252 	if (rc != 0)
6253 		return (rc);
6254 
6255 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6256 	if (sb == NULL)
6257 		return (ENOMEM);
6258 
6259 	t4_tp_get_rdma_stats(sc, &stats);
6260 	sbuf_printf(sb, "NoRQEModDefferals: %u\n", stats.rqe_dfr_mod);
6261 	sbuf_printf(sb, "NoRQEPktDefferals: %u", stats.rqe_dfr_pkt);
6262 
6263 	rc = sbuf_finish(sb);
6264 	sbuf_delete(sb);
6265 
6266 	return (rc);
6267 }
6268 
6269 static int
6270 sysctl_tcp_stats(SYSCTL_HANDLER_ARGS)
6271 {
6272 	struct adapter *sc = arg1;
6273 	struct sbuf *sb;
6274 	int rc;
6275 	struct tp_tcp_stats v4, v6;
6276 
6277 	rc = sysctl_wire_old_buffer(req, 0);
6278 	if (rc != 0)
6279 		return (rc);
6280 
6281 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6282 	if (sb == NULL)
6283 		return (ENOMEM);
6284 
6285 	t4_tp_get_tcp_stats(sc, &v4, &v6);
6286 	sbuf_printf(sb,
6287 	    "                                IP                 IPv6\n");
6288 	sbuf_printf(sb, "OutRsts:      %20u %20u\n",
6289 	    v4.tcpOutRsts, v6.tcpOutRsts);
6290 	sbuf_printf(sb, "InSegs:       %20ju %20ju\n",
6291 	    v4.tcpInSegs, v6.tcpInSegs);
6292 	sbuf_printf(sb, "OutSegs:      %20ju %20ju\n",
6293 	    v4.tcpOutSegs, v6.tcpOutSegs);
6294 	sbuf_printf(sb, "RetransSegs:  %20ju %20ju",
6295 	    v4.tcpRetransSegs, v6.tcpRetransSegs);
6296 
6297 	rc = sbuf_finish(sb);
6298 	sbuf_delete(sb);
6299 
6300 	return (rc);
6301 }
6302 
6303 static int
6304 sysctl_tids(SYSCTL_HANDLER_ARGS)
6305 {
6306 	struct adapter *sc = arg1;
6307 	struct sbuf *sb;
6308 	int rc;
6309 	struct tid_info *t = &sc->tids;
6310 
6311 	rc = sysctl_wire_old_buffer(req, 0);
6312 	if (rc != 0)
6313 		return (rc);
6314 
6315 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6316 	if (sb == NULL)
6317 		return (ENOMEM);
6318 
6319 	if (t->natids) {
6320 		sbuf_printf(sb, "ATID range: 0-%u, in use: %u\n", t->natids - 1,
6321 		    t->atids_in_use);
6322 	}
6323 
6324 	if (t->ntids) {
6325 		if (t4_read_reg(sc, A_LE_DB_CONFIG) & F_HASHEN) {
6326 			uint32_t b = t4_read_reg(sc, A_LE_DB_SERVER_INDEX) / 4;
6327 
6328 			if (b) {
6329 				sbuf_printf(sb, "TID range: 0-%u, %u-%u", b - 1,
6330 				    t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4,
6331 				    t->ntids - 1);
6332 			} else {
6333 				sbuf_printf(sb, "TID range: %u-%u",
6334 				    t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4,
6335 				    t->ntids - 1);
6336 			}
6337 		} else
6338 			sbuf_printf(sb, "TID range: 0-%u", t->ntids - 1);
6339 		sbuf_printf(sb, ", in use: %u\n",
6340 		    atomic_load_acq_int(&t->tids_in_use));
6341 	}
6342 
6343 	if (t->nstids) {
6344 		sbuf_printf(sb, "STID range: %u-%u, in use: %u\n", t->stid_base,
6345 		    t->stid_base + t->nstids - 1, t->stids_in_use);
6346 	}
6347 
6348 	if (t->nftids) {
6349 		sbuf_printf(sb, "FTID range: %u-%u\n", t->ftid_base,
6350 		    t->ftid_base + t->nftids - 1);
6351 	}
6352 
6353 	if (t->netids) {
6354 		sbuf_printf(sb, "ETID range: %u-%u\n", t->etid_base,
6355 		    t->etid_base + t->netids - 1);
6356 	}
6357 
6358 	sbuf_printf(sb, "HW TID usage: %u IP users, %u IPv6 users",
6359 	    t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV4),
6360 	    t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV6));
6361 
6362 	rc = sbuf_finish(sb);
6363 	sbuf_delete(sb);
6364 
6365 	return (rc);
6366 }
6367 
6368 static int
6369 sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS)
6370 {
6371 	struct adapter *sc = arg1;
6372 	struct sbuf *sb;
6373 	int rc;
6374 	struct tp_err_stats stats;
6375 
6376 	rc = sysctl_wire_old_buffer(req, 0);
6377 	if (rc != 0)
6378 		return (rc);
6379 
6380 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6381 	if (sb == NULL)
6382 		return (ENOMEM);
6383 
6384 	t4_tp_get_err_stats(sc, &stats);
6385 
6386 	sbuf_printf(sb, "                 channel 0  channel 1  channel 2  "
6387 		      "channel 3\n");
6388 	sbuf_printf(sb, "macInErrs:      %10u %10u %10u %10u\n",
6389 	    stats.macInErrs[0], stats.macInErrs[1], stats.macInErrs[2],
6390 	    stats.macInErrs[3]);
6391 	sbuf_printf(sb, "hdrInErrs:      %10u %10u %10u %10u\n",
6392 	    stats.hdrInErrs[0], stats.hdrInErrs[1], stats.hdrInErrs[2],
6393 	    stats.hdrInErrs[3]);
6394 	sbuf_printf(sb, "tcpInErrs:      %10u %10u %10u %10u\n",
6395 	    stats.tcpInErrs[0], stats.tcpInErrs[1], stats.tcpInErrs[2],
6396 	    stats.tcpInErrs[3]);
6397 	sbuf_printf(sb, "tcp6InErrs:     %10u %10u %10u %10u\n",
6398 	    stats.tcp6InErrs[0], stats.tcp6InErrs[1], stats.tcp6InErrs[2],
6399 	    stats.tcp6InErrs[3]);
6400 	sbuf_printf(sb, "tnlCongDrops:   %10u %10u %10u %10u\n",
6401 	    stats.tnlCongDrops[0], stats.tnlCongDrops[1], stats.tnlCongDrops[2],
6402 	    stats.tnlCongDrops[3]);
6403 	sbuf_printf(sb, "tnlTxDrops:     %10u %10u %10u %10u\n",
6404 	    stats.tnlTxDrops[0], stats.tnlTxDrops[1], stats.tnlTxDrops[2],
6405 	    stats.tnlTxDrops[3]);
6406 	sbuf_printf(sb, "ofldVlanDrops:  %10u %10u %10u %10u\n",
6407 	    stats.ofldVlanDrops[0], stats.ofldVlanDrops[1],
6408 	    stats.ofldVlanDrops[2], stats.ofldVlanDrops[3]);
6409 	sbuf_printf(sb, "ofldChanDrops:  %10u %10u %10u %10u\n\n",
6410 	    stats.ofldChanDrops[0], stats.ofldChanDrops[1],
6411 	    stats.ofldChanDrops[2], stats.ofldChanDrops[3]);
6412 	sbuf_printf(sb, "ofldNoNeigh:    %u\nofldCongDefer:  %u",
6413 	    stats.ofldNoNeigh, stats.ofldCongDefer);
6414 
6415 	rc = sbuf_finish(sb);
6416 	sbuf_delete(sb);
6417 
6418 	return (rc);
6419 }
6420 
6421 struct field_desc {
6422 	const char *name;
6423 	u_int start;
6424 	u_int width;
6425 };
6426 
6427 static void
6428 field_desc_show(struct sbuf *sb, uint64_t v, const struct field_desc *f)
6429 {
6430 	char buf[32];
6431 	int line_size = 0;
6432 
6433 	while (f->name) {
6434 		uint64_t mask = (1ULL << f->width) - 1;
6435 		int len = snprintf(buf, sizeof(buf), "%s: %ju", f->name,
6436 		    ((uintmax_t)v >> f->start) & mask);
6437 
6438 		if (line_size + len >= 79) {
6439 			line_size = 8;
6440 			sbuf_printf(sb, "\n        ");
6441 		}
6442 		sbuf_printf(sb, "%s ", buf);
6443 		line_size += len + 1;
6444 		f++;
6445 	}
6446 	sbuf_printf(sb, "\n");
6447 }
6448 
6449 static struct field_desc tp_la0[] = {
6450 	{ "RcfOpCodeOut", 60, 4 },
6451 	{ "State", 56, 4 },
6452 	{ "WcfState", 52, 4 },
6453 	{ "RcfOpcSrcOut", 50, 2 },
6454 	{ "CRxError", 49, 1 },
6455 	{ "ERxError", 48, 1 },
6456 	{ "SanityFailed", 47, 1 },
6457 	{ "SpuriousMsg", 46, 1 },
6458 	{ "FlushInputMsg", 45, 1 },
6459 	{ "FlushInputCpl", 44, 1 },
6460 	{ "RssUpBit", 43, 1 },
6461 	{ "RssFilterHit", 42, 1 },
6462 	{ "Tid", 32, 10 },
6463 	{ "InitTcb", 31, 1 },
6464 	{ "LineNumber", 24, 7 },
6465 	{ "Emsg", 23, 1 },
6466 	{ "EdataOut", 22, 1 },
6467 	{ "Cmsg", 21, 1 },
6468 	{ "CdataOut", 20, 1 },
6469 	{ "EreadPdu", 19, 1 },
6470 	{ "CreadPdu", 18, 1 },
6471 	{ "TunnelPkt", 17, 1 },
6472 	{ "RcfPeerFin", 16, 1 },
6473 	{ "RcfReasonOut", 12, 4 },
6474 	{ "TxCchannel", 10, 2 },
6475 	{ "RcfTxChannel", 8, 2 },
6476 	{ "RxEchannel", 6, 2 },
6477 	{ "RcfRxChannel", 5, 1 },
6478 	{ "RcfDataOutSrdy", 4, 1 },
6479 	{ "RxDvld", 3, 1 },
6480 	{ "RxOoDvld", 2, 1 },
6481 	{ "RxCongestion", 1, 1 },
6482 	{ "TxCongestion", 0, 1 },
6483 	{ NULL }
6484 };
6485 
6486 static struct field_desc tp_la1[] = {
6487 	{ "CplCmdIn", 56, 8 },
6488 	{ "CplCmdOut", 48, 8 },
6489 	{ "ESynOut", 47, 1 },
6490 	{ "EAckOut", 46, 1 },
6491 	{ "EFinOut", 45, 1 },
6492 	{ "ERstOut", 44, 1 },
6493 	{ "SynIn", 43, 1 },
6494 	{ "AckIn", 42, 1 },
6495 	{ "FinIn", 41, 1 },
6496 	{ "RstIn", 40, 1 },
6497 	{ "DataIn", 39, 1 },
6498 	{ "DataInVld", 38, 1 },
6499 	{ "PadIn", 37, 1 },
6500 	{ "RxBufEmpty", 36, 1 },
6501 	{ "RxDdp", 35, 1 },
6502 	{ "RxFbCongestion", 34, 1 },
6503 	{ "TxFbCongestion", 33, 1 },
6504 	{ "TxPktSumSrdy", 32, 1 },
6505 	{ "RcfUlpType", 28, 4 },
6506 	{ "Eread", 27, 1 },
6507 	{ "Ebypass", 26, 1 },
6508 	{ "Esave", 25, 1 },
6509 	{ "Static0", 24, 1 },
6510 	{ "Cread", 23, 1 },
6511 	{ "Cbypass", 22, 1 },
6512 	{ "Csave", 21, 1 },
6513 	{ "CPktOut", 20, 1 },
6514 	{ "RxPagePoolFull", 18, 2 },
6515 	{ "RxLpbkPkt", 17, 1 },
6516 	{ "TxLpbkPkt", 16, 1 },
6517 	{ "RxVfValid", 15, 1 },
6518 	{ "SynLearned", 14, 1 },
6519 	{ "SetDelEntry", 13, 1 },
6520 	{ "SetInvEntry", 12, 1 },
6521 	{ "CpcmdDvld", 11, 1 },
6522 	{ "CpcmdSave", 10, 1 },
6523 	{ "RxPstructsFull", 8, 2 },
6524 	{ "EpcmdDvld", 7, 1 },
6525 	{ "EpcmdFlush", 6, 1 },
6526 	{ "EpcmdTrimPrefix", 5, 1 },
6527 	{ "EpcmdTrimPostfix", 4, 1 },
6528 	{ "ERssIp4Pkt", 3, 1 },
6529 	{ "ERssIp6Pkt", 2, 1 },
6530 	{ "ERssTcpUdpPkt", 1, 1 },
6531 	{ "ERssFceFipPkt", 0, 1 },
6532 	{ NULL }
6533 };
6534 
6535 static struct field_desc tp_la2[] = {
6536 	{ "CplCmdIn", 56, 8 },
6537 	{ "MpsVfVld", 55, 1 },
6538 	{ "MpsPf", 52, 3 },
6539 	{ "MpsVf", 44, 8 },
6540 	{ "SynIn", 43, 1 },
6541 	{ "AckIn", 42, 1 },
6542 	{ "FinIn", 41, 1 },
6543 	{ "RstIn", 40, 1 },
6544 	{ "DataIn", 39, 1 },
6545 	{ "DataInVld", 38, 1 },
6546 	{ "PadIn", 37, 1 },
6547 	{ "RxBufEmpty", 36, 1 },
6548 	{ "RxDdp", 35, 1 },
6549 	{ "RxFbCongestion", 34, 1 },
6550 	{ "TxFbCongestion", 33, 1 },
6551 	{ "TxPktSumSrdy", 32, 1 },
6552 	{ "RcfUlpType", 28, 4 },
6553 	{ "Eread", 27, 1 },
6554 	{ "Ebypass", 26, 1 },
6555 	{ "Esave", 25, 1 },
6556 	{ "Static0", 24, 1 },
6557 	{ "Cread", 23, 1 },
6558 	{ "Cbypass", 22, 1 },
6559 	{ "Csave", 21, 1 },
6560 	{ "CPktOut", 20, 1 },
6561 	{ "RxPagePoolFull", 18, 2 },
6562 	{ "RxLpbkPkt", 17, 1 },
6563 	{ "TxLpbkPkt", 16, 1 },
6564 	{ "RxVfValid", 15, 1 },
6565 	{ "SynLearned", 14, 1 },
6566 	{ "SetDelEntry", 13, 1 },
6567 	{ "SetInvEntry", 12, 1 },
6568 	{ "CpcmdDvld", 11, 1 },
6569 	{ "CpcmdSave", 10, 1 },
6570 	{ "RxPstructsFull", 8, 2 },
6571 	{ "EpcmdDvld", 7, 1 },
6572 	{ "EpcmdFlush", 6, 1 },
6573 	{ "EpcmdTrimPrefix", 5, 1 },
6574 	{ "EpcmdTrimPostfix", 4, 1 },
6575 	{ "ERssIp4Pkt", 3, 1 },
6576 	{ "ERssIp6Pkt", 2, 1 },
6577 	{ "ERssTcpUdpPkt", 1, 1 },
6578 	{ "ERssFceFipPkt", 0, 1 },
6579 	{ NULL }
6580 };
6581 
6582 static void
6583 tp_la_show(struct sbuf *sb, uint64_t *p, int idx)
6584 {
6585 
6586 	field_desc_show(sb, *p, tp_la0);
6587 }
6588 
6589 static void
6590 tp_la_show2(struct sbuf *sb, uint64_t *p, int idx)
6591 {
6592 
6593 	if (idx)
6594 		sbuf_printf(sb, "\n");
6595 	field_desc_show(sb, p[0], tp_la0);
6596 	if (idx < (TPLA_SIZE / 2 - 1) || p[1] != ~0ULL)
6597 		field_desc_show(sb, p[1], tp_la0);
6598 }
6599 
6600 static void
6601 tp_la_show3(struct sbuf *sb, uint64_t *p, int idx)
6602 {
6603 
6604 	if (idx)
6605 		sbuf_printf(sb, "\n");
6606 	field_desc_show(sb, p[0], tp_la0);
6607 	if (idx < (TPLA_SIZE / 2 - 1) || p[1] != ~0ULL)
6608 		field_desc_show(sb, p[1], (p[0] & (1 << 17)) ? tp_la2 : tp_la1);
6609 }
6610 
6611 static int
6612 sysctl_tp_la(SYSCTL_HANDLER_ARGS)
6613 {
6614 	struct adapter *sc = arg1;
6615 	struct sbuf *sb;
6616 	uint64_t *buf, *p;
6617 	int rc;
6618 	u_int i, inc;
6619 	void (*show_func)(struct sbuf *, uint64_t *, int);
6620 
6621 	rc = sysctl_wire_old_buffer(req, 0);
6622 	if (rc != 0)
6623 		return (rc);
6624 
6625 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6626 	if (sb == NULL)
6627 		return (ENOMEM);
6628 
6629 	buf = malloc(TPLA_SIZE * sizeof(uint64_t), M_CXGBE, M_ZERO | M_WAITOK);
6630 
6631 	t4_tp_read_la(sc, buf, NULL);
6632 	p = buf;
6633 
6634 	switch (G_DBGLAMODE(t4_read_reg(sc, A_TP_DBG_LA_CONFIG))) {
6635 	case 2:
6636 		inc = 2;
6637 		show_func = tp_la_show2;
6638 		break;
6639 	case 3:
6640 		inc = 2;
6641 		show_func = tp_la_show3;
6642 		break;
6643 	default:
6644 		inc = 1;
6645 		show_func = tp_la_show;
6646 	}
6647 
6648 	for (i = 0; i < TPLA_SIZE / inc; i++, p += inc)
6649 		(*show_func)(sb, p, i);
6650 
6651 	rc = sbuf_finish(sb);
6652 	sbuf_delete(sb);
6653 	free(buf, M_CXGBE);
6654 	return (rc);
6655 }
6656 
6657 static int
6658 sysctl_tx_rate(SYSCTL_HANDLER_ARGS)
6659 {
6660 	struct adapter *sc = arg1;
6661 	struct sbuf *sb;
6662 	int rc;
6663 	u64 nrate[NCHAN], orate[NCHAN];
6664 
6665 	rc = sysctl_wire_old_buffer(req, 0);
6666 	if (rc != 0)
6667 		return (rc);
6668 
6669 	sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6670 	if (sb == NULL)
6671 		return (ENOMEM);
6672 
6673 	t4_get_chan_txrate(sc, nrate, orate);
6674 	sbuf_printf(sb, "              channel 0   channel 1   channel 2   "
6675 		 "channel 3\n");
6676 	sbuf_printf(sb, "NIC B/s:     %10ju  %10ju  %10ju  %10ju\n",
6677 	    nrate[0], nrate[1], nrate[2], nrate[3]);
6678 	sbuf_printf(sb, "Offload B/s: %10ju  %10ju  %10ju  %10ju",
6679 	    orate[0], orate[1], orate[2], orate[3]);
6680 
6681 	rc = sbuf_finish(sb);
6682 	sbuf_delete(sb);
6683 
6684 	return (rc);
6685 }
6686 
6687 static int
6688 sysctl_ulprx_la(SYSCTL_HANDLER_ARGS)
6689 {
6690 	struct adapter *sc = arg1;
6691 	struct sbuf *sb;
6692 	uint32_t *buf, *p;
6693 	int rc, i;
6694 
6695 	rc = sysctl_wire_old_buffer(req, 0);
6696 	if (rc != 0)
6697 		return (rc);
6698 
6699 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6700 	if (sb == NULL)
6701 		return (ENOMEM);
6702 
6703 	buf = malloc(ULPRX_LA_SIZE * 8 * sizeof(uint32_t), M_CXGBE,
6704 	    M_ZERO | M_WAITOK);
6705 
6706 	t4_ulprx_read_la(sc, buf);
6707 	p = buf;
6708 
6709 	sbuf_printf(sb, "      Pcmd        Type   Message"
6710 	    "                Data");
6711 	for (i = 0; i < ULPRX_LA_SIZE; i++, p += 8) {
6712 		sbuf_printf(sb, "\n%08x%08x  %4x  %08x  %08x%08x%08x%08x",
6713 		    p[1], p[0], p[2], p[3], p[7], p[6], p[5], p[4]);
6714 	}
6715 
6716 	rc = sbuf_finish(sb);
6717 	sbuf_delete(sb);
6718 	free(buf, M_CXGBE);
6719 	return (rc);
6720 }
6721 
6722 static int
6723 sysctl_wcwr_stats(SYSCTL_HANDLER_ARGS)
6724 {
6725 	struct adapter *sc = arg1;
6726 	struct sbuf *sb;
6727 	int rc, v;
6728 
6729 	rc = sysctl_wire_old_buffer(req, 0);
6730 	if (rc != 0)
6731 		return (rc);
6732 
6733 	sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6734 	if (sb == NULL)
6735 		return (ENOMEM);
6736 
6737 	v = t4_read_reg(sc, A_SGE_STAT_CFG);
6738 	if (G_STATSOURCE_T5(v) == 7) {
6739 		if (G_STATMODE(v) == 0) {
6740 			sbuf_printf(sb, "total %d, incomplete %d",
6741 			    t4_read_reg(sc, A_SGE_STAT_TOTAL),
6742 			    t4_read_reg(sc, A_SGE_STAT_MATCH));
6743 		} else if (G_STATMODE(v) == 1) {
6744 			sbuf_printf(sb, "total %d, data overflow %d",
6745 			    t4_read_reg(sc, A_SGE_STAT_TOTAL),
6746 			    t4_read_reg(sc, A_SGE_STAT_MATCH));
6747 		}
6748 	}
6749 	rc = sbuf_finish(sb);
6750 	sbuf_delete(sb);
6751 
6752 	return (rc);
6753 }
6754 #endif
6755 
6756 static inline void
6757 txq_start(struct ifnet *ifp, struct sge_txq *txq)
6758 {
6759 	struct buf_ring *br;
6760 	struct mbuf *m;
6761 
6762 	TXQ_LOCK_ASSERT_OWNED(txq);
6763 
6764 	br = txq->br;
6765 	m = txq->m ? txq->m : drbr_dequeue(ifp, br);
6766 	if (m)
6767 		t4_eth_tx(ifp, txq, m);
6768 }
6769 
6770 void
6771 t4_tx_callout(void *arg)
6772 {
6773 	struct sge_eq *eq = arg;
6774 	struct adapter *sc;
6775 
6776 	if (EQ_TRYLOCK(eq) == 0)
6777 		goto reschedule;
6778 
6779 	if (eq->flags & EQ_STALLED && !can_resume_tx(eq)) {
6780 		EQ_UNLOCK(eq);
6781 reschedule:
6782 		if (__predict_true(!(eq->flags && EQ_DOOMED)))
6783 			callout_schedule(&eq->tx_callout, 1);
6784 		return;
6785 	}
6786 
6787 	EQ_LOCK_ASSERT_OWNED(eq);
6788 
6789 	if (__predict_true((eq->flags & EQ_DOOMED) == 0)) {
6790 
6791 		if ((eq->flags & EQ_TYPEMASK) == EQ_ETH) {
6792 			struct sge_txq *txq = arg;
6793 			struct port_info *pi = txq->ifp->if_softc;
6794 
6795 			sc = pi->adapter;
6796 		} else {
6797 			struct sge_wrq *wrq = arg;
6798 
6799 			sc = wrq->adapter;
6800 		}
6801 
6802 		taskqueue_enqueue(sc->tq[eq->tx_chan], &eq->tx_task);
6803 	}
6804 
6805 	EQ_UNLOCK(eq);
6806 }
6807 
6808 void
6809 t4_tx_task(void *arg, int count)
6810 {
6811 	struct sge_eq *eq = arg;
6812 
6813 	EQ_LOCK(eq);
6814 	if ((eq->flags & EQ_TYPEMASK) == EQ_ETH) {
6815 		struct sge_txq *txq = arg;
6816 		txq_start(txq->ifp, txq);
6817 	} else {
6818 		struct sge_wrq *wrq = arg;
6819 		t4_wrq_tx_locked(wrq->adapter, wrq, NULL);
6820 	}
6821 	EQ_UNLOCK(eq);
6822 }
6823 
6824 static uint32_t
6825 fconf_to_mode(uint32_t fconf)
6826 {
6827 	uint32_t mode;
6828 
6829 	mode = T4_FILTER_IPv4 | T4_FILTER_IPv6 | T4_FILTER_IP_SADDR |
6830 	    T4_FILTER_IP_DADDR | T4_FILTER_IP_SPORT | T4_FILTER_IP_DPORT;
6831 
6832 	if (fconf & F_FRAGMENTATION)
6833 		mode |= T4_FILTER_IP_FRAGMENT;
6834 
6835 	if (fconf & F_MPSHITTYPE)
6836 		mode |= T4_FILTER_MPS_HIT_TYPE;
6837 
6838 	if (fconf & F_MACMATCH)
6839 		mode |= T4_FILTER_MAC_IDX;
6840 
6841 	if (fconf & F_ETHERTYPE)
6842 		mode |= T4_FILTER_ETH_TYPE;
6843 
6844 	if (fconf & F_PROTOCOL)
6845 		mode |= T4_FILTER_IP_PROTO;
6846 
6847 	if (fconf & F_TOS)
6848 		mode |= T4_FILTER_IP_TOS;
6849 
6850 	if (fconf & F_VLAN)
6851 		mode |= T4_FILTER_VLAN;
6852 
6853 	if (fconf & F_VNIC_ID)
6854 		mode |= T4_FILTER_VNIC;
6855 
6856 	if (fconf & F_PORT)
6857 		mode |= T4_FILTER_PORT;
6858 
6859 	if (fconf & F_FCOE)
6860 		mode |= T4_FILTER_FCoE;
6861 
6862 	return (mode);
6863 }
6864 
6865 static uint32_t
6866 mode_to_fconf(uint32_t mode)
6867 {
6868 	uint32_t fconf = 0;
6869 
6870 	if (mode & T4_FILTER_IP_FRAGMENT)
6871 		fconf |= F_FRAGMENTATION;
6872 
6873 	if (mode & T4_FILTER_MPS_HIT_TYPE)
6874 		fconf |= F_MPSHITTYPE;
6875 
6876 	if (mode & T4_FILTER_MAC_IDX)
6877 		fconf |= F_MACMATCH;
6878 
6879 	if (mode & T4_FILTER_ETH_TYPE)
6880 		fconf |= F_ETHERTYPE;
6881 
6882 	if (mode & T4_FILTER_IP_PROTO)
6883 		fconf |= F_PROTOCOL;
6884 
6885 	if (mode & T4_FILTER_IP_TOS)
6886 		fconf |= F_TOS;
6887 
6888 	if (mode & T4_FILTER_VLAN)
6889 		fconf |= F_VLAN;
6890 
6891 	if (mode & T4_FILTER_VNIC)
6892 		fconf |= F_VNIC_ID;
6893 
6894 	if (mode & T4_FILTER_PORT)
6895 		fconf |= F_PORT;
6896 
6897 	if (mode & T4_FILTER_FCoE)
6898 		fconf |= F_FCOE;
6899 
6900 	return (fconf);
6901 }
6902 
6903 static uint32_t
6904 fspec_to_fconf(struct t4_filter_specification *fs)
6905 {
6906 	uint32_t fconf = 0;
6907 
6908 	if (fs->val.frag || fs->mask.frag)
6909 		fconf |= F_FRAGMENTATION;
6910 
6911 	if (fs->val.matchtype || fs->mask.matchtype)
6912 		fconf |= F_MPSHITTYPE;
6913 
6914 	if (fs->val.macidx || fs->mask.macidx)
6915 		fconf |= F_MACMATCH;
6916 
6917 	if (fs->val.ethtype || fs->mask.ethtype)
6918 		fconf |= F_ETHERTYPE;
6919 
6920 	if (fs->val.proto || fs->mask.proto)
6921 		fconf |= F_PROTOCOL;
6922 
6923 	if (fs->val.tos || fs->mask.tos)
6924 		fconf |= F_TOS;
6925 
6926 	if (fs->val.vlan_vld || fs->mask.vlan_vld)
6927 		fconf |= F_VLAN;
6928 
6929 	if (fs->val.vnic_vld || fs->mask.vnic_vld)
6930 		fconf |= F_VNIC_ID;
6931 
6932 	if (fs->val.iport || fs->mask.iport)
6933 		fconf |= F_PORT;
6934 
6935 	if (fs->val.fcoe || fs->mask.fcoe)
6936 		fconf |= F_FCOE;
6937 
6938 	return (fconf);
6939 }
6940 
6941 static int
6942 get_filter_mode(struct adapter *sc, uint32_t *mode)
6943 {
6944 	int rc;
6945 	uint32_t fconf;
6946 
6947 	rc = begin_synchronized_op(sc, NULL, HOLD_LOCK | SLEEP_OK | INTR_OK,
6948 	    "t4getfm");
6949 	if (rc)
6950 		return (rc);
6951 
6952 	t4_read_indirect(sc, A_TP_PIO_ADDR, A_TP_PIO_DATA, &fconf, 1,
6953 	    A_TP_VLAN_PRI_MAP);
6954 
6955 	if (sc->params.tp.vlan_pri_map != fconf) {
6956 		log(LOG_WARNING, "%s: cached filter mode out of sync %x %x.\n",
6957 		    device_get_nameunit(sc->dev), sc->params.tp.vlan_pri_map,
6958 		    fconf);
6959 		sc->params.tp.vlan_pri_map = fconf;
6960 	}
6961 
6962 	*mode = fconf_to_mode(sc->params.tp.vlan_pri_map);
6963 
6964 	end_synchronized_op(sc, LOCK_HELD);
6965 	return (0);
6966 }
6967 
6968 static int
6969 set_filter_mode(struct adapter *sc, uint32_t mode)
6970 {
6971 	uint32_t fconf;
6972 	int rc;
6973 
6974 	fconf = mode_to_fconf(mode);
6975 
6976 	rc = begin_synchronized_op(sc, NULL, HOLD_LOCK | SLEEP_OK | INTR_OK,
6977 	    "t4setfm");
6978 	if (rc)
6979 		return (rc);
6980 
6981 	if (sc->tids.ftids_in_use > 0) {
6982 		rc = EBUSY;
6983 		goto done;
6984 	}
6985 
6986 #ifdef TCP_OFFLOAD
6987 	if (sc->offload_map) {
6988 		rc = EBUSY;
6989 		goto done;
6990 	}
6991 #endif
6992 
6993 #ifdef notyet
6994 	rc = -t4_set_filter_mode(sc, fconf);
6995 	if (rc == 0)
6996 		sc->filter_mode = fconf;
6997 #else
6998 	rc = ENOTSUP;
6999 #endif
7000 
7001 done:
7002 	end_synchronized_op(sc, LOCK_HELD);
7003 	return (rc);
7004 }
7005 
7006 static inline uint64_t
7007 get_filter_hits(struct adapter *sc, uint32_t fid)
7008 {
7009 	uint32_t mw_base, off, tcb_base = t4_read_reg(sc, A_TP_CMM_TCB_BASE);
7010 	uint64_t hits;
7011 
7012 	memwin_info(sc, 0, &mw_base, NULL);
7013 	off = position_memwin(sc, 0,
7014 	    tcb_base + (fid + sc->tids.ftid_base) * TCB_SIZE);
7015 	if (is_t4(sc)) {
7016 		hits = t4_read_reg64(sc, mw_base + off + 16);
7017 		hits = be64toh(hits);
7018 	} else {
7019 		hits = t4_read_reg(sc, mw_base + off + 24);
7020 		hits = be32toh(hits);
7021 	}
7022 
7023 	return (hits);
7024 }
7025 
7026 static int
7027 get_filter(struct adapter *sc, struct t4_filter *t)
7028 {
7029 	int i, rc, nfilters = sc->tids.nftids;
7030 	struct filter_entry *f;
7031 
7032 	rc = begin_synchronized_op(sc, NULL, HOLD_LOCK | SLEEP_OK | INTR_OK,
7033 	    "t4getf");
7034 	if (rc)
7035 		return (rc);
7036 
7037 	if (sc->tids.ftids_in_use == 0 || sc->tids.ftid_tab == NULL ||
7038 	    t->idx >= nfilters) {
7039 		t->idx = 0xffffffff;
7040 		goto done;
7041 	}
7042 
7043 	f = &sc->tids.ftid_tab[t->idx];
7044 	for (i = t->idx; i < nfilters; i++, f++) {
7045 		if (f->valid) {
7046 			t->idx = i;
7047 			t->l2tidx = f->l2t ? f->l2t->idx : 0;
7048 			t->smtidx = f->smtidx;
7049 			if (f->fs.hitcnts)
7050 				t->hits = get_filter_hits(sc, t->idx);
7051 			else
7052 				t->hits = UINT64_MAX;
7053 			t->fs = f->fs;
7054 
7055 			goto done;
7056 		}
7057 	}
7058 
7059 	t->idx = 0xffffffff;
7060 done:
7061 	end_synchronized_op(sc, LOCK_HELD);
7062 	return (0);
7063 }
7064 
7065 static int
7066 set_filter(struct adapter *sc, struct t4_filter *t)
7067 {
7068 	unsigned int nfilters, nports;
7069 	struct filter_entry *f;
7070 	int i, rc;
7071 
7072 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4setf");
7073 	if (rc)
7074 		return (rc);
7075 
7076 	nfilters = sc->tids.nftids;
7077 	nports = sc->params.nports;
7078 
7079 	if (nfilters == 0) {
7080 		rc = ENOTSUP;
7081 		goto done;
7082 	}
7083 
7084 	if (!(sc->flags & FULL_INIT_DONE)) {
7085 		rc = EAGAIN;
7086 		goto done;
7087 	}
7088 
7089 	if (t->idx >= nfilters) {
7090 		rc = EINVAL;
7091 		goto done;
7092 	}
7093 
7094 	/* Validate against the global filter mode */
7095 	if ((sc->params.tp.vlan_pri_map | fspec_to_fconf(&t->fs)) !=
7096 	    sc->params.tp.vlan_pri_map) {
7097 		rc = E2BIG;
7098 		goto done;
7099 	}
7100 
7101 	if (t->fs.action == FILTER_SWITCH && t->fs.eport >= nports) {
7102 		rc = EINVAL;
7103 		goto done;
7104 	}
7105 
7106 	if (t->fs.val.iport >= nports) {
7107 		rc = EINVAL;
7108 		goto done;
7109 	}
7110 
7111 	/* Can't specify an iq if not steering to it */
7112 	if (!t->fs.dirsteer && t->fs.iq) {
7113 		rc = EINVAL;
7114 		goto done;
7115 	}
7116 
7117 	/* IPv6 filter idx must be 4 aligned */
7118 	if (t->fs.type == 1 &&
7119 	    ((t->idx & 0x3) || t->idx + 4 >= nfilters)) {
7120 		rc = EINVAL;
7121 		goto done;
7122 	}
7123 
7124 	if (sc->tids.ftid_tab == NULL) {
7125 		KASSERT(sc->tids.ftids_in_use == 0,
7126 		    ("%s: no memory allocated but filters_in_use > 0",
7127 		    __func__));
7128 
7129 		sc->tids.ftid_tab = malloc(sizeof (struct filter_entry) *
7130 		    nfilters, M_CXGBE, M_NOWAIT | M_ZERO);
7131 		if (sc->tids.ftid_tab == NULL) {
7132 			rc = ENOMEM;
7133 			goto done;
7134 		}
7135 		mtx_init(&sc->tids.ftid_lock, "T4 filters", 0, MTX_DEF);
7136 	}
7137 
7138 	for (i = 0; i < 4; i++) {
7139 		f = &sc->tids.ftid_tab[t->idx + i];
7140 
7141 		if (f->pending || f->valid) {
7142 			rc = EBUSY;
7143 			goto done;
7144 		}
7145 		if (f->locked) {
7146 			rc = EPERM;
7147 			goto done;
7148 		}
7149 
7150 		if (t->fs.type == 0)
7151 			break;
7152 	}
7153 
7154 	f = &sc->tids.ftid_tab[t->idx];
7155 	f->fs = t->fs;
7156 
7157 	rc = set_filter_wr(sc, t->idx);
7158 done:
7159 	end_synchronized_op(sc, 0);
7160 
7161 	if (rc == 0) {
7162 		mtx_lock(&sc->tids.ftid_lock);
7163 		for (;;) {
7164 			if (f->pending == 0) {
7165 				rc = f->valid ? 0 : EIO;
7166 				break;
7167 			}
7168 
7169 			if (mtx_sleep(&sc->tids.ftid_tab, &sc->tids.ftid_lock,
7170 			    PCATCH, "t4setfw", 0)) {
7171 				rc = EINPROGRESS;
7172 				break;
7173 			}
7174 		}
7175 		mtx_unlock(&sc->tids.ftid_lock);
7176 	}
7177 	return (rc);
7178 }
7179 
7180 static int
7181 del_filter(struct adapter *sc, struct t4_filter *t)
7182 {
7183 	unsigned int nfilters;
7184 	struct filter_entry *f;
7185 	int rc;
7186 
7187 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4delf");
7188 	if (rc)
7189 		return (rc);
7190 
7191 	nfilters = sc->tids.nftids;
7192 
7193 	if (nfilters == 0) {
7194 		rc = ENOTSUP;
7195 		goto done;
7196 	}
7197 
7198 	if (sc->tids.ftid_tab == NULL || sc->tids.ftids_in_use == 0 ||
7199 	    t->idx >= nfilters) {
7200 		rc = EINVAL;
7201 		goto done;
7202 	}
7203 
7204 	if (!(sc->flags & FULL_INIT_DONE)) {
7205 		rc = EAGAIN;
7206 		goto done;
7207 	}
7208 
7209 	f = &sc->tids.ftid_tab[t->idx];
7210 
7211 	if (f->pending) {
7212 		rc = EBUSY;
7213 		goto done;
7214 	}
7215 	if (f->locked) {
7216 		rc = EPERM;
7217 		goto done;
7218 	}
7219 
7220 	if (f->valid) {
7221 		t->fs = f->fs;	/* extra info for the caller */
7222 		rc = del_filter_wr(sc, t->idx);
7223 	}
7224 
7225 done:
7226 	end_synchronized_op(sc, 0);
7227 
7228 	if (rc == 0) {
7229 		mtx_lock(&sc->tids.ftid_lock);
7230 		for (;;) {
7231 			if (f->pending == 0) {
7232 				rc = f->valid ? EIO : 0;
7233 				break;
7234 			}
7235 
7236 			if (mtx_sleep(&sc->tids.ftid_tab, &sc->tids.ftid_lock,
7237 			    PCATCH, "t4delfw", 0)) {
7238 				rc = EINPROGRESS;
7239 				break;
7240 			}
7241 		}
7242 		mtx_unlock(&sc->tids.ftid_lock);
7243 	}
7244 
7245 	return (rc);
7246 }
7247 
7248 static void
7249 clear_filter(struct filter_entry *f)
7250 {
7251 	if (f->l2t)
7252 		t4_l2t_release(f->l2t);
7253 
7254 	bzero(f, sizeof (*f));
7255 }
7256 
7257 static int
7258 set_filter_wr(struct adapter *sc, int fidx)
7259 {
7260 	struct filter_entry *f = &sc->tids.ftid_tab[fidx];
7261 	struct wrqe *wr;
7262 	struct fw_filter_wr *fwr;
7263 	unsigned int ftid;
7264 
7265 	ASSERT_SYNCHRONIZED_OP(sc);
7266 
7267 	if (f->fs.newdmac || f->fs.newvlan) {
7268 		/* This filter needs an L2T entry; allocate one. */
7269 		f->l2t = t4_l2t_alloc_switching(sc->l2t);
7270 		if (f->l2t == NULL)
7271 			return (EAGAIN);
7272 		if (t4_l2t_set_switching(sc, f->l2t, f->fs.vlan, f->fs.eport,
7273 		    f->fs.dmac)) {
7274 			t4_l2t_release(f->l2t);
7275 			f->l2t = NULL;
7276 			return (ENOMEM);
7277 		}
7278 	}
7279 
7280 	ftid = sc->tids.ftid_base + fidx;
7281 
7282 	wr = alloc_wrqe(sizeof(*fwr), &sc->sge.mgmtq);
7283 	if (wr == NULL)
7284 		return (ENOMEM);
7285 
7286 	fwr = wrtod(wr);
7287 	bzero(fwr, sizeof (*fwr));
7288 
7289 	fwr->op_pkd = htobe32(V_FW_WR_OP(FW_FILTER_WR));
7290 	fwr->len16_pkd = htobe32(FW_LEN16(*fwr));
7291 	fwr->tid_to_iq =
7292 	    htobe32(V_FW_FILTER_WR_TID(ftid) |
7293 		V_FW_FILTER_WR_RQTYPE(f->fs.type) |
7294 		V_FW_FILTER_WR_NOREPLY(0) |
7295 		V_FW_FILTER_WR_IQ(f->fs.iq));
7296 	fwr->del_filter_to_l2tix =
7297 	    htobe32(V_FW_FILTER_WR_RPTTID(f->fs.rpttid) |
7298 		V_FW_FILTER_WR_DROP(f->fs.action == FILTER_DROP) |
7299 		V_FW_FILTER_WR_DIRSTEER(f->fs.dirsteer) |
7300 		V_FW_FILTER_WR_MASKHASH(f->fs.maskhash) |
7301 		V_FW_FILTER_WR_DIRSTEERHASH(f->fs.dirsteerhash) |
7302 		V_FW_FILTER_WR_LPBK(f->fs.action == FILTER_SWITCH) |
7303 		V_FW_FILTER_WR_DMAC(f->fs.newdmac) |
7304 		V_FW_FILTER_WR_SMAC(f->fs.newsmac) |
7305 		V_FW_FILTER_WR_INSVLAN(f->fs.newvlan == VLAN_INSERT ||
7306 		    f->fs.newvlan == VLAN_REWRITE) |
7307 		V_FW_FILTER_WR_RMVLAN(f->fs.newvlan == VLAN_REMOVE ||
7308 		    f->fs.newvlan == VLAN_REWRITE) |
7309 		V_FW_FILTER_WR_HITCNTS(f->fs.hitcnts) |
7310 		V_FW_FILTER_WR_TXCHAN(f->fs.eport) |
7311 		V_FW_FILTER_WR_PRIO(f->fs.prio) |
7312 		V_FW_FILTER_WR_L2TIX(f->l2t ? f->l2t->idx : 0));
7313 	fwr->ethtype = htobe16(f->fs.val.ethtype);
7314 	fwr->ethtypem = htobe16(f->fs.mask.ethtype);
7315 	fwr->frag_to_ovlan_vldm =
7316 	    (V_FW_FILTER_WR_FRAG(f->fs.val.frag) |
7317 		V_FW_FILTER_WR_FRAGM(f->fs.mask.frag) |
7318 		V_FW_FILTER_WR_IVLAN_VLD(f->fs.val.vlan_vld) |
7319 		V_FW_FILTER_WR_OVLAN_VLD(f->fs.val.vnic_vld) |
7320 		V_FW_FILTER_WR_IVLAN_VLDM(f->fs.mask.vlan_vld) |
7321 		V_FW_FILTER_WR_OVLAN_VLDM(f->fs.mask.vnic_vld));
7322 	fwr->smac_sel = 0;
7323 	fwr->rx_chan_rx_rpl_iq = htobe16(V_FW_FILTER_WR_RX_CHAN(0) |
7324 	    V_FW_FILTER_WR_RX_RPL_IQ(sc->sge.fwq.abs_id));
7325 	fwr->maci_to_matchtypem =
7326 	    htobe32(V_FW_FILTER_WR_MACI(f->fs.val.macidx) |
7327 		V_FW_FILTER_WR_MACIM(f->fs.mask.macidx) |
7328 		V_FW_FILTER_WR_FCOE(f->fs.val.fcoe) |
7329 		V_FW_FILTER_WR_FCOEM(f->fs.mask.fcoe) |
7330 		V_FW_FILTER_WR_PORT(f->fs.val.iport) |
7331 		V_FW_FILTER_WR_PORTM(f->fs.mask.iport) |
7332 		V_FW_FILTER_WR_MATCHTYPE(f->fs.val.matchtype) |
7333 		V_FW_FILTER_WR_MATCHTYPEM(f->fs.mask.matchtype));
7334 	fwr->ptcl = f->fs.val.proto;
7335 	fwr->ptclm = f->fs.mask.proto;
7336 	fwr->ttyp = f->fs.val.tos;
7337 	fwr->ttypm = f->fs.mask.tos;
7338 	fwr->ivlan = htobe16(f->fs.val.vlan);
7339 	fwr->ivlanm = htobe16(f->fs.mask.vlan);
7340 	fwr->ovlan = htobe16(f->fs.val.vnic);
7341 	fwr->ovlanm = htobe16(f->fs.mask.vnic);
7342 	bcopy(f->fs.val.dip, fwr->lip, sizeof (fwr->lip));
7343 	bcopy(f->fs.mask.dip, fwr->lipm, sizeof (fwr->lipm));
7344 	bcopy(f->fs.val.sip, fwr->fip, sizeof (fwr->fip));
7345 	bcopy(f->fs.mask.sip, fwr->fipm, sizeof (fwr->fipm));
7346 	fwr->lp = htobe16(f->fs.val.dport);
7347 	fwr->lpm = htobe16(f->fs.mask.dport);
7348 	fwr->fp = htobe16(f->fs.val.sport);
7349 	fwr->fpm = htobe16(f->fs.mask.sport);
7350 	if (f->fs.newsmac)
7351 		bcopy(f->fs.smac, fwr->sma, sizeof (fwr->sma));
7352 
7353 	f->pending = 1;
7354 	sc->tids.ftids_in_use++;
7355 
7356 	t4_wrq_tx(sc, wr);
7357 	return (0);
7358 }
7359 
7360 static int
7361 del_filter_wr(struct adapter *sc, int fidx)
7362 {
7363 	struct filter_entry *f = &sc->tids.ftid_tab[fidx];
7364 	struct wrqe *wr;
7365 	struct fw_filter_wr *fwr;
7366 	unsigned int ftid;
7367 
7368 	ftid = sc->tids.ftid_base + fidx;
7369 
7370 	wr = alloc_wrqe(sizeof(*fwr), &sc->sge.mgmtq);
7371 	if (wr == NULL)
7372 		return (ENOMEM);
7373 	fwr = wrtod(wr);
7374 	bzero(fwr, sizeof (*fwr));
7375 
7376 	t4_mk_filtdelwr(ftid, fwr, sc->sge.fwq.abs_id);
7377 
7378 	f->pending = 1;
7379 	t4_wrq_tx(sc, wr);
7380 	return (0);
7381 }
7382 
7383 int
7384 t4_filter_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
7385 {
7386 	struct adapter *sc = iq->adapter;
7387 	const struct cpl_set_tcb_rpl *rpl = (const void *)(rss + 1);
7388 	unsigned int idx = GET_TID(rpl);
7389 	unsigned int rc;
7390 	struct filter_entry *f;
7391 
7392 	KASSERT(m == NULL, ("%s: payload with opcode %02x", __func__,
7393 	    rss->opcode));
7394 
7395 	if (is_ftid(sc, idx)) {
7396 
7397 		idx -= sc->tids.ftid_base;
7398 		f = &sc->tids.ftid_tab[idx];
7399 		rc = G_COOKIE(rpl->cookie);
7400 
7401 		mtx_lock(&sc->tids.ftid_lock);
7402 		if (rc == FW_FILTER_WR_FLT_ADDED) {
7403 			KASSERT(f->pending, ("%s: filter[%u] isn't pending.",
7404 			    __func__, idx));
7405 			f->smtidx = (be64toh(rpl->oldval) >> 24) & 0xff;
7406 			f->pending = 0;  /* asynchronous setup completed */
7407 			f->valid = 1;
7408 		} else {
7409 			if (rc != FW_FILTER_WR_FLT_DELETED) {
7410 				/* Add or delete failed, display an error */
7411 				log(LOG_ERR,
7412 				    "filter %u setup failed with error %u\n",
7413 				    idx, rc);
7414 			}
7415 
7416 			clear_filter(f);
7417 			sc->tids.ftids_in_use--;
7418 		}
7419 		wakeup(&sc->tids.ftid_tab);
7420 		mtx_unlock(&sc->tids.ftid_lock);
7421 	}
7422 
7423 	return (0);
7424 }
7425 
7426 static int
7427 get_sge_context(struct adapter *sc, struct t4_sge_context *cntxt)
7428 {
7429 	int rc;
7430 
7431 	if (cntxt->cid > M_CTXTQID)
7432 		return (EINVAL);
7433 
7434 	if (cntxt->mem_id != CTXT_EGRESS && cntxt->mem_id != CTXT_INGRESS &&
7435 	    cntxt->mem_id != CTXT_FLM && cntxt->mem_id != CTXT_CNM)
7436 		return (EINVAL);
7437 
7438 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4ctxt");
7439 	if (rc)
7440 		return (rc);
7441 
7442 	if (sc->flags & FW_OK) {
7443 		rc = -t4_sge_ctxt_rd(sc, sc->mbox, cntxt->cid, cntxt->mem_id,
7444 		    &cntxt->data[0]);
7445 		if (rc == 0)
7446 			goto done;
7447 	}
7448 
7449 	/*
7450 	 * Read via firmware failed or wasn't even attempted.  Read directly via
7451 	 * the backdoor.
7452 	 */
7453 	rc = -t4_sge_ctxt_rd_bd(sc, cntxt->cid, cntxt->mem_id, &cntxt->data[0]);
7454 done:
7455 	end_synchronized_op(sc, 0);
7456 	return (rc);
7457 }
7458 
7459 static int
7460 load_fw(struct adapter *sc, struct t4_data *fw)
7461 {
7462 	int rc;
7463 	uint8_t *fw_data;
7464 
7465 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4ldfw");
7466 	if (rc)
7467 		return (rc);
7468 
7469 	if (sc->flags & FULL_INIT_DONE) {
7470 		rc = EBUSY;
7471 		goto done;
7472 	}
7473 
7474 	fw_data = malloc(fw->len, M_CXGBE, M_WAITOK);
7475 	if (fw_data == NULL) {
7476 		rc = ENOMEM;
7477 		goto done;
7478 	}
7479 
7480 	rc = copyin(fw->data, fw_data, fw->len);
7481 	if (rc == 0)
7482 		rc = -t4_load_fw(sc, fw_data, fw->len);
7483 
7484 	free(fw_data, M_CXGBE);
7485 done:
7486 	end_synchronized_op(sc, 0);
7487 	return (rc);
7488 }
7489 
7490 static int
7491 read_card_mem(struct adapter *sc, int win, struct t4_mem_range *mr)
7492 {
7493 	uint32_t addr, off, remaining, i, n;
7494 	uint32_t *buf, *b;
7495 	uint32_t mw_base, mw_aperture;
7496 	int rc;
7497 	uint8_t *dst;
7498 
7499 	rc = validate_mem_range(sc, mr->addr, mr->len);
7500 	if (rc != 0)
7501 		return (rc);
7502 
7503 	memwin_info(sc, win, &mw_base, &mw_aperture);
7504 	buf = b = malloc(min(mr->len, mw_aperture), M_CXGBE, M_WAITOK);
7505 	addr = mr->addr;
7506 	remaining = mr->len;
7507 	dst = (void *)mr->data;
7508 
7509 	while (remaining) {
7510 		off = position_memwin(sc, win, addr);
7511 
7512 		/* number of bytes that we'll copy in the inner loop */
7513 		n = min(remaining, mw_aperture - off);
7514 		for (i = 0; i < n; i += 4)
7515 			*b++ = t4_read_reg(sc, mw_base + off + i);
7516 
7517 		rc = copyout(buf, dst, n);
7518 		if (rc != 0)
7519 			break;
7520 
7521 		b = buf;
7522 		dst += n;
7523 		remaining -= n;
7524 		addr += n;
7525 	}
7526 
7527 	free(buf, M_CXGBE);
7528 	return (rc);
7529 }
7530 
7531 static int
7532 read_i2c(struct adapter *sc, struct t4_i2c_data *i2cd)
7533 {
7534 	int rc;
7535 
7536 	if (i2cd->len == 0 || i2cd->port_id >= sc->params.nports)
7537 		return (EINVAL);
7538 
7539 	if (i2cd->len > sizeof(i2cd->data))
7540 		return (EFBIG);
7541 
7542 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4i2crd");
7543 	if (rc)
7544 		return (rc);
7545 	rc = -t4_i2c_rd(sc, sc->mbox, i2cd->port_id, i2cd->dev_addr,
7546 	    i2cd->offset, i2cd->len, &i2cd->data[0]);
7547 	end_synchronized_op(sc, 0);
7548 
7549 	return (rc);
7550 }
7551 
7552 static int
7553 in_range(int val, int lo, int hi)
7554 {
7555 
7556 	return (val < 0 || (val <= hi && val >= lo));
7557 }
7558 
7559 static int
7560 set_sched_class(struct adapter *sc, struct t4_sched_params *p)
7561 {
7562 	int fw_subcmd, fw_type, rc;
7563 
7564 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4setsc");
7565 	if (rc)
7566 		return (rc);
7567 
7568 	if (!(sc->flags & FULL_INIT_DONE)) {
7569 		rc = EAGAIN;
7570 		goto done;
7571 	}
7572 
7573 	/*
7574 	 * Translate the cxgbetool parameters into T4 firmware parameters.  (The
7575 	 * sub-command and type are in common locations.)
7576 	 */
7577 	if (p->subcmd == SCHED_CLASS_SUBCMD_CONFIG)
7578 		fw_subcmd = FW_SCHED_SC_CONFIG;
7579 	else if (p->subcmd == SCHED_CLASS_SUBCMD_PARAMS)
7580 		fw_subcmd = FW_SCHED_SC_PARAMS;
7581 	else {
7582 		rc = EINVAL;
7583 		goto done;
7584 	}
7585 	if (p->type == SCHED_CLASS_TYPE_PACKET)
7586 		fw_type = FW_SCHED_TYPE_PKTSCHED;
7587 	else {
7588 		rc = EINVAL;
7589 		goto done;
7590 	}
7591 
7592 	if (fw_subcmd == FW_SCHED_SC_CONFIG) {
7593 		/* Vet our parameters ..*/
7594 		if (p->u.config.minmax < 0) {
7595 			rc = EINVAL;
7596 			goto done;
7597 		}
7598 
7599 		/* And pass the request to the firmware ...*/
7600 		rc = -t4_sched_config(sc, fw_type, p->u.config.minmax);
7601 		goto done;
7602 	}
7603 
7604 	if (fw_subcmd == FW_SCHED_SC_PARAMS) {
7605 		int fw_level;
7606 		int fw_mode;
7607 		int fw_rateunit;
7608 		int fw_ratemode;
7609 
7610 		if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL)
7611 			fw_level = FW_SCHED_PARAMS_LEVEL_CL_RL;
7612 		else if (p->u.params.level == SCHED_CLASS_LEVEL_CL_WRR)
7613 			fw_level = FW_SCHED_PARAMS_LEVEL_CL_WRR;
7614 		else if (p->u.params.level == SCHED_CLASS_LEVEL_CH_RL)
7615 			fw_level = FW_SCHED_PARAMS_LEVEL_CH_RL;
7616 		else {
7617 			rc = EINVAL;
7618 			goto done;
7619 		}
7620 
7621 		if (p->u.params.mode == SCHED_CLASS_MODE_CLASS)
7622 			fw_mode = FW_SCHED_PARAMS_MODE_CLASS;
7623 		else if (p->u.params.mode == SCHED_CLASS_MODE_FLOW)
7624 			fw_mode = FW_SCHED_PARAMS_MODE_FLOW;
7625 		else {
7626 			rc = EINVAL;
7627 			goto done;
7628 		}
7629 
7630 		if (p->u.params.rateunit == SCHED_CLASS_RATEUNIT_BITS)
7631 			fw_rateunit = FW_SCHED_PARAMS_UNIT_BITRATE;
7632 		else if (p->u.params.rateunit == SCHED_CLASS_RATEUNIT_PKTS)
7633 			fw_rateunit = FW_SCHED_PARAMS_UNIT_PKTRATE;
7634 		else {
7635 			rc = EINVAL;
7636 			goto done;
7637 		}
7638 
7639 		if (p->u.params.ratemode == SCHED_CLASS_RATEMODE_REL)
7640 			fw_ratemode = FW_SCHED_PARAMS_RATE_REL;
7641 		else if (p->u.params.ratemode == SCHED_CLASS_RATEMODE_ABS)
7642 			fw_ratemode = FW_SCHED_PARAMS_RATE_ABS;
7643 		else {
7644 			rc = EINVAL;
7645 			goto done;
7646 		}
7647 
7648 		/* Vet our parameters ... */
7649 		if (!in_range(p->u.params.channel, 0, 3) ||
7650 		    !in_range(p->u.params.cl, 0, is_t4(sc) ? 15 : 16) ||
7651 		    !in_range(p->u.params.minrate, 0, 10000000) ||
7652 		    !in_range(p->u.params.maxrate, 0, 10000000) ||
7653 		    !in_range(p->u.params.weight, 0, 100)) {
7654 			rc = ERANGE;
7655 			goto done;
7656 		}
7657 
7658 		/*
7659 		 * Translate any unset parameters into the firmware's
7660 		 * nomenclature and/or fail the call if the parameters
7661 		 * are required ...
7662 		 */
7663 		if (p->u.params.rateunit < 0 || p->u.params.ratemode < 0 ||
7664 		    p->u.params.channel < 0 || p->u.params.cl < 0) {
7665 			rc = EINVAL;
7666 			goto done;
7667 		}
7668 		if (p->u.params.minrate < 0)
7669 			p->u.params.minrate = 0;
7670 		if (p->u.params.maxrate < 0) {
7671 			if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL ||
7672 			    p->u.params.level == SCHED_CLASS_LEVEL_CH_RL) {
7673 				rc = EINVAL;
7674 				goto done;
7675 			} else
7676 				p->u.params.maxrate = 0;
7677 		}
7678 		if (p->u.params.weight < 0) {
7679 			if (p->u.params.level == SCHED_CLASS_LEVEL_CL_WRR) {
7680 				rc = EINVAL;
7681 				goto done;
7682 			} else
7683 				p->u.params.weight = 0;
7684 		}
7685 		if (p->u.params.pktsize < 0) {
7686 			if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL ||
7687 			    p->u.params.level == SCHED_CLASS_LEVEL_CH_RL) {
7688 				rc = EINVAL;
7689 				goto done;
7690 			} else
7691 				p->u.params.pktsize = 0;
7692 		}
7693 
7694 		/* See what the firmware thinks of the request ... */
7695 		rc = -t4_sched_params(sc, fw_type, fw_level, fw_mode,
7696 		    fw_rateunit, fw_ratemode, p->u.params.channel,
7697 		    p->u.params.cl, p->u.params.minrate, p->u.params.maxrate,
7698 		    p->u.params.weight, p->u.params.pktsize);
7699 		goto done;
7700 	}
7701 
7702 	rc = EINVAL;
7703 done:
7704 	end_synchronized_op(sc, 0);
7705 	return (rc);
7706 }
7707 
7708 static int
7709 set_sched_queue(struct adapter *sc, struct t4_sched_queue *p)
7710 {
7711 	struct port_info *pi = NULL;
7712 	struct sge_txq *txq;
7713 	uint32_t fw_mnem, fw_queue, fw_class;
7714 	int i, rc;
7715 
7716 	rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4setsq");
7717 	if (rc)
7718 		return (rc);
7719 
7720 	if (!(sc->flags & FULL_INIT_DONE)) {
7721 		rc = EAGAIN;
7722 		goto done;
7723 	}
7724 
7725 	if (p->port >= sc->params.nports) {
7726 		rc = EINVAL;
7727 		goto done;
7728 	}
7729 
7730 	pi = sc->port[p->port];
7731 	if (!in_range(p->queue, 0, pi->ntxq - 1) || !in_range(p->cl, 0, 7)) {
7732 		rc = EINVAL;
7733 		goto done;
7734 	}
7735 
7736 	/*
7737 	 * Create a template for the FW_PARAMS_CMD mnemonic and value (TX
7738 	 * Scheduling Class in this case).
7739 	 */
7740 	fw_mnem = (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) |
7741 	    V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_EQ_SCHEDCLASS_ETH));
7742 	fw_class = p->cl < 0 ? 0xffffffff : p->cl;
7743 
7744 	/*
7745 	 * If op.queue is non-negative, then we're only changing the scheduling
7746 	 * on a single specified TX queue.
7747 	 */
7748 	if (p->queue >= 0) {
7749 		txq = &sc->sge.txq[pi->first_txq + p->queue];
7750 		fw_queue = (fw_mnem | V_FW_PARAMS_PARAM_YZ(txq->eq.cntxt_id));
7751 		rc = -t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &fw_queue,
7752 		    &fw_class);
7753 		goto done;
7754 	}
7755 
7756 	/*
7757 	 * Change the scheduling on all the TX queues for the
7758 	 * interface.
7759 	 */
7760 	for_each_txq(pi, i, txq) {
7761 		fw_queue = (fw_mnem | V_FW_PARAMS_PARAM_YZ(txq->eq.cntxt_id));
7762 		rc = -t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &fw_queue,
7763 		    &fw_class);
7764 		if (rc)
7765 			goto done;
7766 	}
7767 
7768 	rc = 0;
7769 done:
7770 	end_synchronized_op(sc, 0);
7771 	return (rc);
7772 }
7773 
7774 int
7775 t4_os_find_pci_capability(struct adapter *sc, int cap)
7776 {
7777 	int i;
7778 
7779 	return (pci_find_cap(sc->dev, cap, &i) == 0 ? i : 0);
7780 }
7781 
7782 int
7783 t4_os_pci_save_state(struct adapter *sc)
7784 {
7785 	device_t dev;
7786 	struct pci_devinfo *dinfo;
7787 
7788 	dev = sc->dev;
7789 	dinfo = device_get_ivars(dev);
7790 
7791 	pci_cfg_save(dev, dinfo, 0);
7792 	return (0);
7793 }
7794 
7795 int
7796 t4_os_pci_restore_state(struct adapter *sc)
7797 {
7798 	device_t dev;
7799 	struct pci_devinfo *dinfo;
7800 
7801 	dev = sc->dev;
7802 	dinfo = device_get_ivars(dev);
7803 
7804 	pci_cfg_restore(dev, dinfo);
7805 	return (0);
7806 }
7807 
7808 void
7809 t4_os_portmod_changed(const struct adapter *sc, int idx)
7810 {
7811 	struct port_info *pi = sc->port[idx];
7812 	static const char *mod_str[] = {
7813 		NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM"
7814 	};
7815 
7816 	if (pi->mod_type == FW_PORT_MOD_TYPE_NONE)
7817 		if_printf(pi->ifp, "transceiver unplugged.\n");
7818 	else if (pi->mod_type == FW_PORT_MOD_TYPE_UNKNOWN)
7819 		if_printf(pi->ifp, "unknown transceiver inserted.\n");
7820 	else if (pi->mod_type == FW_PORT_MOD_TYPE_NOTSUPPORTED)
7821 		if_printf(pi->ifp, "unsupported transceiver inserted.\n");
7822 	else if (pi->mod_type > 0 && pi->mod_type < nitems(mod_str)) {
7823 		if_printf(pi->ifp, "%s transceiver inserted.\n",
7824 		    mod_str[pi->mod_type]);
7825 	} else {
7826 		if_printf(pi->ifp, "transceiver (type %d) inserted.\n",
7827 		    pi->mod_type);
7828 	}
7829 }
7830 
7831 void
7832 t4_os_link_changed(struct adapter *sc, int idx, int link_stat, int reason)
7833 {
7834 	struct port_info *pi = sc->port[idx];
7835 	struct ifnet *ifp = pi->ifp;
7836 
7837 	if (link_stat) {
7838 		pi->linkdnrc = -1;
7839 		ifp->if_baudrate = IF_Mbps(pi->link_cfg.speed);
7840 		if_link_state_change(ifp, LINK_STATE_UP);
7841 	} else {
7842 		if (reason >= 0)
7843 			pi->linkdnrc = reason;
7844 		if_link_state_change(ifp, LINK_STATE_DOWN);
7845 	}
7846 }
7847 
7848 void
7849 t4_iterate(void (*func)(struct adapter *, void *), void *arg)
7850 {
7851 	struct adapter *sc;
7852 
7853 	sx_slock(&t4_list_lock);
7854 	SLIST_FOREACH(sc, &t4_list, link) {
7855 		/*
7856 		 * func should not make any assumptions about what state sc is
7857 		 * in - the only guarantee is that sc->sc_lock is a valid lock.
7858 		 */
7859 		func(sc, arg);
7860 	}
7861 	sx_sunlock(&t4_list_lock);
7862 }
7863 
7864 static int
7865 t4_open(struct cdev *dev, int flags, int type, struct thread *td)
7866 {
7867        return (0);
7868 }
7869 
7870 static int
7871 t4_close(struct cdev *dev, int flags, int type, struct thread *td)
7872 {
7873        return (0);
7874 }
7875 
7876 static int
7877 t4_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, int fflag,
7878     struct thread *td)
7879 {
7880 	int rc;
7881 	struct adapter *sc = dev->si_drv1;
7882 
7883 	rc = priv_check(td, PRIV_DRIVER);
7884 	if (rc != 0)
7885 		return (rc);
7886 
7887 	switch (cmd) {
7888 	case CHELSIO_T4_GETREG: {
7889 		struct t4_reg *edata = (struct t4_reg *)data;
7890 
7891 		if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
7892 			return (EFAULT);
7893 
7894 		if (edata->size == 4)
7895 			edata->val = t4_read_reg(sc, edata->addr);
7896 		else if (edata->size == 8)
7897 			edata->val = t4_read_reg64(sc, edata->addr);
7898 		else
7899 			return (EINVAL);
7900 
7901 		break;
7902 	}
7903 	case CHELSIO_T4_SETREG: {
7904 		struct t4_reg *edata = (struct t4_reg *)data;
7905 
7906 		if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
7907 			return (EFAULT);
7908 
7909 		if (edata->size == 4) {
7910 			if (edata->val & 0xffffffff00000000)
7911 				return (EINVAL);
7912 			t4_write_reg(sc, edata->addr, (uint32_t) edata->val);
7913 		} else if (edata->size == 8)
7914 			t4_write_reg64(sc, edata->addr, edata->val);
7915 		else
7916 			return (EINVAL);
7917 		break;
7918 	}
7919 	case CHELSIO_T4_REGDUMP: {
7920 		struct t4_regdump *regs = (struct t4_regdump *)data;
7921 		int reglen = is_t4(sc) ? T4_REGDUMP_SIZE : T5_REGDUMP_SIZE;
7922 		uint8_t *buf;
7923 
7924 		if (regs->len < reglen) {
7925 			regs->len = reglen; /* hint to the caller */
7926 			return (ENOBUFS);
7927 		}
7928 
7929 		regs->len = reglen;
7930 		buf = malloc(reglen, M_CXGBE, M_WAITOK | M_ZERO);
7931 		t4_get_regs(sc, regs, buf);
7932 		rc = copyout(buf, regs->data, reglen);
7933 		free(buf, M_CXGBE);
7934 		break;
7935 	}
7936 	case CHELSIO_T4_GET_FILTER_MODE:
7937 		rc = get_filter_mode(sc, (uint32_t *)data);
7938 		break;
7939 	case CHELSIO_T4_SET_FILTER_MODE:
7940 		rc = set_filter_mode(sc, *(uint32_t *)data);
7941 		break;
7942 	case CHELSIO_T4_GET_FILTER:
7943 		rc = get_filter(sc, (struct t4_filter *)data);
7944 		break;
7945 	case CHELSIO_T4_SET_FILTER:
7946 		rc = set_filter(sc, (struct t4_filter *)data);
7947 		break;
7948 	case CHELSIO_T4_DEL_FILTER:
7949 		rc = del_filter(sc, (struct t4_filter *)data);
7950 		break;
7951 	case CHELSIO_T4_GET_SGE_CONTEXT:
7952 		rc = get_sge_context(sc, (struct t4_sge_context *)data);
7953 		break;
7954 	case CHELSIO_T4_LOAD_FW:
7955 		rc = load_fw(sc, (struct t4_data *)data);
7956 		break;
7957 	case CHELSIO_T4_GET_MEM:
7958 		rc = read_card_mem(sc, 2, (struct t4_mem_range *)data);
7959 		break;
7960 	case CHELSIO_T4_GET_I2C:
7961 		rc = read_i2c(sc, (struct t4_i2c_data *)data);
7962 		break;
7963 	case CHELSIO_T4_CLEAR_STATS: {
7964 		int i;
7965 		u_int port_id = *(uint32_t *)data;
7966 		struct port_info *pi;
7967 
7968 		if (port_id >= sc->params.nports)
7969 			return (EINVAL);
7970 		pi = sc->port[port_id];
7971 
7972 		/* MAC stats */
7973 		t4_clr_port_stats(sc, pi->tx_chan);
7974 
7975 		if (pi->flags & PORT_INIT_DONE) {
7976 			struct sge_rxq *rxq;
7977 			struct sge_txq *txq;
7978 			struct sge_wrq *wrq;
7979 
7980 			for_each_rxq(pi, i, rxq) {
7981 #if defined(INET) || defined(INET6)
7982 				rxq->lro.lro_queued = 0;
7983 				rxq->lro.lro_flushed = 0;
7984 #endif
7985 				rxq->rxcsum = 0;
7986 				rxq->vlan_extraction = 0;
7987 			}
7988 
7989 			for_each_txq(pi, i, txq) {
7990 				txq->txcsum = 0;
7991 				txq->tso_wrs = 0;
7992 				txq->vlan_insertion = 0;
7993 				txq->imm_wrs = 0;
7994 				txq->sgl_wrs = 0;
7995 				txq->txpkt_wrs = 0;
7996 				txq->txpkts_wrs = 0;
7997 				txq->txpkts_pkts = 0;
7998 				txq->br->br_drops = 0;
7999 				txq->no_dmamap = 0;
8000 				txq->no_desc = 0;
8001 			}
8002 
8003 #ifdef TCP_OFFLOAD
8004 			/* nothing to clear for each ofld_rxq */
8005 
8006 			for_each_ofld_txq(pi, i, wrq) {
8007 				wrq->tx_wrs = 0;
8008 				wrq->no_desc = 0;
8009 			}
8010 #endif
8011 			wrq = &sc->sge.ctrlq[pi->port_id];
8012 			wrq->tx_wrs = 0;
8013 			wrq->no_desc = 0;
8014 		}
8015 		break;
8016 	}
8017 	case CHELSIO_T4_SCHED_CLASS:
8018 		rc = set_sched_class(sc, (struct t4_sched_params *)data);
8019 		break;
8020 	case CHELSIO_T4_SCHED_QUEUE:
8021 		rc = set_sched_queue(sc, (struct t4_sched_queue *)data);
8022 		break;
8023 	case CHELSIO_T4_GET_TRACER:
8024 		rc = t4_get_tracer(sc, (struct t4_tracer *)data);
8025 		break;
8026 	case CHELSIO_T4_SET_TRACER:
8027 		rc = t4_set_tracer(sc, (struct t4_tracer *)data);
8028 		break;
8029 	default:
8030 		rc = EINVAL;
8031 	}
8032 
8033 	return (rc);
8034 }
8035 
8036 #ifdef TCP_OFFLOAD
8037 static int
8038 toe_capability(struct port_info *pi, int enable)
8039 {
8040 	int rc;
8041 	struct adapter *sc = pi->adapter;
8042 
8043 	ASSERT_SYNCHRONIZED_OP(sc);
8044 
8045 	if (!is_offload(sc))
8046 		return (ENODEV);
8047 
8048 	if (enable) {
8049 		if (!(sc->flags & FULL_INIT_DONE)) {
8050 			rc = cxgbe_init_synchronized(pi);
8051 			if (rc)
8052 				return (rc);
8053 		}
8054 
8055 		if (isset(&sc->offload_map, pi->port_id))
8056 			return (0);
8057 
8058 		if (!(sc->flags & TOM_INIT_DONE)) {
8059 			rc = t4_activate_uld(sc, ULD_TOM);
8060 			if (rc == EAGAIN) {
8061 				log(LOG_WARNING,
8062 				    "You must kldload t4_tom.ko before trying "
8063 				    "to enable TOE on a cxgbe interface.\n");
8064 			}
8065 			if (rc != 0)
8066 				return (rc);
8067 			KASSERT(sc->tom_softc != NULL,
8068 			    ("%s: TOM activated but softc NULL", __func__));
8069 			KASSERT(sc->flags & TOM_INIT_DONE,
8070 			    ("%s: TOM activated but flag not set", __func__));
8071 		}
8072 
8073 		setbit(&sc->offload_map, pi->port_id);
8074 	} else {
8075 		if (!isset(&sc->offload_map, pi->port_id))
8076 			return (0);
8077 
8078 		KASSERT(sc->flags & TOM_INIT_DONE,
8079 		    ("%s: TOM never initialized?", __func__));
8080 		clrbit(&sc->offload_map, pi->port_id);
8081 	}
8082 
8083 	return (0);
8084 }
8085 
8086 /*
8087  * Add an upper layer driver to the global list.
8088  */
8089 int
8090 t4_register_uld(struct uld_info *ui)
8091 {
8092 	int rc = 0;
8093 	struct uld_info *u;
8094 
8095 	sx_xlock(&t4_uld_list_lock);
8096 	SLIST_FOREACH(u, &t4_uld_list, link) {
8097 	    if (u->uld_id == ui->uld_id) {
8098 		    rc = EEXIST;
8099 		    goto done;
8100 	    }
8101 	}
8102 
8103 	SLIST_INSERT_HEAD(&t4_uld_list, ui, link);
8104 	ui->refcount = 0;
8105 done:
8106 	sx_xunlock(&t4_uld_list_lock);
8107 	return (rc);
8108 }
8109 
8110 int
8111 t4_unregister_uld(struct uld_info *ui)
8112 {
8113 	int rc = EINVAL;
8114 	struct uld_info *u;
8115 
8116 	sx_xlock(&t4_uld_list_lock);
8117 
8118 	SLIST_FOREACH(u, &t4_uld_list, link) {
8119 	    if (u == ui) {
8120 		    if (ui->refcount > 0) {
8121 			    rc = EBUSY;
8122 			    goto done;
8123 		    }
8124 
8125 		    SLIST_REMOVE(&t4_uld_list, ui, uld_info, link);
8126 		    rc = 0;
8127 		    goto done;
8128 	    }
8129 	}
8130 done:
8131 	sx_xunlock(&t4_uld_list_lock);
8132 	return (rc);
8133 }
8134 
8135 int
8136 t4_activate_uld(struct adapter *sc, int id)
8137 {
8138 	int rc = EAGAIN;
8139 	struct uld_info *ui;
8140 
8141 	ASSERT_SYNCHRONIZED_OP(sc);
8142 
8143 	sx_slock(&t4_uld_list_lock);
8144 
8145 	SLIST_FOREACH(ui, &t4_uld_list, link) {
8146 		if (ui->uld_id == id) {
8147 			rc = ui->activate(sc);
8148 			if (rc == 0)
8149 				ui->refcount++;
8150 			goto done;
8151 		}
8152 	}
8153 done:
8154 	sx_sunlock(&t4_uld_list_lock);
8155 
8156 	return (rc);
8157 }
8158 
8159 int
8160 t4_deactivate_uld(struct adapter *sc, int id)
8161 {
8162 	int rc = EINVAL;
8163 	struct uld_info *ui;
8164 
8165 	ASSERT_SYNCHRONIZED_OP(sc);
8166 
8167 	sx_slock(&t4_uld_list_lock);
8168 
8169 	SLIST_FOREACH(ui, &t4_uld_list, link) {
8170 		if (ui->uld_id == id) {
8171 			rc = ui->deactivate(sc);
8172 			if (rc == 0)
8173 				ui->refcount--;
8174 			goto done;
8175 		}
8176 	}
8177 done:
8178 	sx_sunlock(&t4_uld_list_lock);
8179 
8180 	return (rc);
8181 }
8182 #endif
8183 
8184 /*
8185  * Come up with reasonable defaults for some of the tunables, provided they're
8186  * not set by the user (in which case we'll use the values as is).
8187  */
8188 static void
8189 tweak_tunables(void)
8190 {
8191 	int nc = mp_ncpus;	/* our snapshot of the number of CPUs */
8192 
8193 	if (t4_ntxq10g < 1)
8194 		t4_ntxq10g = min(nc, NTXQ_10G);
8195 
8196 	if (t4_ntxq1g < 1)
8197 		t4_ntxq1g = min(nc, NTXQ_1G);
8198 
8199 	if (t4_nrxq10g < 1)
8200 		t4_nrxq10g = min(nc, NRXQ_10G);
8201 
8202 	if (t4_nrxq1g < 1)
8203 		t4_nrxq1g = min(nc, NRXQ_1G);
8204 
8205 #ifdef TCP_OFFLOAD
8206 	if (t4_nofldtxq10g < 1)
8207 		t4_nofldtxq10g = min(nc, NOFLDTXQ_10G);
8208 
8209 	if (t4_nofldtxq1g < 1)
8210 		t4_nofldtxq1g = min(nc, NOFLDTXQ_1G);
8211 
8212 	if (t4_nofldrxq10g < 1)
8213 		t4_nofldrxq10g = min(nc, NOFLDRXQ_10G);
8214 
8215 	if (t4_nofldrxq1g < 1)
8216 		t4_nofldrxq1g = min(nc, NOFLDRXQ_1G);
8217 
8218 	if (t4_toecaps_allowed == -1)
8219 		t4_toecaps_allowed = FW_CAPS_CONFIG_TOE;
8220 #else
8221 	if (t4_toecaps_allowed == -1)
8222 		t4_toecaps_allowed = 0;
8223 #endif
8224 
8225 #ifdef DEV_NETMAP
8226 	if (t4_nnmtxq10g < 1)
8227 		t4_nnmtxq10g = min(nc, NNMTXQ_10G);
8228 
8229 	if (t4_nnmtxq1g < 1)
8230 		t4_nnmtxq1g = min(nc, NNMTXQ_1G);
8231 
8232 	if (t4_nnmrxq10g < 1)
8233 		t4_nnmrxq10g = min(nc, NNMRXQ_10G);
8234 
8235 	if (t4_nnmrxq1g < 1)
8236 		t4_nnmrxq1g = min(nc, NNMRXQ_1G);
8237 #endif
8238 
8239 	if (t4_tmr_idx_10g < 0 || t4_tmr_idx_10g >= SGE_NTIMERS)
8240 		t4_tmr_idx_10g = TMR_IDX_10G;
8241 
8242 	if (t4_pktc_idx_10g < -1 || t4_pktc_idx_10g >= SGE_NCOUNTERS)
8243 		t4_pktc_idx_10g = PKTC_IDX_10G;
8244 
8245 	if (t4_tmr_idx_1g < 0 || t4_tmr_idx_1g >= SGE_NTIMERS)
8246 		t4_tmr_idx_1g = TMR_IDX_1G;
8247 
8248 	if (t4_pktc_idx_1g < -1 || t4_pktc_idx_1g >= SGE_NCOUNTERS)
8249 		t4_pktc_idx_1g = PKTC_IDX_1G;
8250 
8251 	if (t4_qsize_txq < 128)
8252 		t4_qsize_txq = 128;
8253 
8254 	if (t4_qsize_rxq < 128)
8255 		t4_qsize_rxq = 128;
8256 	while (t4_qsize_rxq & 7)
8257 		t4_qsize_rxq++;
8258 
8259 	t4_intr_types &= INTR_MSIX | INTR_MSI | INTR_INTX;
8260 }
8261 
8262 static int
8263 mod_event(module_t mod, int cmd, void *arg)
8264 {
8265 	int rc = 0;
8266 	static int loaded = 0;
8267 
8268 	switch (cmd) {
8269 	case MOD_LOAD:
8270 		if (atomic_fetchadd_int(&loaded, 1))
8271 			break;
8272 		t4_sge_modload();
8273 		sx_init(&t4_list_lock, "T4/T5 adapters");
8274 		SLIST_INIT(&t4_list);
8275 #ifdef TCP_OFFLOAD
8276 		sx_init(&t4_uld_list_lock, "T4/T5 ULDs");
8277 		SLIST_INIT(&t4_uld_list);
8278 #endif
8279 		t4_tracer_modload();
8280 		tweak_tunables();
8281 		break;
8282 
8283 	case MOD_UNLOAD:
8284 		if (atomic_fetchadd_int(&loaded, -1) > 1)
8285 			break;
8286 		t4_tracer_modunload();
8287 #ifdef TCP_OFFLOAD
8288 		sx_slock(&t4_uld_list_lock);
8289 		if (!SLIST_EMPTY(&t4_uld_list)) {
8290 			rc = EBUSY;
8291 			sx_sunlock(&t4_uld_list_lock);
8292 			break;
8293 		}
8294 		sx_sunlock(&t4_uld_list_lock);
8295 		sx_destroy(&t4_uld_list_lock);
8296 #endif
8297 		sx_slock(&t4_list_lock);
8298 		if (!SLIST_EMPTY(&t4_list)) {
8299 			rc = EBUSY;
8300 			sx_sunlock(&t4_list_lock);
8301 			break;
8302 		}
8303 		sx_sunlock(&t4_list_lock);
8304 		sx_destroy(&t4_list_lock);
8305 		break;
8306 	}
8307 
8308 	return (rc);
8309 }
8310 
8311 static devclass_t t4_devclass, t5_devclass;
8312 static devclass_t cxgbe_devclass, cxl_devclass;
8313 
8314 DRIVER_MODULE(t4nex, pci, t4_driver, t4_devclass, mod_event, 0);
8315 MODULE_VERSION(t4nex, 1);
8316 MODULE_DEPEND(t4nex, firmware, 1, 1, 1);
8317 
8318 DRIVER_MODULE(t5nex, pci, t5_driver, t5_devclass, mod_event, 0);
8319 MODULE_VERSION(t5nex, 1);
8320 MODULE_DEPEND(t5nex, firmware, 1, 1, 1);
8321 
8322 DRIVER_MODULE(cxgbe, t4nex, cxgbe_driver, cxgbe_devclass, 0, 0);
8323 MODULE_VERSION(cxgbe, 1);
8324 
8325 DRIVER_MODULE(cxl, t5nex, cxl_driver, cxl_devclass, 0, 0);
8326 MODULE_VERSION(cxl, 1);
8327