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