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