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