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