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