]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/cxgbe/t4_main.c
Merge from HEAD
[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
586         sc = device_get_softc(dev);
587         sc->dev = dev;
588         TUNABLE_INT_FETCH("hw.cxgbe.debug_flags", &sc->debug_flags);
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, 1);
617
618         mtx_init(&sc->regwin_lock, "register and memory window", 0, MTX_DEF);
619
620         rc = map_bars_0_and_4(sc);
621         if (rc != 0)
622                 goto done; /* error message displayed already */
623
624         /*
625          * This is the real PF# to which we're attaching.  Works from within PCI
626          * passthrough environments too, where pci_get_function() could return a
627          * different PF# depending on the passthrough configuration.  We need to
628          * use the real PF# in all our communication with the firmware.
629          */
630         sc->pf = G_SOURCEPF(t4_read_reg(sc, A_PL_WHOAMI));
631         sc->mbox = sc->pf;
632
633         memset(sc->chan_map, 0xff, sizeof(sc->chan_map));
634         sc->an_handler = an_not_handled;
635         for (i = 0; i < nitems(sc->cpl_handler); i++)
636                 sc->cpl_handler[i] = cpl_not_handled;
637         for (i = 0; i < nitems(sc->fw_msg_handler); i++)
638                 sc->fw_msg_handler[i] = fw_msg_not_handled;
639         t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, t4_filter_rpl);
640         t4_register_cpl_handler(sc, CPL_TRACE_PKT, t4_trace_pkt);
641         t4_register_cpl_handler(sc, CPL_TRACE_PKT_T5, t5_trace_pkt);
642         t4_init_sge_cpl_handlers(sc);
643
644         /* Prepare the adapter for operation */
645         rc = -t4_prep_adapter(sc);
646         if (rc != 0) {
647                 device_printf(dev, "failed to prepare adapter: %d.\n", rc);
648                 goto done;
649         }
650
651         /*
652          * Do this really early, with the memory windows set up even before the
653          * character device.  The userland tool's register i/o and mem read
654          * will work even in "recovery mode".
655          */
656         setup_memwin(sc);
657         sc->cdev = make_dev(is_t4(sc) ? &t4_cdevsw : &t5_cdevsw,
658             device_get_unit(dev), UID_ROOT, GID_WHEEL, 0600, "%s",
659             device_get_nameunit(dev));
660         if (sc->cdev == NULL)
661                 device_printf(dev, "failed to create nexus char device.\n");
662         else
663                 sc->cdev->si_drv1 = sc;
664
665         /* Go no further if recovery mode has been requested. */
666         if (TUNABLE_INT_FETCH("hw.cxgbe.sos", &i) && i != 0) {
667                 device_printf(dev, "recovery mode.\n");
668                 goto done;
669         }
670
671 #if defined(__i386__)
672         if ((cpu_feature & CPUID_CX8) == 0) {
673                 device_printf(dev, "64 bit atomics not available.\n");
674                 rc = ENOTSUP;
675                 goto done;
676         }
677 #endif
678
679         /* Prepare the firmware for operation */
680         rc = prep_firmware(sc);
681         if (rc != 0)
682                 goto done; /* error message displayed already */
683
684         rc = get_params__post_init(sc);
685         if (rc != 0)
686                 goto done; /* error message displayed already */
687
688         rc = set_params__post_init(sc);
689         if (rc != 0)
690                 goto done; /* error message displayed already */
691
692         rc = map_bar_2(sc);
693         if (rc != 0)
694                 goto done; /* error message displayed already */
695
696         rc = t4_create_dma_tag(sc);
697         if (rc != 0)
698                 goto done; /* error message displayed already */
699
700         /*
701          * First pass over all the ports - allocate VIs and initialize some
702          * basic parameters like mac address, port type, etc.  We also figure
703          * out whether a port is 10G or 1G and use that information when
704          * calculating how many interrupts to attempt to allocate.
705          */
706         n10g = n1g = 0;
707         for_each_port(sc, i) {
708                 struct port_info *pi;
709
710                 pi = malloc(sizeof(*pi), M_CXGBE, M_ZERO | M_WAITOK);
711                 sc->port[i] = pi;
712
713                 /* These must be set before t4_port_init */
714                 pi->adapter = sc;
715                 pi->port_id = i;
716
717                 /* Allocate the vi and initialize parameters like mac addr */
718                 rc = -t4_port_init(pi, sc->mbox, sc->pf, 0);
719                 if (rc != 0) {
720                         device_printf(dev, "unable to initialize port %d: %d\n",
721                             i, rc);
722                         free(pi, M_CXGBE);
723                         sc->port[i] = NULL;
724                         goto done;
725                 }
726
727                 pi->link_cfg.requested_fc &= ~(PAUSE_TX | PAUSE_RX);
728                 pi->link_cfg.requested_fc |= t4_pause_settings;
729                 pi->link_cfg.fc &= ~(PAUSE_TX | PAUSE_RX);
730                 pi->link_cfg.fc |= t4_pause_settings;
731
732                 rc = -t4_link_start(sc, sc->mbox, pi->tx_chan, &pi->link_cfg);
733                 if (rc != 0) {
734                         device_printf(dev, "port %d l1cfg failed: %d\n", i, rc);
735                         free(pi, M_CXGBE);
736                         sc->port[i] = NULL;
737                         goto done;
738                 }
739
740                 snprintf(pi->lockname, sizeof(pi->lockname), "%sp%d",
741                     device_get_nameunit(dev), i);
742                 mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF);
743                 sc->chan_map[pi->tx_chan] = i;
744
745                 if (is_10G_port(pi) || is_40G_port(pi)) {
746                         n10g++;
747                         pi->tmr_idx = t4_tmr_idx_10g;
748                         pi->pktc_idx = t4_pktc_idx_10g;
749                 } else {
750                         n1g++;
751                         pi->tmr_idx = t4_tmr_idx_1g;
752                         pi->pktc_idx = t4_pktc_idx_1g;
753                 }
754
755                 pi->xact_addr_filt = -1;
756                 pi->linkdnrc = -1;
757
758                 pi->qsize_rxq = t4_qsize_rxq;
759                 pi->qsize_txq = t4_qsize_txq;
760
761                 pi->dev = device_add_child(dev, is_t4(sc) ? "cxgbe" : "cxl", -1);
762                 if (pi->dev == NULL) {
763                         device_printf(dev,
764                             "failed to add device for port %d.\n", i);
765                         rc = ENXIO;
766                         goto done;
767                 }
768                 device_set_softc(pi->dev, pi);
769         }
770
771         /*
772          * Interrupt type, # of interrupts, # of rx/tx queues, etc.
773          */
774         rc = cfg_itype_and_nqueues(sc, n10g, n1g, &iaq);
775         if (rc != 0)
776                 goto done; /* error message displayed already */
777
778         sc->intr_type = iaq.intr_type;
779         sc->intr_count = iaq.nirq;
780
781         s = &sc->sge;
782         s->nrxq = n10g * iaq.nrxq10g + n1g * iaq.nrxq1g;
783         s->ntxq = n10g * iaq.ntxq10g + n1g * iaq.ntxq1g;
784         s->neq = s->ntxq + s->nrxq;     /* the free list in an rxq is an eq */
785         s->neq += sc->params.nports + 1;/* ctrl queues: 1 per port + 1 mgmt */
786         s->niq = s->nrxq + 1;           /* 1 extra for firmware event queue */
787 #ifdef TCP_OFFLOAD
788         if (is_offload(sc)) {
789                 s->nofldrxq = n10g * iaq.nofldrxq10g + n1g * iaq.nofldrxq1g;
790                 s->nofldtxq = n10g * iaq.nofldtxq10g + n1g * iaq.nofldtxq1g;
791                 s->neq += s->nofldtxq + s->nofldrxq;
792                 s->niq += s->nofldrxq;
793
794                 s->ofld_rxq = malloc(s->nofldrxq * sizeof(struct sge_ofld_rxq),
795                     M_CXGBE, M_ZERO | M_WAITOK);
796                 s->ofld_txq = malloc(s->nofldtxq * sizeof(struct sge_wrq),
797                     M_CXGBE, M_ZERO | M_WAITOK);
798         }
799 #endif
800 #ifdef DEV_NETMAP
801         s->nnmrxq = n10g * iaq.nnmrxq10g + n1g * iaq.nnmrxq1g;
802         s->nnmtxq = n10g * iaq.nnmtxq10g + n1g * iaq.nnmtxq1g;
803         s->neq += s->nnmtxq + s->nnmrxq;
804         s->niq += s->nnmrxq;
805
806         s->nm_rxq = malloc(s->nnmrxq * sizeof(struct sge_nm_rxq),
807             M_CXGBE, M_ZERO | M_WAITOK);
808         s->nm_txq = malloc(s->nnmtxq * sizeof(struct sge_nm_txq),
809             M_CXGBE, M_ZERO | M_WAITOK);
810 #endif
811
812         s->ctrlq = malloc(sc->params.nports * sizeof(struct sge_wrq), M_CXGBE,
813             M_ZERO | M_WAITOK);
814         s->rxq = malloc(s->nrxq * sizeof(struct sge_rxq), M_CXGBE,
815             M_ZERO | M_WAITOK);
816         s->txq = malloc(s->ntxq * sizeof(struct sge_txq), M_CXGBE,
817             M_ZERO | M_WAITOK);
818         s->iqmap = malloc(s->niq * sizeof(struct sge_iq *), M_CXGBE,
819             M_ZERO | M_WAITOK);
820         s->eqmap = malloc(s->neq * sizeof(struct sge_eq *), M_CXGBE,
821             M_ZERO | M_WAITOK);
822
823         sc->irq = malloc(sc->intr_count * sizeof(struct irq), M_CXGBE,
824             M_ZERO | M_WAITOK);
825
826         t4_init_l2t(sc, M_WAITOK);
827
828         /*
829          * Second pass over the ports.  This time we know the number of rx and
830          * tx queues that each port should get.
831          */
832         rqidx = tqidx = 0;
833 #ifdef TCP_OFFLOAD
834         ofld_rqidx = ofld_tqidx = 0;
835 #endif
836 #ifdef DEV_NETMAP
837         nm_rqidx = nm_tqidx = 0;
838 #endif
839         for_each_port(sc, i) {
840                 struct port_info *pi = sc->port[i];
841
842                 if (pi == NULL)
843                         continue;
844
845                 pi->first_rxq = rqidx;
846                 pi->first_txq = tqidx;
847                 if (is_10G_port(pi) || is_40G_port(pi)) {
848                         pi->flags |= iaq.intr_flags_10g;
849                         pi->nrxq = iaq.nrxq10g;
850                         pi->ntxq = iaq.ntxq10g;
851                 } else {
852                         pi->flags |= iaq.intr_flags_1g;
853                         pi->nrxq = iaq.nrxq1g;
854                         pi->ntxq = iaq.ntxq1g;
855                 }
856
857                 if (pi->ntxq > 1)
858                         pi->rsrv_noflowq = iaq.rsrv_noflowq ? 1 : 0;
859                 else
860                         pi->rsrv_noflowq = 0;
861
862                 rqidx += pi->nrxq;
863                 tqidx += pi->ntxq;
864 #ifdef TCP_OFFLOAD
865                 if (is_offload(sc)) {
866                         pi->first_ofld_rxq = ofld_rqidx;
867                         pi->first_ofld_txq = ofld_tqidx;
868                         if (is_10G_port(pi) || is_40G_port(pi)) {
869                                 pi->nofldrxq = iaq.nofldrxq10g;
870                                 pi->nofldtxq = iaq.nofldtxq10g;
871                         } else {
872                                 pi->nofldrxq = iaq.nofldrxq1g;
873                                 pi->nofldtxq = iaq.nofldtxq1g;
874                         }
875                         ofld_rqidx += pi->nofldrxq;
876                         ofld_tqidx += pi->nofldtxq;
877                 }
878 #endif
879 #ifdef DEV_NETMAP
880                 pi->first_nm_rxq = nm_rqidx;
881                 pi->first_nm_txq = nm_tqidx;
882                 if (is_10G_port(pi) || is_40G_port(pi)) {
883                         pi->nnmrxq = iaq.nnmrxq10g;
884                         pi->nnmtxq = iaq.nnmtxq10g;
885                 } else {
886                         pi->nnmrxq = iaq.nnmrxq1g;
887                         pi->nnmtxq = iaq.nnmtxq1g;
888                 }
889                 nm_rqidx += pi->nnmrxq;
890                 nm_tqidx += pi->nnmtxq;
891 #endif
892         }
893
894         rc = setup_intr_handlers(sc);
895         if (rc != 0) {
896                 device_printf(dev,
897                     "failed to setup interrupt handlers: %d\n", rc);
898                 goto done;
899         }
900
901         rc = bus_generic_attach(dev);
902         if (rc != 0) {
903                 device_printf(dev,
904                     "failed to attach all child ports: %d\n", rc);
905                 goto done;
906         }
907
908         device_printf(dev,
909             "PCIe gen%d x%d, %d ports, %d %s interrupt%s, %d eq, %d iq\n",
910             sc->params.pci.speed, sc->params.pci.width, sc->params.nports,
911             sc->intr_count, sc->intr_type == INTR_MSIX ? "MSI-X" :
912             (sc->intr_type == INTR_MSI ? "MSI" : "INTx"),
913             sc->intr_count > 1 ? "s" : "", sc->sge.neq, sc->sge.niq);
914
915         t4_set_desc(sc);
916
917 done:
918         if (rc != 0 && sc->cdev) {
919                 /* cdev was created and so cxgbetool works; recover that way. */
920                 device_printf(dev,
921                     "error during attach, adapter is now in recovery mode.\n");
922                 rc = 0;
923         }
924
925         if (rc != 0)
926                 t4_detach(dev);
927         else
928                 t4_sysctls(sc);
929
930         return (rc);
931 }
932
933 /*
934  * Idempotent
935  */
936 static int
937 t4_detach(device_t dev)
938 {
939         struct adapter *sc;
940         struct port_info *pi;
941         int i, rc;
942
943         sc = device_get_softc(dev);
944
945         if (sc->flags & FULL_INIT_DONE)
946                 t4_intr_disable(sc);
947
948         if (sc->cdev) {
949                 destroy_dev(sc->cdev);
950                 sc->cdev = NULL;
951         }
952
953         rc = bus_generic_detach(dev);
954         if (rc) {
955                 device_printf(dev,
956                     "failed to detach child devices: %d\n", rc);
957                 return (rc);
958         }
959
960         for (i = 0; i < sc->intr_count; i++)
961                 t4_free_irq(sc, &sc->irq[i]);
962
963         for (i = 0; i < MAX_NPORTS; i++) {
964                 pi = sc->port[i];
965                 if (pi) {
966                         t4_free_vi(sc, sc->mbox, sc->pf, 0, pi->viid);
967                         if (pi->dev)
968                                 device_delete_child(dev, pi->dev);
969
970                         mtx_destroy(&pi->pi_lock);
971                         free(pi, M_CXGBE);
972                 }
973         }
974
975         if (sc->flags & FULL_INIT_DONE)
976                 adapter_full_uninit(sc);
977
978         if (sc->flags & FW_OK)
979                 t4_fw_bye(sc, sc->mbox);
980
981         if (sc->intr_type == INTR_MSI || sc->intr_type == INTR_MSIX)
982                 pci_release_msi(dev);
983
984         if (sc->regs_res)
985                 bus_release_resource(dev, SYS_RES_MEMORY, sc->regs_rid,
986                     sc->regs_res);
987
988         if (sc->udbs_res)
989                 bus_release_resource(dev, SYS_RES_MEMORY, sc->udbs_rid,
990                     sc->udbs_res);
991
992         if (sc->msix_res)
993                 bus_release_resource(dev, SYS_RES_MEMORY, sc->msix_rid,
994                     sc->msix_res);
995
996         if (sc->l2t)
997                 t4_free_l2t(sc->l2t);
998
999 #ifdef TCP_OFFLOAD
1000         free(sc->sge.ofld_rxq, M_CXGBE);
1001         free(sc->sge.ofld_txq, M_CXGBE);
1002 #endif
1003 #ifdef DEV_NETMAP
1004         free(sc->sge.nm_rxq, M_CXGBE);
1005         free(sc->sge.nm_txq, M_CXGBE);
1006 #endif
1007         free(sc->irq, M_CXGBE);
1008         free(sc->sge.rxq, M_CXGBE);
1009         free(sc->sge.txq, M_CXGBE);
1010         free(sc->sge.ctrlq, M_CXGBE);
1011         free(sc->sge.iqmap, M_CXGBE);
1012         free(sc->sge.eqmap, M_CXGBE);
1013         free(sc->tids.ftid_tab, M_CXGBE);
1014         t4_destroy_dma_tag(sc);
1015         if (mtx_initialized(&sc->sc_lock)) {
1016                 sx_xlock(&t4_list_lock);
1017                 SLIST_REMOVE(&t4_list, sc, adapter, link);
1018                 sx_xunlock(&t4_list_lock);
1019                 mtx_destroy(&sc->sc_lock);
1020         }
1021
1022         if (mtx_initialized(&sc->tids.ftid_lock))
1023                 mtx_destroy(&sc->tids.ftid_lock);
1024         if (mtx_initialized(&sc->sfl_lock))
1025                 mtx_destroy(&sc->sfl_lock);
1026         if (mtx_initialized(&sc->ifp_lock))
1027                 mtx_destroy(&sc->ifp_lock);
1028         if (mtx_initialized(&sc->regwin_lock))
1029                 mtx_destroy(&sc->regwin_lock);
1030
1031         bzero(sc, sizeof(*sc));
1032
1033         return (0);
1034 }
1035
1036 static int
1037 cxgbe_probe(device_t dev)
1038 {
1039         char buf[128];
1040         struct port_info *pi = device_get_softc(dev);
1041
1042         snprintf(buf, sizeof(buf), "port %d", pi->port_id);
1043         device_set_desc_copy(dev, buf);
1044
1045         return (BUS_PROBE_DEFAULT);
1046 }
1047
1048 #define T4_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \
1049     IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \
1050     IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6 | IFCAP_HWSTATS)
1051 #define T4_CAP_ENABLE (T4_CAP)
1052
1053 static int
1054 cxgbe_attach(device_t dev)
1055 {
1056         struct port_info *pi = device_get_softc(dev);
1057         struct ifnet *ifp;
1058         char *s;
1059         int n, o;
1060
1061         /* Allocate an ifnet and set it up */
1062         ifp = if_alloc(IFT_ETHER);
1063         if (ifp == NULL) {
1064                 device_printf(dev, "Cannot allocate ifnet\n");
1065                 return (ENOMEM);
1066         }
1067         pi->ifp = ifp;
1068         ifp->if_softc = pi;
1069
1070         callout_init(&pi->tick, 1);
1071
1072         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1073         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1074
1075         ifp->if_init = cxgbe_init;
1076         ifp->if_ioctl = cxgbe_ioctl;
1077         ifp->if_transmit = cxgbe_transmit;
1078         ifp->if_qflush = cxgbe_qflush;
1079         ifp->if_get_counter = cxgbe_get_counter;
1080
1081         ifp->if_capabilities = T4_CAP;
1082 #ifdef TCP_OFFLOAD
1083         if (is_offload(pi->adapter))
1084                 ifp->if_capabilities |= IFCAP_TOE;
1085 #endif
1086         ifp->if_capenable = T4_CAP_ENABLE;
1087         ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO |
1088             CSUM_UDP_IPV6 | CSUM_TCP_IPV6;
1089
1090         ifp->if_hw_tsomax = 65536 - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
1091         ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS;
1092         ifp->if_hw_tsomaxsegsize = 65536;
1093
1094         /* Initialize ifmedia for this port */
1095         ifmedia_init(&pi->media, IFM_IMASK, cxgbe_media_change,
1096             cxgbe_media_status);
1097         build_medialist(pi, &pi->media);
1098
1099         pi->vlan_c = EVENTHANDLER_REGISTER(vlan_config, cxgbe_vlan_config, ifp,
1100             EVENTHANDLER_PRI_ANY);
1101
1102         ether_ifattach(ifp, pi->hw_addr);
1103
1104         n = 128;
1105         s = malloc(n, M_CXGBE, M_WAITOK);
1106         o = snprintf(s, n, "%d txq, %d rxq (NIC)", pi->ntxq, pi->nrxq);
1107         MPASS(n > o);
1108 #ifdef TCP_OFFLOAD
1109         if (is_offload(pi->adapter)) {
1110                 o += snprintf(s + o, n - o, "; %d txq, %d rxq (TOE)",
1111                     pi->nofldtxq, pi->nofldrxq);
1112                 MPASS(n > o);
1113         }
1114 #endif
1115 #ifdef DEV_NETMAP
1116         o += snprintf(s + o, n - o, "; %d txq, %d rxq (netmap)", pi->nnmtxq,
1117             pi->nnmrxq);
1118         MPASS(n > o);
1119 #endif
1120         device_printf(dev, "%s\n", s);
1121         free(s, M_CXGBE);
1122
1123 #ifdef DEV_NETMAP
1124         /* nm_media handled here to keep implementation private to this file */
1125         ifmedia_init(&pi->nm_media, IFM_IMASK, cxgbe_media_change,
1126             cxgbe_media_status);
1127         build_medialist(pi, &pi->nm_media);
1128         create_netmap_ifnet(pi);        /* logs errors it something fails */
1129 #endif
1130         cxgbe_sysctls(pi);
1131
1132         return (0);
1133 }
1134
1135 static int
1136 cxgbe_detach(device_t dev)
1137 {
1138         struct port_info *pi = device_get_softc(dev);
1139         struct adapter *sc = pi->adapter;
1140         struct ifnet *ifp = pi->ifp;
1141
1142         /* Tell if_ioctl and if_init that the port is going away */
1143         ADAPTER_LOCK(sc);
1144         SET_DOOMED(pi);
1145         wakeup(&sc->flags);
1146         while (IS_BUSY(sc))
1147                 mtx_sleep(&sc->flags, &sc->sc_lock, 0, "t4detach", 0);
1148         SET_BUSY(sc);
1149 #ifdef INVARIANTS
1150         sc->last_op = "t4detach";
1151         sc->last_op_thr = curthread;
1152         sc->last_op_flags = 0;
1153 #endif
1154         ADAPTER_UNLOCK(sc);
1155
1156         if (pi->flags & HAS_TRACEQ) {
1157                 sc->traceq = -1;        /* cloner should not create ifnet */
1158                 t4_tracer_port_detach(sc);
1159         }
1160
1161         if (pi->vlan_c)
1162                 EVENTHANDLER_DEREGISTER(vlan_config, pi->vlan_c);
1163
1164         PORT_LOCK(pi);
1165         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1166         callout_stop(&pi->tick);
1167         PORT_UNLOCK(pi);
1168         callout_drain(&pi->tick);
1169
1170         /* Let detach proceed even if these fail. */
1171         cxgbe_uninit_synchronized(pi);
1172         port_full_uninit(pi);
1173
1174         ifmedia_removeall(&pi->media);
1175         ether_ifdetach(pi->ifp);
1176         if_free(pi->ifp);
1177
1178 #ifdef DEV_NETMAP
1179         /* XXXNM: equivalent of cxgbe_uninit_synchronized to ifdown nm_ifp */
1180         destroy_netmap_ifnet(pi);
1181 #endif
1182
1183         ADAPTER_LOCK(sc);
1184         CLR_BUSY(sc);
1185         wakeup(&sc->flags);
1186         ADAPTER_UNLOCK(sc);
1187
1188         return (0);
1189 }
1190
1191 static void
1192 cxgbe_init(void *arg)
1193 {
1194         struct port_info *pi = arg;
1195         struct adapter *sc = pi->adapter;
1196
1197         if (begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4init") != 0)
1198                 return;
1199         cxgbe_init_synchronized(pi);
1200         end_synchronized_op(sc, 0);
1201 }
1202
1203 static int
1204 cxgbe_ioctl(struct ifnet *ifp, unsigned long cmd, caddr_t data)
1205 {
1206         int rc = 0, mtu, flags, can_sleep;
1207         struct port_info *pi = ifp->if_softc;
1208         struct adapter *sc = pi->adapter;
1209         struct ifreq *ifr = (struct ifreq *)data;
1210         uint32_t mask;
1211
1212         switch (cmd) {
1213         case SIOCSIFMTU:
1214                 mtu = ifr->ifr_mtu;
1215                 if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO))
1216                         return (EINVAL);
1217
1218                 rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4mtu");
1219                 if (rc)
1220                         return (rc);
1221                 ifp->if_mtu = mtu;
1222                 if (pi->flags & PORT_INIT_DONE) {
1223                         t4_update_fl_bufsize(ifp);
1224                         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1225                                 rc = update_mac_settings(ifp, XGMAC_MTU);
1226                 }
1227                 end_synchronized_op(sc, 0);
1228                 break;
1229
1230         case SIOCSIFFLAGS:
1231                 can_sleep = 0;
1232 redo_sifflags:
1233                 rc = begin_synchronized_op(sc, pi,
1234                     can_sleep ? (SLEEP_OK | INTR_OK) : HOLD_LOCK, "t4flg");
1235                 if (rc)
1236                         return (rc);
1237
1238                 if (ifp->if_flags & IFF_UP) {
1239                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1240                                 flags = pi->if_flags;
1241                                 if ((ifp->if_flags ^ flags) &
1242                                     (IFF_PROMISC | IFF_ALLMULTI)) {
1243                                         if (can_sleep == 1) {
1244                                                 end_synchronized_op(sc, 0);
1245                                                 can_sleep = 0;
1246                                                 goto redo_sifflags;
1247                                         }
1248                                         rc = update_mac_settings(ifp,
1249                                             XGMAC_PROMISC | XGMAC_ALLMULTI);
1250                                 }
1251                         } else {
1252                                 if (can_sleep == 0) {
1253                                         end_synchronized_op(sc, LOCK_HELD);
1254                                         can_sleep = 1;
1255                                         goto redo_sifflags;
1256                                 }
1257                                 rc = cxgbe_init_synchronized(pi);
1258                         }
1259                         pi->if_flags = ifp->if_flags;
1260                 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1261                         if (can_sleep == 0) {
1262                                 end_synchronized_op(sc, LOCK_HELD);
1263                                 can_sleep = 1;
1264                                 goto redo_sifflags;
1265                         }
1266                         rc = cxgbe_uninit_synchronized(pi);
1267                 }
1268                 end_synchronized_op(sc, can_sleep ? 0 : LOCK_HELD);
1269                 break;
1270
1271         case SIOCADDMULTI:
1272         case SIOCDELMULTI: /* these two are called with a mutex held :-( */
1273                 rc = begin_synchronized_op(sc, pi, HOLD_LOCK, "t4multi");
1274                 if (rc)
1275                         return (rc);
1276                 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1277                         rc = update_mac_settings(ifp, XGMAC_MCADDRS);
1278                 end_synchronized_op(sc, LOCK_HELD);
1279                 break;
1280
1281         case SIOCSIFCAP:
1282                 rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4cap");
1283                 if (rc)
1284                         return (rc);
1285
1286                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1287                 if (mask & IFCAP_TXCSUM) {
1288                         ifp->if_capenable ^= IFCAP_TXCSUM;
1289                         ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
1290
1291                         if (IFCAP_TSO4 & ifp->if_capenable &&
1292                             !(IFCAP_TXCSUM & ifp->if_capenable)) {
1293                                 ifp->if_capenable &= ~IFCAP_TSO4;
1294                                 if_printf(ifp,
1295                                     "tso4 disabled due to -txcsum.\n");
1296                         }
1297                 }
1298                 if (mask & IFCAP_TXCSUM_IPV6) {
1299                         ifp->if_capenable ^= IFCAP_TXCSUM_IPV6;
1300                         ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6);
1301
1302                         if (IFCAP_TSO6 & ifp->if_capenable &&
1303                             !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
1304                                 ifp->if_capenable &= ~IFCAP_TSO6;
1305                                 if_printf(ifp,
1306                                     "tso6 disabled due to -txcsum6.\n");
1307                         }
1308                 }
1309                 if (mask & IFCAP_RXCSUM)
1310                         ifp->if_capenable ^= IFCAP_RXCSUM;
1311                 if (mask & IFCAP_RXCSUM_IPV6)
1312                         ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
1313
1314                 /*
1315                  * Note that we leave CSUM_TSO alone (it is always set).  The
1316                  * kernel takes both IFCAP_TSOx and CSUM_TSO into account before
1317                  * sending a TSO request our way, so it's sufficient to toggle
1318                  * IFCAP_TSOx only.
1319                  */
1320                 if (mask & IFCAP_TSO4) {
1321                         if (!(IFCAP_TSO4 & ifp->if_capenable) &&
1322                             !(IFCAP_TXCSUM & ifp->if_capenable)) {
1323                                 if_printf(ifp, "enable txcsum first.\n");
1324                                 rc = EAGAIN;
1325                                 goto fail;
1326                         }
1327                         ifp->if_capenable ^= IFCAP_TSO4;
1328                 }
1329                 if (mask & IFCAP_TSO6) {
1330                         if (!(IFCAP_TSO6 & ifp->if_capenable) &&
1331                             !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
1332                                 if_printf(ifp, "enable txcsum6 first.\n");
1333                                 rc = EAGAIN;
1334                                 goto fail;
1335                         }
1336                         ifp->if_capenable ^= IFCAP_TSO6;
1337                 }
1338                 if (mask & IFCAP_LRO) {
1339 #if defined(INET) || defined(INET6)
1340                         int i;
1341                         struct sge_rxq *rxq;
1342
1343                         ifp->if_capenable ^= IFCAP_LRO;
1344                         for_each_rxq(pi, i, rxq) {
1345                                 if (ifp->if_capenable & IFCAP_LRO)
1346                                         rxq->iq.flags |= IQ_LRO_ENABLED;
1347                                 else
1348                                         rxq->iq.flags &= ~IQ_LRO_ENABLED;
1349                         }
1350 #endif
1351                 }
1352 #ifdef TCP_OFFLOAD
1353                 if (mask & IFCAP_TOE) {
1354                         int enable = (ifp->if_capenable ^ mask) & IFCAP_TOE;
1355
1356                         rc = toe_capability(pi, enable);
1357                         if (rc != 0)
1358                                 goto fail;
1359
1360                         ifp->if_capenable ^= mask;
1361                 }
1362 #endif
1363                 if (mask & IFCAP_VLAN_HWTAGGING) {
1364                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1365                         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1366                                 rc = update_mac_settings(ifp, XGMAC_VLANEX);
1367                 }
1368                 if (mask & IFCAP_VLAN_MTU) {
1369                         ifp->if_capenable ^= IFCAP_VLAN_MTU;
1370
1371                         /* Need to find out how to disable auto-mtu-inflation */
1372                 }
1373                 if (mask & IFCAP_VLAN_HWTSO)
1374                         ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
1375                 if (mask & IFCAP_VLAN_HWCSUM)
1376                         ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
1377
1378 #ifdef VLAN_CAPABILITIES
1379                 VLAN_CAPABILITIES(ifp);
1380 #endif
1381 fail:
1382                 end_synchronized_op(sc, 0);
1383                 break;
1384
1385         case SIOCSIFMEDIA:
1386         case SIOCGIFMEDIA:
1387                 ifmedia_ioctl(ifp, ifr, &pi->media, cmd);
1388                 break;
1389
1390         case SIOCGI2C: {
1391                 struct ifi2creq i2c;
1392
1393                 rc = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
1394                 if (rc != 0)
1395                         break;
1396                 if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
1397                         rc = EPERM;
1398                         break;
1399                 }
1400                 if (i2c.len > sizeof(i2c.data)) {
1401                         rc = EINVAL;
1402                         break;
1403                 }
1404                 rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4i2c");
1405                 if (rc)
1406                         return (rc);
1407                 rc = -t4_i2c_rd(sc, sc->mbox, pi->port_id, i2c.dev_addr,
1408                     i2c.offset, i2c.len, &i2c.data[0]);
1409                 end_synchronized_op(sc, 0);
1410                 if (rc == 0)
1411                         rc = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
1412                 break;
1413         }
1414
1415         default:
1416                 rc = ether_ioctl(ifp, cmd, data);
1417         }
1418
1419         return (rc);
1420 }
1421
1422 static int
1423 cxgbe_transmit(struct ifnet *ifp, struct mbuf *m)
1424 {
1425         struct port_info *pi = ifp->if_softc;
1426         struct adapter *sc = pi->adapter;
1427         struct sge_txq *txq;
1428         void *items[1];
1429         int rc;
1430
1431         M_ASSERTPKTHDR(m);
1432         MPASS(m->m_nextpkt == NULL);    /* not quite ready for this yet */
1433
1434         if (__predict_false(pi->link_cfg.link_ok == 0)) {
1435                 m_freem(m);
1436                 return (ENETDOWN);
1437         }
1438
1439         rc = parse_pkt(&m);
1440         if (__predict_false(rc != 0)) {
1441                 MPASS(m == NULL);                       /* was freed already */
1442                 atomic_add_int(&pi->tx_parse_error, 1); /* rare, atomic is ok */
1443                 return (rc);
1444         }
1445
1446         /* Select a txq. */
1447         txq = &sc->sge.txq[pi->first_txq];
1448         if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
1449                 txq += ((m->m_pkthdr.flowid % (pi->ntxq - pi->rsrv_noflowq)) +
1450                     pi->rsrv_noflowq);
1451
1452         items[0] = m;
1453         rc = mp_ring_enqueue(txq->r, items, 1, 4096);
1454         if (__predict_false(rc != 0))
1455                 m_freem(m);
1456
1457         return (rc);
1458 }
1459
1460 static void
1461 cxgbe_qflush(struct ifnet *ifp)
1462 {
1463         struct port_info *pi = ifp->if_softc;
1464         struct sge_txq *txq;
1465         int i;
1466
1467         /* queues do not exist if !PORT_INIT_DONE. */
1468         if (pi->flags & PORT_INIT_DONE) {
1469                 for_each_txq(pi, i, txq) {
1470                         TXQ_LOCK(txq);
1471                         txq->eq.flags &= ~EQ_ENABLED;
1472                         TXQ_UNLOCK(txq);
1473                         while (!mp_ring_is_idle(txq->r)) {
1474                                 mp_ring_check_drainage(txq->r, 0);
1475                                 pause("qflush", 1);
1476                         }
1477                 }
1478         }
1479         if_qflush(ifp);
1480 }
1481
1482 static uint64_t
1483 cxgbe_get_counter(struct ifnet *ifp, ift_counter c)
1484 {
1485         struct port_info *pi = ifp->if_softc;
1486         struct adapter *sc = pi->adapter;
1487         struct port_stats *s = &pi->stats;
1488
1489         cxgbe_refresh_stats(sc, pi);
1490
1491         switch (c) {
1492         case IFCOUNTER_IPACKETS:
1493                 return (s->rx_frames - s->rx_pause);
1494
1495         case IFCOUNTER_IERRORS:
1496                 return (s->rx_jabber + s->rx_runt + s->rx_too_long +
1497                     s->rx_fcs_err + s->rx_len_err);
1498
1499         case IFCOUNTER_OPACKETS:
1500                 return (s->tx_frames - s->tx_pause);
1501
1502         case IFCOUNTER_OERRORS:
1503                 return (s->tx_error_frames);
1504
1505         case IFCOUNTER_IBYTES:
1506                 return (s->rx_octets - s->rx_pause * 64);
1507
1508         case IFCOUNTER_OBYTES:
1509                 return (s->tx_octets - s->tx_pause * 64);
1510
1511         case IFCOUNTER_IMCASTS:
1512                 return (s->rx_mcast_frames - s->rx_pause);
1513
1514         case IFCOUNTER_OMCASTS:
1515                 return (s->tx_mcast_frames - s->tx_pause);
1516
1517         case IFCOUNTER_IQDROPS:
1518                 return (s->rx_ovflow0 + s->rx_ovflow1 + s->rx_ovflow2 +
1519                     s->rx_ovflow3 + s->rx_trunc0 + s->rx_trunc1 + s->rx_trunc2 +
1520                     s->rx_trunc3 + pi->tnl_cong_drops);
1521
1522         case IFCOUNTER_OQDROPS: {
1523                 uint64_t drops;
1524
1525                 drops = s->tx_drop;
1526                 if (pi->flags & PORT_INIT_DONE) {
1527                         int i;
1528                         struct sge_txq *txq;
1529
1530                         for_each_txq(pi, i, txq)
1531                                 drops += counter_u64_fetch(txq->r->drops);
1532                 }
1533
1534                 return (drops);
1535
1536         }
1537
1538         default:
1539                 return (if_get_counter_default(ifp, c));
1540         }
1541 }
1542
1543 static int
1544 cxgbe_media_change(struct ifnet *ifp)
1545 {
1546         struct port_info *pi = ifp->if_softc;
1547
1548         device_printf(pi->dev, "%s unimplemented.\n", __func__);
1549
1550         return (EOPNOTSUPP);
1551 }
1552
1553 static void
1554 cxgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1555 {
1556         struct port_info *pi = ifp->if_softc;
1557         struct ifmedia *media = NULL;
1558         struct ifmedia_entry *cur;
1559         int speed = pi->link_cfg.speed;
1560
1561         if (ifp == pi->ifp)
1562                 media = &pi->media;
1563 #ifdef DEV_NETMAP
1564         else if (ifp == pi->nm_ifp)
1565                 media = &pi->nm_media;
1566 #endif
1567         MPASS(media != NULL);
1568
1569         cur = media->ifm_cur;
1570
1571         ifmr->ifm_status = IFM_AVALID;
1572         if (!pi->link_cfg.link_ok)
1573                 return;
1574
1575         ifmr->ifm_status |= IFM_ACTIVE;
1576
1577         /* active and current will differ iff current media is autoselect. */
1578         if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
1579                 return;
1580
1581         ifmr->ifm_active = IFM_ETHER | IFM_FDX;
1582         if (speed == SPEED_10000)
1583                 ifmr->ifm_active |= IFM_10G_T;
1584         else if (speed == SPEED_1000)
1585                 ifmr->ifm_active |= IFM_1000_T;
1586         else if (speed == SPEED_100)
1587                 ifmr->ifm_active |= IFM_100_TX;
1588         else if (speed == SPEED_10)
1589                 ifmr->ifm_active |= IFM_10_T;
1590         else
1591                 KASSERT(0, ("%s: link up but speed unknown (%u)", __func__,
1592                             speed));
1593 }
1594
1595 void
1596 t4_fatal_err(struct adapter *sc)
1597 {
1598         t4_set_reg_field(sc, A_SGE_CONTROL, F_GLOBALENABLE, 0);
1599         t4_intr_disable(sc);
1600         log(LOG_EMERG, "%s: encountered fatal error, adapter stopped.\n",
1601             device_get_nameunit(sc->dev));
1602 }
1603
1604 static int
1605 map_bars_0_and_4(struct adapter *sc)
1606 {
1607         sc->regs_rid = PCIR_BAR(0);
1608         sc->regs_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
1609             &sc->regs_rid, RF_ACTIVE);
1610         if (sc->regs_res == NULL) {
1611                 device_printf(sc->dev, "cannot map registers.\n");
1612                 return (ENXIO);
1613         }
1614         sc->bt = rman_get_bustag(sc->regs_res);
1615         sc->bh = rman_get_bushandle(sc->regs_res);
1616         sc->mmio_len = rman_get_size(sc->regs_res);
1617         setbit(&sc->doorbells, DOORBELL_KDB);
1618
1619         sc->msix_rid = PCIR_BAR(4);
1620         sc->msix_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
1621             &sc->msix_rid, RF_ACTIVE);
1622         if (sc->msix_res == NULL) {
1623                 device_printf(sc->dev, "cannot map MSI-X BAR.\n");
1624                 return (ENXIO);
1625         }
1626
1627         return (0);
1628 }
1629
1630 static int
1631 map_bar_2(struct adapter *sc)
1632 {
1633
1634         /*
1635          * T4: only iWARP driver uses the userspace doorbells.  There is no need
1636          * to map it if RDMA is disabled.
1637          */
1638         if (is_t4(sc) && sc->rdmacaps == 0)
1639                 return (0);
1640
1641         sc->udbs_rid = PCIR_BAR(2);
1642         sc->udbs_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
1643             &sc->udbs_rid, RF_ACTIVE);
1644         if (sc->udbs_res == NULL) {
1645                 device_printf(sc->dev, "cannot map doorbell BAR.\n");
1646                 return (ENXIO);
1647         }
1648         sc->udbs_base = rman_get_virtual(sc->udbs_res);
1649
1650         if (is_t5(sc)) {
1651                 setbit(&sc->doorbells, DOORBELL_UDB);
1652 #if defined(__i386__) || defined(__amd64__)
1653                 if (t5_write_combine) {
1654                         int rc;
1655
1656                         /*
1657                          * Enable write combining on BAR2.  This is the
1658                          * userspace doorbell BAR and is split into 128B
1659                          * (UDBS_SEG_SIZE) doorbell regions, each associated
1660                          * with an egress queue.  The first 64B has the doorbell
1661                          * and the second 64B can be used to submit a tx work
1662                          * request with an implicit doorbell.
1663                          */
1664
1665                         rc = pmap_change_attr((vm_offset_t)sc->udbs_base,
1666                             rman_get_size(sc->udbs_res), PAT_WRITE_COMBINING);
1667                         if (rc == 0) {
1668                                 clrbit(&sc->doorbells, DOORBELL_UDB);
1669                                 setbit(&sc->doorbells, DOORBELL_WCWR);
1670                                 setbit(&sc->doorbells, DOORBELL_UDBWC);
1671                         } else {
1672                                 device_printf(sc->dev,
1673                                     "couldn't enable write combining: %d\n",
1674                                     rc);
1675                         }
1676
1677                         t4_write_reg(sc, A_SGE_STAT_CFG,
1678                             V_STATSOURCE_T5(7) | V_STATMODE(0));
1679                 }
1680 #endif
1681         }
1682
1683         return (0);
1684 }
1685
1686 static const struct memwin t4_memwin[] = {
1687         { MEMWIN0_BASE, MEMWIN0_APERTURE },
1688         { MEMWIN1_BASE, MEMWIN1_APERTURE },
1689         { MEMWIN2_BASE_T4, MEMWIN2_APERTURE_T4 }
1690 };
1691
1692 static const struct memwin t5_memwin[] = {
1693         { MEMWIN0_BASE, MEMWIN0_APERTURE },
1694         { MEMWIN1_BASE, MEMWIN1_APERTURE },
1695         { MEMWIN2_BASE_T5, MEMWIN2_APERTURE_T5 },
1696 };
1697
1698 static void
1699 setup_memwin(struct adapter *sc)
1700 {
1701         const struct memwin *mw;
1702         int i, n;
1703         uint32_t bar0;
1704
1705         if (is_t4(sc)) {
1706                 /*
1707                  * Read low 32b of bar0 indirectly via the hardware backdoor
1708                  * mechanism.  Works from within PCI passthrough environments
1709                  * too, where rman_get_start() can return a different value.  We
1710                  * need to program the T4 memory window decoders with the actual
1711                  * addresses that will be coming across the PCIe link.
1712                  */
1713                 bar0 = t4_hw_pci_read_cfg4(sc, PCIR_BAR(0));
1714                 bar0 &= (uint32_t) PCIM_BAR_MEM_BASE;
1715
1716                 mw = &t4_memwin[0];
1717                 n = nitems(t4_memwin);
1718         } else {
1719                 /* T5 uses the relative offset inside the PCIe BAR */
1720                 bar0 = 0;
1721
1722                 mw = &t5_memwin[0];
1723                 n = nitems(t5_memwin);
1724         }
1725
1726         for (i = 0; i < n; i++, mw++) {
1727                 t4_write_reg(sc,
1728                     PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, i),
1729                     (mw->base + bar0) | V_BIR(0) |
1730                     V_WINDOW(ilog2(mw->aperture) - 10));
1731         }
1732
1733         /* flush */
1734         t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2));
1735 }
1736
1737 /*
1738  * Verify that the memory range specified by the addr/len pair is valid and lies
1739  * entirely within a single region (EDCx or MCx).
1740  */
1741 static int
1742 validate_mem_range(struct adapter *sc, uint32_t addr, int len)
1743 {
1744         uint32_t em, addr_len, maddr, mlen;
1745
1746         /* Memory can only be accessed in naturally aligned 4 byte units */
1747         if (addr & 3 || len & 3 || len == 0)
1748                 return (EINVAL);
1749
1750         /* Enabled memories */
1751         em = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
1752         if (em & F_EDRAM0_ENABLE) {
1753                 addr_len = t4_read_reg(sc, A_MA_EDRAM0_BAR);
1754                 maddr = G_EDRAM0_BASE(addr_len) << 20;
1755                 mlen = G_EDRAM0_SIZE(addr_len) << 20;
1756                 if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1757                     addr + len <= maddr + mlen)
1758                         return (0);
1759         }
1760         if (em & F_EDRAM1_ENABLE) {
1761                 addr_len = t4_read_reg(sc, A_MA_EDRAM1_BAR);
1762                 maddr = G_EDRAM1_BASE(addr_len) << 20;
1763                 mlen = G_EDRAM1_SIZE(addr_len) << 20;
1764                 if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1765                     addr + len <= maddr + mlen)
1766                         return (0);
1767         }
1768         if (em & F_EXT_MEM_ENABLE) {
1769                 addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
1770                 maddr = G_EXT_MEM_BASE(addr_len) << 20;
1771                 mlen = G_EXT_MEM_SIZE(addr_len) << 20;
1772                 if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1773                     addr + len <= maddr + mlen)
1774                         return (0);
1775         }
1776         if (!is_t4(sc) && em & F_EXT_MEM1_ENABLE) {
1777                 addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
1778                 maddr = G_EXT_MEM1_BASE(addr_len) << 20;
1779                 mlen = G_EXT_MEM1_SIZE(addr_len) << 20;
1780                 if (mlen > 0 && addr >= maddr && addr < maddr + mlen &&
1781                     addr + len <= maddr + mlen)
1782                         return (0);
1783         }
1784
1785         return (EFAULT);
1786 }
1787
1788 static int
1789 fwmtype_to_hwmtype(int mtype)
1790 {
1791
1792         switch (mtype) {
1793         case FW_MEMTYPE_EDC0:
1794                 return (MEM_EDC0);
1795         case FW_MEMTYPE_EDC1:
1796                 return (MEM_EDC1);
1797         case FW_MEMTYPE_EXTMEM:
1798                 return (MEM_MC0);
1799         case FW_MEMTYPE_EXTMEM1:
1800                 return (MEM_MC1);
1801         default:
1802                 panic("%s: cannot translate fw mtype %d.", __func__, mtype);
1803         }
1804 }
1805
1806 /*
1807  * Verify that the memory range specified by the memtype/offset/len pair is
1808  * valid and lies entirely within the memtype specified.  The global address of
1809  * the start of the range is returned in addr.
1810  */
1811 static int
1812 validate_mt_off_len(struct adapter *sc, int mtype, uint32_t off, int len,
1813     uint32_t *addr)
1814 {
1815         uint32_t em, addr_len, maddr, mlen;
1816
1817         /* Memory can only be accessed in naturally aligned 4 byte units */
1818         if (off & 3 || len & 3 || len == 0)
1819                 return (EINVAL);
1820
1821         em = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
1822         switch (fwmtype_to_hwmtype(mtype)) {
1823         case MEM_EDC0:
1824                 if (!(em & F_EDRAM0_ENABLE))
1825                         return (EINVAL);
1826                 addr_len = t4_read_reg(sc, A_MA_EDRAM0_BAR);
1827                 maddr = G_EDRAM0_BASE(addr_len) << 20;
1828                 mlen = G_EDRAM0_SIZE(addr_len) << 20;
1829                 break;
1830         case MEM_EDC1:
1831                 if (!(em & F_EDRAM1_ENABLE))
1832                         return (EINVAL);
1833                 addr_len = t4_read_reg(sc, A_MA_EDRAM1_BAR);
1834                 maddr = G_EDRAM1_BASE(addr_len) << 20;
1835                 mlen = G_EDRAM1_SIZE(addr_len) << 20;
1836                 break;
1837         case MEM_MC:
1838                 if (!(em & F_EXT_MEM_ENABLE))
1839                         return (EINVAL);
1840                 addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
1841                 maddr = G_EXT_MEM_BASE(addr_len) << 20;
1842                 mlen = G_EXT_MEM_SIZE(addr_len) << 20;
1843                 break;
1844         case MEM_MC1:
1845                 if (is_t4(sc) || !(em & F_EXT_MEM1_ENABLE))
1846                         return (EINVAL);
1847                 addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
1848                 maddr = G_EXT_MEM1_BASE(addr_len) << 20;
1849                 mlen = G_EXT_MEM1_SIZE(addr_len) << 20;
1850                 break;
1851         default:
1852                 return (EINVAL);
1853         }
1854
1855         if (mlen > 0 && off < mlen && off + len <= mlen) {
1856                 *addr = maddr + off;    /* global address */
1857                 return (0);
1858         }
1859
1860         return (EFAULT);
1861 }
1862
1863 static void
1864 memwin_info(struct adapter *sc, int win, uint32_t *base, uint32_t *aperture)
1865 {
1866         const struct memwin *mw;
1867
1868         if (is_t4(sc)) {
1869                 KASSERT(win >= 0 && win < nitems(t4_memwin),
1870                     ("%s: incorrect memwin# (%d)", __func__, win));
1871                 mw = &t4_memwin[win];
1872         } else {
1873                 KASSERT(win >= 0 && win < nitems(t5_memwin),
1874                     ("%s: incorrect memwin# (%d)", __func__, win));
1875                 mw = &t5_memwin[win];
1876         }
1877
1878         if (base != NULL)
1879                 *base = mw->base;
1880         if (aperture != NULL)
1881                 *aperture = mw->aperture;
1882 }
1883
1884 /*
1885  * Positions the memory window such that it can be used to access the specified
1886  * address in the chip's address space.  The return value is the offset of addr
1887  * from the start of the window.
1888  */
1889 static uint32_t
1890 position_memwin(struct adapter *sc, int n, uint32_t addr)
1891 {
1892         uint32_t start, pf;
1893         uint32_t reg;
1894
1895         KASSERT(n >= 0 && n <= 3,
1896             ("%s: invalid window %d.", __func__, n));
1897         KASSERT((addr & 3) == 0,
1898             ("%s: addr (0x%x) is not at a 4B boundary.", __func__, addr));
1899
1900         if (is_t4(sc)) {
1901                 pf = 0;
1902                 start = addr & ~0xf;    /* start must be 16B aligned */
1903         } else {
1904                 pf = V_PFNUM(sc->pf);
1905                 start = addr & ~0x7f;   /* start must be 128B aligned */
1906         }
1907         reg = PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, n);
1908
1909         t4_write_reg(sc, reg, start | pf);
1910         t4_read_reg(sc, reg);
1911
1912         return (addr - start);
1913 }
1914
1915 static int
1916 cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g,
1917     struct intrs_and_queues *iaq)
1918 {
1919         int rc, itype, navail, nrxq10g, nrxq1g, n;
1920         int nofldrxq10g = 0, nofldrxq1g = 0;
1921         int nnmrxq10g = 0, nnmrxq1g = 0;
1922
1923         bzero(iaq, sizeof(*iaq));
1924
1925         iaq->ntxq10g = t4_ntxq10g;
1926         iaq->ntxq1g = t4_ntxq1g;
1927         iaq->nrxq10g = nrxq10g = t4_nrxq10g;
1928         iaq->nrxq1g = nrxq1g = t4_nrxq1g;
1929         iaq->rsrv_noflowq = t4_rsrv_noflowq;
1930 #ifdef TCP_OFFLOAD
1931         if (is_offload(sc)) {
1932                 iaq->nofldtxq10g = t4_nofldtxq10g;
1933                 iaq->nofldtxq1g = t4_nofldtxq1g;
1934                 iaq->nofldrxq10g = nofldrxq10g = t4_nofldrxq10g;
1935                 iaq->nofldrxq1g = nofldrxq1g = t4_nofldrxq1g;
1936         }
1937 #endif
1938 #ifdef DEV_NETMAP
1939         iaq->nnmtxq10g = t4_nnmtxq10g;
1940         iaq->nnmtxq1g = t4_nnmtxq1g;
1941         iaq->nnmrxq10g = nnmrxq10g = t4_nnmrxq10g;
1942         iaq->nnmrxq1g = nnmrxq1g = t4_nnmrxq1g;
1943 #endif
1944
1945         for (itype = INTR_MSIX; itype; itype >>= 1) {
1946
1947                 if ((itype & t4_intr_types) == 0)
1948                         continue;       /* not allowed */
1949
1950                 if (itype == INTR_MSIX)
1951                         navail = pci_msix_count(sc->dev);
1952                 else if (itype == INTR_MSI)
1953                         navail = pci_msi_count(sc->dev);
1954                 else
1955                         navail = 1;
1956 restart:
1957                 if (navail == 0)
1958                         continue;
1959
1960                 iaq->intr_type = itype;
1961                 iaq->intr_flags_10g = 0;
1962                 iaq->intr_flags_1g = 0;
1963
1964                 /*
1965                  * Best option: an interrupt vector for errors, one for the
1966                  * firmware event queue, and one for every rxq (NIC, TOE, and
1967                  * netmap).
1968                  */
1969                 iaq->nirq = T4_EXTRA_INTR;
1970                 iaq->nirq += n10g * (nrxq10g + nofldrxq10g + nnmrxq10g);
1971                 iaq->nirq += n1g * (nrxq1g + nofldrxq1g + nnmrxq1g);
1972                 if (iaq->nirq <= navail &&
1973                     (itype != INTR_MSI || powerof2(iaq->nirq))) {
1974                         iaq->intr_flags_10g = INTR_ALL;
1975                         iaq->intr_flags_1g = INTR_ALL;
1976                         goto allocate;
1977                 }
1978
1979                 /*
1980                  * Second best option: a vector for errors, one for the firmware
1981                  * event queue, and vectors for either all the NIC rx queues or
1982                  * all the TOE rx queues.  The queues that don't get vectors
1983                  * will forward their interrupts to those that do.
1984                  *
1985                  * Note: netmap rx queues cannot be created early and so they
1986                  * can't be setup to receive forwarded interrupts for others.
1987                  */
1988                 iaq->nirq = T4_EXTRA_INTR;
1989                 if (nrxq10g >= nofldrxq10g) {
1990                         iaq->intr_flags_10g = INTR_RXQ;
1991                         iaq->nirq += n10g * nrxq10g;
1992 #ifdef DEV_NETMAP
1993                         iaq->nnmrxq10g = min(nnmrxq10g, nrxq10g);
1994 #endif
1995                 } else {
1996                         iaq->intr_flags_10g = INTR_OFLD_RXQ;
1997                         iaq->nirq += n10g * nofldrxq10g;
1998 #ifdef DEV_NETMAP
1999                         iaq->nnmrxq10g = min(nnmrxq10g, nofldrxq10g);
2000 #endif
2001                 }
2002                 if (nrxq1g >= nofldrxq1g) {
2003                         iaq->intr_flags_1g = INTR_RXQ;
2004                         iaq->nirq += n1g * nrxq1g;
2005 #ifdef DEV_NETMAP
2006                         iaq->nnmrxq1g = min(nnmrxq1g, nrxq1g);
2007 #endif
2008                 } else {
2009                         iaq->intr_flags_1g = INTR_OFLD_RXQ;
2010                         iaq->nirq += n1g * nofldrxq1g;
2011 #ifdef DEV_NETMAP
2012                         iaq->nnmrxq1g = min(nnmrxq1g, nofldrxq1g);
2013 #endif
2014                 }
2015                 if (iaq->nirq <= navail &&
2016                     (itype != INTR_MSI || powerof2(iaq->nirq)))
2017                         goto allocate;
2018
2019                 /*
2020                  * Next best option: an interrupt vector for errors, one for the
2021                  * firmware event queue, and at least one per port.  At this
2022                  * point we know we'll have to downsize nrxq and/or nofldrxq
2023                  * and/or nnmrxq to fit what's available to us.
2024                  */
2025                 iaq->nirq = T4_EXTRA_INTR;
2026                 iaq->nirq += n10g + n1g;
2027                 if (iaq->nirq <= navail) {
2028                         int leftover = navail - iaq->nirq;
2029
2030                         if (n10g > 0) {
2031                                 int target = max(nrxq10g, nofldrxq10g);
2032
2033                                 iaq->intr_flags_10g = nrxq10g >= nofldrxq10g ?
2034                                     INTR_RXQ : INTR_OFLD_RXQ;
2035
2036                                 n = 1;
2037                                 while (n < target && leftover >= n10g) {
2038                                         leftover -= n10g;
2039                                         iaq->nirq += n10g;
2040                                         n++;
2041                                 }
2042                                 iaq->nrxq10g = min(n, nrxq10g);
2043 #ifdef TCP_OFFLOAD
2044                                 iaq->nofldrxq10g = min(n, nofldrxq10g);
2045 #endif
2046 #ifdef DEV_NETMAP
2047                                 iaq->nnmrxq10g = min(n, nnmrxq10g);
2048 #endif
2049                         }
2050
2051                         if (n1g > 0) {
2052                                 int target = max(nrxq1g, nofldrxq1g);
2053
2054                                 iaq->intr_flags_1g = nrxq1g >= nofldrxq1g ?
2055                                     INTR_RXQ : INTR_OFLD_RXQ;
2056
2057                                 n = 1;
2058                                 while (n < target && leftover >= n1g) {
2059                                         leftover -= n1g;
2060                                         iaq->nirq += n1g;
2061                                         n++;
2062                                 }
2063                                 iaq->nrxq1g = min(n, nrxq1g);
2064 #ifdef TCP_OFFLOAD
2065                                 iaq->nofldrxq1g = min(n, nofldrxq1g);
2066 #endif
2067 #ifdef DEV_NETMAP
2068                                 iaq->nnmrxq1g = min(n, nnmrxq1g);
2069 #endif
2070                         }
2071
2072                         if (itype != INTR_MSI || powerof2(iaq->nirq))
2073                                 goto allocate;
2074                 }
2075
2076                 /*
2077                  * Least desirable option: one interrupt vector for everything.
2078                  */
2079                 iaq->nirq = iaq->nrxq10g = iaq->nrxq1g = 1;
2080                 iaq->intr_flags_10g = iaq->intr_flags_1g = 0;
2081 #ifdef TCP_OFFLOAD
2082                 if (is_offload(sc))
2083                         iaq->nofldrxq10g = iaq->nofldrxq1g = 1;
2084 #endif
2085 #ifdef DEV_NETMAP
2086                 iaq->nnmrxq10g = iaq->nnmrxq1g = 1;
2087 #endif
2088
2089 allocate:
2090                 navail = iaq->nirq;
2091                 rc = 0;
2092                 if (itype == INTR_MSIX)
2093                         rc = pci_alloc_msix(sc->dev, &navail);
2094                 else if (itype == INTR_MSI)
2095                         rc = pci_alloc_msi(sc->dev, &navail);
2096
2097                 if (rc == 0) {
2098                         if (navail == iaq->nirq)
2099                                 return (0);
2100
2101                         /*
2102                          * Didn't get the number requested.  Use whatever number
2103                          * the kernel is willing to allocate (it's in navail).
2104                          */
2105                         device_printf(sc->dev, "fewer vectors than requested, "
2106                             "type=%d, req=%d, rcvd=%d; will downshift req.\n",
2107                             itype, iaq->nirq, navail);
2108                         pci_release_msi(sc->dev);
2109                         goto restart;
2110                 }
2111
2112                 device_printf(sc->dev,
2113                     "failed to allocate vectors:%d, type=%d, req=%d, rcvd=%d\n",
2114                     itype, rc, iaq->nirq, navail);
2115         }
2116
2117         device_printf(sc->dev,
2118             "failed to find a usable interrupt type.  "
2119             "allowed=%d, msi-x=%d, msi=%d, intx=1", t4_intr_types,
2120             pci_msix_count(sc->dev), pci_msi_count(sc->dev));
2121
2122         return (ENXIO);
2123 }
2124
2125 #define FW_VERSION(chip) ( \
2126     V_FW_HDR_FW_VER_MAJOR(chip##FW_VERSION_MAJOR) | \
2127     V_FW_HDR_FW_VER_MINOR(chip##FW_VERSION_MINOR) | \
2128     V_FW_HDR_FW_VER_MICRO(chip##FW_VERSION_MICRO) | \
2129     V_FW_HDR_FW_VER_BUILD(chip##FW_VERSION_BUILD))
2130 #define FW_INTFVER(chip, intf) (chip##FW_HDR_INTFVER_##intf)
2131
2132 struct fw_info {
2133         uint8_t chip;
2134         char *kld_name;
2135         char *fw_mod_name;
2136         struct fw_hdr fw_hdr;   /* XXX: waste of space, need a sparse struct */
2137 } fw_info[] = {
2138         {
2139                 .chip = CHELSIO_T4,
2140                 .kld_name = "t4fw_cfg",
2141                 .fw_mod_name = "t4fw",
2142                 .fw_hdr = {
2143                         .chip = FW_HDR_CHIP_T4,
2144                         .fw_ver = htobe32_const(FW_VERSION(T4)),
2145                         .intfver_nic = FW_INTFVER(T4, NIC),
2146                         .intfver_vnic = FW_INTFVER(T4, VNIC),
2147                         .intfver_ofld = FW_INTFVER(T4, OFLD),
2148                         .intfver_ri = FW_INTFVER(T4, RI),
2149                         .intfver_iscsipdu = FW_INTFVER(T4, ISCSIPDU),
2150                         .intfver_iscsi = FW_INTFVER(T4, ISCSI),
2151                         .intfver_fcoepdu = FW_INTFVER(T4, FCOEPDU),
2152                         .intfver_fcoe = FW_INTFVER(T4, FCOE),
2153                 },
2154         }, {
2155                 .chip = CHELSIO_T5,
2156                 .kld_name = "t5fw_cfg",
2157                 .fw_mod_name = "t5fw",
2158                 .fw_hdr = {
2159                         .chip = FW_HDR_CHIP_T5,
2160                         .fw_ver = htobe32_const(FW_VERSION(T5)),
2161                         .intfver_nic = FW_INTFVER(T5, NIC),
2162                         .intfver_vnic = FW_INTFVER(T5, VNIC),
2163                         .intfver_ofld = FW_INTFVER(T5, OFLD),
2164                         .intfver_ri = FW_INTFVER(T5, RI),
2165                         .intfver_iscsipdu = FW_INTFVER(T5, ISCSIPDU),
2166                         .intfver_iscsi = FW_INTFVER(T5, ISCSI),
2167                         .intfver_fcoepdu = FW_INTFVER(T5, FCOEPDU),
2168                         .intfver_fcoe = FW_INTFVER(T5, FCOE),
2169                 },
2170         }
2171 };
2172
2173 static struct fw_info *
2174 find_fw_info(int chip)
2175 {
2176         int i;
2177
2178         for (i = 0; i < nitems(fw_info); i++) {
2179                 if (fw_info[i].chip == chip)
2180                         return (&fw_info[i]);
2181         }
2182         return (NULL);
2183 }
2184
2185 /*
2186  * Is the given firmware API compatible with the one the driver was compiled
2187  * with?
2188  */
2189 static int
2190 fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2)
2191 {
2192
2193         /* short circuit if it's the exact same firmware version */
2194         if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver)
2195                 return (1);
2196
2197         /*
2198          * XXX: Is this too conservative?  Perhaps I should limit this to the
2199          * features that are supported in the driver.
2200          */
2201 #define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x)
2202         if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) &&
2203             SAME_INTF(ofld) && SAME_INTF(ri) && SAME_INTF(iscsipdu) &&
2204             SAME_INTF(iscsi) && SAME_INTF(fcoepdu) && SAME_INTF(fcoe))
2205                 return (1);
2206 #undef SAME_INTF
2207
2208         return (0);
2209 }
2210
2211 /*
2212  * The firmware in the KLD is usable, but should it be installed?  This routine
2213  * explains itself in detail if it indicates the KLD firmware should be
2214  * installed.
2215  */
2216 static int
2217 should_install_kld_fw(struct adapter *sc, int card_fw_usable, int k, int c)
2218 {
2219         const char *reason;
2220
2221         if (!card_fw_usable) {
2222                 reason = "incompatible or unusable";
2223                 goto install;
2224         }
2225
2226         if (k > c) {
2227                 reason = "older than the version bundled with this driver";
2228                 goto install;
2229         }
2230
2231         if (t4_fw_install == 2 && k != c) {
2232                 reason = "different than the version bundled with this driver";
2233                 goto install;
2234         }
2235
2236         return (0);
2237
2238 install:
2239         if (t4_fw_install == 0) {
2240                 device_printf(sc->dev, "firmware on card (%u.%u.%u.%u) is %s, "
2241                     "but the driver is prohibited from installing a different "
2242                     "firmware on the card.\n",
2243                     G_FW_HDR_FW_VER_MAJOR(c), G_FW_HDR_FW_VER_MINOR(c),
2244                     G_FW_HDR_FW_VER_MICRO(c), G_FW_HDR_FW_VER_BUILD(c), reason);
2245
2246                 return (0);
2247         }
2248
2249         device_printf(sc->dev, "firmware on card (%u.%u.%u.%u) is %s, "
2250             "installing firmware %u.%u.%u.%u on card.\n",
2251             G_FW_HDR_FW_VER_MAJOR(c), G_FW_HDR_FW_VER_MINOR(c),
2252             G_FW_HDR_FW_VER_MICRO(c), G_FW_HDR_FW_VER_BUILD(c), reason,
2253             G_FW_HDR_FW_VER_MAJOR(k), G_FW_HDR_FW_VER_MINOR(k),
2254             G_FW_HDR_FW_VER_MICRO(k), G_FW_HDR_FW_VER_BUILD(k));
2255
2256         return (1);
2257 }
2258 /*
2259  * Establish contact with the firmware and determine if we are the master driver
2260  * or not, and whether we are responsible for chip initialization.
2261  */
2262 static int
2263 prep_firmware(struct adapter *sc)
2264 {
2265         const struct firmware *fw = NULL, *default_cfg;
2266         int rc, pf, card_fw_usable, kld_fw_usable, need_fw_reset = 1;
2267         enum dev_state state;
2268         struct fw_info *fw_info;
2269         struct fw_hdr *card_fw;         /* fw on the card */
2270         const struct fw_hdr *kld_fw;    /* fw in the KLD */
2271         const struct fw_hdr *drv_fw;    /* fw header the driver was compiled
2272                                            against */
2273
2274         /* Contact firmware. */
2275         rc = t4_fw_hello(sc, sc->mbox, sc->mbox, MASTER_MAY, &state);
2276         if (rc < 0 || state == DEV_STATE_ERR) {
2277                 rc = -rc;
2278                 device_printf(sc->dev,
2279                     "failed to connect to the firmware: %d, %d.\n", rc, state);
2280                 return (rc);
2281         }
2282         pf = rc;
2283         if (pf == sc->mbox)
2284                 sc->flags |= MASTER_PF;
2285         else if (state == DEV_STATE_UNINIT) {
2286                 /*
2287                  * We didn't get to be the master so we definitely won't be
2288                  * configuring the chip.  It's a bug if someone else hasn't
2289                  * configured it already.
2290                  */
2291                 device_printf(sc->dev, "couldn't be master(%d), "
2292                     "device not already initialized either(%d).\n", rc, state);
2293                 return (EDOOFUS);
2294         }
2295
2296         /* This is the firmware whose headers the driver was compiled against */
2297         fw_info = find_fw_info(chip_id(sc));
2298         if (fw_info == NULL) {
2299                 device_printf(sc->dev,
2300                     "unable to look up firmware information for chip %d.\n",
2301                     chip_id(sc));
2302                 return (EINVAL);
2303         }
2304         drv_fw = &fw_info->fw_hdr;
2305
2306         /*
2307          * The firmware KLD contains many modules.  The KLD name is also the
2308          * name of the module that contains the default config file.
2309          */
2310         default_cfg = firmware_get(fw_info->kld_name);
2311
2312         /* Read the header of the firmware on the card */
2313         card_fw = malloc(sizeof(*card_fw), M_CXGBE, M_ZERO | M_WAITOK);
2314         rc = -t4_read_flash(sc, FLASH_FW_START,
2315             sizeof (*card_fw) / sizeof (uint32_t), (uint32_t *)card_fw, 1);
2316         if (rc == 0)
2317                 card_fw_usable = fw_compatible(drv_fw, (const void*)card_fw);
2318         else {
2319                 device_printf(sc->dev,
2320                     "Unable to read card's firmware header: %d\n", rc);
2321                 card_fw_usable = 0;
2322         }
2323
2324         /* This is the firmware in the KLD */
2325         fw = firmware_get(fw_info->fw_mod_name);
2326         if (fw != NULL) {
2327                 kld_fw = (const void *)fw->data;
2328                 kld_fw_usable = fw_compatible(drv_fw, kld_fw);
2329         } else {
2330                 kld_fw = NULL;
2331                 kld_fw_usable = 0;
2332         }
2333
2334         if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver &&
2335             (!kld_fw_usable || kld_fw->fw_ver == drv_fw->fw_ver)) {
2336                 /*
2337                  * Common case: the firmware on the card is an exact match and
2338                  * the KLD is an exact match too, or the KLD is
2339                  * absent/incompatible.  Note that t4_fw_install = 2 is ignored
2340                  * here -- use cxgbetool loadfw if you want to reinstall the
2341                  * same firmware as the one on the card.
2342                  */
2343         } else if (kld_fw_usable && state == DEV_STATE_UNINIT &&
2344             should_install_kld_fw(sc, card_fw_usable, be32toh(kld_fw->fw_ver),
2345             be32toh(card_fw->fw_ver))) {
2346
2347                 rc = -t4_fw_upgrade(sc, sc->mbox, fw->data, fw->datasize, 0);
2348                 if (rc != 0) {
2349                         device_printf(sc->dev,
2350                             "failed to install firmware: %d\n", rc);
2351                         goto done;
2352                 }
2353
2354                 /* Installed successfully, update the cached header too. */
2355                 memcpy(card_fw, kld_fw, sizeof(*card_fw));
2356                 card_fw_usable = 1;
2357                 need_fw_reset = 0;      /* already reset as part of load_fw */
2358         }
2359
2360         if (!card_fw_usable) {
2361                 uint32_t d, c, k;
2362
2363                 d = ntohl(drv_fw->fw_ver);
2364                 c = ntohl(card_fw->fw_ver);
2365                 k = kld_fw ? ntohl(kld_fw->fw_ver) : 0;
2366
2367                 device_printf(sc->dev, "Cannot find a usable firmware: "
2368                     "fw_install %d, chip state %d, "
2369                     "driver compiled with %d.%d.%d.%d, "
2370                     "card has %d.%d.%d.%d, KLD has %d.%d.%d.%d\n",
2371                     t4_fw_install, state,
2372                     G_FW_HDR_FW_VER_MAJOR(d), G_FW_HDR_FW_VER_MINOR(d),
2373                     G_FW_HDR_FW_VER_MICRO(d), G_FW_HDR_FW_VER_BUILD(d),
2374                     G_FW_HDR_FW_VER_MAJOR(c), G_FW_HDR_FW_VER_MINOR(c),
2375                     G_FW_HDR_FW_VER_MICRO(c), G_FW_HDR_FW_VER_BUILD(c),
2376                     G_FW_HDR_FW_VER_MAJOR(k), G_FW_HDR_FW_VER_MINOR(k),
2377                     G_FW_HDR_FW_VER_MICRO(k), G_FW_HDR_FW_VER_BUILD(k));
2378                 rc = EINVAL;
2379                 goto done;
2380         }
2381
2382         /* We're using whatever's on the card and it's known to be good. */
2383         sc->params.fw_vers = ntohl(card_fw->fw_ver);
2384         snprintf(sc->fw_version, sizeof(sc->fw_version), "%u.%u.%u.%u",
2385             G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers),
2386             G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers),
2387             G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers),
2388             G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers));
2389         t4_get_tp_version(sc, &sc->params.tp_vers);
2390
2391         /* Reset device */
2392         if (need_fw_reset &&
2393             (rc = -t4_fw_reset(sc, sc->mbox, F_PIORSTMODE | F_PIORST)) != 0) {
2394                 device_printf(sc->dev, "firmware reset failed: %d.\n", rc);
2395                 if (rc != ETIMEDOUT && rc != EIO)
2396                         t4_fw_bye(sc, sc->mbox);
2397                 goto done;
2398         }
2399         sc->flags |= FW_OK;
2400
2401         rc = get_params__pre_init(sc);
2402         if (rc != 0)
2403                 goto done; /* error message displayed already */
2404
2405         /* Partition adapter resources as specified in the config file. */
2406         if (state == DEV_STATE_UNINIT) {
2407
2408                 KASSERT(sc->flags & MASTER_PF,
2409                     ("%s: trying to change chip settings when not master.",
2410                     __func__));
2411
2412                 rc = partition_resources(sc, default_cfg, fw_info->kld_name);
2413                 if (rc != 0)
2414                         goto done;      /* error message displayed already */
2415
2416                 t4_tweak_chip_settings(sc);
2417
2418                 /* get basic stuff going */
2419                 rc = -t4_fw_initialize(sc, sc->mbox);
2420                 if (rc != 0) {
2421                         device_printf(sc->dev, "fw init failed: %d.\n", rc);
2422                         goto done;
2423                 }
2424         } else {
2425                 snprintf(sc->cfg_file, sizeof(sc->cfg_file), "pf%d", pf);
2426                 sc->cfcsum = 0;
2427         }
2428
2429 done:
2430         free(card_fw, M_CXGBE);
2431         if (fw != NULL)
2432                 firmware_put(fw, FIRMWARE_UNLOAD);
2433         if (default_cfg != NULL)
2434                 firmware_put(default_cfg, FIRMWARE_UNLOAD);
2435
2436         return (rc);
2437 }
2438
2439 #define FW_PARAM_DEV(param) \
2440         (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | \
2441          V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_##param))
2442 #define FW_PARAM_PFVF(param) \
2443         (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_PFVF) | \
2444          V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_PFVF_##param))
2445
2446 /*
2447  * Partition chip resources for use between various PFs, VFs, etc.
2448  */
2449 static int
2450 partition_resources(struct adapter *sc, const struct firmware *default_cfg,
2451     const char *name_prefix)
2452 {
2453         const struct firmware *cfg = NULL;
2454         int rc = 0;
2455         struct fw_caps_config_cmd caps;
2456         uint32_t mtype, moff, finicsum, cfcsum;
2457
2458         /*
2459          * Figure out what configuration file to use.  Pick the default config
2460          * file for the card if the user hasn't specified one explicitly.
2461          */
2462         snprintf(sc->cfg_file, sizeof(sc->cfg_file), "%s", t4_cfg_file);
2463         if (strncmp(t4_cfg_file, DEFAULT_CF, sizeof(t4_cfg_file)) == 0) {
2464                 /* Card specific overrides go here. */
2465                 if (pci_get_device(sc->dev) == 0x440a)
2466                         snprintf(sc->cfg_file, sizeof(sc->cfg_file), UWIRE_CF);
2467                 if (is_fpga(sc))
2468                         snprintf(sc->cfg_file, sizeof(sc->cfg_file), FPGA_CF);
2469         }
2470
2471         /*
2472          * We need to load another module if the profile is anything except
2473          * "default" or "flash".
2474          */
2475         if (strncmp(sc->cfg_file, DEFAULT_CF, sizeof(sc->cfg_file)) != 0 &&
2476             strncmp(sc->cfg_file, FLASH_CF, sizeof(sc->cfg_file)) != 0) {
2477                 char s[32];
2478
2479                 snprintf(s, sizeof(s), "%s_%s", name_prefix, sc->cfg_file);
2480                 cfg = firmware_get(s);
2481                 if (cfg == NULL) {
2482                         if (default_cfg != NULL) {
2483                                 device_printf(sc->dev,
2484                                     "unable to load module \"%s\" for "
2485                                     "configuration profile \"%s\", will use "
2486                                     "the default config file instead.\n",
2487                                     s, sc->cfg_file);
2488                                 snprintf(sc->cfg_file, sizeof(sc->cfg_file),
2489                                     "%s", DEFAULT_CF);
2490                         } else {
2491                                 device_printf(sc->dev,
2492                                     "unable to load module \"%s\" for "
2493                                     "configuration profile \"%s\", will use "
2494                                     "the config file on the card's flash "
2495                                     "instead.\n", s, sc->cfg_file);
2496                                 snprintf(sc->cfg_file, sizeof(sc->cfg_file),
2497                                     "%s", FLASH_CF);
2498                         }
2499                 }
2500         }
2501
2502         if (strncmp(sc->cfg_file, DEFAULT_CF, sizeof(sc->cfg_file)) == 0 &&
2503             default_cfg == NULL) {
2504                 device_printf(sc->dev,
2505                     "default config file not available, will use the config "
2506                     "file on the card's flash instead.\n");
2507                 snprintf(sc->cfg_file, sizeof(sc->cfg_file), "%s", FLASH_CF);
2508         }
2509
2510         if (strncmp(sc->cfg_file, FLASH_CF, sizeof(sc->cfg_file)) != 0) {
2511                 u_int cflen, i, n;
2512                 const uint32_t *cfdata;
2513                 uint32_t param, val, addr, off, mw_base, mw_aperture;
2514
2515                 KASSERT(cfg != NULL || default_cfg != NULL,
2516                     ("%s: no config to upload", __func__));
2517
2518                 /*
2519                  * Ask the firmware where it wants us to upload the config file.
2520                  */
2521                 param = FW_PARAM_DEV(CF);
2522                 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
2523                 if (rc != 0) {
2524                         /* No support for config file?  Shouldn't happen. */
2525                         device_printf(sc->dev,
2526                             "failed to query config file location: %d.\n", rc);
2527                         goto done;
2528                 }
2529                 mtype = G_FW_PARAMS_PARAM_Y(val);
2530                 moff = G_FW_PARAMS_PARAM_Z(val) << 16;
2531
2532                 /*
2533                  * XXX: sheer laziness.  We deliberately added 4 bytes of
2534                  * useless stuffing/comments at the end of the config file so
2535                  * it's ok to simply throw away the last remaining bytes when
2536                  * the config file is not an exact multiple of 4.  This also
2537                  * helps with the validate_mt_off_len check.
2538                  */
2539                 if (cfg != NULL) {
2540                         cflen = cfg->datasize & ~3;
2541                         cfdata = cfg->data;
2542                 } else {
2543                         cflen = default_cfg->datasize & ~3;
2544                         cfdata = default_cfg->data;
2545                 }
2546
2547                 if (cflen > FLASH_CFG_MAX_SIZE) {
2548                         device_printf(sc->dev,
2549                             "config file too long (%d, max allowed is %d).  "
2550                             "Will try to use the config on the card, if any.\n",
2551                             cflen, FLASH_CFG_MAX_SIZE);
2552                         goto use_config_on_flash;
2553                 }
2554
2555                 rc = validate_mt_off_len(sc, mtype, moff, cflen, &addr);
2556                 if (rc != 0) {
2557                         device_printf(sc->dev,
2558                             "%s: addr (%d/0x%x) or len %d is not valid: %d.  "
2559                             "Will try to use the config on the card, if any.\n",
2560                             __func__, mtype, moff, cflen, rc);
2561                         goto use_config_on_flash;
2562                 }
2563
2564                 memwin_info(sc, 2, &mw_base, &mw_aperture);
2565                 while (cflen) {
2566                         off = position_memwin(sc, 2, addr);
2567                         n = min(cflen, mw_aperture - off);
2568                         for (i = 0; i < n; i += 4)
2569                                 t4_write_reg(sc, mw_base + off + i, *cfdata++);
2570                         cflen -= n;
2571                         addr += n;
2572                 }
2573         } else {
2574 use_config_on_flash:
2575                 mtype = FW_MEMTYPE_FLASH;
2576                 moff = t4_flash_cfg_addr(sc);
2577         }
2578
2579         bzero(&caps, sizeof(caps));
2580         caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
2581             F_FW_CMD_REQUEST | F_FW_CMD_READ);
2582         caps.cfvalid_to_len16 = htobe32(F_FW_CAPS_CONFIG_CMD_CFVALID |
2583             V_FW_CAPS_CONFIG_CMD_MEMTYPE_CF(mtype) |
2584             V_FW_CAPS_CONFIG_CMD_MEMADDR64K_CF(moff >> 16) | FW_LEN16(caps));
2585         rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), &caps);
2586         if (rc != 0) {
2587                 device_printf(sc->dev,
2588                     "failed to pre-process config file: %d "
2589                     "(mtype %d, moff 0x%x).\n", rc, mtype, moff);
2590                 goto done;
2591         }
2592
2593         finicsum = be32toh(caps.finicsum);
2594         cfcsum = be32toh(caps.cfcsum);
2595         if (finicsum != cfcsum) {
2596                 device_printf(sc->dev,
2597                     "WARNING: config file checksum mismatch: %08x %08x\n",
2598                     finicsum, cfcsum);
2599         }
2600         sc->cfcsum = cfcsum;
2601
2602 #define LIMIT_CAPS(x) do { \
2603         caps.x &= htobe16(t4_##x##_allowed); \
2604 } while (0)
2605
2606         /*
2607          * Let the firmware know what features will (not) be used so it can tune
2608          * things accordingly.
2609          */
2610         LIMIT_CAPS(linkcaps);
2611         LIMIT_CAPS(niccaps);
2612         LIMIT_CAPS(toecaps);
2613         LIMIT_CAPS(rdmacaps);
2614         LIMIT_CAPS(iscsicaps);
2615         LIMIT_CAPS(fcoecaps);
2616 #undef LIMIT_CAPS
2617
2618         caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
2619             F_FW_CMD_REQUEST | F_FW_CMD_WRITE);
2620         caps.cfvalid_to_len16 = htobe32(FW_LEN16(caps));
2621         rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), NULL);
2622         if (rc != 0) {
2623                 device_printf(sc->dev,
2624                     "failed to process config file: %d.\n", rc);
2625         }
2626 done:
2627         if (cfg != NULL)
2628                 firmware_put(cfg, FIRMWARE_UNLOAD);
2629         return (rc);
2630 }
2631
2632 /*
2633  * Retrieve parameters that are needed (or nice to have) very early.
2634  */
2635 static int
2636 get_params__pre_init(struct adapter *sc)
2637 {
2638         int rc;
2639         uint32_t param[2], val[2];
2640         struct fw_devlog_cmd cmd;
2641         struct devlog_params *dlog = &sc->params.devlog;
2642
2643         param[0] = FW_PARAM_DEV(PORTVEC);
2644         param[1] = FW_PARAM_DEV(CCLK);
2645         rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
2646         if (rc != 0) {
2647                 device_printf(sc->dev,
2648                     "failed to query parameters (pre_init): %d.\n", rc);
2649                 return (rc);
2650         }
2651
2652         sc->params.portvec = val[0];
2653         sc->params.nports = bitcount32(val[0]);
2654         sc->params.vpd.cclk = val[1];
2655
2656         /* Read device log parameters. */
2657         bzero(&cmd, sizeof(cmd));
2658         cmd.op_to_write = htobe32(V_FW_CMD_OP(FW_DEVLOG_CMD) |
2659             F_FW_CMD_REQUEST | F_FW_CMD_READ);
2660         cmd.retval_len16 = htobe32(FW_LEN16(cmd));
2661         rc = -t4_wr_mbox(sc, sc->mbox, &cmd, sizeof(cmd), &cmd);
2662         if (rc != 0) {
2663                 device_printf(sc->dev,
2664                     "failed to get devlog parameters: %d.\n", rc);
2665                 bzero(dlog, sizeof (*dlog));
2666                 rc = 0; /* devlog isn't critical for device operation */
2667         } else {
2668                 val[0] = be32toh(cmd.memtype_devlog_memaddr16_devlog);
2669                 dlog->memtype = G_FW_DEVLOG_CMD_MEMTYPE_DEVLOG(val[0]);
2670                 dlog->start = G_FW_DEVLOG_CMD_MEMADDR16_DEVLOG(val[0]) << 4;
2671                 dlog->size = be32toh(cmd.memsize_devlog);
2672         }
2673
2674         return (rc);
2675 }
2676
2677 /*
2678  * Retrieve various parameters that are of interest to the driver.  The device
2679  * has been initialized by the firmware at this point.
2680  */
2681 static int
2682 get_params__post_init(struct adapter *sc)
2683 {
2684         int rc;
2685         uint32_t param[7], val[7];
2686         struct fw_caps_config_cmd caps;
2687
2688         param[0] = FW_PARAM_PFVF(IQFLINT_START);
2689         param[1] = FW_PARAM_PFVF(EQ_START);
2690         param[2] = FW_PARAM_PFVF(FILTER_START);
2691         param[3] = FW_PARAM_PFVF(FILTER_END);
2692         param[4] = FW_PARAM_PFVF(L2T_START);
2693         param[5] = FW_PARAM_PFVF(L2T_END);
2694         rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2695         if (rc != 0) {
2696                 device_printf(sc->dev,
2697                     "failed to query parameters (post_init): %d.\n", rc);
2698                 return (rc);
2699         }
2700
2701         sc->sge.iq_start = val[0];
2702         sc->sge.eq_start = val[1];
2703         sc->tids.ftid_base = val[2];
2704         sc->tids.nftids = val[3] - val[2] + 1;
2705         sc->params.ftid_min = val[2];
2706         sc->params.ftid_max = val[3];
2707         sc->vres.l2t.start = val[4];
2708         sc->vres.l2t.size = val[5] - val[4] + 1;
2709         KASSERT(sc->vres.l2t.size <= L2T_SIZE,
2710             ("%s: L2 table size (%u) larger than expected (%u)",
2711             __func__, sc->vres.l2t.size, L2T_SIZE));
2712
2713         /* get capabilites */
2714         bzero(&caps, sizeof(caps));
2715         caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
2716             F_FW_CMD_REQUEST | F_FW_CMD_READ);
2717         caps.cfvalid_to_len16 = htobe32(FW_LEN16(caps));
2718         rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), &caps);
2719         if (rc != 0) {
2720                 device_printf(sc->dev,
2721                     "failed to get card capabilities: %d.\n", rc);
2722                 return (rc);
2723         }
2724
2725 #define READ_CAPS(x) do { \
2726         sc->x = htobe16(caps.x); \
2727 } while (0)
2728         READ_CAPS(linkcaps);
2729         READ_CAPS(niccaps);
2730         READ_CAPS(toecaps);
2731         READ_CAPS(rdmacaps);
2732         READ_CAPS(iscsicaps);
2733         READ_CAPS(fcoecaps);
2734
2735         if (sc->niccaps & FW_CAPS_CONFIG_NIC_ETHOFLD) {
2736                 param[0] = FW_PARAM_PFVF(ETHOFLD_START);
2737                 param[1] = FW_PARAM_PFVF(ETHOFLD_END);
2738                 param[2] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ);
2739                 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 3, param, val);
2740                 if (rc != 0) {
2741                         device_printf(sc->dev,
2742                             "failed to query NIC parameters: %d.\n", rc);
2743                         return (rc);
2744                 }
2745                 sc->tids.etid_base = val[0];
2746                 sc->params.etid_min = val[0];
2747                 sc->tids.netids = val[1] - val[0] + 1;
2748                 sc->params.netids = sc->tids.netids;
2749                 sc->params.eo_wr_cred = val[2];
2750                 sc->params.ethoffload = 1;
2751         }
2752
2753         if (sc->toecaps) {
2754                 /* query offload-related parameters */
2755                 param[0] = FW_PARAM_DEV(NTID);
2756                 param[1] = FW_PARAM_PFVF(SERVER_START);
2757                 param[2] = FW_PARAM_PFVF(SERVER_END);
2758                 param[3] = FW_PARAM_PFVF(TDDP_START);
2759                 param[4] = FW_PARAM_PFVF(TDDP_END);
2760                 param[5] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ);
2761                 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2762                 if (rc != 0) {
2763                         device_printf(sc->dev,
2764                             "failed to query TOE parameters: %d.\n", rc);
2765                         return (rc);
2766                 }
2767                 sc->tids.ntids = val[0];
2768                 sc->tids.natids = min(sc->tids.ntids / 2, MAX_ATIDS);
2769                 sc->tids.stid_base = val[1];
2770                 sc->tids.nstids = val[2] - val[1] + 1;
2771                 sc->vres.ddp.start = val[3];
2772                 sc->vres.ddp.size = val[4] - val[3] + 1;
2773                 sc->params.ofldq_wr_cred = val[5];
2774                 sc->params.offload = 1;
2775         }
2776         if (sc->rdmacaps) {
2777                 param[0] = FW_PARAM_PFVF(STAG_START);
2778                 param[1] = FW_PARAM_PFVF(STAG_END);
2779                 param[2] = FW_PARAM_PFVF(RQ_START);
2780                 param[3] = FW_PARAM_PFVF(RQ_END);
2781                 param[4] = FW_PARAM_PFVF(PBL_START);
2782                 param[5] = FW_PARAM_PFVF(PBL_END);
2783                 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2784                 if (rc != 0) {
2785                         device_printf(sc->dev,
2786                             "failed to query RDMA parameters(1): %d.\n", rc);
2787                         return (rc);
2788                 }
2789                 sc->vres.stag.start = val[0];
2790                 sc->vres.stag.size = val[1] - val[0] + 1;
2791                 sc->vres.rq.start = val[2];
2792                 sc->vres.rq.size = val[3] - val[2] + 1;
2793                 sc->vres.pbl.start = val[4];
2794                 sc->vres.pbl.size = val[5] - val[4] + 1;
2795
2796                 param[0] = FW_PARAM_PFVF(SQRQ_START);
2797                 param[1] = FW_PARAM_PFVF(SQRQ_END);
2798                 param[2] = FW_PARAM_PFVF(CQ_START);
2799                 param[3] = FW_PARAM_PFVF(CQ_END);
2800                 param[4] = FW_PARAM_PFVF(OCQ_START);
2801                 param[5] = FW_PARAM_PFVF(OCQ_END);
2802                 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
2803                 if (rc != 0) {
2804                         device_printf(sc->dev,
2805                             "failed to query RDMA parameters(2): %d.\n", rc);
2806                         return (rc);
2807                 }
2808                 sc->vres.qp.start = val[0];
2809                 sc->vres.qp.size = val[1] - val[0] + 1;
2810                 sc->vres.cq.start = val[2];
2811                 sc->vres.cq.size = val[3] - val[2] + 1;
2812                 sc->vres.ocq.start = val[4];
2813                 sc->vres.ocq.size = val[5] - val[4] + 1;
2814         }
2815         if (sc->iscsicaps) {
2816                 param[0] = FW_PARAM_PFVF(ISCSI_START);
2817                 param[1] = FW_PARAM_PFVF(ISCSI_END);
2818                 rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
2819                 if (rc != 0) {
2820                         device_printf(sc->dev,
2821                             "failed to query iSCSI parameters: %d.\n", rc);
2822                         return (rc);
2823                 }
2824                 sc->vres.iscsi.start = val[0];
2825                 sc->vres.iscsi.size = val[1] - val[0] + 1;
2826         }
2827
2828         /*
2829          * We've got the params we wanted to query via the firmware.  Now grab
2830          * some others directly from the chip.
2831          */
2832         rc = t4_read_chip_settings(sc);
2833
2834         return (rc);
2835 }
2836
2837 static int
2838 set_params__post_init(struct adapter *sc)
2839 {
2840         uint32_t param, val;
2841
2842         /* ask for encapsulated CPLs */
2843         param = FW_PARAM_PFVF(CPLFW4MSG_ENCAP);
2844         val = 1;
2845         (void)t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
2846
2847         return (0);
2848 }
2849
2850 #undef FW_PARAM_PFVF
2851 #undef FW_PARAM_DEV
2852
2853 static void
2854 t4_set_desc(struct adapter *sc)
2855 {
2856         char buf[128];
2857         struct adapter_params *p = &sc->params;
2858
2859         snprintf(buf, sizeof(buf), "Chelsio %s %sNIC (rev %d), S/N:%s, "
2860             "P/N:%s, E/C:%s", p->vpd.id, is_offload(sc) ? "R" : "",
2861             chip_rev(sc), p->vpd.sn, p->vpd.pn, p->vpd.ec);
2862
2863         device_set_desc_copy(sc->dev, buf);
2864 }
2865
2866 static void
2867 build_medialist(struct port_info *pi, struct ifmedia *media)
2868 {
2869         int m;
2870
2871         PORT_LOCK(pi);
2872
2873         ifmedia_removeall(media);
2874
2875         m = IFM_ETHER | IFM_FDX;
2876
2877         switch(pi->port_type) {
2878         case FW_PORT_TYPE_BT_XFI:
2879         case FW_PORT_TYPE_BT_XAUI:
2880                 ifmedia_add(media, m | IFM_10G_T, 0, NULL);
2881                 /* fall through */
2882
2883         case FW_PORT_TYPE_BT_SGMII:
2884                 ifmedia_add(media, m | IFM_1000_T, 0, NULL);
2885                 ifmedia_add(media, m | IFM_100_TX, 0, NULL);
2886                 ifmedia_add(media, IFM_ETHER | IFM_AUTO, 0, NULL);
2887                 ifmedia_set(media, IFM_ETHER | IFM_AUTO);
2888                 break;
2889
2890         case FW_PORT_TYPE_CX4:
2891                 ifmedia_add(media, m | IFM_10G_CX4, 0, NULL);
2892                 ifmedia_set(media, m | IFM_10G_CX4);
2893                 break;
2894
2895         case FW_PORT_TYPE_QSFP_10G:
2896         case FW_PORT_TYPE_SFP:
2897         case FW_PORT_TYPE_FIBER_XFI:
2898         case FW_PORT_TYPE_FIBER_XAUI:
2899                 switch (pi->mod_type) {
2900
2901                 case FW_PORT_MOD_TYPE_LR:
2902                         ifmedia_add(media, m | IFM_10G_LR, 0, NULL);
2903                         ifmedia_set(media, m | IFM_10G_LR);
2904                         break;
2905
2906                 case FW_PORT_MOD_TYPE_SR:
2907                         ifmedia_add(media, m | IFM_10G_SR, 0, NULL);
2908                         ifmedia_set(media, m | IFM_10G_SR);
2909                         break;
2910
2911                 case FW_PORT_MOD_TYPE_LRM:
2912                         ifmedia_add(media, m | IFM_10G_LRM, 0, NULL);
2913                         ifmedia_set(media, m | IFM_10G_LRM);
2914                         break;
2915
2916                 case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
2917                 case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
2918                         ifmedia_add(media, m | IFM_10G_TWINAX, 0, NULL);
2919                         ifmedia_set(media, m | IFM_10G_TWINAX);
2920                         break;
2921
2922                 case FW_PORT_MOD_TYPE_NONE:
2923                         m &= ~IFM_FDX;
2924                         ifmedia_add(media, m | IFM_NONE, 0, NULL);
2925                         ifmedia_set(media, m | IFM_NONE);
2926                         break;
2927
2928                 case FW_PORT_MOD_TYPE_NA:
2929                 case FW_PORT_MOD_TYPE_ER:
2930                 default:
2931                         device_printf(pi->dev,
2932                             "unknown port_type (%d), mod_type (%d)\n",
2933                             pi->port_type, pi->mod_type);
2934                         ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
2935                         ifmedia_set(media, m | IFM_UNKNOWN);
2936                         break;
2937                 }
2938                 break;
2939
2940         case FW_PORT_TYPE_QSFP:
2941                 switch (pi->mod_type) {
2942
2943                 case FW_PORT_MOD_TYPE_LR:
2944                         ifmedia_add(media, m | IFM_40G_LR4, 0, NULL);
2945                         ifmedia_set(media, m | IFM_40G_LR4);
2946                         break;
2947
2948                 case FW_PORT_MOD_TYPE_SR:
2949                         ifmedia_add(media, m | IFM_40G_SR4, 0, NULL);
2950                         ifmedia_set(media, m | IFM_40G_SR4);
2951                         break;
2952
2953                 case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
2954                 case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
2955                         ifmedia_add(media, m | IFM_40G_CR4, 0, NULL);
2956                         ifmedia_set(media, m | IFM_40G_CR4);
2957                         break;
2958
2959                 case FW_PORT_MOD_TYPE_NONE:
2960                         m &= ~IFM_FDX;
2961                         ifmedia_add(media, m | IFM_NONE, 0, NULL);
2962                         ifmedia_set(media, m | IFM_NONE);
2963                         break;
2964
2965                 default:
2966                         device_printf(pi->dev,
2967                             "unknown port_type (%d), mod_type (%d)\n",
2968                             pi->port_type, pi->mod_type);
2969                         ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
2970                         ifmedia_set(media, m | IFM_UNKNOWN);
2971                         break;
2972                 }
2973                 break;
2974
2975         default:
2976                 device_printf(pi->dev,
2977                     "unknown port_type (%d), mod_type (%d)\n", pi->port_type,
2978                     pi->mod_type);
2979                 ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
2980                 ifmedia_set(media, m | IFM_UNKNOWN);
2981                 break;
2982         }
2983
2984         PORT_UNLOCK(pi);
2985 }
2986
2987 #define FW_MAC_EXACT_CHUNK      7
2988
2989 /*
2990  * Program the port's XGMAC based on parameters in ifnet.  The caller also
2991  * indicates which parameters should be programmed (the rest are left alone).
2992  */
2993 int
2994 update_mac_settings(struct ifnet *ifp, int flags)
2995 {
2996         int rc = 0;
2997         struct port_info *pi = ifp->if_softc;
2998         struct adapter *sc = pi->adapter;
2999         int mtu = -1, promisc = -1, allmulti = -1, vlanex = -1;
3000         uint16_t viid = 0xffff;
3001         int16_t *xact_addr_filt = NULL;
3002
3003         ASSERT_SYNCHRONIZED_OP(sc);
3004         KASSERT(flags, ("%s: not told what to update.", __func__));
3005
3006         if (ifp == pi->ifp) {
3007                 viid = pi->viid;
3008                 xact_addr_filt = &pi->xact_addr_filt;
3009         }
3010 #ifdef DEV_NETMAP
3011         else if (ifp == pi->nm_ifp) {
3012                 viid = pi->nm_viid;
3013                 xact_addr_filt = &pi->nm_xact_addr_filt;
3014         }
3015 #endif
3016         if (flags & XGMAC_MTU)
3017                 mtu = ifp->if_mtu;
3018
3019         if (flags & XGMAC_PROMISC)
3020                 promisc = ifp->if_flags & IFF_PROMISC ? 1 : 0;
3021
3022         if (flags & XGMAC_ALLMULTI)
3023                 allmulti = ifp->if_flags & IFF_ALLMULTI ? 1 : 0;
3024
3025         if (flags & XGMAC_VLANEX)
3026                 vlanex = ifp->if_capenable & IFCAP_VLAN_HWTAGGING ? 1 : 0;
3027
3028         if (flags & (XGMAC_MTU|XGMAC_PROMISC|XGMAC_ALLMULTI|XGMAC_VLANEX)) {
3029                 rc = -t4_set_rxmode(sc, sc->mbox, viid, mtu, promisc, allmulti,
3030                     1, vlanex, false);
3031                 if (rc) {
3032                         if_printf(ifp, "set_rxmode (%x) failed: %d\n", flags,
3033                             rc);
3034                         return (rc);
3035                 }
3036         }
3037
3038         if (flags & XGMAC_UCADDR) {
3039                 uint8_t ucaddr[ETHER_ADDR_LEN];
3040
3041                 bcopy(IF_LLADDR(ifp), ucaddr, sizeof(ucaddr));
3042                 rc = t4_change_mac(sc, sc->mbox, viid, *xact_addr_filt, ucaddr,
3043                     true, true);
3044                 if (rc < 0) {
3045                         rc = -rc;
3046                         if_printf(ifp, "change_mac failed: %d\n", rc);
3047                         return (rc);
3048                 } else {
3049                         *xact_addr_filt = rc;
3050                         rc = 0;
3051                 }
3052         }
3053
3054         if (flags & XGMAC_MCADDRS) {
3055                 const uint8_t *mcaddr[FW_MAC_EXACT_CHUNK];
3056                 int del = 1;
3057                 uint64_t hash = 0;
3058                 struct ifmultiaddr *ifma;
3059                 int i = 0, j;
3060
3061                 if_maddr_rlock(ifp);
3062                 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
3063                         if (ifma->ifma_addr->sa_family != AF_LINK)
3064                                 continue;
3065                         mcaddr[i] =
3066                             LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
3067                         MPASS(ETHER_IS_MULTICAST(mcaddr[i]));
3068                         i++;
3069
3070                         if (i == FW_MAC_EXACT_CHUNK) {
3071                                 rc = t4_alloc_mac_filt(sc, sc->mbox, viid, del,
3072                                     i, mcaddr, NULL, &hash, 0);
3073                                 if (rc < 0) {
3074                                         rc = -rc;
3075                                         for (j = 0; j < i; j++) {
3076                                                 if_printf(ifp,
3077                                                     "failed to add mc address"
3078                                                     " %02x:%02x:%02x:"
3079                                                     "%02x:%02x:%02x rc=%d\n",
3080                                                     mcaddr[j][0], mcaddr[j][1],
3081                                                     mcaddr[j][2], mcaddr[j][3],
3082                                                     mcaddr[j][4], mcaddr[j][5],
3083                                                     rc);
3084                                         }
3085                                         goto mcfail;
3086                                 }
3087                                 del = 0;
3088                                 i = 0;
3089                         }
3090                 }
3091                 if (i > 0) {
3092                         rc = t4_alloc_mac_filt(sc, sc->mbox, viid, del, i,
3093                             mcaddr, NULL, &hash, 0);
3094                         if (rc < 0) {
3095                                 rc = -rc;
3096                                 for (j = 0; j < i; j++) {
3097                                         if_printf(ifp,
3098                                             "failed to add mc address"
3099                                             " %02x:%02x:%02x:"
3100                                             "%02x:%02x:%02x rc=%d\n",
3101                                             mcaddr[j][0], mcaddr[j][1],
3102                                             mcaddr[j][2], mcaddr[j][3],
3103                                             mcaddr[j][4], mcaddr[j][5],
3104                                             rc);
3105                                 }
3106                                 goto mcfail;
3107                         }
3108                 }
3109
3110                 rc = -t4_set_addr_hash(sc, sc->mbox, viid, 0, hash, 0);
3111                 if (rc != 0)
3112                         if_printf(ifp, "failed to set mc address hash: %d", rc);
3113 mcfail:
3114                 if_maddr_runlock(ifp);
3115         }
3116
3117         return (rc);
3118 }
3119
3120 /*
3121  * {begin|end}_synchronized_op must be called from the same thread.
3122  */
3123 int
3124 begin_synchronized_op(struct adapter *sc, struct port_info *pi, int flags,
3125     char *wmesg)
3126 {
3127         int rc, pri;
3128
3129 #ifdef WITNESS
3130         /* the caller thinks it's ok to sleep, but is it really? */
3131         if (flags & SLEEP_OK)
3132                 pause("t4slptst", 1);
3133 #endif
3134
3135         if (INTR_OK)
3136                 pri = PCATCH;
3137         else
3138                 pri = 0;
3139
3140         ADAPTER_LOCK(sc);
3141         for (;;) {
3142
3143                 if (pi && IS_DOOMED(pi)) {
3144                         rc = ENXIO;
3145                         goto done;
3146                 }
3147
3148                 if (!IS_BUSY(sc)) {
3149                         rc = 0;
3150                         break;
3151                 }
3152
3153                 if (!(flags & SLEEP_OK)) {
3154                         rc = EBUSY;
3155                         goto done;
3156                 }
3157
3158                 if (mtx_sleep(&sc->flags, &sc->sc_lock, pri, wmesg, 0)) {
3159                         rc = EINTR;
3160                         goto done;
3161                 }
3162         }
3163
3164         KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
3165         SET_BUSY(sc);
3166 #ifdef INVARIANTS
3167         sc->last_op = wmesg;
3168         sc->last_op_thr = curthread;
3169         sc->last_op_flags = flags;
3170 #endif
3171
3172 done:
3173         if (!(flags & HOLD_LOCK) || rc)
3174                 ADAPTER_UNLOCK(sc);
3175
3176         return (rc);
3177 }
3178
3179 /*
3180  * {begin|end}_synchronized_op must be called from the same thread.
3181  */
3182 void
3183 end_synchronized_op(struct adapter *sc, int flags)
3184 {
3185
3186         if (flags & LOCK_HELD)
3187                 ADAPTER_LOCK_ASSERT_OWNED(sc);
3188         else
3189                 ADAPTER_LOCK(sc);
3190
3191         KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
3192         CLR_BUSY(sc);
3193         wakeup(&sc->flags);
3194         ADAPTER_UNLOCK(sc);
3195 }
3196
3197 static int
3198 cxgbe_init_synchronized(struct port_info *pi)
3199 {
3200         struct adapter *sc = pi->adapter;
3201         struct ifnet *ifp = pi->ifp;
3202         int rc = 0, i;
3203         struct sge_txq *txq;
3204
3205         ASSERT_SYNCHRONIZED_OP(sc);
3206
3207         if (isset(&sc->open_device_map, pi->port_id)) {
3208                 KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING,
3209                     ("mismatch between open_device_map and if_drv_flags"));
3210                 return (0);     /* already running */
3211         }
3212
3213         if (!(sc->flags & FULL_INIT_DONE) &&
3214             ((rc = adapter_full_init(sc)) != 0))
3215                 return (rc);    /* error message displayed already */
3216
3217         if (!(pi->flags & PORT_INIT_DONE) &&
3218             ((rc = port_full_init(pi)) != 0))
3219                 return (rc); /* error message displayed already */
3220
3221         rc = update_mac_settings(ifp, XGMAC_ALL);
3222         if (rc)
3223                 goto done;      /* error message displayed already */
3224
3225         rc = -t4_enable_vi(sc, sc->mbox, pi->viid, true, true);
3226         if (rc != 0) {
3227                 if_printf(ifp, "enable_vi failed: %d\n", rc);
3228                 goto done;
3229         }
3230
3231         /*
3232          * Can't fail from this point onwards.  Review cxgbe_uninit_synchronized
3233          * if this changes.
3234          */
3235
3236         for_each_txq(pi, i, txq) {
3237                 TXQ_LOCK(txq);
3238                 txq->eq.flags |= EQ_ENABLED;
3239                 TXQ_UNLOCK(txq);
3240         }
3241
3242         /*
3243          * The first iq of the first port to come up is used for tracing.
3244          */
3245         if (sc->traceq < 0) {
3246                 sc->traceq = sc->sge.rxq[pi->first_rxq].iq.abs_id;
3247                 t4_write_reg(sc, is_t4(sc) ?  A_MPS_TRC_RSS_CONTROL :
3248                     A_MPS_T5_TRC_RSS_CONTROL, V_RSSCONTROL(pi->tx_chan) |
3249                     V_QUEUENUMBER(sc->traceq));
3250                 pi->flags |= HAS_TRACEQ;
3251         }
3252
3253         /* all ok */
3254         setbit(&sc->open_device_map, pi->port_id);
3255         PORT_LOCK(pi);
3256         ifp->if_drv_flags |= IFF_DRV_RUNNING;
3257         PORT_UNLOCK(pi);
3258
3259         callout_reset(&pi->tick, hz, cxgbe_tick, pi);
3260 done:
3261         if (rc != 0)
3262                 cxgbe_uninit_synchronized(pi);
3263
3264         return (rc);
3265 }
3266
3267 /*
3268  * Idempotent.
3269  */
3270 static int
3271 cxgbe_uninit_synchronized(struct port_info *pi)
3272 {
3273         struct adapter *sc = pi->adapter;
3274         struct ifnet *ifp = pi->ifp;
3275         int rc, i;
3276         struct sge_txq *txq;
3277
3278         ASSERT_SYNCHRONIZED_OP(sc);
3279
3280         if (!(pi->flags & PORT_INIT_DONE)) {
3281                 KASSERT(!(ifp->if_drv_flags & IFF_DRV_RUNNING),
3282                     ("uninited port is running"));
3283                 return (0);
3284         }
3285
3286         /*
3287          * Disable the VI so that all its data in either direction is discarded
3288          * by the MPS.  Leave everything else (the queues, interrupts, and 1Hz
3289          * tick) intact as the TP can deliver negative advice or data that it's
3290          * holding in its RAM (for an offloaded connection) even after the VI is
3291          * disabled.
3292          */
3293         rc = -t4_enable_vi(sc, sc->mbox, pi->viid, false, false);
3294         if (rc) {
3295                 if_printf(ifp, "disable_vi failed: %d\n", rc);
3296                 return (rc);
3297         }
3298
3299         for_each_txq(pi, i, txq) {
3300                 TXQ_LOCK(txq);
3301                 txq->eq.flags &= ~EQ_ENABLED;
3302                 TXQ_UNLOCK(txq);
3303         }
3304
3305         clrbit(&sc->open_device_map, pi->port_id);
3306         PORT_LOCK(pi);
3307         ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
3308         PORT_UNLOCK(pi);
3309
3310         pi->link_cfg.link_ok = 0;
3311         pi->link_cfg.speed = 0;
3312         pi->linkdnrc = -1;
3313         t4_os_link_changed(sc, pi->port_id, 0, -1);
3314
3315         return (0);
3316 }
3317
3318 /*
3319  * It is ok for this function to fail midway and return right away.  t4_detach
3320  * will walk the entire sc->irq list and clean up whatever is valid.
3321  */
3322 static int
3323 setup_intr_handlers(struct adapter *sc)
3324 {
3325         int rc, rid, p, q;
3326         char s[8];
3327         struct irq *irq;
3328         struct port_info *pi;
3329         struct sge_rxq *rxq;
3330 #ifdef TCP_OFFLOAD
3331         struct sge_ofld_rxq *ofld_rxq;
3332 #endif
3333 #ifdef DEV_NETMAP
3334         struct sge_nm_rxq *nm_rxq;
3335 #endif
3336
3337         /*
3338          * Setup interrupts.
3339          */
3340         irq = &sc->irq[0];
3341         rid = sc->intr_type == INTR_INTX ? 0 : 1;
3342         if (sc->intr_count == 1)
3343                 return (t4_alloc_irq(sc, irq, rid, t4_intr_all, sc, "all"));
3344
3345         /* Multiple interrupts. */
3346         KASSERT(sc->intr_count >= T4_EXTRA_INTR + sc->params.nports,
3347             ("%s: too few intr.", __func__));
3348
3349         /* The first one is always error intr */
3350         rc = t4_alloc_irq(sc, irq, rid, t4_intr_err, sc, "err");
3351         if (rc != 0)
3352                 return (rc);
3353         irq++;
3354         rid++;
3355
3356         /* The second one is always the firmware event queue */
3357         rc = t4_alloc_irq(sc, irq, rid, t4_intr_evt, &sc->sge.fwq, "evt");
3358         if (rc != 0)
3359                 return (rc);
3360         irq++;
3361         rid++;
3362
3363         for_each_port(sc, p) {
3364                 pi = sc->port[p];
3365
3366                 if (pi->flags & INTR_RXQ) {
3367                         for_each_rxq(pi, q, rxq) {
3368                                 snprintf(s, sizeof(s), "%d.%d", p, q);
3369                                 rc = t4_alloc_irq(sc, irq, rid, t4_intr, rxq,
3370                                     s);
3371                                 if (rc != 0)
3372                                         return (rc);
3373                                 irq++;
3374                                 rid++;
3375                         }
3376                 }
3377 #ifdef TCP_OFFLOAD
3378                 if (pi->flags & INTR_OFLD_RXQ) {
3379                         for_each_ofld_rxq(pi, q, ofld_rxq) {
3380                                 snprintf(s, sizeof(s), "%d,%d", p, q);
3381                                 rc = t4_alloc_irq(sc, irq, rid, t4_intr,
3382                                     ofld_rxq, s);
3383                                 if (rc != 0)
3384                                         return (rc);
3385                                 irq++;
3386                                 rid++;
3387                         }
3388                 }
3389 #endif
3390 #ifdef DEV_NETMAP
3391                 if (pi->flags & INTR_NM_RXQ) {
3392                         for_each_nm_rxq(pi, q, nm_rxq) {
3393                                 snprintf(s, sizeof(s), "%d-%d", p, q);
3394                                 rc = t4_alloc_irq(sc, irq, rid, t4_nm_intr,
3395                                     nm_rxq, s);
3396                                 if (rc != 0)
3397                                         return (rc);
3398                                 irq++;
3399                                 rid++;
3400                         }
3401                 }
3402 #endif
3403         }
3404         MPASS(irq == &sc->irq[sc->intr_count]);
3405
3406         return (0);
3407 }
3408
3409 int
3410 adapter_full_init(struct adapter *sc)
3411 {
3412         int rc, i;
3413
3414         ASSERT_SYNCHRONIZED_OP(sc);
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         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "debug_flags", CTLFLAG_RW,
4610             &sc->debug_flags, 0, "flags to enable runtime debugging");
4611
4612 #ifdef SBUF_DRAIN
4613         /*
4614          * dev.t4nex.X.misc.  Marked CTLFLAG_SKIP to avoid information overload.
4615          */
4616         oid = SYSCTL_ADD_NODE(ctx, c0, OID_AUTO, "misc",
4617             CTLFLAG_RD | CTLFLAG_SKIP, NULL,
4618             "logs and miscellaneous information");
4619         children = SYSCTL_CHILDREN(oid);
4620
4621         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cctrl",
4622             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4623             sysctl_cctrl, "A", "congestion control");
4624
4625         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_tp0",
4626             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4627             sysctl_cim_ibq_obq, "A", "CIM IBQ 0 (TP0)");
4628
4629         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_tp1",
4630             CTLTYPE_STRING | CTLFLAG_RD, sc, 1,
4631             sysctl_cim_ibq_obq, "A", "CIM IBQ 1 (TP1)");
4632
4633         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_ulp",
4634             CTLTYPE_STRING | CTLFLAG_RD, sc, 2,
4635             sysctl_cim_ibq_obq, "A", "CIM IBQ 2 (ULP)");
4636
4637         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_sge0",
4638             CTLTYPE_STRING | CTLFLAG_RD, sc, 3,
4639             sysctl_cim_ibq_obq, "A", "CIM IBQ 3 (SGE0)");
4640
4641         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_sge1",
4642             CTLTYPE_STRING | CTLFLAG_RD, sc, 4,
4643             sysctl_cim_ibq_obq, "A", "CIM IBQ 4 (SGE1)");
4644
4645         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_ncsi",
4646             CTLTYPE_STRING | CTLFLAG_RD, sc, 5,
4647             sysctl_cim_ibq_obq, "A", "CIM IBQ 5 (NCSI)");
4648
4649         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_la",
4650             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4651             sysctl_cim_la, "A", "CIM logic analyzer");
4652
4653         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ma_la",
4654             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4655             sysctl_cim_ma_la, "A", "CIM MA logic analyzer");
4656
4657         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp0",
4658             CTLTYPE_STRING | CTLFLAG_RD, sc, 0 + CIM_NUM_IBQ,
4659             sysctl_cim_ibq_obq, "A", "CIM OBQ 0 (ULP0)");
4660
4661         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp1",
4662             CTLTYPE_STRING | CTLFLAG_RD, sc, 1 + CIM_NUM_IBQ,
4663             sysctl_cim_ibq_obq, "A", "CIM OBQ 1 (ULP1)");
4664
4665         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp2",
4666             CTLTYPE_STRING | CTLFLAG_RD, sc, 2 + CIM_NUM_IBQ,
4667             sysctl_cim_ibq_obq, "A", "CIM OBQ 2 (ULP2)");
4668
4669         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp3",
4670             CTLTYPE_STRING | CTLFLAG_RD, sc, 3 + CIM_NUM_IBQ,
4671             sysctl_cim_ibq_obq, "A", "CIM OBQ 3 (ULP3)");
4672
4673         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge",
4674             CTLTYPE_STRING | CTLFLAG_RD, sc, 4 + CIM_NUM_IBQ,
4675             sysctl_cim_ibq_obq, "A", "CIM OBQ 4 (SGE)");
4676
4677         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ncsi",
4678             CTLTYPE_STRING | CTLFLAG_RD, sc, 5 + CIM_NUM_IBQ,
4679             sysctl_cim_ibq_obq, "A", "CIM OBQ 5 (NCSI)");
4680
4681         if (is_t5(sc)) {
4682                 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge0_rx",
4683                     CTLTYPE_STRING | CTLFLAG_RD, sc, 6 + CIM_NUM_IBQ,
4684                     sysctl_cim_ibq_obq, "A", "CIM OBQ 6 (SGE0-RX)");
4685
4686                 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge1_rx",
4687                     CTLTYPE_STRING | CTLFLAG_RD, sc, 7 + CIM_NUM_IBQ,
4688                     sysctl_cim_ibq_obq, "A", "CIM OBQ 7 (SGE1-RX)");
4689         }
4690
4691         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_pif_la",
4692             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4693             sysctl_cim_pif_la, "A", "CIM PIF logic analyzer");
4694
4695         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_qcfg",
4696             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4697             sysctl_cim_qcfg, "A", "CIM queue configuration");
4698
4699         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cpl_stats",
4700             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4701             sysctl_cpl_stats, "A", "CPL statistics");
4702
4703         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ddp_stats",
4704             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4705             sysctl_ddp_stats, "A", "non-TCP DDP statistics");
4706
4707         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "devlog",
4708             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4709             sysctl_devlog, "A", "firmware's device log");
4710
4711         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fcoe_stats",
4712             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4713             sysctl_fcoe_stats, "A", "FCoE statistics");
4714
4715         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "hw_sched",
4716             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4717             sysctl_hw_sched, "A", "hardware scheduler ");
4718
4719         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "l2t",
4720             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4721             sysctl_l2t, "A", "hardware L2 table");
4722
4723         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "lb_stats",
4724             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4725             sysctl_lb_stats, "A", "loopback statistics");
4726
4727         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "meminfo",
4728             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4729             sysctl_meminfo, "A", "memory regions");
4730
4731         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "mps_tcam",
4732             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4733             sysctl_mps_tcam, "A", "MPS TCAM entries");
4734
4735         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "path_mtus",
4736             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4737             sysctl_path_mtus, "A", "path MTUs");
4738
4739         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "pm_stats",
4740             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4741             sysctl_pm_stats, "A", "PM statistics");
4742
4743         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rdma_stats",
4744             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4745             sysctl_rdma_stats, "A", "RDMA statistics");
4746
4747         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tcp_stats",
4748             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4749             sysctl_tcp_stats, "A", "TCP statistics");
4750
4751         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tids",
4752             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4753             sysctl_tids, "A", "TID information");
4754
4755         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_err_stats",
4756             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4757             sysctl_tp_err_stats, "A", "TP error statistics");
4758
4759         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_la",
4760             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4761             sysctl_tp_la, "A", "TP logic analyzer");
4762
4763         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_rate",
4764             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4765             sysctl_tx_rate, "A", "Tx rate");
4766
4767         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ulprx_la",
4768             CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4769             sysctl_ulprx_la, "A", "ULPRX logic analyzer");
4770
4771         if (is_t5(sc)) {
4772                 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "wcwr_stats",
4773                     CTLTYPE_STRING | CTLFLAG_RD, sc, 0,
4774                     sysctl_wcwr_stats, "A", "write combined work requests");
4775         }
4776 #endif
4777
4778 #ifdef TCP_OFFLOAD
4779         if (is_offload(sc)) {
4780                 /*
4781                  * dev.t4nex.X.toe.
4782                  */
4783                 oid = SYSCTL_ADD_NODE(ctx, c0, OID_AUTO, "toe", CTLFLAG_RD,
4784                     NULL, "TOE parameters");
4785                 children = SYSCTL_CHILDREN(oid);
4786
4787                 sc->tt.sndbuf = 256 * 1024;
4788                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "sndbuf", CTLFLAG_RW,
4789                     &sc->tt.sndbuf, 0, "max hardware send buffer size");
4790
4791                 sc->tt.ddp = 0;
4792                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ddp", CTLFLAG_RW,
4793                     &sc->tt.ddp, 0, "DDP allowed");
4794
4795                 sc->tt.indsz = G_INDICATESIZE(t4_read_reg(sc, A_TP_PARA_REG5));
4796                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "indsz", CTLFLAG_RW,
4797                     &sc->tt.indsz, 0, "DDP max indicate size allowed");
4798
4799                 sc->tt.ddp_thres =
4800                     G_RXCOALESCESIZE(t4_read_reg(sc, A_TP_PARA_REG2));
4801                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ddp_thres", CTLFLAG_RW,
4802                     &sc->tt.ddp_thres, 0, "DDP threshold");
4803
4804                 sc->tt.rx_coalesce = 1;
4805                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "rx_coalesce",
4806                     CTLFLAG_RW, &sc->tt.rx_coalesce, 0, "receive coalescing");
4807
4808                 sc->tt.tx_align = 1;
4809                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "tx_align",
4810                     CTLFLAG_RW, &sc->tt.tx_align, 0, "chop and align payload");
4811         }
4812 #endif
4813
4814
4815         return (0);
4816 }
4817
4818 static int
4819 cxgbe_sysctls(struct port_info *pi)
4820 {
4821         struct sysctl_ctx_list *ctx;
4822         struct sysctl_oid *oid;
4823         struct sysctl_oid_list *children;
4824         struct adapter *sc = pi->adapter;
4825
4826         ctx = device_get_sysctl_ctx(pi->dev);
4827
4828         /*
4829          * dev.cxgbe.X.
4830          */
4831         oid = device_get_sysctl_tree(pi->dev);
4832         children = SYSCTL_CHILDREN(oid);
4833
4834         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "linkdnrc", CTLTYPE_STRING |
4835            CTLFLAG_RD, pi, 0, sysctl_linkdnrc, "A", "reason why link is down");
4836         if (pi->port_type == FW_PORT_TYPE_BT_XAUI) {
4837                 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature",
4838                     CTLTYPE_INT | CTLFLAG_RD, pi, 0, sysctl_btphy, "I",
4839                     "PHY temperature (in Celsius)");
4840                 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fw_version",
4841                     CTLTYPE_INT | CTLFLAG_RD, pi, 1, sysctl_btphy, "I",
4842                     "PHY firmware version");
4843         }
4844         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nrxq", CTLFLAG_RD,
4845             &pi->nrxq, 0, "# of rx queues");
4846         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "ntxq", CTLFLAG_RD,
4847             &pi->ntxq, 0, "# of tx queues");
4848         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_rxq", CTLFLAG_RD,
4849             &pi->first_rxq, 0, "index of first rx queue");
4850         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_txq", CTLFLAG_RD,
4851             &pi->first_txq, 0, "index of first tx queue");
4852         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rsrv_noflowq", CTLTYPE_INT |
4853             CTLFLAG_RW, pi, 0, sysctl_noflowq, "IU",
4854             "Reserve queue 0 for non-flowid packets");
4855
4856 #ifdef TCP_OFFLOAD
4857         if (is_offload(sc)) {
4858                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldrxq", CTLFLAG_RD,
4859                     &pi->nofldrxq, 0,
4860                     "# of rx queues for offloaded TCP connections");
4861                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldtxq", CTLFLAG_RD,
4862                     &pi->nofldtxq, 0,
4863                     "# of tx queues for offloaded TCP connections");
4864                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_rxq",
4865                     CTLFLAG_RD, &pi->first_ofld_rxq, 0,
4866                     "index of first TOE rx queue");
4867                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_txq",
4868                     CTLFLAG_RD, &pi->first_ofld_txq, 0,
4869                     "index of first TOE tx queue");
4870         }
4871 #endif
4872 #ifdef DEV_NETMAP
4873         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nnmrxq", CTLFLAG_RD,
4874             &pi->nnmrxq, 0, "# of rx queues for netmap");
4875         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nnmtxq", CTLFLAG_RD,
4876             &pi->nnmtxq, 0, "# of tx queues for netmap");
4877         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_nm_rxq",
4878             CTLFLAG_RD, &pi->first_nm_rxq, 0,
4879             "index of first netmap rx queue");
4880         SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_nm_txq",
4881             CTLFLAG_RD, &pi->first_nm_txq, 0,
4882             "index of first netmap tx queue");
4883 #endif
4884
4885         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_tmr_idx",
4886             CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_holdoff_tmr_idx, "I",
4887             "holdoff timer index");
4888         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pktc_idx",
4889             CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_holdoff_pktc_idx, "I",
4890             "holdoff packet counter index");
4891
4892         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_rxq",
4893             CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_qsize_rxq, "I",
4894             "rx queue size");
4895         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_txq",
4896             CTLTYPE_INT | CTLFLAG_RW, pi, 0, sysctl_qsize_txq, "I",
4897             "tx queue size");
4898
4899         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "pause_settings",
4900             CTLTYPE_STRING | CTLFLAG_RW, pi, PAUSE_TX, sysctl_pause_settings,
4901             "A", "PAUSE settings (bit 0 = rx_pause, bit 1 = tx_pause)");
4902
4903         /*
4904          * dev.cxgbe.X.stats.
4905          */
4906         oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "stats", CTLFLAG_RD,
4907             NULL, "port statistics");
4908         children = SYSCTL_CHILDREN(oid);
4909         SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "tx_parse_error", CTLFLAG_RD,
4910             &pi->tx_parse_error, 0,
4911             "# of tx packets with invalid length or # of segments");
4912
4913 #define SYSCTL_ADD_T4_REG64(pi, name, desc, reg) \
4914         SYSCTL_ADD_OID(ctx, children, OID_AUTO, name, \
4915             CTLTYPE_U64 | CTLFLAG_RD, sc, reg, \
4916             sysctl_handle_t4_reg64, "QU", desc)
4917
4918         SYSCTL_ADD_T4_REG64(pi, "tx_octets", "# of octets in good frames",
4919             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BYTES_L));
4920         SYSCTL_ADD_T4_REG64(pi, "tx_frames", "total # of good frames",
4921             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_FRAMES_L));
4922         SYSCTL_ADD_T4_REG64(pi, "tx_bcast_frames", "# of broadcast frames",
4923             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BCAST_L));
4924         SYSCTL_ADD_T4_REG64(pi, "tx_mcast_frames", "# of multicast frames",
4925             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_MCAST_L));
4926         SYSCTL_ADD_T4_REG64(pi, "tx_ucast_frames", "# of unicast frames",
4927             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_UCAST_L));
4928         SYSCTL_ADD_T4_REG64(pi, "tx_error_frames", "# of error frames",
4929             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_ERROR_L));
4930         SYSCTL_ADD_T4_REG64(pi, "tx_frames_64",
4931             "# of tx frames in this range",
4932             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_64B_L));
4933         SYSCTL_ADD_T4_REG64(pi, "tx_frames_65_127",
4934             "# of tx frames in this range",
4935             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_65B_127B_L));
4936         SYSCTL_ADD_T4_REG64(pi, "tx_frames_128_255",
4937             "# of tx frames in this range",
4938             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_128B_255B_L));
4939         SYSCTL_ADD_T4_REG64(pi, "tx_frames_256_511",
4940             "# of tx frames in this range",
4941             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_256B_511B_L));
4942         SYSCTL_ADD_T4_REG64(pi, "tx_frames_512_1023",
4943             "# of tx frames in this range",
4944             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_512B_1023B_L));
4945         SYSCTL_ADD_T4_REG64(pi, "tx_frames_1024_1518",
4946             "# of tx frames in this range",
4947             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1024B_1518B_L));
4948         SYSCTL_ADD_T4_REG64(pi, "tx_frames_1519_max",
4949             "# of tx frames in this range",
4950             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1519B_MAX_L));
4951         SYSCTL_ADD_T4_REG64(pi, "tx_drop", "# of dropped tx frames",
4952             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_DROP_L));
4953         SYSCTL_ADD_T4_REG64(pi, "tx_pause", "# of pause frames transmitted",
4954             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PAUSE_L));
4955         SYSCTL_ADD_T4_REG64(pi, "tx_ppp0", "# of PPP prio 0 frames transmitted",
4956             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP0_L));
4957         SYSCTL_ADD_T4_REG64(pi, "tx_ppp1", "# of PPP prio 1 frames transmitted",
4958             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP1_L));
4959         SYSCTL_ADD_T4_REG64(pi, "tx_ppp2", "# of PPP prio 2 frames transmitted",
4960             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP2_L));
4961         SYSCTL_ADD_T4_REG64(pi, "tx_ppp3", "# of PPP prio 3 frames transmitted",
4962             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP3_L));
4963         SYSCTL_ADD_T4_REG64(pi, "tx_ppp4", "# of PPP prio 4 frames transmitted",
4964             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP4_L));
4965         SYSCTL_ADD_T4_REG64(pi, "tx_ppp5", "# of PPP prio 5 frames transmitted",
4966             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP5_L));
4967         SYSCTL_ADD_T4_REG64(pi, "tx_ppp6", "# of PPP prio 6 frames transmitted",
4968             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP6_L));
4969         SYSCTL_ADD_T4_REG64(pi, "tx_ppp7", "# of PPP prio 7 frames transmitted",
4970             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP7_L));
4971
4972         SYSCTL_ADD_T4_REG64(pi, "rx_octets", "# of octets in good frames",
4973             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BYTES_L));
4974         SYSCTL_ADD_T4_REG64(pi, "rx_frames", "total # of good frames",
4975             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_FRAMES_L));
4976         SYSCTL_ADD_T4_REG64(pi, "rx_bcast_frames", "# of broadcast frames",
4977             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BCAST_L));
4978         SYSCTL_ADD_T4_REG64(pi, "rx_mcast_frames", "# of multicast frames",
4979             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MCAST_L));
4980         SYSCTL_ADD_T4_REG64(pi, "rx_ucast_frames", "# of unicast frames",
4981             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_UCAST_L));
4982         SYSCTL_ADD_T4_REG64(pi, "rx_too_long", "# of frames exceeding MTU",
4983             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L));
4984         SYSCTL_ADD_T4_REG64(pi, "rx_jabber", "# of jabber frames",
4985             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L));
4986         SYSCTL_ADD_T4_REG64(pi, "rx_fcs_err",
4987             "# of frames received with bad FCS",
4988             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L));
4989         SYSCTL_ADD_T4_REG64(pi, "rx_len_err",
4990             "# of frames received with length error",
4991             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L));
4992         SYSCTL_ADD_T4_REG64(pi, "rx_symbol_err", "symbol errors",
4993             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L));
4994         SYSCTL_ADD_T4_REG64(pi, "rx_runt", "# of short frames received",
4995             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LESS_64B_L));
4996         SYSCTL_ADD_T4_REG64(pi, "rx_frames_64",
4997             "# of rx frames in this range",
4998             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_64B_L));
4999         SYSCTL_ADD_T4_REG64(pi, "rx_frames_65_127",
5000             "# of rx frames in this range",
5001             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_65B_127B_L));
5002         SYSCTL_ADD_T4_REG64(pi, "rx_frames_128_255",
5003             "# of rx frames in this range",
5004             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_128B_255B_L));
5005         SYSCTL_ADD_T4_REG64(pi, "rx_frames_256_511",
5006             "# of rx frames in this range",
5007             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_256B_511B_L));
5008         SYSCTL_ADD_T4_REG64(pi, "rx_frames_512_1023",
5009             "# of rx frames in this range",
5010             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_512B_1023B_L));
5011         SYSCTL_ADD_T4_REG64(pi, "rx_frames_1024_1518",
5012             "# of rx frames in this range",
5013             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1024B_1518B_L));
5014         SYSCTL_ADD_T4_REG64(pi, "rx_frames_1519_max",
5015             "# of rx frames in this range",
5016             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1519B_MAX_L));
5017         SYSCTL_ADD_T4_REG64(pi, "rx_pause", "# of pause frames received",
5018             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PAUSE_L));
5019         SYSCTL_ADD_T4_REG64(pi, "rx_ppp0", "# of PPP prio 0 frames received",
5020             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP0_L));
5021         SYSCTL_ADD_T4_REG64(pi, "rx_ppp1", "# of PPP prio 1 frames received",
5022             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP1_L));
5023         SYSCTL_ADD_T4_REG64(pi, "rx_ppp2", "# of PPP prio 2 frames received",
5024             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP2_L));
5025         SYSCTL_ADD_T4_REG64(pi, "rx_ppp3", "# of PPP prio 3 frames received",
5026             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP3_L));
5027         SYSCTL_ADD_T4_REG64(pi, "rx_ppp4", "# of PPP prio 4 frames received",
5028             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP4_L));
5029         SYSCTL_ADD_T4_REG64(pi, "rx_ppp5", "# of PPP prio 5 frames received",
5030             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP5_L));
5031         SYSCTL_ADD_T4_REG64(pi, "rx_ppp6", "# of PPP prio 6 frames received",
5032             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP6_L));
5033         SYSCTL_ADD_T4_REG64(pi, "rx_ppp7", "# of PPP prio 7 frames received",
5034             PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP7_L));
5035
5036 #undef SYSCTL_ADD_T4_REG64
5037
5038 #define SYSCTL_ADD_T4_PORTSTAT(name, desc) \
5039         SYSCTL_ADD_UQUAD(ctx, children, OID_AUTO, #name, CTLFLAG_RD, \
5040             &pi->stats.name, desc)
5041
5042         /* We get these from port_stats and they may be stale by upto 1s */
5043         SYSCTL_ADD_T4_PORTSTAT(rx_ovflow0,
5044             "# drops due to buffer-group 0 overflows");
5045         SYSCTL_ADD_T4_PORTSTAT(rx_ovflow1,
5046             "# drops due to buffer-group 1 overflows");
5047         SYSCTL_ADD_T4_PORTSTAT(rx_ovflow2,
5048             "# drops due to buffer-group 2 overflows");
5049         SYSCTL_ADD_T4_PORTSTAT(rx_ovflow3,
5050             "# drops due to buffer-group 3 overflows");
5051         SYSCTL_ADD_T4_PORTSTAT(rx_trunc0,
5052             "# of buffer-group 0 truncated packets");
5053         SYSCTL_ADD_T4_PORTSTAT(rx_trunc1,
5054             "# of buffer-group 1 truncated packets");
5055         SYSCTL_ADD_T4_PORTSTAT(rx_trunc2,
5056             "# of buffer-group 2 truncated packets");
5057         SYSCTL_ADD_T4_PORTSTAT(rx_trunc3,
5058             "# of buffer-group 3 truncated packets");
5059
5060 #undef SYSCTL_ADD_T4_PORTSTAT
5061
5062         return (0);
5063 }
5064
5065 static int
5066 sysctl_int_array(SYSCTL_HANDLER_ARGS)
5067 {
5068         int rc, *i, space = 0;
5069         struct sbuf sb;
5070
5071         sbuf_new_for_sysctl(&sb, NULL, 64, req);
5072         for (i = arg1; arg2; arg2 -= sizeof(int), i++) {
5073                 if (space)
5074                         sbuf_printf(&sb, " ");
5075                 sbuf_printf(&sb, "%d", *i);
5076                 space = 1;
5077         }
5078         rc = sbuf_finish(&sb);
5079         sbuf_delete(&sb);
5080         return (rc);
5081 }
5082
5083 static int
5084 sysctl_bitfield(SYSCTL_HANDLER_ARGS)
5085 {
5086         int rc;
5087         struct sbuf *sb;
5088
5089         rc = sysctl_wire_old_buffer(req, 0);
5090         if (rc != 0)
5091                 return(rc);
5092
5093         sb = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5094         if (sb == NULL)
5095                 return (ENOMEM);
5096
5097         sbuf_printf(sb, "%b", (int)arg2, (char *)arg1);
5098         rc = sbuf_finish(sb);
5099         sbuf_delete(sb);
5100
5101         return (rc);
5102 }
5103
5104 static int
5105 sysctl_btphy(SYSCTL_HANDLER_ARGS)
5106 {
5107         struct port_info *pi = arg1;
5108         int op = arg2;
5109         struct adapter *sc = pi->adapter;
5110         u_int v;
5111         int rc;
5112
5113         rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4btt");
5114         if (rc)
5115                 return (rc);
5116         /* XXX: magic numbers */
5117         rc = -t4_mdio_rd(sc, sc->mbox, pi->mdio_addr, 0x1e, op ? 0x20 : 0xc820,
5118             &v);
5119         end_synchronized_op(sc, 0);
5120         if (rc)
5121                 return (rc);
5122         if (op == 0)
5123                 v /= 256;
5124
5125         rc = sysctl_handle_int(oidp, &v, 0, req);
5126         return (rc);
5127 }
5128
5129 static int
5130 sysctl_noflowq(SYSCTL_HANDLER_ARGS)
5131 {
5132         struct port_info *pi = arg1;
5133         int rc, val;
5134
5135         val = pi->rsrv_noflowq;
5136         rc = sysctl_handle_int(oidp, &val, 0, req);
5137         if (rc != 0 || req->newptr == NULL)
5138                 return (rc);
5139
5140         if ((val >= 1) && (pi->ntxq > 1))
5141                 pi->rsrv_noflowq = 1;
5142         else
5143                 pi->rsrv_noflowq = 0;
5144
5145         return (rc);
5146 }
5147
5148 static int
5149 sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS)
5150 {
5151         struct port_info *pi = arg1;
5152         struct adapter *sc = pi->adapter;
5153         int idx, rc, i;
5154         struct sge_rxq *rxq;
5155 #ifdef TCP_OFFLOAD
5156         struct sge_ofld_rxq *ofld_rxq;
5157 #endif
5158         uint8_t v;
5159
5160         idx = pi->tmr_idx;
5161
5162         rc = sysctl_handle_int(oidp, &idx, 0, req);
5163         if (rc != 0 || req->newptr == NULL)
5164                 return (rc);
5165
5166         if (idx < 0 || idx >= SGE_NTIMERS)
5167                 return (EINVAL);
5168
5169         rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5170             "t4tmr");
5171         if (rc)
5172                 return (rc);
5173
5174         v = V_QINTR_TIMER_IDX(idx) | V_QINTR_CNT_EN(pi->pktc_idx != -1);
5175         for_each_rxq(pi, i, rxq) {
5176 #ifdef atomic_store_rel_8
5177                 atomic_store_rel_8(&rxq->iq.intr_params, v);
5178 #else
5179                 rxq->iq.intr_params = v;
5180 #endif
5181         }
5182 #ifdef TCP_OFFLOAD
5183         for_each_ofld_rxq(pi, i, ofld_rxq) {
5184 #ifdef atomic_store_rel_8
5185                 atomic_store_rel_8(&ofld_rxq->iq.intr_params, v);
5186 #else
5187                 ofld_rxq->iq.intr_params = v;
5188 #endif
5189         }
5190 #endif
5191         pi->tmr_idx = idx;
5192
5193         end_synchronized_op(sc, LOCK_HELD);
5194         return (0);
5195 }
5196
5197 static int
5198 sysctl_holdoff_pktc_idx(SYSCTL_HANDLER_ARGS)
5199 {
5200         struct port_info *pi = arg1;
5201         struct adapter *sc = pi->adapter;
5202         int idx, rc;
5203
5204         idx = pi->pktc_idx;
5205
5206         rc = sysctl_handle_int(oidp, &idx, 0, req);
5207         if (rc != 0 || req->newptr == NULL)
5208                 return (rc);
5209
5210         if (idx < -1 || idx >= SGE_NCOUNTERS)
5211                 return (EINVAL);
5212
5213         rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5214             "t4pktc");
5215         if (rc)
5216                 return (rc);
5217
5218         if (pi->flags & PORT_INIT_DONE)
5219                 rc = EBUSY; /* cannot be changed once the queues are created */
5220         else
5221                 pi->pktc_idx = idx;
5222
5223         end_synchronized_op(sc, LOCK_HELD);
5224         return (rc);
5225 }
5226
5227 static int
5228 sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS)
5229 {
5230         struct port_info *pi = arg1;
5231         struct adapter *sc = pi->adapter;
5232         int qsize, rc;
5233
5234         qsize = pi->qsize_rxq;
5235
5236         rc = sysctl_handle_int(oidp, &qsize, 0, req);
5237         if (rc != 0 || req->newptr == NULL)
5238                 return (rc);
5239
5240         if (qsize < 128 || (qsize & 7))
5241                 return (EINVAL);
5242
5243         rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5244             "t4rxqs");
5245         if (rc)
5246                 return (rc);
5247
5248         if (pi->flags & PORT_INIT_DONE)
5249                 rc = EBUSY; /* cannot be changed once the queues are created */
5250         else
5251                 pi->qsize_rxq = qsize;
5252
5253         end_synchronized_op(sc, LOCK_HELD);
5254         return (rc);
5255 }
5256
5257 static int
5258 sysctl_qsize_txq(SYSCTL_HANDLER_ARGS)
5259 {
5260         struct port_info *pi = arg1;
5261         struct adapter *sc = pi->adapter;
5262         int qsize, rc;
5263
5264         qsize = pi->qsize_txq;
5265
5266         rc = sysctl_handle_int(oidp, &qsize, 0, req);
5267         if (rc != 0 || req->newptr == NULL)
5268                 return (rc);
5269
5270         if (qsize < 128 || qsize > 65536)
5271                 return (EINVAL);
5272
5273         rc = begin_synchronized_op(sc, pi, HOLD_LOCK | SLEEP_OK | INTR_OK,
5274             "t4txqs");
5275         if (rc)
5276                 return (rc);
5277
5278         if (pi->flags & PORT_INIT_DONE)
5279                 rc = EBUSY; /* cannot be changed once the queues are created */
5280         else
5281                 pi->qsize_txq = qsize;
5282
5283         end_synchronized_op(sc, LOCK_HELD);
5284         return (rc);
5285 }
5286
5287 static int
5288 sysctl_pause_settings(SYSCTL_HANDLER_ARGS)
5289 {
5290         struct port_info *pi = arg1;
5291         struct adapter *sc = pi->adapter;
5292         struct link_config *lc = &pi->link_cfg;
5293         int rc;
5294
5295         if (req->newptr == NULL) {
5296                 struct sbuf *sb;
5297                 static char *bits = "\20\1PAUSE_RX\2PAUSE_TX";
5298
5299                 rc = sysctl_wire_old_buffer(req, 0);
5300                 if (rc != 0)
5301                         return(rc);
5302
5303                 sb = sbuf_new_for_sysctl(NULL, NULL, 128, req);
5304                 if (sb == NULL)
5305                         return (ENOMEM);
5306
5307                 sbuf_printf(sb, "%b", lc->fc & (PAUSE_TX | PAUSE_RX), bits);
5308                 rc = sbuf_finish(sb);
5309                 sbuf_delete(sb);
5310         } else {
5311                 char s[2];
5312                 int n;
5313
5314                 s[0] = '0' + (lc->requested_fc & (PAUSE_TX | PAUSE_RX));
5315                 s[1] = 0;
5316
5317                 rc = sysctl_handle_string(oidp, s, sizeof(s), req);
5318                 if (rc != 0)
5319                         return(rc);
5320
5321                 if (s[1] != 0)
5322                         return (EINVAL);
5323                 if (s[0] < '0' || s[0] > '9')
5324                         return (EINVAL);        /* not a number */
5325                 n = s[0] - '0';
5326                 if (n & ~(PAUSE_TX | PAUSE_RX))
5327                         return (EINVAL);        /* some other bit is set too */
5328
5329                 rc = begin_synchronized_op(sc, pi, SLEEP_OK | INTR_OK, "t4PAUSE");
5330                 if (rc)
5331                         return (rc);
5332                 if ((lc->requested_fc & (PAUSE_TX | PAUSE_RX)) != n) {
5333                         int link_ok = lc->link_ok;
5334
5335                         lc->requested_fc &= ~(PAUSE_TX | PAUSE_RX);
5336                         lc->requested_fc |= n;
5337                         rc = -t4_link_start(sc, sc->mbox, pi->tx_chan, lc);
5338                         lc->link_ok = link_ok;  /* restore */
5339                 }
5340                 end_synchronized_op(sc, 0);
5341         }
5342
5343         return (rc);
5344 }
5345
5346 static int
5347 sysctl_handle_t4_reg64(SYSCTL_HANDLER_ARGS)
5348 {
5349         struct adapter *sc = arg1;
5350         int reg = arg2;
5351         uint64_t val;
5352
5353         val = t4_read_reg64(sc, reg);
5354
5355         return (sysctl_handle_64(oidp, &val, 0, req));
5356 }
5357
5358 static int
5359 sysctl_temperature(SYSCTL_HANDLER_ARGS)
5360 {
5361         struct adapter *sc = arg1;
5362         int rc, t;
5363         uint32_t param, val;
5364
5365         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4temp");
5366         if (rc)
5367                 return (rc);
5368         param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
5369             V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_DIAG) |
5370             V_FW_PARAMS_PARAM_Y(FW_PARAM_DEV_DIAG_TMP);
5371         rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
5372         end_synchronized_op(sc, 0);
5373         if (rc)
5374                 return (rc);
5375
5376         /* unknown is returned as 0 but we display -1 in that case */
5377         t = val == 0 ? -1 : val;
5378
5379         rc = sysctl_handle_int(oidp, &t, 0, req);
5380         return (rc);
5381 }
5382
5383 #ifdef SBUF_DRAIN
5384 static int
5385 sysctl_cctrl(SYSCTL_HANDLER_ARGS)
5386 {
5387         struct adapter *sc = arg1;
5388         struct sbuf *sb;
5389         int rc, i;
5390         uint16_t incr[NMTUS][NCCTRL_WIN];
5391         static const char *dec_fac[] = {
5392                 "0.5", "0.5625", "0.625", "0.6875", "0.75", "0.8125", "0.875",
5393                 "0.9375"
5394         };
5395
5396         rc = sysctl_wire_old_buffer(req, 0);
5397         if (rc != 0)
5398                 return (rc);
5399
5400         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5401         if (sb == NULL)
5402                 return (ENOMEM);
5403
5404         t4_read_cong_tbl(sc, incr);
5405
5406         for (i = 0; i < NCCTRL_WIN; ++i) {
5407                 sbuf_printf(sb, "%2d: %4u %4u %4u %4u %4u %4u %4u %4u\n", i,
5408                     incr[0][i], incr[1][i], incr[2][i], incr[3][i], incr[4][i],
5409                     incr[5][i], incr[6][i], incr[7][i]);
5410                 sbuf_printf(sb, "%8u %4u %4u %4u %4u %4u %4u %4u %5u %s\n",
5411                     incr[8][i], incr[9][i], incr[10][i], incr[11][i],
5412                     incr[12][i], incr[13][i], incr[14][i], incr[15][i],
5413                     sc->params.a_wnd[i], dec_fac[sc->params.b_wnd[i]]);
5414         }
5415
5416         rc = sbuf_finish(sb);
5417         sbuf_delete(sb);
5418
5419         return (rc);
5420 }
5421
5422 static const char *qname[CIM_NUM_IBQ + CIM_NUM_OBQ_T5] = {
5423         "TP0", "TP1", "ULP", "SGE0", "SGE1", "NC-SI",   /* ibq's */
5424         "ULP0", "ULP1", "ULP2", "ULP3", "SGE", "NC-SI", /* obq's */
5425         "SGE0-RX", "SGE1-RX"    /* additional obq's (T5 onwards) */
5426 };
5427
5428 static int
5429 sysctl_cim_ibq_obq(SYSCTL_HANDLER_ARGS)
5430 {
5431         struct adapter *sc = arg1;
5432         struct sbuf *sb;
5433         int rc, i, n, qid = arg2;
5434         uint32_t *buf, *p;
5435         char *qtype;
5436         u_int cim_num_obq = is_t4(sc) ? CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
5437
5438         KASSERT(qid >= 0 && qid < CIM_NUM_IBQ + cim_num_obq,
5439             ("%s: bad qid %d\n", __func__, qid));
5440
5441         if (qid < CIM_NUM_IBQ) {
5442                 /* inbound queue */
5443                 qtype = "IBQ";
5444                 n = 4 * CIM_IBQ_SIZE;
5445                 buf = malloc(n * sizeof(uint32_t), M_CXGBE, M_ZERO | M_WAITOK);
5446                 rc = t4_read_cim_ibq(sc, qid, buf, n);
5447         } else {
5448                 /* outbound queue */
5449                 qtype = "OBQ";
5450                 qid -= CIM_NUM_IBQ;
5451                 n = 4 * cim_num_obq * CIM_OBQ_SIZE;
5452                 buf = malloc(n * sizeof(uint32_t), M_CXGBE, M_ZERO | M_WAITOK);
5453                 rc = t4_read_cim_obq(sc, qid, buf, n);
5454         }
5455
5456         if (rc < 0) {
5457                 rc = -rc;
5458                 goto done;
5459         }
5460         n = rc * sizeof(uint32_t);      /* rc has # of words actually read */
5461
5462         rc = sysctl_wire_old_buffer(req, 0);
5463         if (rc != 0)
5464                 goto done;
5465
5466         sb = sbuf_new_for_sysctl(NULL, NULL, PAGE_SIZE, req);
5467         if (sb == NULL) {
5468                 rc = ENOMEM;
5469                 goto done;
5470         }
5471
5472         sbuf_printf(sb, "%s%d %s", qtype , qid, qname[arg2]);
5473         for (i = 0, p = buf; i < n; i += 16, p += 4)
5474                 sbuf_printf(sb, "\n%#06x: %08x %08x %08x %08x", i, p[0], p[1],
5475                     p[2], p[3]);
5476
5477         rc = sbuf_finish(sb);
5478         sbuf_delete(sb);
5479 done:
5480         free(buf, M_CXGBE);
5481         return (rc);
5482 }
5483
5484 static int
5485 sysctl_cim_la(SYSCTL_HANDLER_ARGS)
5486 {
5487         struct adapter *sc = arg1;
5488         u_int cfg;
5489         struct sbuf *sb;
5490         uint32_t *buf, *p;
5491         int rc;
5492
5493         rc = -t4_cim_read(sc, A_UP_UP_DBG_LA_CFG, 1, &cfg);
5494         if (rc != 0)
5495                 return (rc);
5496
5497         rc = sysctl_wire_old_buffer(req, 0);
5498         if (rc != 0)
5499                 return (rc);
5500
5501         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5502         if (sb == NULL)
5503                 return (ENOMEM);
5504
5505         buf = malloc(sc->params.cim_la_size * sizeof(uint32_t), M_CXGBE,
5506             M_ZERO | M_WAITOK);
5507
5508         rc = -t4_cim_read_la(sc, buf, NULL);
5509         if (rc != 0)
5510                 goto done;
5511
5512         sbuf_printf(sb, "Status   Data      PC%s",
5513             cfg & F_UPDBGLACAPTPCONLY ? "" :
5514             "     LS0Stat  LS0Addr             LS0Data");
5515
5516         KASSERT((sc->params.cim_la_size & 7) == 0,
5517             ("%s: p will walk off the end of buf", __func__));
5518
5519         for (p = buf; p < &buf[sc->params.cim_la_size]; p += 8) {
5520                 if (cfg & F_UPDBGLACAPTPCONLY) {
5521                         sbuf_printf(sb, "\n  %02x   %08x %08x", p[5] & 0xff,
5522                             p[6], p[7]);
5523                         sbuf_printf(sb, "\n  %02x   %02x%06x %02x%06x",
5524                             (p[3] >> 8) & 0xff, p[3] & 0xff, p[4] >> 8,
5525                             p[4] & 0xff, p[5] >> 8);
5526                         sbuf_printf(sb, "\n  %02x   %x%07x %x%07x",
5527                             (p[0] >> 4) & 0xff, p[0] & 0xf, p[1] >> 4,
5528                             p[1] & 0xf, p[2] >> 4);
5529                 } else {
5530                         sbuf_printf(sb,
5531                             "\n  %02x   %x%07x %x%07x %08x %08x "
5532                             "%08x%08x%08x%08x",
5533                             (p[0] >> 4) & 0xff, p[0] & 0xf, p[1] >> 4,
5534                             p[1] & 0xf, p[2] >> 4, p[2] & 0xf, p[3], p[4], p[5],
5535                             p[6], p[7]);
5536                 }
5537         }
5538
5539         rc = sbuf_finish(sb);
5540         sbuf_delete(sb);
5541 done:
5542         free(buf, M_CXGBE);
5543         return (rc);
5544 }
5545
5546 static int
5547 sysctl_cim_ma_la(SYSCTL_HANDLER_ARGS)
5548 {
5549         struct adapter *sc = arg1;
5550         u_int i;
5551         struct sbuf *sb;
5552         uint32_t *buf, *p;
5553         int rc;
5554
5555         rc = sysctl_wire_old_buffer(req, 0);
5556         if (rc != 0)
5557                 return (rc);
5558
5559         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5560         if (sb == NULL)
5561                 return (ENOMEM);
5562
5563         buf = malloc(2 * CIM_MALA_SIZE * 5 * sizeof(uint32_t), M_CXGBE,
5564             M_ZERO | M_WAITOK);
5565
5566         t4_cim_read_ma_la(sc, buf, buf + 5 * CIM_MALA_SIZE);
5567         p = buf;
5568
5569         for (i = 0; i < CIM_MALA_SIZE; i++, p += 5) {
5570                 sbuf_printf(sb, "\n%02x%08x%08x%08x%08x", p[4], p[3], p[2],
5571                     p[1], p[0]);
5572         }
5573
5574         sbuf_printf(sb, "\n\nCnt ID Tag UE       Data       RDY VLD");
5575         for (i = 0; i < CIM_MALA_SIZE; i++, p += 5) {
5576                 sbuf_printf(sb, "\n%3u %2u  %x   %u %08x%08x  %u   %u",
5577                     (p[2] >> 10) & 0xff, (p[2] >> 7) & 7,
5578                     (p[2] >> 3) & 0xf, (p[2] >> 2) & 1,
5579                     (p[1] >> 2) | ((p[2] & 3) << 30),
5580                     (p[0] >> 2) | ((p[1] & 3) << 30), (p[0] >> 1) & 1,
5581                     p[0] & 1);
5582         }
5583
5584         rc = sbuf_finish(sb);
5585         sbuf_delete(sb);
5586         free(buf, M_CXGBE);
5587         return (rc);
5588 }
5589
5590 static int
5591 sysctl_cim_pif_la(SYSCTL_HANDLER_ARGS)
5592 {
5593         struct adapter *sc = arg1;
5594         u_int i;
5595         struct sbuf *sb;
5596         uint32_t *buf, *p;
5597         int rc;
5598
5599         rc = sysctl_wire_old_buffer(req, 0);
5600         if (rc != 0)
5601                 return (rc);
5602
5603         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5604         if (sb == NULL)
5605                 return (ENOMEM);
5606
5607         buf = malloc(2 * CIM_PIFLA_SIZE * 6 * sizeof(uint32_t), M_CXGBE,
5608             M_ZERO | M_WAITOK);
5609
5610         t4_cim_read_pif_la(sc, buf, buf + 6 * CIM_PIFLA_SIZE, NULL, NULL);
5611         p = buf;
5612
5613         sbuf_printf(sb, "Cntl ID DataBE   Addr                 Data");
5614         for (i = 0; i < CIM_MALA_SIZE; i++, p += 6) {
5615                 sbuf_printf(sb, "\n %02x  %02x  %04x  %08x %08x%08x%08x%08x",
5616                     (p[5] >> 22) & 0xff, (p[5] >> 16) & 0x3f, p[5] & 0xffff,
5617                     p[4], p[3], p[2], p[1], p[0]);
5618         }
5619
5620         sbuf_printf(sb, "\n\nCntl ID               Data");
5621         for (i = 0; i < CIM_MALA_SIZE; i++, p += 6) {
5622                 sbuf_printf(sb, "\n %02x  %02x %08x%08x%08x%08x",
5623                     (p[4] >> 6) & 0xff, p[4] & 0x3f, p[3], p[2], p[1], p[0]);
5624         }
5625
5626         rc = sbuf_finish(sb);
5627         sbuf_delete(sb);
5628         free(buf, M_CXGBE);
5629         return (rc);
5630 }
5631
5632 static int
5633 sysctl_cim_qcfg(SYSCTL_HANDLER_ARGS)
5634 {
5635         struct adapter *sc = arg1;
5636         struct sbuf *sb;
5637         int rc, i;
5638         uint16_t base[CIM_NUM_IBQ + CIM_NUM_OBQ_T5];
5639         uint16_t size[CIM_NUM_IBQ + CIM_NUM_OBQ_T5];
5640         uint16_t thres[CIM_NUM_IBQ];
5641         uint32_t obq_wr[2 * CIM_NUM_OBQ_T5], *wr = obq_wr;
5642         uint32_t stat[4 * (CIM_NUM_IBQ + CIM_NUM_OBQ_T5)], *p = stat;
5643         u_int cim_num_obq, ibq_rdaddr, obq_rdaddr, nq;
5644
5645         if (is_t4(sc)) {
5646                 cim_num_obq = CIM_NUM_OBQ;
5647                 ibq_rdaddr = A_UP_IBQ_0_RDADDR;
5648                 obq_rdaddr = A_UP_OBQ_0_REALADDR;
5649         } else {
5650                 cim_num_obq = CIM_NUM_OBQ_T5;
5651                 ibq_rdaddr = A_UP_IBQ_0_SHADOW_RDADDR;
5652                 obq_rdaddr = A_UP_OBQ_0_SHADOW_REALADDR;
5653         }
5654         nq = CIM_NUM_IBQ + cim_num_obq;
5655
5656         rc = -t4_cim_read(sc, ibq_rdaddr, 4 * nq, stat);
5657         if (rc == 0)
5658                 rc = -t4_cim_read(sc, obq_rdaddr, 2 * cim_num_obq, obq_wr);
5659         if (rc != 0)
5660                 return (rc);
5661
5662         t4_read_cimq_cfg(sc, base, size, thres);
5663
5664         rc = sysctl_wire_old_buffer(req, 0);
5665         if (rc != 0)
5666                 return (rc);
5667
5668         sb = sbuf_new_for_sysctl(NULL, NULL, PAGE_SIZE, req);
5669         if (sb == NULL)
5670                 return (ENOMEM);
5671
5672         sbuf_printf(sb, "Queue  Base  Size Thres RdPtr WrPtr  SOP  EOP Avail");
5673
5674         for (i = 0; i < CIM_NUM_IBQ; i++, p += 4)
5675                 sbuf_printf(sb, "\n%7s %5x %5u %5u %6x  %4x %4u %4u %5u",
5676                     qname[i], base[i], size[i], thres[i], G_IBQRDADDR(p[0]),
5677                     G_IBQWRADDR(p[1]), G_QUESOPCNT(p[3]), G_QUEEOPCNT(p[3]),
5678                     G_QUEREMFLITS(p[2]) * 16);
5679         for ( ; i < nq; i++, p += 4, wr += 2)
5680                 sbuf_printf(sb, "\n%7s %5x %5u %12x  %4x %4u %4u %5u", qname[i],
5681                     base[i], size[i], G_QUERDADDR(p[0]) & 0x3fff,
5682                     wr[0] - base[i], G_QUESOPCNT(p[3]), G_QUEEOPCNT(p[3]),
5683                     G_QUEREMFLITS(p[2]) * 16);
5684
5685         rc = sbuf_finish(sb);
5686         sbuf_delete(sb);
5687
5688         return (rc);
5689 }
5690
5691 static int
5692 sysctl_cpl_stats(SYSCTL_HANDLER_ARGS)
5693 {
5694         struct adapter *sc = arg1;
5695         struct sbuf *sb;
5696         int rc;
5697         struct tp_cpl_stats stats;
5698
5699         rc = sysctl_wire_old_buffer(req, 0);
5700         if (rc != 0)
5701                 return (rc);
5702
5703         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5704         if (sb == NULL)
5705                 return (ENOMEM);
5706
5707         t4_tp_get_cpl_stats(sc, &stats);
5708
5709         sbuf_printf(sb, "                 channel 0  channel 1  channel 2  "
5710             "channel 3\n");
5711         sbuf_printf(sb, "CPL requests:   %10u %10u %10u %10u\n",
5712                    stats.req[0], stats.req[1], stats.req[2], stats.req[3]);
5713         sbuf_printf(sb, "CPL responses:  %10u %10u %10u %10u",
5714                    stats.rsp[0], stats.rsp[1], stats.rsp[2], stats.rsp[3]);
5715
5716         rc = sbuf_finish(sb);
5717         sbuf_delete(sb);
5718
5719         return (rc);
5720 }
5721
5722 static int
5723 sysctl_ddp_stats(SYSCTL_HANDLER_ARGS)
5724 {
5725         struct adapter *sc = arg1;
5726         struct sbuf *sb;
5727         int rc;
5728         struct tp_usm_stats stats;
5729
5730         rc = sysctl_wire_old_buffer(req, 0);
5731         if (rc != 0)
5732                 return(rc);
5733
5734         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5735         if (sb == NULL)
5736                 return (ENOMEM);
5737
5738         t4_get_usm_stats(sc, &stats);
5739
5740         sbuf_printf(sb, "Frames: %u\n", stats.frames);
5741         sbuf_printf(sb, "Octets: %ju\n", stats.octets);
5742         sbuf_printf(sb, "Drops:  %u", stats.drops);
5743
5744         rc = sbuf_finish(sb);
5745         sbuf_delete(sb);
5746
5747         return (rc);
5748 }
5749
5750 const char *devlog_level_strings[] = {
5751         [FW_DEVLOG_LEVEL_EMERG]         = "EMERG",
5752         [FW_DEVLOG_LEVEL_CRIT]          = "CRIT",
5753         [FW_DEVLOG_LEVEL_ERR]           = "ERR",
5754         [FW_DEVLOG_LEVEL_NOTICE]        = "NOTICE",
5755         [FW_DEVLOG_LEVEL_INFO]          = "INFO",
5756         [FW_DEVLOG_LEVEL_DEBUG]         = "DEBUG"
5757 };
5758
5759 const char *devlog_facility_strings[] = {
5760         [FW_DEVLOG_FACILITY_CORE]       = "CORE",
5761         [FW_DEVLOG_FACILITY_CF]         = "CF",
5762         [FW_DEVLOG_FACILITY_SCHED]      = "SCHED",
5763         [FW_DEVLOG_FACILITY_TIMER]      = "TIMER",
5764         [FW_DEVLOG_FACILITY_RES]        = "RES",
5765         [FW_DEVLOG_FACILITY_HW]         = "HW",
5766         [FW_DEVLOG_FACILITY_FLR]        = "FLR",
5767         [FW_DEVLOG_FACILITY_DMAQ]       = "DMAQ",
5768         [FW_DEVLOG_FACILITY_PHY]        = "PHY",
5769         [FW_DEVLOG_FACILITY_MAC]        = "MAC",
5770         [FW_DEVLOG_FACILITY_PORT]       = "PORT",
5771         [FW_DEVLOG_FACILITY_VI]         = "VI",
5772         [FW_DEVLOG_FACILITY_FILTER]     = "FILTER",
5773         [FW_DEVLOG_FACILITY_ACL]        = "ACL",
5774         [FW_DEVLOG_FACILITY_TM]         = "TM",
5775         [FW_DEVLOG_FACILITY_QFC]        = "QFC",
5776         [FW_DEVLOG_FACILITY_DCB]        = "DCB",
5777         [FW_DEVLOG_FACILITY_ETH]        = "ETH",
5778         [FW_DEVLOG_FACILITY_OFLD]       = "OFLD",
5779         [FW_DEVLOG_FACILITY_RI]         = "RI",
5780         [FW_DEVLOG_FACILITY_ISCSI]      = "ISCSI",
5781         [FW_DEVLOG_FACILITY_FCOE]       = "FCOE",
5782         [FW_DEVLOG_FACILITY_FOISCSI]    = "FOISCSI",
5783         [FW_DEVLOG_FACILITY_FOFCOE]     = "FOFCOE"
5784 };
5785
5786 static int
5787 sysctl_devlog(SYSCTL_HANDLER_ARGS)
5788 {
5789         struct adapter *sc = arg1;
5790         struct devlog_params *dparams = &sc->params.devlog;
5791         struct fw_devlog_e *buf, *e;
5792         int i, j, rc, nentries, first = 0, m;
5793         struct sbuf *sb;
5794         uint64_t ftstamp = UINT64_MAX;
5795
5796         if (dparams->start == 0) {
5797                 dparams->memtype = FW_MEMTYPE_EDC0;
5798                 dparams->start = 0x84000;
5799                 dparams->size = 32768;
5800         }
5801
5802         nentries = dparams->size / sizeof(struct fw_devlog_e);
5803
5804         buf = malloc(dparams->size, M_CXGBE, M_NOWAIT);
5805         if (buf == NULL)
5806                 return (ENOMEM);
5807
5808         m = fwmtype_to_hwmtype(dparams->memtype);
5809         rc = -t4_mem_read(sc, m, dparams->start, dparams->size, (void *)buf);
5810         if (rc != 0)
5811                 goto done;
5812
5813         for (i = 0; i < nentries; i++) {
5814                 e = &buf[i];
5815
5816                 if (e->timestamp == 0)
5817                         break;  /* end */
5818
5819                 e->timestamp = be64toh(e->timestamp);
5820                 e->seqno = be32toh(e->seqno);
5821                 for (j = 0; j < 8; j++)
5822                         e->params[j] = be32toh(e->params[j]);
5823
5824                 if (e->timestamp < ftstamp) {
5825                         ftstamp = e->timestamp;
5826                         first = i;
5827                 }
5828         }
5829
5830         if (buf[first].timestamp == 0)
5831                 goto done;      /* nothing in the log */
5832
5833         rc = sysctl_wire_old_buffer(req, 0);
5834         if (rc != 0)
5835                 goto done;
5836
5837         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5838         if (sb == NULL) {
5839                 rc = ENOMEM;
5840                 goto done;
5841         }
5842         sbuf_printf(sb, "%10s  %15s  %8s  %8s  %s\n",
5843             "Seq#", "Tstamp", "Level", "Facility", "Message");
5844
5845         i = first;
5846         do {
5847                 e = &buf[i];
5848                 if (e->timestamp == 0)
5849                         break;  /* end */
5850
5851                 sbuf_printf(sb, "%10d  %15ju  %8s  %8s  ",
5852                     e->seqno, e->timestamp,
5853                     (e->level < nitems(devlog_level_strings) ?
5854                         devlog_level_strings[e->level] : "UNKNOWN"),
5855                     (e->facility < nitems(devlog_facility_strings) ?
5856                         devlog_facility_strings[e->facility] : "UNKNOWN"));
5857                 sbuf_printf(sb, e->fmt, e->params[0], e->params[1],
5858                     e->params[2], e->params[3], e->params[4],
5859                     e->params[5], e->params[6], e->params[7]);
5860
5861                 if (++i == nentries)
5862                         i = 0;
5863         } while (i != first);
5864
5865         rc = sbuf_finish(sb);
5866         sbuf_delete(sb);
5867 done:
5868         free(buf, M_CXGBE);
5869         return (rc);
5870 }
5871
5872 static int
5873 sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS)
5874 {
5875         struct adapter *sc = arg1;
5876         struct sbuf *sb;
5877         int rc;
5878         struct tp_fcoe_stats stats[4];
5879
5880         rc = sysctl_wire_old_buffer(req, 0);
5881         if (rc != 0)
5882                 return (rc);
5883
5884         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5885         if (sb == NULL)
5886                 return (ENOMEM);
5887
5888         t4_get_fcoe_stats(sc, 0, &stats[0]);
5889         t4_get_fcoe_stats(sc, 1, &stats[1]);
5890         t4_get_fcoe_stats(sc, 2, &stats[2]);
5891         t4_get_fcoe_stats(sc, 3, &stats[3]);
5892
5893         sbuf_printf(sb, "                   channel 0        channel 1        "
5894             "channel 2        channel 3\n");
5895         sbuf_printf(sb, "octetsDDP:  %16ju %16ju %16ju %16ju\n",
5896             stats[0].octetsDDP, stats[1].octetsDDP, stats[2].octetsDDP,
5897             stats[3].octetsDDP);
5898         sbuf_printf(sb, "framesDDP:  %16u %16u %16u %16u\n", stats[0].framesDDP,
5899             stats[1].framesDDP, stats[2].framesDDP, stats[3].framesDDP);
5900         sbuf_printf(sb, "framesDrop: %16u %16u %16u %16u",
5901             stats[0].framesDrop, stats[1].framesDrop, stats[2].framesDrop,
5902             stats[3].framesDrop);
5903
5904         rc = sbuf_finish(sb);
5905         sbuf_delete(sb);
5906
5907         return (rc);
5908 }
5909
5910 static int
5911 sysctl_hw_sched(SYSCTL_HANDLER_ARGS)
5912 {
5913         struct adapter *sc = arg1;
5914         struct sbuf *sb;
5915         int rc, i;
5916         unsigned int map, kbps, ipg, mode;
5917         unsigned int pace_tab[NTX_SCHED];
5918
5919         rc = sysctl_wire_old_buffer(req, 0);
5920         if (rc != 0)
5921                 return (rc);
5922
5923         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
5924         if (sb == NULL)
5925                 return (ENOMEM);
5926
5927         map = t4_read_reg(sc, A_TP_TX_MOD_QUEUE_REQ_MAP);
5928         mode = G_TIMERMODE(t4_read_reg(sc, A_TP_MOD_CONFIG));
5929         t4_read_pace_tbl(sc, pace_tab);
5930
5931         sbuf_printf(sb, "Scheduler  Mode   Channel  Rate (Kbps)   "
5932             "Class IPG (0.1 ns)   Flow IPG (us)");
5933
5934         for (i = 0; i < NTX_SCHED; ++i, map >>= 2) {
5935                 t4_get_tx_sched(sc, i, &kbps, &ipg);
5936                 sbuf_printf(sb, "\n    %u      %-5s     %u     ", i,
5937                     (mode & (1 << i)) ? "flow" : "class", map & 3);
5938                 if (kbps)
5939                         sbuf_printf(sb, "%9u     ", kbps);
5940                 else
5941                         sbuf_printf(sb, " disabled     ");
5942
5943                 if (ipg)
5944                         sbuf_printf(sb, "%13u        ", ipg);
5945                 else
5946                         sbuf_printf(sb, "     disabled        ");
5947
5948                 if (pace_tab[i])
5949                         sbuf_printf(sb, "%10u", pace_tab[i]);
5950                 else
5951                         sbuf_printf(sb, "  disabled");
5952         }
5953
5954         rc = sbuf_finish(sb);
5955         sbuf_delete(sb);
5956
5957         return (rc);
5958 }
5959
5960 static int
5961 sysctl_lb_stats(SYSCTL_HANDLER_ARGS)
5962 {
5963         struct adapter *sc = arg1;
5964         struct sbuf *sb;
5965         int rc, i, j;
5966         uint64_t *p0, *p1;
5967         struct lb_port_stats s[2];
5968         static const char *stat_name[] = {
5969                 "OctetsOK:", "FramesOK:", "BcastFrames:", "McastFrames:",
5970                 "UcastFrames:", "ErrorFrames:", "Frames64:", "Frames65To127:",
5971                 "Frames128To255:", "Frames256To511:", "Frames512To1023:",
5972                 "Frames1024To1518:", "Frames1519ToMax:", "FramesDropped:",
5973                 "BG0FramesDropped:", "BG1FramesDropped:", "BG2FramesDropped:",
5974                 "BG3FramesDropped:", "BG0FramesTrunc:", "BG1FramesTrunc:",
5975                 "BG2FramesTrunc:", "BG3FramesTrunc:"
5976         };
5977
5978         rc = sysctl_wire_old_buffer(req, 0);
5979         if (rc != 0)
5980                 return (rc);
5981
5982         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
5983         if (sb == NULL)
5984                 return (ENOMEM);
5985
5986         memset(s, 0, sizeof(s));
5987
5988         for (i = 0; i < 4; i += 2) {
5989                 t4_get_lb_stats(sc, i, &s[0]);
5990                 t4_get_lb_stats(sc, i + 1, &s[1]);
5991
5992                 p0 = &s[0].octets;
5993                 p1 = &s[1].octets;
5994                 sbuf_printf(sb, "%s                       Loopback %u"
5995                     "           Loopback %u", i == 0 ? "" : "\n", i, i + 1);
5996
5997                 for (j = 0; j < nitems(stat_name); j++)
5998                         sbuf_printf(sb, "\n%-17s %20ju %20ju", stat_name[j],
5999                                    *p0++, *p1++);
6000         }
6001
6002         rc = sbuf_finish(sb);
6003         sbuf_delete(sb);
6004
6005         return (rc);
6006 }
6007
6008 static int
6009 sysctl_linkdnrc(SYSCTL_HANDLER_ARGS)
6010 {
6011         int rc = 0;
6012         struct port_info *pi = arg1;
6013         struct sbuf *sb;
6014         static const char *linkdnreasons[] = {
6015                 "non-specific", "remote fault", "autoneg failed", "reserved3",
6016                 "PHY overheated", "unknown", "rx los", "reserved7"
6017         };
6018
6019         rc = sysctl_wire_old_buffer(req, 0);
6020         if (rc != 0)
6021                 return(rc);
6022         sb = sbuf_new_for_sysctl(NULL, NULL, 64, req);
6023         if (sb == NULL)
6024                 return (ENOMEM);
6025
6026         if (pi->linkdnrc < 0)
6027                 sbuf_printf(sb, "n/a");
6028         else if (pi->linkdnrc < nitems(linkdnreasons))
6029                 sbuf_printf(sb, "%s", linkdnreasons[pi->linkdnrc]);
6030         else
6031                 sbuf_printf(sb, "%d", pi->linkdnrc);
6032
6033         rc = sbuf_finish(sb);
6034         sbuf_delete(sb);
6035
6036         return (rc);
6037 }
6038
6039 struct mem_desc {
6040         unsigned int base;
6041         unsigned int limit;
6042         unsigned int idx;
6043 };
6044
6045 static int
6046 mem_desc_cmp(const void *a, const void *b)
6047 {
6048         return ((const struct mem_desc *)a)->base -
6049                ((const struct mem_desc *)b)->base;
6050 }
6051
6052 static void
6053 mem_region_show(struct sbuf *sb, const char *name, unsigned int from,
6054     unsigned int to)
6055 {
6056         unsigned int size;
6057
6058         size = to - from + 1;
6059         if (size == 0)
6060                 return;
6061
6062         /* XXX: need humanize_number(3) in libkern for a more readable 'size' */
6063         sbuf_printf(sb, "%-15s %#x-%#x [%u]\n", name, from, to, size);
6064 }
6065
6066 static int
6067 sysctl_meminfo(SYSCTL_HANDLER_ARGS)
6068 {
6069         struct adapter *sc = arg1;
6070         struct sbuf *sb;
6071         int rc, i, n;
6072         uint32_t lo, hi, used, alloc;
6073         static const char *memory[] = {"EDC0:", "EDC1:", "MC:", "MC0:", "MC1:"};
6074         static const char *region[] = {
6075                 "DBQ contexts:", "IMSG contexts:", "FLM cache:", "TCBs:",
6076                 "Pstructs:", "Timers:", "Rx FL:", "Tx FL:", "Pstruct FL:",
6077                 "Tx payload:", "Rx payload:", "LE hash:", "iSCSI region:",
6078                 "TDDP region:", "TPT region:", "STAG region:", "RQ region:",
6079                 "RQUDP region:", "PBL region:", "TXPBL region:",
6080                 "DBVFIFO region:", "ULPRX state:", "ULPTX state:",
6081                 "On-chip queues:"
6082         };
6083         struct mem_desc avail[4];
6084         struct mem_desc mem[nitems(region) + 3];        /* up to 3 holes */
6085         struct mem_desc *md = mem;
6086
6087         rc = sysctl_wire_old_buffer(req, 0);
6088         if (rc != 0)
6089                 return (rc);
6090
6091         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6092         if (sb == NULL)
6093                 return (ENOMEM);
6094
6095         for (i = 0; i < nitems(mem); i++) {
6096                 mem[i].limit = 0;
6097                 mem[i].idx = i;
6098         }
6099
6100         /* Find and sort the populated memory ranges */
6101         i = 0;
6102         lo = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
6103         if (lo & F_EDRAM0_ENABLE) {
6104                 hi = t4_read_reg(sc, A_MA_EDRAM0_BAR);
6105                 avail[i].base = G_EDRAM0_BASE(hi) << 20;
6106                 avail[i].limit = avail[i].base + (G_EDRAM0_SIZE(hi) << 20);
6107                 avail[i].idx = 0;
6108                 i++;
6109         }
6110         if (lo & F_EDRAM1_ENABLE) {
6111                 hi = t4_read_reg(sc, A_MA_EDRAM1_BAR);
6112                 avail[i].base = G_EDRAM1_BASE(hi) << 20;
6113                 avail[i].limit = avail[i].base + (G_EDRAM1_SIZE(hi) << 20);
6114                 avail[i].idx = 1;
6115                 i++;
6116         }
6117         if (lo & F_EXT_MEM_ENABLE) {
6118                 hi = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
6119                 avail[i].base = G_EXT_MEM_BASE(hi) << 20;
6120                 avail[i].limit = avail[i].base +
6121                     (G_EXT_MEM_SIZE(hi) << 20);
6122                 avail[i].idx = is_t4(sc) ? 2 : 3;       /* Call it MC for T4 */
6123                 i++;
6124         }
6125         if (!is_t4(sc) && lo & F_EXT_MEM1_ENABLE) {
6126                 hi = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
6127                 avail[i].base = G_EXT_MEM1_BASE(hi) << 20;
6128                 avail[i].limit = avail[i].base +
6129                     (G_EXT_MEM1_SIZE(hi) << 20);
6130                 avail[i].idx = 4;
6131                 i++;
6132         }
6133         if (!i)                                    /* no memory available */
6134                 return 0;
6135         qsort(avail, i, sizeof(struct mem_desc), mem_desc_cmp);
6136
6137         (md++)->base = t4_read_reg(sc, A_SGE_DBQ_CTXT_BADDR);
6138         (md++)->base = t4_read_reg(sc, A_SGE_IMSG_CTXT_BADDR);
6139         (md++)->base = t4_read_reg(sc, A_SGE_FLM_CACHE_BADDR);
6140         (md++)->base = t4_read_reg(sc, A_TP_CMM_TCB_BASE);
6141         (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_BASE);
6142         (md++)->base = t4_read_reg(sc, A_TP_CMM_TIMER_BASE);
6143         (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_RX_FLST_BASE);
6144         (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_TX_FLST_BASE);
6145         (md++)->base = t4_read_reg(sc, A_TP_CMM_MM_PS_FLST_BASE);
6146
6147         /* the next few have explicit upper bounds */
6148         md->base = t4_read_reg(sc, A_TP_PMM_TX_BASE);
6149         md->limit = md->base - 1 +
6150                     t4_read_reg(sc, A_TP_PMM_TX_PAGE_SIZE) *
6151                     G_PMTXMAXPAGE(t4_read_reg(sc, A_TP_PMM_TX_MAX_PAGE));
6152         md++;
6153
6154         md->base = t4_read_reg(sc, A_TP_PMM_RX_BASE);
6155         md->limit = md->base - 1 +
6156                     t4_read_reg(sc, A_TP_PMM_RX_PAGE_SIZE) *
6157                     G_PMRXMAXPAGE(t4_read_reg(sc, A_TP_PMM_RX_MAX_PAGE));
6158         md++;
6159
6160         if (t4_read_reg(sc, A_LE_DB_CONFIG) & F_HASHEN) {
6161                 hi = t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4;
6162                 md->base = t4_read_reg(sc, A_LE_DB_HASH_TID_BASE);
6163                 md->limit = (sc->tids.ntids - hi) * 16 + md->base - 1;
6164         } else {
6165                 md->base = 0;
6166                 md->idx = nitems(region);  /* hide it */
6167         }
6168         md++;
6169
6170 #define ulp_region(reg) \
6171         md->base = t4_read_reg(sc, A_ULP_ ## reg ## _LLIMIT);\
6172         (md++)->limit = t4_read_reg(sc, A_ULP_ ## reg ## _ULIMIT)
6173
6174         ulp_region(RX_ISCSI);
6175         ulp_region(RX_TDDP);
6176         ulp_region(TX_TPT);
6177         ulp_region(RX_STAG);
6178         ulp_region(RX_RQ);
6179         ulp_region(RX_RQUDP);
6180         ulp_region(RX_PBL);
6181         ulp_region(TX_PBL);
6182 #undef ulp_region
6183
6184         md->base = 0;
6185         md->idx = nitems(region);
6186         if (!is_t4(sc) && t4_read_reg(sc, A_SGE_CONTROL2) & F_VFIFO_ENABLE) {
6187                 md->base = G_BASEADDR(t4_read_reg(sc, A_SGE_DBVFIFO_BADDR));
6188                 md->limit = md->base + (G_DBVFIFO_SIZE((t4_read_reg(sc,
6189                     A_SGE_DBVFIFO_SIZE))) << 2) - 1;
6190         }
6191         md++;
6192
6193         md->base = t4_read_reg(sc, A_ULP_RX_CTX_BASE);
6194         md->limit = md->base + sc->tids.ntids - 1;
6195         md++;
6196         md->base = t4_read_reg(sc, A_ULP_TX_ERR_TABLE_BASE);
6197         md->limit = md->base + sc->tids.ntids - 1;
6198         md++;
6199
6200         md->base = sc->vres.ocq.start;
6201         if (sc->vres.ocq.size)
6202                 md->limit = md->base + sc->vres.ocq.size - 1;
6203         else
6204                 md->idx = nitems(region);  /* hide it */
6205         md++;
6206
6207         /* add any address-space holes, there can be up to 3 */
6208         for (n = 0; n < i - 1; n++)
6209                 if (avail[n].limit < avail[n + 1].base)
6210                         (md++)->base = avail[n].limit;
6211         if (avail[n].limit)
6212                 (md++)->base = avail[n].limit;
6213
6214         n = md - mem;
6215         qsort(mem, n, sizeof(struct mem_desc), mem_desc_cmp);
6216
6217         for (lo = 0; lo < i; lo++)
6218                 mem_region_show(sb, memory[avail[lo].idx], avail[lo].base,
6219                                 avail[lo].limit - 1);
6220
6221         sbuf_printf(sb, "\n");
6222         for (i = 0; i < n; i++) {
6223                 if (mem[i].idx >= nitems(region))
6224                         continue;                        /* skip holes */
6225                 if (!mem[i].limit)
6226                         mem[i].limit = i < n - 1 ? mem[i + 1].base - 1 : ~0;
6227                 mem_region_show(sb, region[mem[i].idx], mem[i].base,
6228                                 mem[i].limit);
6229         }
6230
6231         sbuf_printf(sb, "\n");
6232         lo = t4_read_reg(sc, A_CIM_SDRAM_BASE_ADDR);
6233         hi = t4_read_reg(sc, A_CIM_SDRAM_ADDR_SIZE) + lo - 1;
6234         mem_region_show(sb, "uP RAM:", lo, hi);
6235
6236         lo = t4_read_reg(sc, A_CIM_EXTMEM2_BASE_ADDR);
6237         hi = t4_read_reg(sc, A_CIM_EXTMEM2_ADDR_SIZE) + lo - 1;
6238         mem_region_show(sb, "uP Extmem2:", lo, hi);
6239
6240         lo = t4_read_reg(sc, A_TP_PMM_RX_MAX_PAGE);
6241         sbuf_printf(sb, "\n%u Rx pages of size %uKiB for %u channels\n",
6242                    G_PMRXMAXPAGE(lo),
6243                    t4_read_reg(sc, A_TP_PMM_RX_PAGE_SIZE) >> 10,
6244                    (lo & F_PMRXNUMCHN) ? 2 : 1);
6245
6246         lo = t4_read_reg(sc, A_TP_PMM_TX_MAX_PAGE);
6247         hi = t4_read_reg(sc, A_TP_PMM_TX_PAGE_SIZE);
6248         sbuf_printf(sb, "%u Tx pages of size %u%ciB for %u channels\n",
6249                    G_PMTXMAXPAGE(lo),
6250                    hi >= (1 << 20) ? (hi >> 20) : (hi >> 10),
6251                    hi >= (1 << 20) ? 'M' : 'K', 1 << G_PMTXNUMCHN(lo));
6252         sbuf_printf(sb, "%u p-structs\n",
6253                    t4_read_reg(sc, A_TP_CMM_MM_MAX_PSTRUCT));
6254
6255         for (i = 0; i < 4; i++) {
6256                 lo = t4_read_reg(sc, A_MPS_RX_PG_RSV0 + i * 4);
6257                 if (is_t4(sc)) {
6258                         used = G_USED(lo);
6259                         alloc = G_ALLOC(lo);
6260                 } else {
6261                         used = G_T5_USED(lo);
6262                         alloc = G_T5_ALLOC(lo);
6263                 }
6264                 sbuf_printf(sb, "\nPort %d using %u pages out of %u allocated",
6265                            i, used, alloc);
6266         }
6267         for (i = 0; i < 4; i++) {
6268                 lo = t4_read_reg(sc, A_MPS_RX_PG_RSV4 + i * 4);
6269                 if (is_t4(sc)) {
6270                         used = G_USED(lo);
6271                         alloc = G_ALLOC(lo);
6272                 } else {
6273                         used = G_T5_USED(lo);
6274                         alloc = G_T5_ALLOC(lo);
6275                 }
6276                 sbuf_printf(sb,
6277                            "\nLoopback %d using %u pages out of %u allocated",
6278                            i, used, alloc);
6279         }
6280
6281         rc = sbuf_finish(sb);
6282         sbuf_delete(sb);
6283
6284         return (rc);
6285 }
6286
6287 static inline void
6288 tcamxy2valmask(uint64_t x, uint64_t y, uint8_t *addr, uint64_t *mask)
6289 {
6290         *mask = x | y;
6291         y = htobe64(y);
6292         memcpy(addr, (char *)&y + 2, ETHER_ADDR_LEN);
6293 }
6294
6295 static int
6296 sysctl_mps_tcam(SYSCTL_HANDLER_ARGS)
6297 {
6298         struct adapter *sc = arg1;
6299         struct sbuf *sb;
6300         int rc, i, n;
6301
6302         rc = sysctl_wire_old_buffer(req, 0);
6303         if (rc != 0)
6304                 return (rc);
6305
6306         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6307         if (sb == NULL)
6308                 return (ENOMEM);
6309
6310         sbuf_printf(sb,
6311             "Idx  Ethernet address     Mask     Vld Ports PF"
6312             "  VF              Replication             P0 P1 P2 P3  ML");
6313         n = is_t4(sc) ? NUM_MPS_CLS_SRAM_L_INSTANCES :
6314             NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
6315         for (i = 0; i < n; i++) {
6316                 uint64_t tcamx, tcamy, mask;
6317                 uint32_t cls_lo, cls_hi;
6318                 uint8_t addr[ETHER_ADDR_LEN];
6319
6320                 tcamy = t4_read_reg64(sc, MPS_CLS_TCAM_Y_L(i));
6321                 tcamx = t4_read_reg64(sc, MPS_CLS_TCAM_X_L(i));
6322                 cls_lo = t4_read_reg(sc, MPS_CLS_SRAM_L(i));
6323                 cls_hi = t4_read_reg(sc, MPS_CLS_SRAM_H(i));
6324
6325                 if (tcamx & tcamy)
6326                         continue;
6327
6328                 tcamxy2valmask(tcamx, tcamy, addr, &mask);
6329                 sbuf_printf(sb, "\n%3u %02x:%02x:%02x:%02x:%02x:%02x %012jx"
6330                            "  %c   %#x%4u%4d", i, addr[0], addr[1], addr[2],
6331                            addr[3], addr[4], addr[5], (uintmax_t)mask,
6332                            (cls_lo & F_SRAM_VLD) ? 'Y' : 'N',
6333                            G_PORTMAP(cls_hi), G_PF(cls_lo),
6334                            (cls_lo & F_VF_VALID) ? G_VF(cls_lo) : -1);
6335
6336                 if (cls_lo & F_REPLICATE) {
6337                         struct fw_ldst_cmd ldst_cmd;
6338
6339                         memset(&ldst_cmd, 0, sizeof(ldst_cmd));
6340                         ldst_cmd.op_to_addrspace =
6341                             htobe32(V_FW_CMD_OP(FW_LDST_CMD) |
6342                                 F_FW_CMD_REQUEST | F_FW_CMD_READ |
6343                                 V_FW_LDST_CMD_ADDRSPACE(FW_LDST_ADDRSPC_MPS));
6344                         ldst_cmd.cycles_to_len16 = htobe32(FW_LEN16(ldst_cmd));
6345                         ldst_cmd.u.mps.rplc.fid_idx =
6346                             htobe16(V_FW_LDST_CMD_FID(FW_LDST_MPS_RPLC) |
6347                                 V_FW_LDST_CMD_IDX(i));
6348
6349                         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK,
6350                             "t4mps");
6351                         if (rc)
6352                                 break;
6353                         rc = -t4_wr_mbox(sc, sc->mbox, &ldst_cmd,
6354                             sizeof(ldst_cmd), &ldst_cmd);
6355                         end_synchronized_op(sc, 0);
6356
6357                         if (rc != 0) {
6358                                 sbuf_printf(sb,
6359                                     " ------------ error %3u ------------", rc);
6360                                 rc = 0;
6361                         } else {
6362                                 sbuf_printf(sb, " %08x %08x %08x %08x",
6363                                     be32toh(ldst_cmd.u.mps.rplc.rplc127_96),
6364                                     be32toh(ldst_cmd.u.mps.rplc.rplc95_64),
6365                                     be32toh(ldst_cmd.u.mps.rplc.rplc63_32),
6366                                     be32toh(ldst_cmd.u.mps.rplc.rplc31_0));
6367                         }
6368                 } else
6369                         sbuf_printf(sb, "%36s", "");
6370
6371                 sbuf_printf(sb, "%4u%3u%3u%3u %#3x", G_SRAM_PRIO0(cls_lo),
6372                     G_SRAM_PRIO1(cls_lo), G_SRAM_PRIO2(cls_lo),
6373                     G_SRAM_PRIO3(cls_lo), (cls_lo >> S_MULTILISTEN0) & 0xf);
6374         }
6375
6376         if (rc)
6377                 (void) sbuf_finish(sb);
6378         else
6379                 rc = sbuf_finish(sb);
6380         sbuf_delete(sb);
6381
6382         return (rc);
6383 }
6384
6385 static int
6386 sysctl_path_mtus(SYSCTL_HANDLER_ARGS)
6387 {
6388         struct adapter *sc = arg1;
6389         struct sbuf *sb;
6390         int rc;
6391         uint16_t mtus[NMTUS];
6392
6393         rc = sysctl_wire_old_buffer(req, 0);
6394         if (rc != 0)
6395                 return (rc);
6396
6397         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6398         if (sb == NULL)
6399                 return (ENOMEM);
6400
6401         t4_read_mtu_tbl(sc, mtus, NULL);
6402
6403         sbuf_printf(sb, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
6404             mtus[0], mtus[1], mtus[2], mtus[3], mtus[4], mtus[5], mtus[6],
6405             mtus[7], mtus[8], mtus[9], mtus[10], mtus[11], mtus[12], mtus[13],
6406             mtus[14], mtus[15]);
6407
6408         rc = sbuf_finish(sb);
6409         sbuf_delete(sb);
6410
6411         return (rc);
6412 }
6413
6414 static int
6415 sysctl_pm_stats(SYSCTL_HANDLER_ARGS)
6416 {
6417         struct adapter *sc = arg1;
6418         struct sbuf *sb;
6419         int rc, i;
6420         uint32_t cnt[PM_NSTATS];
6421         uint64_t cyc[PM_NSTATS];
6422         static const char *rx_stats[] = {
6423                 "Read:", "Write bypass:", "Write mem:", "Flush:"
6424         };
6425         static const char *tx_stats[] = {
6426                 "Read:", "Write bypass:", "Write mem:", "Bypass + mem:"
6427         };
6428
6429         rc = sysctl_wire_old_buffer(req, 0);
6430         if (rc != 0)
6431                 return (rc);
6432
6433         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6434         if (sb == NULL)
6435                 return (ENOMEM);
6436
6437         t4_pmtx_get_stats(sc, cnt, cyc);
6438         sbuf_printf(sb, "                Tx pcmds             Tx bytes");
6439         for (i = 0; i < ARRAY_SIZE(tx_stats); i++)
6440                 sbuf_printf(sb, "\n%-13s %10u %20ju", tx_stats[i], cnt[i],
6441                     cyc[i]);
6442
6443         t4_pmrx_get_stats(sc, cnt, cyc);
6444         sbuf_printf(sb, "\n                Rx pcmds             Rx bytes");
6445         for (i = 0; i < ARRAY_SIZE(rx_stats); i++)
6446                 sbuf_printf(sb, "\n%-13s %10u %20ju", rx_stats[i], cnt[i],
6447                     cyc[i]);
6448
6449         rc = sbuf_finish(sb);
6450         sbuf_delete(sb);
6451
6452         return (rc);
6453 }
6454
6455 static int
6456 sysctl_rdma_stats(SYSCTL_HANDLER_ARGS)
6457 {
6458         struct adapter *sc = arg1;
6459         struct sbuf *sb;
6460         int rc;
6461         struct tp_rdma_stats stats;
6462
6463         rc = sysctl_wire_old_buffer(req, 0);
6464         if (rc != 0)
6465                 return (rc);
6466
6467         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6468         if (sb == NULL)
6469                 return (ENOMEM);
6470
6471         t4_tp_get_rdma_stats(sc, &stats);
6472         sbuf_printf(sb, "NoRQEModDefferals: %u\n", stats.rqe_dfr_mod);
6473         sbuf_printf(sb, "NoRQEPktDefferals: %u", stats.rqe_dfr_pkt);
6474
6475         rc = sbuf_finish(sb);
6476         sbuf_delete(sb);
6477
6478         return (rc);
6479 }
6480
6481 static int
6482 sysctl_tcp_stats(SYSCTL_HANDLER_ARGS)
6483 {
6484         struct adapter *sc = arg1;
6485         struct sbuf *sb;
6486         int rc;
6487         struct tp_tcp_stats v4, v6;
6488
6489         rc = sysctl_wire_old_buffer(req, 0);
6490         if (rc != 0)
6491                 return (rc);
6492
6493         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6494         if (sb == NULL)
6495                 return (ENOMEM);
6496
6497         t4_tp_get_tcp_stats(sc, &v4, &v6);
6498         sbuf_printf(sb,
6499             "                                IP                 IPv6\n");
6500         sbuf_printf(sb, "OutRsts:      %20u %20u\n",
6501             v4.tcpOutRsts, v6.tcpOutRsts);
6502         sbuf_printf(sb, "InSegs:       %20ju %20ju\n",
6503             v4.tcpInSegs, v6.tcpInSegs);
6504         sbuf_printf(sb, "OutSegs:      %20ju %20ju\n",
6505             v4.tcpOutSegs, v6.tcpOutSegs);
6506         sbuf_printf(sb, "RetransSegs:  %20ju %20ju",
6507             v4.tcpRetransSegs, v6.tcpRetransSegs);
6508
6509         rc = sbuf_finish(sb);
6510         sbuf_delete(sb);
6511
6512         return (rc);
6513 }
6514
6515 static int
6516 sysctl_tids(SYSCTL_HANDLER_ARGS)
6517 {
6518         struct adapter *sc = arg1;
6519         struct sbuf *sb;
6520         int rc;
6521         struct tid_info *t = &sc->tids;
6522
6523         rc = sysctl_wire_old_buffer(req, 0);
6524         if (rc != 0)
6525                 return (rc);
6526
6527         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6528         if (sb == NULL)
6529                 return (ENOMEM);
6530
6531         if (t->natids) {
6532                 sbuf_printf(sb, "ATID range: 0-%u, in use: %u\n", t->natids - 1,
6533                     t->atids_in_use);
6534         }
6535
6536         if (t->ntids) {
6537                 if (t4_read_reg(sc, A_LE_DB_CONFIG) & F_HASHEN) {
6538                         uint32_t b = t4_read_reg(sc, A_LE_DB_SERVER_INDEX) / 4;
6539
6540                         if (b) {
6541                                 sbuf_printf(sb, "TID range: 0-%u, %u-%u", b - 1,
6542                                     t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4,
6543                                     t->ntids - 1);
6544                         } else {
6545                                 sbuf_printf(sb, "TID range: %u-%u",
6546                                     t4_read_reg(sc, A_LE_DB_TID_HASHBASE) / 4,
6547                                     t->ntids - 1);
6548                         }
6549                 } else
6550                         sbuf_printf(sb, "TID range: 0-%u", t->ntids - 1);
6551                 sbuf_printf(sb, ", in use: %u\n",
6552                     atomic_load_acq_int(&t->tids_in_use));
6553         }
6554
6555         if (t->nstids) {
6556                 sbuf_printf(sb, "STID range: %u-%u, in use: %u\n", t->stid_base,
6557                     t->stid_base + t->nstids - 1, t->stids_in_use);
6558         }
6559
6560         if (t->nftids) {
6561                 sbuf_printf(sb, "FTID range: %u-%u\n", t->ftid_base,
6562                     t->ftid_base + t->nftids - 1);
6563         }
6564
6565         if (t->netids) {
6566                 sbuf_printf(sb, "ETID range: %u-%u\n", t->etid_base,
6567                     t->etid_base + t->netids - 1);
6568         }
6569
6570         sbuf_printf(sb, "HW TID usage: %u IP users, %u IPv6 users",
6571             t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV4),
6572             t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV6));
6573
6574         rc = sbuf_finish(sb);
6575         sbuf_delete(sb);
6576
6577         return (rc);
6578 }
6579
6580 static int
6581 sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS)
6582 {
6583         struct adapter *sc = arg1;
6584         struct sbuf *sb;
6585         int rc;
6586         struct tp_err_stats stats;
6587
6588         rc = sysctl_wire_old_buffer(req, 0);
6589         if (rc != 0)
6590                 return (rc);
6591
6592         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6593         if (sb == NULL)
6594                 return (ENOMEM);
6595
6596         t4_tp_get_err_stats(sc, &stats);
6597
6598         sbuf_printf(sb, "                 channel 0  channel 1  channel 2  "
6599                       "channel 3\n");
6600         sbuf_printf(sb, "macInErrs:      %10u %10u %10u %10u\n",
6601             stats.macInErrs[0], stats.macInErrs[1], stats.macInErrs[2],
6602             stats.macInErrs[3]);
6603         sbuf_printf(sb, "hdrInErrs:      %10u %10u %10u %10u\n",
6604             stats.hdrInErrs[0], stats.hdrInErrs[1], stats.hdrInErrs[2],
6605             stats.hdrInErrs[3]);
6606         sbuf_printf(sb, "tcpInErrs:      %10u %10u %10u %10u\n",
6607             stats.tcpInErrs[0], stats.tcpInErrs[1], stats.tcpInErrs[2],
6608             stats.tcpInErrs[3]);
6609         sbuf_printf(sb, "tcp6InErrs:     %10u %10u %10u %10u\n",
6610             stats.tcp6InErrs[0], stats.tcp6InErrs[1], stats.tcp6InErrs[2],
6611             stats.tcp6InErrs[3]);
6612         sbuf_printf(sb, "tnlCongDrops:   %10u %10u %10u %10u\n",
6613             stats.tnlCongDrops[0], stats.tnlCongDrops[1], stats.tnlCongDrops[2],
6614             stats.tnlCongDrops[3]);
6615         sbuf_printf(sb, "tnlTxDrops:     %10u %10u %10u %10u\n",
6616             stats.tnlTxDrops[0], stats.tnlTxDrops[1], stats.tnlTxDrops[2],
6617             stats.tnlTxDrops[3]);
6618         sbuf_printf(sb, "ofldVlanDrops:  %10u %10u %10u %10u\n",
6619             stats.ofldVlanDrops[0], stats.ofldVlanDrops[1],
6620             stats.ofldVlanDrops[2], stats.ofldVlanDrops[3]);
6621         sbuf_printf(sb, "ofldChanDrops:  %10u %10u %10u %10u\n\n",
6622             stats.ofldChanDrops[0], stats.ofldChanDrops[1],
6623             stats.ofldChanDrops[2], stats.ofldChanDrops[3]);
6624         sbuf_printf(sb, "ofldNoNeigh:    %u\nofldCongDefer:  %u",
6625             stats.ofldNoNeigh, stats.ofldCongDefer);
6626
6627         rc = sbuf_finish(sb);
6628         sbuf_delete(sb);
6629
6630         return (rc);
6631 }
6632
6633 struct field_desc {
6634         const char *name;
6635         u_int start;
6636         u_int width;
6637 };
6638
6639 static void
6640 field_desc_show(struct sbuf *sb, uint64_t v, const struct field_desc *f)
6641 {
6642         char buf[32];
6643         int line_size = 0;
6644
6645         while (f->name) {
6646                 uint64_t mask = (1ULL << f->width) - 1;
6647                 int len = snprintf(buf, sizeof(buf), "%s: %ju", f->name,
6648                     ((uintmax_t)v >> f->start) & mask);
6649
6650                 if (line_size + len >= 79) {
6651                         line_size = 8;
6652                         sbuf_printf(sb, "\n        ");
6653                 }
6654                 sbuf_printf(sb, "%s ", buf);
6655                 line_size += len + 1;
6656                 f++;
6657         }
6658         sbuf_printf(sb, "\n");
6659 }
6660
6661 static struct field_desc tp_la0[] = {
6662         { "RcfOpCodeOut", 60, 4 },
6663         { "State", 56, 4 },
6664         { "WcfState", 52, 4 },
6665         { "RcfOpcSrcOut", 50, 2 },
6666         { "CRxError", 49, 1 },
6667         { "ERxError", 48, 1 },
6668         { "SanityFailed", 47, 1 },
6669         { "SpuriousMsg", 46, 1 },
6670         { "FlushInputMsg", 45, 1 },
6671         { "FlushInputCpl", 44, 1 },
6672         { "RssUpBit", 43, 1 },
6673         { "RssFilterHit", 42, 1 },
6674         { "Tid", 32, 10 },
6675         { "InitTcb", 31, 1 },
6676         { "LineNumber", 24, 7 },
6677         { "Emsg", 23, 1 },
6678         { "EdataOut", 22, 1 },
6679         { "Cmsg", 21, 1 },
6680         { "CdataOut", 20, 1 },
6681         { "EreadPdu", 19, 1 },
6682         { "CreadPdu", 18, 1 },
6683         { "TunnelPkt", 17, 1 },
6684         { "RcfPeerFin", 16, 1 },
6685         { "RcfReasonOut", 12, 4 },
6686         { "TxCchannel", 10, 2 },
6687         { "RcfTxChannel", 8, 2 },
6688         { "RxEchannel", 6, 2 },
6689         { "RcfRxChannel", 5, 1 },
6690         { "RcfDataOutSrdy", 4, 1 },
6691         { "RxDvld", 3, 1 },
6692         { "RxOoDvld", 2, 1 },
6693         { "RxCongestion", 1, 1 },
6694         { "TxCongestion", 0, 1 },
6695         { NULL }
6696 };
6697
6698 static struct field_desc tp_la1[] = {
6699         { "CplCmdIn", 56, 8 },
6700         { "CplCmdOut", 48, 8 },
6701         { "ESynOut", 47, 1 },
6702         { "EAckOut", 46, 1 },
6703         { "EFinOut", 45, 1 },
6704         { "ERstOut", 44, 1 },
6705         { "SynIn", 43, 1 },
6706         { "AckIn", 42, 1 },
6707         { "FinIn", 41, 1 },
6708         { "RstIn", 40, 1 },
6709         { "DataIn", 39, 1 },
6710         { "DataInVld", 38, 1 },
6711         { "PadIn", 37, 1 },
6712         { "RxBufEmpty", 36, 1 },
6713         { "RxDdp", 35, 1 },
6714         { "RxFbCongestion", 34, 1 },
6715         { "TxFbCongestion", 33, 1 },
6716         { "TxPktSumSrdy", 32, 1 },
6717         { "RcfUlpType", 28, 4 },
6718         { "Eread", 27, 1 },
6719         { "Ebypass", 26, 1 },
6720         { "Esave", 25, 1 },
6721         { "Static0", 24, 1 },
6722         { "Cread", 23, 1 },
6723         { "Cbypass", 22, 1 },
6724         { "Csave", 21, 1 },
6725         { "CPktOut", 20, 1 },
6726         { "RxPagePoolFull", 18, 2 },
6727         { "RxLpbkPkt", 17, 1 },
6728         { "TxLpbkPkt", 16, 1 },
6729         { "RxVfValid", 15, 1 },
6730         { "SynLearned", 14, 1 },
6731         { "SetDelEntry", 13, 1 },
6732         { "SetInvEntry", 12, 1 },
6733         { "CpcmdDvld", 11, 1 },
6734         { "CpcmdSave", 10, 1 },
6735         { "RxPstructsFull", 8, 2 },
6736         { "EpcmdDvld", 7, 1 },
6737         { "EpcmdFlush", 6, 1 },
6738         { "EpcmdTrimPrefix", 5, 1 },
6739         { "EpcmdTrimPostfix", 4, 1 },
6740         { "ERssIp4Pkt", 3, 1 },
6741         { "ERssIp6Pkt", 2, 1 },
6742         { "ERssTcpUdpPkt", 1, 1 },
6743         { "ERssFceFipPkt", 0, 1 },
6744         { NULL }
6745 };
6746
6747 static struct field_desc tp_la2[] = {
6748         { "CplCmdIn", 56, 8 },
6749         { "MpsVfVld", 55, 1 },
6750         { "MpsPf", 52, 3 },
6751         { "MpsVf", 44, 8 },
6752         { "SynIn", 43, 1 },
6753         { "AckIn", 42, 1 },
6754         { "FinIn", 41, 1 },
6755         { "RstIn", 40, 1 },
6756         { "DataIn", 39, 1 },
6757         { "DataInVld", 38, 1 },
6758         { "PadIn", 37, 1 },
6759         { "RxBufEmpty", 36, 1 },
6760         { "RxDdp", 35, 1 },
6761         { "RxFbCongestion", 34, 1 },
6762         { "TxFbCongestion", 33, 1 },
6763         { "TxPktSumSrdy", 32, 1 },
6764         { "RcfUlpType", 28, 4 },
6765         { "Eread", 27, 1 },
6766         { "Ebypass", 26, 1 },
6767         { "Esave", 25, 1 },
6768         { "Static0", 24, 1 },
6769         { "Cread", 23, 1 },
6770         { "Cbypass", 22, 1 },
6771         { "Csave", 21, 1 },
6772         { "CPktOut", 20, 1 },
6773         { "RxPagePoolFull", 18, 2 },
6774         { "RxLpbkPkt", 17, 1 },
6775         { "TxLpbkPkt", 16, 1 },
6776         { "RxVfValid", 15, 1 },
6777         { "SynLearned", 14, 1 },
6778         { "SetDelEntry", 13, 1 },
6779         { "SetInvEntry", 12, 1 },
6780         { "CpcmdDvld", 11, 1 },
6781         { "CpcmdSave", 10, 1 },
6782         { "RxPstructsFull", 8, 2 },
6783         { "EpcmdDvld", 7, 1 },
6784         { "EpcmdFlush", 6, 1 },
6785         { "EpcmdTrimPrefix", 5, 1 },
6786         { "EpcmdTrimPostfix", 4, 1 },
6787         { "ERssIp4Pkt", 3, 1 },
6788         { "ERssIp6Pkt", 2, 1 },
6789         { "ERssTcpUdpPkt", 1, 1 },
6790         { "ERssFceFipPkt", 0, 1 },
6791         { NULL }
6792 };
6793
6794 static void
6795 tp_la_show(struct sbuf *sb, uint64_t *p, int idx)
6796 {
6797
6798         field_desc_show(sb, *p, tp_la0);
6799 }
6800
6801 static void
6802 tp_la_show2(struct sbuf *sb, uint64_t *p, int idx)
6803 {
6804
6805         if (idx)
6806                 sbuf_printf(sb, "\n");
6807         field_desc_show(sb, p[0], tp_la0);
6808         if (idx < (TPLA_SIZE / 2 - 1) || p[1] != ~0ULL)
6809                 field_desc_show(sb, p[1], tp_la0);
6810 }
6811
6812 static void
6813 tp_la_show3(struct sbuf *sb, uint64_t *p, int idx)
6814 {
6815
6816         if (idx)
6817                 sbuf_printf(sb, "\n");
6818         field_desc_show(sb, p[0], tp_la0);
6819         if (idx < (TPLA_SIZE / 2 - 1) || p[1] != ~0ULL)
6820                 field_desc_show(sb, p[1], (p[0] & (1 << 17)) ? tp_la2 : tp_la1);
6821 }
6822
6823 static int
6824 sysctl_tp_la(SYSCTL_HANDLER_ARGS)
6825 {
6826         struct adapter *sc = arg1;
6827         struct sbuf *sb;
6828         uint64_t *buf, *p;
6829         int rc;
6830         u_int i, inc;
6831         void (*show_func)(struct sbuf *, uint64_t *, int);
6832
6833         rc = sysctl_wire_old_buffer(req, 0);
6834         if (rc != 0)
6835                 return (rc);
6836
6837         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6838         if (sb == NULL)
6839                 return (ENOMEM);
6840
6841         buf = malloc(TPLA_SIZE * sizeof(uint64_t), M_CXGBE, M_ZERO | M_WAITOK);
6842
6843         t4_tp_read_la(sc, buf, NULL);
6844         p = buf;
6845
6846         switch (G_DBGLAMODE(t4_read_reg(sc, A_TP_DBG_LA_CONFIG))) {
6847         case 2:
6848                 inc = 2;
6849                 show_func = tp_la_show2;
6850                 break;
6851         case 3:
6852                 inc = 2;
6853                 show_func = tp_la_show3;
6854                 break;
6855         default:
6856                 inc = 1;
6857                 show_func = tp_la_show;
6858         }
6859
6860         for (i = 0; i < TPLA_SIZE / inc; i++, p += inc)
6861                 (*show_func)(sb, p, i);
6862
6863         rc = sbuf_finish(sb);
6864         sbuf_delete(sb);
6865         free(buf, M_CXGBE);
6866         return (rc);
6867 }
6868
6869 static int
6870 sysctl_tx_rate(SYSCTL_HANDLER_ARGS)
6871 {
6872         struct adapter *sc = arg1;
6873         struct sbuf *sb;
6874         int rc;
6875         u64 nrate[NCHAN], orate[NCHAN];
6876
6877         rc = sysctl_wire_old_buffer(req, 0);
6878         if (rc != 0)
6879                 return (rc);
6880
6881         sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
6882         if (sb == NULL)
6883                 return (ENOMEM);
6884
6885         t4_get_chan_txrate(sc, nrate, orate);
6886         sbuf_printf(sb, "              channel 0   channel 1   channel 2   "
6887                  "channel 3\n");
6888         sbuf_printf(sb, "NIC B/s:     %10ju  %10ju  %10ju  %10ju\n",
6889             nrate[0], nrate[1], nrate[2], nrate[3]);
6890         sbuf_printf(sb, "Offload B/s: %10ju  %10ju  %10ju  %10ju",
6891             orate[0], orate[1], orate[2], orate[3]);
6892
6893         rc = sbuf_finish(sb);
6894         sbuf_delete(sb);
6895
6896         return (rc);
6897 }
6898
6899 static int
6900 sysctl_ulprx_la(SYSCTL_HANDLER_ARGS)
6901 {
6902         struct adapter *sc = arg1;
6903         struct sbuf *sb;
6904         uint32_t *buf, *p;
6905         int rc, i;
6906
6907         rc = sysctl_wire_old_buffer(req, 0);
6908         if (rc != 0)
6909                 return (rc);
6910
6911         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6912         if (sb == NULL)
6913                 return (ENOMEM);
6914
6915         buf = malloc(ULPRX_LA_SIZE * 8 * sizeof(uint32_t), M_CXGBE,
6916             M_ZERO | M_WAITOK);
6917
6918         t4_ulprx_read_la(sc, buf);
6919         p = buf;
6920
6921         sbuf_printf(sb, "      Pcmd        Type   Message"
6922             "                Data");
6923         for (i = 0; i < ULPRX_LA_SIZE; i++, p += 8) {
6924                 sbuf_printf(sb, "\n%08x%08x  %4x  %08x  %08x%08x%08x%08x",
6925                     p[1], p[0], p[2], p[3], p[7], p[6], p[5], p[4]);
6926         }
6927
6928         rc = sbuf_finish(sb);
6929         sbuf_delete(sb);
6930         free(buf, M_CXGBE);
6931         return (rc);
6932 }
6933
6934 static int
6935 sysctl_wcwr_stats(SYSCTL_HANDLER_ARGS)
6936 {
6937         struct adapter *sc = arg1;
6938         struct sbuf *sb;
6939         int rc, v;
6940
6941         rc = sysctl_wire_old_buffer(req, 0);
6942         if (rc != 0)
6943                 return (rc);
6944
6945         sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
6946         if (sb == NULL)
6947                 return (ENOMEM);
6948
6949         v = t4_read_reg(sc, A_SGE_STAT_CFG);
6950         if (G_STATSOURCE_T5(v) == 7) {
6951                 if (G_STATMODE(v) == 0) {
6952                         sbuf_printf(sb, "total %d, incomplete %d",
6953                             t4_read_reg(sc, A_SGE_STAT_TOTAL),
6954                             t4_read_reg(sc, A_SGE_STAT_MATCH));
6955                 } else if (G_STATMODE(v) == 1) {
6956                         sbuf_printf(sb, "total %d, data overflow %d",
6957                             t4_read_reg(sc, A_SGE_STAT_TOTAL),
6958                             t4_read_reg(sc, A_SGE_STAT_MATCH));
6959                 }
6960         }
6961         rc = sbuf_finish(sb);
6962         sbuf_delete(sb);
6963
6964         return (rc);
6965 }
6966 #endif
6967
6968 static uint32_t
6969 fconf_to_mode(uint32_t fconf)
6970 {
6971         uint32_t mode;
6972
6973         mode = T4_FILTER_IPv4 | T4_FILTER_IPv6 | T4_FILTER_IP_SADDR |
6974             T4_FILTER_IP_DADDR | T4_FILTER_IP_SPORT | T4_FILTER_IP_DPORT;
6975
6976         if (fconf & F_FRAGMENTATION)
6977                 mode |= T4_FILTER_IP_FRAGMENT;
6978
6979         if (fconf & F_MPSHITTYPE)
6980                 mode |= T4_FILTER_MPS_HIT_TYPE;
6981
6982         if (fconf & F_MACMATCH)
6983                 mode |= T4_FILTER_MAC_IDX;
6984
6985         if (fconf & F_ETHERTYPE)
6986                 mode |= T4_FILTER_ETH_TYPE;
6987
6988         if (fconf & F_PROTOCOL)
6989                 mode |= T4_FILTER_IP_PROTO;
6990
6991         if (fconf & F_TOS)
6992                 mode |= T4_FILTER_IP_TOS;
6993
6994         if (fconf & F_VLAN)
6995                 mode |= T4_FILTER_VLAN;
6996
6997         if (fconf & F_VNIC_ID)
6998                 mode |= T4_FILTER_VNIC;
6999
7000         if (fconf & F_PORT)
7001                 mode |= T4_FILTER_PORT;
7002
7003         if (fconf & F_FCOE)
7004                 mode |= T4_FILTER_FCoE;
7005
7006         return (mode);
7007 }
7008
7009 static uint32_t
7010 mode_to_fconf(uint32_t mode)
7011 {
7012         uint32_t fconf = 0;
7013
7014         if (mode & T4_FILTER_IP_FRAGMENT)
7015                 fconf |= F_FRAGMENTATION;
7016
7017         if (mode & T4_FILTER_MPS_HIT_TYPE)
7018                 fconf |= F_MPSHITTYPE;
7019
7020         if (mode & T4_FILTER_MAC_IDX)
7021                 fconf |= F_MACMATCH;
7022
7023         if (mode & T4_FILTER_ETH_TYPE)
7024                 fconf |= F_ETHERTYPE;
7025
7026         if (mode & T4_FILTER_IP_PROTO)
7027                 fconf |= F_PROTOCOL;
7028
7029         if (mode & T4_FILTER_IP_TOS)
7030                 fconf |= F_TOS;
7031
7032         if (mode & T4_FILTER_VLAN)
7033                 fconf |= F_VLAN;
7034
7035         if (mode & T4_FILTER_VNIC)
7036                 fconf |= F_VNIC_ID;
7037
7038         if (mode & T4_FILTER_PORT)
7039                 fconf |= F_PORT;
7040
7041         if (mode & T4_FILTER_FCoE)
7042                 fconf |= F_FCOE;
7043
7044         return (fconf);
7045 }
7046
7047 static uint32_t
7048 fspec_to_fconf(struct t4_filter_specification *fs)
7049 {
7050         uint32_t fconf = 0;
7051
7052         if (fs->val.frag || fs->mask.frag)
7053                 fconf |= F_FRAGMENTATION;
7054
7055         if (fs->val.matchtype || fs->mask.matchtype)
7056                 fconf |= F_MPSHITTYPE;
7057
7058         if (fs->val.macidx || fs->mask.macidx)
7059                 fconf |= F_MACMATCH;
7060
7061         if (fs->val.ethtype || fs->mask.ethtype)
7062                 fconf |= F_ETHERTYPE;
7063
7064         if (fs->val.proto || fs->mask.proto)
7065                 fconf |= F_PROTOCOL;
7066
7067         if (fs->val.tos || fs->mask.tos)
7068                 fconf |= F_TOS;
7069
7070         if (fs->val.vlan_vld || fs->mask.vlan_vld)
7071                 fconf |= F_VLAN;
7072
7073         if (fs->val.vnic_vld || fs->mask.vnic_vld)
7074                 fconf |= F_VNIC_ID;
7075
7076         if (fs->val.iport || fs->mask.iport)
7077                 fconf |= F_PORT;
7078
7079         if (fs->val.fcoe || fs->mask.fcoe)
7080                 fconf |= F_FCOE;
7081
7082         return (fconf);
7083 }
7084
7085 static int
7086 get_filter_mode(struct adapter *sc, uint32_t *mode)
7087 {
7088         int rc;
7089         uint32_t fconf;
7090
7091         rc = begin_synchronized_op(sc, NULL, HOLD_LOCK | SLEEP_OK | INTR_OK,
7092             "t4getfm");
7093         if (rc)
7094                 return (rc);
7095
7096         t4_read_indirect(sc, A_TP_PIO_ADDR, A_TP_PIO_DATA, &fconf, 1,
7097             A_TP_VLAN_PRI_MAP);
7098
7099         if (sc->params.tp.vlan_pri_map != fconf) {
7100                 log(LOG_WARNING, "%s: cached filter mode out of sync %x %x.\n",
7101                     device_get_nameunit(sc->dev), sc->params.tp.vlan_pri_map,
7102                     fconf);
7103         }
7104
7105         *mode = fconf_to_mode(fconf);
7106
7107         end_synchronized_op(sc, LOCK_HELD);
7108         return (0);
7109 }
7110
7111 static int
7112 set_filter_mode(struct adapter *sc, uint32_t mode)
7113 {
7114         uint32_t fconf;
7115         int rc;
7116
7117         fconf = mode_to_fconf(mode);
7118
7119         rc = begin_synchronized_op(sc, NULL, HOLD_LOCK | SLEEP_OK | INTR_OK,
7120             "t4setfm");
7121         if (rc)
7122                 return (rc);
7123
7124         if (sc->tids.ftids_in_use > 0) {
7125                 rc = EBUSY;
7126                 goto done;
7127         }
7128
7129 #ifdef TCP_OFFLOAD
7130         if (uld_active(sc, ULD_TOM)) {
7131                 rc = EBUSY;
7132                 goto done;
7133         }
7134 #endif
7135
7136         rc = -t4_set_filter_mode(sc, fconf);
7137 done:
7138         end_synchronized_op(sc, LOCK_HELD);
7139         return (rc);
7140 }
7141
7142 static inline uint64_t
7143 get_filter_hits(struct adapter *sc, uint32_t fid)
7144 {
7145         uint32_t mw_base, off, tcb_base = t4_read_reg(sc, A_TP_CMM_TCB_BASE);
7146         uint64_t hits;
7147
7148         memwin_info(sc, 0, &mw_base, NULL);
7149         off = position_memwin(sc, 0,
7150             tcb_base + (fid + sc->tids.ftid_base) * TCB_SIZE);
7151         if (is_t4(sc)) {
7152                 hits = t4_read_reg64(sc, mw_base + off + 16);
7153                 hits = be64toh(hits);
7154         } else {
7155                 hits = t4_read_reg(sc, mw_base + off + 24);
7156                 hits = be32toh(hits);
7157         }
7158
7159         return (hits);
7160 }
7161
7162 static int
7163 get_filter(struct adapter *sc, struct t4_filter *t)
7164 {
7165         int i, rc, nfilters = sc->tids.nftids;
7166         struct filter_entry *f;
7167
7168         rc = begin_synchronized_op(sc, NULL, HOLD_LOCK | SLEEP_OK | INTR_OK,
7169             "t4getf");
7170         if (rc)
7171                 return (rc);
7172
7173         if (sc->tids.ftids_in_use == 0 || sc->tids.ftid_tab == NULL ||
7174             t->idx >= nfilters) {
7175                 t->idx = 0xffffffff;
7176                 goto done;
7177         }
7178
7179         f = &sc->tids.ftid_tab[t->idx];
7180         for (i = t->idx; i < nfilters; i++, f++) {
7181                 if (f->valid) {
7182                         t->idx = i;
7183                         t->l2tidx = f->l2t ? f->l2t->idx : 0;
7184                         t->smtidx = f->smtidx;
7185                         if (f->fs.hitcnts)
7186                                 t->hits = get_filter_hits(sc, t->idx);
7187                         else
7188                                 t->hits = UINT64_MAX;
7189                         t->fs = f->fs;
7190
7191                         goto done;
7192                 }
7193         }
7194
7195         t->idx = 0xffffffff;
7196 done:
7197         end_synchronized_op(sc, LOCK_HELD);
7198         return (0);
7199 }
7200
7201 static int
7202 set_filter(struct adapter *sc, struct t4_filter *t)
7203 {
7204         unsigned int nfilters, nports;
7205         struct filter_entry *f;
7206         int i, rc;
7207
7208         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4setf");
7209         if (rc)
7210                 return (rc);
7211
7212         nfilters = sc->tids.nftids;
7213         nports = sc->params.nports;
7214
7215         if (nfilters == 0) {
7216                 rc = ENOTSUP;
7217                 goto done;
7218         }
7219
7220         if (!(sc->flags & FULL_INIT_DONE)) {
7221                 rc = EAGAIN;
7222                 goto done;
7223         }
7224
7225         if (t->idx >= nfilters) {
7226                 rc = EINVAL;
7227                 goto done;
7228         }
7229
7230         /* Validate against the global filter mode */
7231         if ((sc->params.tp.vlan_pri_map | fspec_to_fconf(&t->fs)) !=
7232             sc->params.tp.vlan_pri_map) {
7233                 rc = E2BIG;
7234                 goto done;
7235         }
7236
7237         if (t->fs.action == FILTER_SWITCH && t->fs.eport >= nports) {
7238                 rc = EINVAL;
7239                 goto done;
7240         }
7241
7242         if (t->fs.val.iport >= nports) {
7243                 rc = EINVAL;
7244                 goto done;
7245         }
7246
7247         /* Can't specify an iq if not steering to it */
7248         if (!t->fs.dirsteer && t->fs.iq) {
7249                 rc = EINVAL;
7250                 goto done;
7251         }
7252
7253         /* IPv6 filter idx must be 4 aligned */
7254         if (t->fs.type == 1 &&
7255             ((t->idx & 0x3) || t->idx + 4 >= nfilters)) {
7256                 rc = EINVAL;
7257                 goto done;
7258         }
7259
7260         if (sc->tids.ftid_tab == NULL) {
7261                 KASSERT(sc->tids.ftids_in_use == 0,
7262                     ("%s: no memory allocated but filters_in_use > 0",
7263                     __func__));
7264
7265                 sc->tids.ftid_tab = malloc(sizeof (struct filter_entry) *
7266                     nfilters, M_CXGBE, M_NOWAIT | M_ZERO);
7267                 if (sc->tids.ftid_tab == NULL) {
7268                         rc = ENOMEM;
7269                         goto done;
7270                 }
7271                 mtx_init(&sc->tids.ftid_lock, "T4 filters", 0, MTX_DEF);
7272         }
7273
7274         for (i = 0; i < 4; i++) {
7275                 f = &sc->tids.ftid_tab[t->idx + i];
7276
7277                 if (f->pending || f->valid) {
7278                         rc = EBUSY;
7279                         goto done;
7280                 }
7281                 if (f->locked) {
7282                         rc = EPERM;
7283                         goto done;
7284                 }
7285
7286                 if (t->fs.type == 0)
7287                         break;
7288         }
7289
7290         f = &sc->tids.ftid_tab[t->idx];
7291         f->fs = t->fs;
7292
7293         rc = set_filter_wr(sc, t->idx);
7294 done:
7295         end_synchronized_op(sc, 0);
7296
7297         if (rc == 0) {
7298                 mtx_lock(&sc->tids.ftid_lock);
7299                 for (;;) {
7300                         if (f->pending == 0) {
7301                                 rc = f->valid ? 0 : EIO;
7302                                 break;
7303                         }
7304
7305                         if (mtx_sleep(&sc->tids.ftid_tab, &sc->tids.ftid_lock,
7306                             PCATCH, "t4setfw", 0)) {
7307                                 rc = EINPROGRESS;
7308                                 break;
7309                         }
7310                 }
7311                 mtx_unlock(&sc->tids.ftid_lock);
7312         }
7313         return (rc);
7314 }
7315
7316 static int
7317 del_filter(struct adapter *sc, struct t4_filter *t)
7318 {
7319         unsigned int nfilters;
7320         struct filter_entry *f;
7321         int rc;
7322
7323         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4delf");
7324         if (rc)
7325                 return (rc);
7326
7327         nfilters = sc->tids.nftids;
7328
7329         if (nfilters == 0) {
7330                 rc = ENOTSUP;
7331                 goto done;
7332         }
7333
7334         if (sc->tids.ftid_tab == NULL || sc->tids.ftids_in_use == 0 ||
7335             t->idx >= nfilters) {
7336                 rc = EINVAL;
7337                 goto done;
7338         }
7339
7340         if (!(sc->flags & FULL_INIT_DONE)) {
7341                 rc = EAGAIN;
7342                 goto done;
7343         }
7344
7345         f = &sc->tids.ftid_tab[t->idx];
7346
7347         if (f->pending) {
7348                 rc = EBUSY;
7349                 goto done;
7350         }
7351         if (f->locked) {
7352                 rc = EPERM;
7353                 goto done;
7354         }
7355
7356         if (f->valid) {
7357                 t->fs = f->fs;  /* extra info for the caller */
7358                 rc = del_filter_wr(sc, t->idx);
7359         }
7360
7361 done:
7362         end_synchronized_op(sc, 0);
7363
7364         if (rc == 0) {
7365                 mtx_lock(&sc->tids.ftid_lock);
7366                 for (;;) {
7367                         if (f->pending == 0) {
7368                                 rc = f->valid ? EIO : 0;
7369                                 break;
7370                         }
7371
7372                         if (mtx_sleep(&sc->tids.ftid_tab, &sc->tids.ftid_lock,
7373                             PCATCH, "t4delfw", 0)) {
7374                                 rc = EINPROGRESS;
7375                                 break;
7376                         }
7377                 }
7378                 mtx_unlock(&sc->tids.ftid_lock);
7379         }
7380
7381         return (rc);
7382 }
7383
7384 static void
7385 clear_filter(struct filter_entry *f)
7386 {
7387         if (f->l2t)
7388                 t4_l2t_release(f->l2t);
7389
7390         bzero(f, sizeof (*f));
7391 }
7392
7393 static int
7394 set_filter_wr(struct adapter *sc, int fidx)
7395 {
7396         struct filter_entry *f = &sc->tids.ftid_tab[fidx];
7397         struct fw_filter_wr *fwr;
7398         unsigned int ftid;
7399         struct wrq_cookie cookie;
7400
7401         ASSERT_SYNCHRONIZED_OP(sc);
7402
7403         if (f->fs.newdmac || f->fs.newvlan) {
7404                 /* This filter needs an L2T entry; allocate one. */
7405                 f->l2t = t4_l2t_alloc_switching(sc->l2t);
7406                 if (f->l2t == NULL)
7407                         return (EAGAIN);
7408                 if (t4_l2t_set_switching(sc, f->l2t, f->fs.vlan, f->fs.eport,
7409                     f->fs.dmac)) {
7410                         t4_l2t_release(f->l2t);
7411                         f->l2t = NULL;
7412                         return (ENOMEM);
7413                 }
7414         }
7415
7416         ftid = sc->tids.ftid_base + fidx;
7417
7418         fwr = start_wrq_wr(&sc->sge.mgmtq, howmany(sizeof(*fwr), 16), &cookie);
7419         if (fwr == NULL)
7420                 return (ENOMEM);
7421         bzero(fwr, sizeof(*fwr));
7422
7423         fwr->op_pkd = htobe32(V_FW_WR_OP(FW_FILTER_WR));
7424         fwr->len16_pkd = htobe32(FW_LEN16(*fwr));
7425         fwr->tid_to_iq =
7426             htobe32(V_FW_FILTER_WR_TID(ftid) |
7427                 V_FW_FILTER_WR_RQTYPE(f->fs.type) |
7428                 V_FW_FILTER_WR_NOREPLY(0) |
7429                 V_FW_FILTER_WR_IQ(f->fs.iq));
7430         fwr->del_filter_to_l2tix =
7431             htobe32(V_FW_FILTER_WR_RPTTID(f->fs.rpttid) |
7432                 V_FW_FILTER_WR_DROP(f->fs.action == FILTER_DROP) |
7433                 V_FW_FILTER_WR_DIRSTEER(f->fs.dirsteer) |
7434                 V_FW_FILTER_WR_MASKHASH(f->fs.maskhash) |
7435                 V_FW_FILTER_WR_DIRSTEERHASH(f->fs.dirsteerhash) |
7436                 V_FW_FILTER_WR_LPBK(f->fs.action == FILTER_SWITCH) |
7437                 V_FW_FILTER_WR_DMAC(f->fs.newdmac) |
7438                 V_FW_FILTER_WR_SMAC(f->fs.newsmac) |
7439                 V_FW_FILTER_WR_INSVLAN(f->fs.newvlan == VLAN_INSERT ||
7440                     f->fs.newvlan == VLAN_REWRITE) |
7441                 V_FW_FILTER_WR_RMVLAN(f->fs.newvlan == VLAN_REMOVE ||
7442                     f->fs.newvlan == VLAN_REWRITE) |
7443                 V_FW_FILTER_WR_HITCNTS(f->fs.hitcnts) |
7444                 V_FW_FILTER_WR_TXCHAN(f->fs.eport) |
7445                 V_FW_FILTER_WR_PRIO(f->fs.prio) |
7446                 V_FW_FILTER_WR_L2TIX(f->l2t ? f->l2t->idx : 0));
7447         fwr->ethtype = htobe16(f->fs.val.ethtype);
7448         fwr->ethtypem = htobe16(f->fs.mask.ethtype);
7449         fwr->frag_to_ovlan_vldm =
7450             (V_FW_FILTER_WR_FRAG(f->fs.val.frag) |
7451                 V_FW_FILTER_WR_FRAGM(f->fs.mask.frag) |
7452                 V_FW_FILTER_WR_IVLAN_VLD(f->fs.val.vlan_vld) |
7453                 V_FW_FILTER_WR_OVLAN_VLD(f->fs.val.vnic_vld) |
7454                 V_FW_FILTER_WR_IVLAN_VLDM(f->fs.mask.vlan_vld) |
7455                 V_FW_FILTER_WR_OVLAN_VLDM(f->fs.mask.vnic_vld));
7456         fwr->smac_sel = 0;
7457         fwr->rx_chan_rx_rpl_iq = htobe16(V_FW_FILTER_WR_RX_CHAN(0) |
7458             V_FW_FILTER_WR_RX_RPL_IQ(sc->sge.fwq.abs_id));
7459         fwr->maci_to_matchtypem =
7460             htobe32(V_FW_FILTER_WR_MACI(f->fs.val.macidx) |
7461                 V_FW_FILTER_WR_MACIM(f->fs.mask.macidx) |
7462                 V_FW_FILTER_WR_FCOE(f->fs.val.fcoe) |
7463                 V_FW_FILTER_WR_FCOEM(f->fs.mask.fcoe) |
7464                 V_FW_FILTER_WR_PORT(f->fs.val.iport) |
7465                 V_FW_FILTER_WR_PORTM(f->fs.mask.iport) |
7466                 V_FW_FILTER_WR_MATCHTYPE(f->fs.val.matchtype) |
7467                 V_FW_FILTER_WR_MATCHTYPEM(f->fs.mask.matchtype));
7468         fwr->ptcl = f->fs.val.proto;
7469         fwr->ptclm = f->fs.mask.proto;
7470         fwr->ttyp = f->fs.val.tos;
7471         fwr->ttypm = f->fs.mask.tos;
7472         fwr->ivlan = htobe16(f->fs.val.vlan);
7473         fwr->ivlanm = htobe16(f->fs.mask.vlan);
7474         fwr->ovlan = htobe16(f->fs.val.vnic);
7475         fwr->ovlanm = htobe16(f->fs.mask.vnic);
7476         bcopy(f->fs.val.dip, fwr->lip, sizeof (fwr->lip));
7477         bcopy(f->fs.mask.dip, fwr->lipm, sizeof (fwr->lipm));
7478         bcopy(f->fs.val.sip, fwr->fip, sizeof (fwr->fip));
7479         bcopy(f->fs.mask.sip, fwr->fipm, sizeof (fwr->fipm));
7480         fwr->lp = htobe16(f->fs.val.dport);
7481         fwr->lpm = htobe16(f->fs.mask.dport);
7482         fwr->fp = htobe16(f->fs.val.sport);
7483         fwr->fpm = htobe16(f->fs.mask.sport);
7484         if (f->fs.newsmac)
7485                 bcopy(f->fs.smac, fwr->sma, sizeof (fwr->sma));
7486
7487         f->pending = 1;
7488         sc->tids.ftids_in_use++;
7489
7490         commit_wrq_wr(&sc->sge.mgmtq, fwr, &cookie);
7491         return (0);
7492 }
7493
7494 static int
7495 del_filter_wr(struct adapter *sc, int fidx)
7496 {
7497         struct filter_entry *f = &sc->tids.ftid_tab[fidx];
7498         struct fw_filter_wr *fwr;
7499         unsigned int ftid;
7500         struct wrq_cookie cookie;
7501
7502         ftid = sc->tids.ftid_base + fidx;
7503
7504         fwr = start_wrq_wr(&sc->sge.mgmtq, howmany(sizeof(*fwr), 16), &cookie);
7505         if (fwr == NULL)
7506                 return (ENOMEM);
7507         bzero(fwr, sizeof (*fwr));
7508
7509         t4_mk_filtdelwr(ftid, fwr, sc->sge.fwq.abs_id);
7510
7511         f->pending = 1;
7512         commit_wrq_wr(&sc->sge.mgmtq, fwr, &cookie);
7513         return (0);
7514 }
7515
7516 int
7517 t4_filter_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
7518 {
7519         struct adapter *sc = iq->adapter;
7520         const struct cpl_set_tcb_rpl *rpl = (const void *)(rss + 1);
7521         unsigned int idx = GET_TID(rpl);
7522         unsigned int rc;
7523         struct filter_entry *f;
7524
7525         KASSERT(m == NULL, ("%s: payload with opcode %02x", __func__,
7526             rss->opcode));
7527
7528         if (is_ftid(sc, idx)) {
7529
7530                 idx -= sc->tids.ftid_base;
7531                 f = &sc->tids.ftid_tab[idx];
7532                 rc = G_COOKIE(rpl->cookie);
7533
7534                 mtx_lock(&sc->tids.ftid_lock);
7535                 if (rc == FW_FILTER_WR_FLT_ADDED) {
7536                         KASSERT(f->pending, ("%s: filter[%u] isn't pending.",
7537                             __func__, idx));
7538                         f->smtidx = (be64toh(rpl->oldval) >> 24) & 0xff;
7539                         f->pending = 0;  /* asynchronous setup completed */
7540                         f->valid = 1;
7541                 } else {
7542                         if (rc != FW_FILTER_WR_FLT_DELETED) {
7543                                 /* Add or delete failed, display an error */
7544                                 log(LOG_ERR,
7545                                     "filter %u setup failed with error %u\n",
7546                                     idx, rc);
7547                         }
7548
7549                         clear_filter(f);
7550                         sc->tids.ftids_in_use--;
7551                 }
7552                 wakeup(&sc->tids.ftid_tab);
7553                 mtx_unlock(&sc->tids.ftid_lock);
7554         }
7555
7556         return (0);
7557 }
7558
7559 static int
7560 get_sge_context(struct adapter *sc, struct t4_sge_context *cntxt)
7561 {
7562         int rc;
7563
7564         if (cntxt->cid > M_CTXTQID)
7565                 return (EINVAL);
7566
7567         if (cntxt->mem_id != CTXT_EGRESS && cntxt->mem_id != CTXT_INGRESS &&
7568             cntxt->mem_id != CTXT_FLM && cntxt->mem_id != CTXT_CNM)
7569                 return (EINVAL);
7570
7571         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4ctxt");
7572         if (rc)
7573                 return (rc);
7574
7575         if (sc->flags & FW_OK) {
7576                 rc = -t4_sge_ctxt_rd(sc, sc->mbox, cntxt->cid, cntxt->mem_id,
7577                     &cntxt->data[0]);
7578                 if (rc == 0)
7579                         goto done;
7580         }
7581
7582         /*
7583          * Read via firmware failed or wasn't even attempted.  Read directly via
7584          * the backdoor.
7585          */
7586         rc = -t4_sge_ctxt_rd_bd(sc, cntxt->cid, cntxt->mem_id, &cntxt->data[0]);
7587 done:
7588         end_synchronized_op(sc, 0);
7589         return (rc);
7590 }
7591
7592 static int
7593 load_fw(struct adapter *sc, struct t4_data *fw)
7594 {
7595         int rc;
7596         uint8_t *fw_data;
7597
7598         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4ldfw");
7599         if (rc)
7600                 return (rc);
7601
7602         if (sc->flags & FULL_INIT_DONE) {
7603                 rc = EBUSY;
7604                 goto done;
7605         }
7606
7607         fw_data = malloc(fw->len, M_CXGBE, M_WAITOK);
7608         if (fw_data == NULL) {
7609                 rc = ENOMEM;
7610                 goto done;
7611         }
7612
7613         rc = copyin(fw->data, fw_data, fw->len);
7614         if (rc == 0)
7615                 rc = -t4_load_fw(sc, fw_data, fw->len);
7616
7617         free(fw_data, M_CXGBE);
7618 done:
7619         end_synchronized_op(sc, 0);
7620         return (rc);
7621 }
7622
7623 static int
7624 read_card_mem(struct adapter *sc, int win, struct t4_mem_range *mr)
7625 {
7626         uint32_t addr, off, remaining, i, n;
7627         uint32_t *buf, *b;
7628         uint32_t mw_base, mw_aperture;
7629         int rc;
7630         uint8_t *dst;
7631
7632         rc = validate_mem_range(sc, mr->addr, mr->len);
7633         if (rc != 0)
7634                 return (rc);
7635
7636         memwin_info(sc, win, &mw_base, &mw_aperture);
7637         buf = b = malloc(min(mr->len, mw_aperture), M_CXGBE, M_WAITOK);
7638         addr = mr->addr;
7639         remaining = mr->len;
7640         dst = (void *)mr->data;
7641
7642         while (remaining) {
7643                 off = position_memwin(sc, win, addr);
7644
7645                 /* number of bytes that we'll copy in the inner loop */
7646                 n = min(remaining, mw_aperture - off);
7647                 for (i = 0; i < n; i += 4)
7648                         *b++ = t4_read_reg(sc, mw_base + off + i);
7649
7650                 rc = copyout(buf, dst, n);
7651                 if (rc != 0)
7652                         break;
7653
7654                 b = buf;
7655                 dst += n;
7656                 remaining -= n;
7657                 addr += n;
7658         }
7659
7660         free(buf, M_CXGBE);
7661         return (rc);
7662 }
7663
7664 static int
7665 read_i2c(struct adapter *sc, struct t4_i2c_data *i2cd)
7666 {
7667         int rc;
7668
7669         if (i2cd->len == 0 || i2cd->port_id >= sc->params.nports)
7670                 return (EINVAL);
7671
7672         if (i2cd->len > sizeof(i2cd->data))
7673                 return (EFBIG);
7674
7675         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4i2crd");
7676         if (rc)
7677                 return (rc);
7678         rc = -t4_i2c_rd(sc, sc->mbox, i2cd->port_id, i2cd->dev_addr,
7679             i2cd->offset, i2cd->len, &i2cd->data[0]);
7680         end_synchronized_op(sc, 0);
7681
7682         return (rc);
7683 }
7684
7685 static int
7686 in_range(int val, int lo, int hi)
7687 {
7688
7689         return (val < 0 || (val <= hi && val >= lo));
7690 }
7691
7692 static int
7693 set_sched_class(struct adapter *sc, struct t4_sched_params *p)
7694 {
7695         int fw_subcmd, fw_type, rc;
7696
7697         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4setsc");
7698         if (rc)
7699                 return (rc);
7700
7701         if (!(sc->flags & FULL_INIT_DONE)) {
7702                 rc = EAGAIN;
7703                 goto done;
7704         }
7705
7706         /*
7707          * Translate the cxgbetool parameters into T4 firmware parameters.  (The
7708          * sub-command and type are in common locations.)
7709          */
7710         if (p->subcmd == SCHED_CLASS_SUBCMD_CONFIG)
7711                 fw_subcmd = FW_SCHED_SC_CONFIG;
7712         else if (p->subcmd == SCHED_CLASS_SUBCMD_PARAMS)
7713                 fw_subcmd = FW_SCHED_SC_PARAMS;
7714         else {
7715                 rc = EINVAL;
7716                 goto done;
7717         }
7718         if (p->type == SCHED_CLASS_TYPE_PACKET)
7719                 fw_type = FW_SCHED_TYPE_PKTSCHED;
7720         else {
7721                 rc = EINVAL;
7722                 goto done;
7723         }
7724
7725         if (fw_subcmd == FW_SCHED_SC_CONFIG) {
7726                 /* Vet our parameters ..*/
7727                 if (p->u.config.minmax < 0) {
7728                         rc = EINVAL;
7729                         goto done;
7730                 }
7731
7732                 /* And pass the request to the firmware ...*/
7733                 rc = -t4_sched_config(sc, fw_type, p->u.config.minmax, 1);
7734                 goto done;
7735         }
7736
7737         if (fw_subcmd == FW_SCHED_SC_PARAMS) {
7738                 int fw_level;
7739                 int fw_mode;
7740                 int fw_rateunit;
7741                 int fw_ratemode;
7742
7743                 if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL)
7744                         fw_level = FW_SCHED_PARAMS_LEVEL_CL_RL;
7745                 else if (p->u.params.level == SCHED_CLASS_LEVEL_CL_WRR)
7746                         fw_level = FW_SCHED_PARAMS_LEVEL_CL_WRR;
7747                 else if (p->u.params.level == SCHED_CLASS_LEVEL_CH_RL)
7748                         fw_level = FW_SCHED_PARAMS_LEVEL_CH_RL;
7749                 else {
7750                         rc = EINVAL;
7751                         goto done;
7752                 }
7753
7754                 if (p->u.params.mode == SCHED_CLASS_MODE_CLASS)
7755                         fw_mode = FW_SCHED_PARAMS_MODE_CLASS;
7756                 else if (p->u.params.mode == SCHED_CLASS_MODE_FLOW)
7757                         fw_mode = FW_SCHED_PARAMS_MODE_FLOW;
7758                 else {
7759                         rc = EINVAL;
7760                         goto done;
7761                 }
7762
7763                 if (p->u.params.rateunit == SCHED_CLASS_RATEUNIT_BITS)
7764                         fw_rateunit = FW_SCHED_PARAMS_UNIT_BITRATE;
7765                 else if (p->u.params.rateunit == SCHED_CLASS_RATEUNIT_PKTS)
7766                         fw_rateunit = FW_SCHED_PARAMS_UNIT_PKTRATE;
7767                 else {
7768                         rc = EINVAL;
7769                         goto done;
7770                 }
7771
7772                 if (p->u.params.ratemode == SCHED_CLASS_RATEMODE_REL)
7773                         fw_ratemode = FW_SCHED_PARAMS_RATE_REL;
7774                 else if (p->u.params.ratemode == SCHED_CLASS_RATEMODE_ABS)
7775                         fw_ratemode = FW_SCHED_PARAMS_RATE_ABS;
7776                 else {
7777                         rc = EINVAL;
7778                         goto done;
7779                 }
7780
7781                 /* Vet our parameters ... */
7782                 if (!in_range(p->u.params.channel, 0, 3) ||
7783                     !in_range(p->u.params.cl, 0, is_t4(sc) ? 15 : 16) ||
7784                     !in_range(p->u.params.minrate, 0, 10000000) ||
7785                     !in_range(p->u.params.maxrate, 0, 10000000) ||
7786                     !in_range(p->u.params.weight, 0, 100)) {
7787                         rc = ERANGE;
7788                         goto done;
7789                 }
7790
7791                 /*
7792                  * Translate any unset parameters into the firmware's
7793                  * nomenclature and/or fail the call if the parameters
7794                  * are required ...
7795                  */
7796                 if (p->u.params.rateunit < 0 || p->u.params.ratemode < 0 ||
7797                     p->u.params.channel < 0 || p->u.params.cl < 0) {
7798                         rc = EINVAL;
7799                         goto done;
7800                 }
7801                 if (p->u.params.minrate < 0)
7802                         p->u.params.minrate = 0;
7803                 if (p->u.params.maxrate < 0) {
7804                         if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL ||
7805                             p->u.params.level == SCHED_CLASS_LEVEL_CH_RL) {
7806                                 rc = EINVAL;
7807                                 goto done;
7808                         } else
7809                                 p->u.params.maxrate = 0;
7810                 }
7811                 if (p->u.params.weight < 0) {
7812                         if (p->u.params.level == SCHED_CLASS_LEVEL_CL_WRR) {
7813                                 rc = EINVAL;
7814                                 goto done;
7815                         } else
7816                                 p->u.params.weight = 0;
7817                 }
7818                 if (p->u.params.pktsize < 0) {
7819                         if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL ||
7820                             p->u.params.level == SCHED_CLASS_LEVEL_CH_RL) {
7821                                 rc = EINVAL;
7822                                 goto done;
7823                         } else
7824                                 p->u.params.pktsize = 0;
7825                 }
7826
7827                 /* See what the firmware thinks of the request ... */
7828                 rc = -t4_sched_params(sc, fw_type, fw_level, fw_mode,
7829                     fw_rateunit, fw_ratemode, p->u.params.channel,
7830                     p->u.params.cl, p->u.params.minrate, p->u.params.maxrate,
7831                     p->u.params.weight, p->u.params.pktsize, 1);
7832                 goto done;
7833         }
7834
7835         rc = EINVAL;
7836 done:
7837         end_synchronized_op(sc, 0);
7838         return (rc);
7839 }
7840
7841 static int
7842 set_sched_queue(struct adapter *sc, struct t4_sched_queue *p)
7843 {
7844         struct port_info *pi = NULL;
7845         struct sge_txq *txq;
7846         uint32_t fw_mnem, fw_queue, fw_class;
7847         int i, rc;
7848
7849         rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4setsq");
7850         if (rc)
7851                 return (rc);
7852
7853         if (!(sc->flags & FULL_INIT_DONE)) {
7854                 rc = EAGAIN;
7855                 goto done;
7856         }
7857
7858         if (p->port >= sc->params.nports) {
7859                 rc = EINVAL;
7860                 goto done;
7861         }
7862
7863         pi = sc->port[p->port];
7864         if (!in_range(p->queue, 0, pi->ntxq - 1) || !in_range(p->cl, 0, 7)) {
7865                 rc = EINVAL;
7866                 goto done;
7867         }
7868
7869         /*
7870          * Create a template for the FW_PARAMS_CMD mnemonic and value (TX
7871          * Scheduling Class in this case).
7872          */
7873         fw_mnem = (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) |
7874             V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_EQ_SCHEDCLASS_ETH));
7875         fw_class = p->cl < 0 ? 0xffffffff : p->cl;
7876
7877         /*
7878          * If op.queue is non-negative, then we're only changing the scheduling
7879          * on a single specified TX queue.
7880          */
7881         if (p->queue >= 0) {
7882                 txq = &sc->sge.txq[pi->first_txq + p->queue];
7883                 fw_queue = (fw_mnem | V_FW_PARAMS_PARAM_YZ(txq->eq.cntxt_id));
7884                 rc = -t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &fw_queue,
7885                     &fw_class);
7886                 goto done;
7887         }
7888
7889         /*
7890          * Change the scheduling on all the TX queues for the
7891          * interface.
7892          */
7893         for_each_txq(pi, i, txq) {
7894                 fw_queue = (fw_mnem | V_FW_PARAMS_PARAM_YZ(txq->eq.cntxt_id));
7895                 rc = -t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &fw_queue,
7896                     &fw_class);
7897                 if (rc)
7898                         goto done;
7899         }
7900
7901         rc = 0;
7902 done:
7903         end_synchronized_op(sc, 0);
7904         return (rc);
7905 }
7906
7907 int
7908 t4_os_find_pci_capability(struct adapter *sc, int cap)
7909 {
7910         int i;
7911
7912         return (pci_find_cap(sc->dev, cap, &i) == 0 ? i : 0);
7913 }
7914
7915 int
7916 t4_os_pci_save_state(struct adapter *sc)
7917 {
7918         device_t dev;
7919         struct pci_devinfo *dinfo;
7920
7921         dev = sc->dev;
7922         dinfo = device_get_ivars(dev);
7923
7924         pci_cfg_save(dev, dinfo, 0);
7925         return (0);
7926 }
7927
7928 int
7929 t4_os_pci_restore_state(struct adapter *sc)
7930 {
7931         device_t dev;
7932         struct pci_devinfo *dinfo;
7933
7934         dev = sc->dev;
7935         dinfo = device_get_ivars(dev);
7936
7937         pci_cfg_restore(dev, dinfo);
7938         return (0);
7939 }
7940
7941 void
7942 t4_os_portmod_changed(const struct adapter *sc, int idx)
7943 {
7944         struct port_info *pi = sc->port[idx];
7945         static const char *mod_str[] = {
7946                 NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM"
7947         };
7948
7949         build_medialist(pi, &pi->media);
7950 #ifdef DEV_NETMAP
7951         build_medialist(pi, &pi->nm_media);
7952 #endif
7953
7954         if (pi->mod_type == FW_PORT_MOD_TYPE_NONE)
7955                 if_printf(pi->ifp, "transceiver unplugged.\n");
7956         else if (pi->mod_type == FW_PORT_MOD_TYPE_UNKNOWN)
7957                 if_printf(pi->ifp, "unknown transceiver inserted.\n");
7958         else if (pi->mod_type == FW_PORT_MOD_TYPE_NOTSUPPORTED)
7959                 if_printf(pi->ifp, "unsupported transceiver inserted.\n");
7960         else if (pi->mod_type > 0 && pi->mod_type < nitems(mod_str)) {
7961                 if_printf(pi->ifp, "%s transceiver inserted.\n",
7962                     mod_str[pi->mod_type]);
7963         } else {
7964                 if_printf(pi->ifp, "transceiver (type %d) inserted.\n",
7965                     pi->mod_type);
7966         }
7967 }
7968
7969 void
7970 t4_os_link_changed(struct adapter *sc, int idx, int link_stat, int reason)
7971 {
7972         struct port_info *pi = sc->port[idx];
7973         struct ifnet *ifp = pi->ifp;
7974
7975         if (link_stat) {
7976                 pi->linkdnrc = -1;
7977                 ifp->if_baudrate = IF_Mbps(pi->link_cfg.speed);
7978                 if_link_state_change(ifp, LINK_STATE_UP);
7979         } else {
7980                 if (reason >= 0)
7981                         pi->linkdnrc = reason;
7982                 if_link_state_change(ifp, LINK_STATE_DOWN);
7983         }
7984 }
7985
7986 void
7987 t4_iterate(void (*func)(struct adapter *, void *), void *arg)
7988 {
7989         struct adapter *sc;
7990
7991         sx_slock(&t4_list_lock);
7992         SLIST_FOREACH(sc, &t4_list, link) {
7993                 /*
7994                  * func should not make any assumptions about what state sc is
7995                  * in - the only guarantee is that sc->sc_lock is a valid lock.
7996                  */
7997                 func(sc, arg);
7998         }
7999         sx_sunlock(&t4_list_lock);
8000 }
8001
8002 static int
8003 t4_open(struct cdev *dev, int flags, int type, struct thread *td)
8004 {
8005        return (0);
8006 }
8007
8008 static int
8009 t4_close(struct cdev *dev, int flags, int type, struct thread *td)
8010 {
8011        return (0);
8012 }
8013
8014 static int
8015 t4_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, int fflag,
8016     struct thread *td)
8017 {
8018         int rc;
8019         struct adapter *sc = dev->si_drv1;
8020
8021         rc = priv_check(td, PRIV_DRIVER);
8022         if (rc != 0)
8023                 return (rc);
8024
8025         switch (cmd) {
8026         case CHELSIO_T4_GETREG: {
8027                 struct t4_reg *edata = (struct t4_reg *)data;
8028
8029                 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
8030                         return (EFAULT);
8031
8032                 if (edata->size == 4)
8033                         edata->val = t4_read_reg(sc, edata->addr);
8034                 else if (edata->size == 8)
8035                         edata->val = t4_read_reg64(sc, edata->addr);
8036                 else
8037                         return (EINVAL);
8038
8039                 break;
8040         }
8041         case CHELSIO_T4_SETREG: {
8042                 struct t4_reg *edata = (struct t4_reg *)data;
8043
8044                 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
8045                         return (EFAULT);
8046
8047                 if (edata->size == 4) {
8048                         if (edata->val & 0xffffffff00000000)
8049                                 return (EINVAL);
8050                         t4_write_reg(sc, edata->addr, (uint32_t) edata->val);
8051                 } else if (edata->size == 8)
8052                         t4_write_reg64(sc, edata->addr, edata->val);
8053                 else
8054                         return (EINVAL);
8055                 break;
8056         }
8057         case CHELSIO_T4_REGDUMP: {
8058                 struct t4_regdump *regs = (struct t4_regdump *)data;
8059                 int reglen = is_t4(sc) ? T4_REGDUMP_SIZE : T5_REGDUMP_SIZE;
8060                 uint8_t *buf;
8061
8062                 if (regs->len < reglen) {
8063                         regs->len = reglen; /* hint to the caller */
8064                         return (ENOBUFS);
8065                 }
8066
8067                 regs->len = reglen;
8068                 buf = malloc(reglen, M_CXGBE, M_WAITOK | M_ZERO);
8069                 t4_get_regs(sc, regs, buf);
8070                 rc = copyout(buf, regs->data, reglen);
8071                 free(buf, M_CXGBE);
8072                 break;
8073         }
8074         case CHELSIO_T4_GET_FILTER_MODE:
8075                 rc = get_filter_mode(sc, (uint32_t *)data);
8076                 break;
8077         case CHELSIO_T4_SET_FILTER_MODE:
8078                 rc = set_filter_mode(sc, *(uint32_t *)data);
8079                 break;
8080         case CHELSIO_T4_GET_FILTER:
8081                 rc = get_filter(sc, (struct t4_filter *)data);
8082                 break;
8083         case CHELSIO_T4_SET_FILTER:
8084                 rc = set_filter(sc, (struct t4_filter *)data);
8085                 break;
8086         case CHELSIO_T4_DEL_FILTER:
8087                 rc = del_filter(sc, (struct t4_filter *)data);
8088                 break;
8089         case CHELSIO_T4_GET_SGE_CONTEXT:
8090                 rc = get_sge_context(sc, (struct t4_sge_context *)data);
8091                 break;
8092         case CHELSIO_T4_LOAD_FW:
8093                 rc = load_fw(sc, (struct t4_data *)data);
8094                 break;
8095         case CHELSIO_T4_GET_MEM:
8096                 rc = read_card_mem(sc, 2, (struct t4_mem_range *)data);
8097                 break;
8098         case CHELSIO_T4_GET_I2C:
8099                 rc = read_i2c(sc, (struct t4_i2c_data *)data);
8100                 break;
8101         case CHELSIO_T4_CLEAR_STATS: {
8102                 int i;
8103                 u_int port_id = *(uint32_t *)data;
8104                 struct port_info *pi;
8105
8106                 if (port_id >= sc->params.nports)
8107                         return (EINVAL);
8108                 pi = sc->port[port_id];
8109
8110                 /* MAC stats */
8111                 t4_clr_port_stats(sc, pi->tx_chan);
8112                 pi->tx_parse_error = 0;
8113
8114                 if (pi->flags & PORT_INIT_DONE) {
8115                         struct sge_rxq *rxq;
8116                         struct sge_txq *txq;
8117                         struct sge_wrq *wrq;
8118
8119                         for_each_rxq(pi, i, rxq) {
8120 #if defined(INET) || defined(INET6)
8121                                 rxq->lro.lro_queued = 0;
8122                                 rxq->lro.lro_flushed = 0;
8123 #endif
8124                                 rxq->rxcsum = 0;
8125                                 rxq->vlan_extraction = 0;
8126                         }
8127
8128                         for_each_txq(pi, i, txq) {
8129                                 txq->txcsum = 0;
8130                                 txq->tso_wrs = 0;
8131                                 txq->vlan_insertion = 0;
8132                                 txq->imm_wrs = 0;
8133                                 txq->sgl_wrs = 0;
8134                                 txq->txpkt_wrs = 0;
8135                                 txq->txpkts0_wrs = 0;
8136                                 txq->txpkts1_wrs = 0;
8137                                 txq->txpkts0_pkts = 0;
8138                                 txq->txpkts1_pkts = 0;
8139                                 mp_ring_reset_stats(txq->r);
8140                         }
8141
8142 #ifdef TCP_OFFLOAD
8143                         /* nothing to clear for each ofld_rxq */
8144
8145                         for_each_ofld_txq(pi, i, wrq) {
8146                                 wrq->tx_wrs_direct = 0;
8147                                 wrq->tx_wrs_copied = 0;
8148                         }
8149 #endif
8150                         wrq = &sc->sge.ctrlq[pi->port_id];
8151                         wrq->tx_wrs_direct = 0;
8152                         wrq->tx_wrs_copied = 0;
8153                 }
8154                 break;
8155         }
8156         case CHELSIO_T4_SCHED_CLASS:
8157                 rc = set_sched_class(sc, (struct t4_sched_params *)data);
8158                 break;
8159         case CHELSIO_T4_SCHED_QUEUE:
8160                 rc = set_sched_queue(sc, (struct t4_sched_queue *)data);
8161                 break;
8162         case CHELSIO_T4_GET_TRACER:
8163                 rc = t4_get_tracer(sc, (struct t4_tracer *)data);
8164                 break;
8165         case CHELSIO_T4_SET_TRACER:
8166                 rc = t4_set_tracer(sc, (struct t4_tracer *)data);
8167                 break;
8168         default:
8169                 rc = EINVAL;
8170         }
8171
8172         return (rc);
8173 }
8174
8175 #ifdef TCP_OFFLOAD
8176 void
8177 t4_iscsi_init(struct ifnet *ifp, unsigned int tag_mask,
8178     const unsigned int *pgsz_order)
8179 {
8180         struct port_info *pi = ifp->if_softc;
8181         struct adapter *sc = pi->adapter;
8182
8183         t4_write_reg(sc, A_ULP_RX_ISCSI_TAGMASK, tag_mask);
8184         t4_write_reg(sc, A_ULP_RX_ISCSI_PSZ, V_HPZ0(pgsz_order[0]) |
8185                 V_HPZ1(pgsz_order[1]) | V_HPZ2(pgsz_order[2]) |
8186                 V_HPZ3(pgsz_order[3]));
8187 }
8188
8189 static int
8190 toe_capability(struct port_info *pi, int enable)
8191 {
8192         int rc;
8193         struct adapter *sc = pi->adapter;
8194
8195         ASSERT_SYNCHRONIZED_OP(sc);
8196
8197         if (!is_offload(sc))
8198                 return (ENODEV);
8199
8200         if (enable) {
8201                 /*
8202                  * We need the port's queues around so that we're able to send
8203                  * and receive CPLs to/from the TOE even if the ifnet for this
8204                  * port has never been UP'd administratively.
8205                  */
8206                 if (!(pi->flags & PORT_INIT_DONE)) {
8207                         rc = cxgbe_init_synchronized(pi);
8208                         if (rc)
8209                                 return (rc);
8210                 }
8211
8212                 if (isset(&sc->offload_map, pi->port_id))
8213                         return (0);
8214
8215                 if (!uld_active(sc, ULD_TOM)) {
8216                         rc = t4_activate_uld(sc, ULD_TOM);
8217                         if (rc == EAGAIN) {
8218                                 log(LOG_WARNING,
8219                                     "You must kldload t4_tom.ko before trying "
8220                                     "to enable TOE on a cxgbe interface.\n");
8221                         }
8222                         if (rc != 0)
8223                                 return (rc);
8224                         KASSERT(sc->tom_softc != NULL,
8225                             ("%s: TOM activated but softc NULL", __func__));
8226                         KASSERT(uld_active(sc, ULD_TOM),
8227                             ("%s: TOM activated but flag not set", __func__));
8228                 }
8229
8230                 /* Activate iWARP and iSCSI too, if the modules are loaded. */
8231                 if (!uld_active(sc, ULD_IWARP))
8232                         (void) t4_activate_uld(sc, ULD_IWARP);
8233                 if (!uld_active(sc, ULD_ISCSI))
8234                         (void) t4_activate_uld(sc, ULD_ISCSI);
8235
8236                 setbit(&sc->offload_map, pi->port_id);
8237         } else {
8238                 if (!isset(&sc->offload_map, pi->port_id))
8239                         return (0);
8240
8241                 KASSERT(uld_active(sc, ULD_TOM),
8242                     ("%s: TOM never initialized?", __func__));
8243                 clrbit(&sc->offload_map, pi->port_id);
8244         }
8245
8246         return (0);
8247 }
8248
8249 /*
8250  * Add an upper layer driver to the global list.
8251  */
8252 int
8253 t4_register_uld(struct uld_info *ui)
8254 {
8255         int rc = 0;
8256         struct uld_info *u;
8257
8258         sx_xlock(&t4_uld_list_lock);
8259         SLIST_FOREACH(u, &t4_uld_list, link) {
8260             if (u->uld_id == ui->uld_id) {
8261                     rc = EEXIST;
8262                     goto done;
8263             }
8264         }
8265
8266         SLIST_INSERT_HEAD(&t4_uld_list, ui, link);
8267         ui->refcount = 0;
8268 done:
8269         sx_xunlock(&t4_uld_list_lock);
8270         return (rc);
8271 }
8272
8273 int
8274 t4_unregister_uld(struct uld_info *ui)
8275 {
8276         int rc = EINVAL;
8277         struct uld_info *u;
8278
8279         sx_xlock(&t4_uld_list_lock);
8280
8281         SLIST_FOREACH(u, &t4_uld_list, link) {
8282             if (u == ui) {
8283                     if (ui->refcount > 0) {
8284                             rc = EBUSY;
8285                             goto done;
8286                     }
8287
8288                     SLIST_REMOVE(&t4_uld_list, ui, uld_info, link);
8289                     rc = 0;
8290                     goto done;
8291             }
8292         }
8293 done:
8294         sx_xunlock(&t4_uld_list_lock);
8295         return (rc);
8296 }
8297
8298 int
8299 t4_activate_uld(struct adapter *sc, int id)
8300 {
8301         int rc;
8302         struct uld_info *ui;
8303
8304         ASSERT_SYNCHRONIZED_OP(sc);
8305
8306         if (id < 0 || id > ULD_MAX)
8307                 return (EINVAL);
8308         rc = EAGAIN;    /* kldoad the module with this ULD and try again. */
8309
8310         sx_slock(&t4_uld_list_lock);
8311
8312         SLIST_FOREACH(ui, &t4_uld_list, link) {
8313                 if (ui->uld_id == id) {
8314                         if (!(sc->flags & FULL_INIT_DONE)) {
8315                                 rc = adapter_full_init(sc);
8316                                 if (rc != 0)
8317                                         break;
8318                         }
8319
8320                         rc = ui->activate(sc);
8321                         if (rc == 0) {
8322                                 setbit(&sc->active_ulds, id);
8323                                 ui->refcount++;
8324                         }
8325                         break;
8326                 }
8327         }
8328
8329         sx_sunlock(&t4_uld_list_lock);
8330
8331         return (rc);
8332 }
8333
8334 int
8335 t4_deactivate_uld(struct adapter *sc, int id)
8336 {
8337         int rc;
8338         struct uld_info *ui;
8339
8340         ASSERT_SYNCHRONIZED_OP(sc);
8341
8342         if (id < 0 || id > ULD_MAX)
8343                 return (EINVAL);
8344         rc = ENXIO;
8345
8346         sx_slock(&t4_uld_list_lock);
8347
8348         SLIST_FOREACH(ui, &t4_uld_list, link) {
8349                 if (ui->uld_id == id) {
8350                         rc = ui->deactivate(sc);
8351                         if (rc == 0) {
8352                                 clrbit(&sc->active_ulds, id);
8353                                 ui->refcount--;
8354                         }
8355                         break;
8356                 }
8357         }
8358
8359         sx_sunlock(&t4_uld_list_lock);
8360
8361         return (rc);
8362 }
8363
8364 int
8365 uld_active(struct adapter *sc, int uld_id)
8366 {
8367
8368         MPASS(uld_id >= 0 && uld_id <= ULD_MAX);
8369
8370         return (isset(&sc->active_ulds, uld_id));
8371 }
8372 #endif
8373
8374 /*
8375  * Come up with reasonable defaults for some of the tunables, provided they're
8376  * not set by the user (in which case we'll use the values as is).
8377  */
8378 static void
8379 tweak_tunables(void)
8380 {
8381         int nc = mp_ncpus;      /* our snapshot of the number of CPUs */
8382
8383         if (t4_ntxq10g < 1)
8384                 t4_ntxq10g = min(nc, NTXQ_10G);
8385
8386         if (t4_ntxq1g < 1)
8387                 t4_ntxq1g = min(nc, NTXQ_1G);
8388
8389         if (t4_nrxq10g < 1)
8390                 t4_nrxq10g = min(nc, NRXQ_10G);
8391
8392         if (t4_nrxq1g < 1)
8393                 t4_nrxq1g = min(nc, NRXQ_1G);
8394
8395 #ifdef TCP_OFFLOAD
8396         if (t4_nofldtxq10g < 1)
8397                 t4_nofldtxq10g = min(nc, NOFLDTXQ_10G);
8398
8399         if (t4_nofldtxq1g < 1)
8400                 t4_nofldtxq1g = min(nc, NOFLDTXQ_1G);
8401
8402         if (t4_nofldrxq10g < 1)
8403                 t4_nofldrxq10g = min(nc, NOFLDRXQ_10G);
8404
8405         if (t4_nofldrxq1g < 1)
8406                 t4_nofldrxq1g = min(nc, NOFLDRXQ_1G);
8407
8408         if (t4_toecaps_allowed == -1)
8409                 t4_toecaps_allowed = FW_CAPS_CONFIG_TOE;
8410 #else
8411         if (t4_toecaps_allowed == -1)
8412                 t4_toecaps_allowed = 0;
8413 #endif
8414
8415 #ifdef DEV_NETMAP
8416         if (t4_nnmtxq10g < 1)
8417                 t4_nnmtxq10g = min(nc, NNMTXQ_10G);
8418
8419         if (t4_nnmtxq1g < 1)
8420                 t4_nnmtxq1g = min(nc, NNMTXQ_1G);
8421
8422         if (t4_nnmrxq10g < 1)
8423                 t4_nnmrxq10g = min(nc, NNMRXQ_10G);
8424
8425         if (t4_nnmrxq1g < 1)
8426                 t4_nnmrxq1g = min(nc, NNMRXQ_1G);
8427 #endif
8428
8429         if (t4_tmr_idx_10g < 0 || t4_tmr_idx_10g >= SGE_NTIMERS)
8430                 t4_tmr_idx_10g = TMR_IDX_10G;
8431
8432         if (t4_pktc_idx_10g < -1 || t4_pktc_idx_10g >= SGE_NCOUNTERS)
8433                 t4_pktc_idx_10g = PKTC_IDX_10G;
8434
8435         if (t4_tmr_idx_1g < 0 || t4_tmr_idx_1g >= SGE_NTIMERS)
8436                 t4_tmr_idx_1g = TMR_IDX_1G;
8437
8438         if (t4_pktc_idx_1g < -1 || t4_pktc_idx_1g >= SGE_NCOUNTERS)
8439                 t4_pktc_idx_1g = PKTC_IDX_1G;
8440
8441         if (t4_qsize_txq < 128)
8442                 t4_qsize_txq = 128;
8443
8444         if (t4_qsize_rxq < 128)
8445                 t4_qsize_rxq = 128;
8446         while (t4_qsize_rxq & 7)
8447                 t4_qsize_rxq++;
8448
8449         t4_intr_types &= INTR_MSIX | INTR_MSI | INTR_INTX;
8450 }
8451
8452 static struct sx mlu;   /* mod load unload */
8453 SX_SYSINIT(cxgbe_mlu, &mlu, "cxgbe mod load/unload");
8454
8455 static int
8456 mod_event(module_t mod, int cmd, void *arg)
8457 {
8458         int rc = 0;
8459         static int loaded = 0;
8460
8461         switch (cmd) {
8462         case MOD_LOAD:
8463                 sx_xlock(&mlu);
8464                 if (loaded++ == 0) {
8465                         t4_sge_modload();
8466                         sx_init(&t4_list_lock, "T4/T5 adapters");
8467                         SLIST_INIT(&t4_list);
8468 #ifdef TCP_OFFLOAD
8469                         sx_init(&t4_uld_list_lock, "T4/T5 ULDs");
8470                         SLIST_INIT(&t4_uld_list);
8471 #endif
8472                         t4_tracer_modload();
8473                         tweak_tunables();
8474                 }
8475                 sx_xunlock(&mlu);
8476                 break;
8477
8478         case MOD_UNLOAD:
8479                 sx_xlock(&mlu);
8480                 if (--loaded == 0) {
8481                         int tries;
8482
8483                         sx_slock(&t4_list_lock);
8484                         if (!SLIST_EMPTY(&t4_list)) {
8485                                 rc = EBUSY;
8486                                 sx_sunlock(&t4_list_lock);
8487                                 goto done_unload;
8488                         }
8489 #ifdef TCP_OFFLOAD
8490                         sx_slock(&t4_uld_list_lock);
8491                         if (!SLIST_EMPTY(&t4_uld_list)) {
8492                                 rc = EBUSY;
8493                                 sx_sunlock(&t4_uld_list_lock);
8494                                 sx_sunlock(&t4_list_lock);
8495                                 goto done_unload;
8496                         }
8497 #endif
8498                         tries = 0;
8499                         while (tries++ < 5 && t4_sge_extfree_refs() != 0) {
8500                                 uprintf("%ju clusters with custom free routine "
8501                                     "still is use.\n", t4_sge_extfree_refs());
8502                                 pause("t4unload", 2 * hz);
8503                         }
8504 #ifdef TCP_OFFLOAD
8505                         sx_sunlock(&t4_uld_list_lock);
8506 #endif
8507                         sx_sunlock(&t4_list_lock);
8508
8509                         if (t4_sge_extfree_refs() == 0) {
8510                                 t4_tracer_modunload();
8511 #ifdef TCP_OFFLOAD
8512                                 sx_destroy(&t4_uld_list_lock);
8513 #endif
8514                                 sx_destroy(&t4_list_lock);
8515                                 t4_sge_modunload();
8516                                 loaded = 0;
8517                         } else {
8518                                 rc = EBUSY;
8519                                 loaded++;       /* undo earlier decrement */
8520                         }
8521                 }
8522 done_unload:
8523                 sx_xunlock(&mlu);
8524                 break;
8525         }
8526
8527         return (rc);
8528 }
8529
8530 static devclass_t t4_devclass, t5_devclass;
8531 static devclass_t cxgbe_devclass, cxl_devclass;
8532
8533 DRIVER_MODULE(t4nex, pci, t4_driver, t4_devclass, mod_event, 0);
8534 MODULE_VERSION(t4nex, 1);
8535 MODULE_DEPEND(t4nex, firmware, 1, 1, 1);
8536 #ifdef DEV_NETMAP
8537 MODULE_DEPEND(t4nex, netmap, 1, 1, 1);
8538 #endif /* DEV_NETMAP */
8539
8540
8541 DRIVER_MODULE(t5nex, pci, t5_driver, t5_devclass, mod_event, 0);
8542 MODULE_VERSION(t5nex, 1);
8543 MODULE_DEPEND(t5nex, firmware, 1, 1, 1);
8544 #ifdef DEV_NETMAP
8545 MODULE_DEPEND(t5nex, netmap, 1, 1, 1);
8546 #endif /* DEV_NETMAP */
8547
8548 DRIVER_MODULE(cxgbe, t4nex, cxgbe_driver, cxgbe_devclass, 0, 0);
8549 MODULE_VERSION(cxgbe, 1);
8550
8551 DRIVER_MODULE(cxl, t5nex, cxl_driver, cxl_devclass, 0, 0);
8552 MODULE_VERSION(cxl, 1);