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