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