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