xref: /illumos-gate/usr/src/uts/common/io/cxgbe/t4nex/t4_nexus.c (revision 0245b61fd282e95735b173b8d95be0d6688163b4)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source. A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * This file is part of the Chelsio T4 support code.
14  *
15  * Copyright (C) 2010-2013 Chelsio Communications.  All rights reserved.
16  *
17  * This program is distributed in the hope that it will be useful, but WITHOUT
18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19  * FITNESS FOR A PARTICULAR PURPOSE.  See the LICENSE file included in this
20  * release for licensing terms and conditions.
21  */
22 
23 #include <sys/ddi.h>
24 #include <sys/sunddi.h>
25 #include <sys/sunndi.h>
26 #include <sys/modctl.h>
27 #include <sys/conf.h>
28 #include <sys/devops.h>
29 #include <sys/pci.h>
30 #include <sys/atomic.h>
31 #include <sys/types.h>
32 #include <sys/file.h>
33 #include <sys/errno.h>
34 #include <sys/open.h>
35 #include <sys/cred.h>
36 #include <sys/stat.h>
37 #include <sys/mkdev.h>
38 #include <sys/queue.h>
39 #include <sys/containerof.h>
40 #include <sys/sensors.h>
41 
42 #include "version.h"
43 #include "common/common.h"
44 #include "common/t4_msg.h"
45 #include "common/t4_regs.h"
46 #include "firmware/t4_fw.h"
47 #include "firmware/t4_cfg.h"
48 #include "firmware/t5_fw.h"
49 #include "firmware/t5_cfg.h"
50 #include "firmware/t6_fw.h"
51 #include "firmware/t6_cfg.h"
52 #include "t4_l2t.h"
53 
54 static int t4_cb_open(dev_t *devp, int flag, int otyp, cred_t *credp);
55 static int t4_cb_close(dev_t dev, int flag, int otyp, cred_t *credp);
56 static int t4_cb_ioctl(dev_t dev, int cmd, intptr_t d, int mode, cred_t *credp,
57     int *rp);
58 struct cb_ops t4_cb_ops = {
59 	.cb_open =		t4_cb_open,
60 	.cb_close =		t4_cb_close,
61 	.cb_strategy =		nodev,
62 	.cb_print =		nodev,
63 	.cb_dump =		nodev,
64 	.cb_read =		nodev,
65 	.cb_write =		nodev,
66 	.cb_ioctl =		t4_cb_ioctl,
67 	.cb_devmap =		nodev,
68 	.cb_mmap =		nodev,
69 	.cb_segmap =		nodev,
70 	.cb_chpoll =		nochpoll,
71 	.cb_prop_op =		ddi_prop_op,
72 	.cb_flag =		D_MP,
73 	.cb_rev =		CB_REV,
74 	.cb_aread =		nodev,
75 	.cb_awrite =		nodev
76 };
77 
78 static int t4_bus_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t op,
79     void *arg, void *result);
80 static int t4_bus_config(dev_info_t *dip, uint_t flags, ddi_bus_config_op_t op,
81     void *arg, dev_info_t **cdipp);
82 static int t4_bus_unconfig(dev_info_t *dip, uint_t flags,
83     ddi_bus_config_op_t op, void *arg);
84 struct bus_ops t4_bus_ops = {
85 	.busops_rev =		BUSO_REV,
86 	.bus_ctl =		t4_bus_ctl,
87 	.bus_prop_op =		ddi_bus_prop_op,
88 	.bus_config =		t4_bus_config,
89 	.bus_unconfig =		t4_bus_unconfig,
90 };
91 
92 static int t4_devo_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg,
93     void **rp);
94 static int t4_devo_probe(dev_info_t *dip);
95 static int t4_devo_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
96 static int t4_devo_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
97 static int t4_devo_quiesce(dev_info_t *dip);
98 struct dev_ops t4_dev_ops = {
99 	.devo_rev =		DEVO_REV,
100 	.devo_getinfo =		t4_devo_getinfo,
101 	.devo_identify =	nulldev,
102 	.devo_probe =		t4_devo_probe,
103 	.devo_attach =		t4_devo_attach,
104 	.devo_detach =		t4_devo_detach,
105 	.devo_reset =		nodev,
106 	.devo_cb_ops =		&t4_cb_ops,
107 	.devo_bus_ops =		&t4_bus_ops,
108 	.devo_quiesce =		&t4_devo_quiesce,
109 };
110 
111 static struct modldrv modldrv = {
112 	.drv_modops =		&mod_driverops,
113 	.drv_linkinfo =		"Chelsio T4 nexus " DRV_VERSION,
114 	.drv_dev_ops =		&t4_dev_ops
115 };
116 
117 static struct modlinkage modlinkage = {
118 	.ml_rev =		MODREV_1,
119 	.ml_linkage =		{&modldrv, NULL},
120 };
121 
122 void *t4_list;
123 
124 struct intrs_and_queues {
125 	int intr_type;		/* DDI_INTR_TYPE_* */
126 	int nirq;		/* Number of vectors */
127 	int intr_fwd;		/* Interrupts forwarded */
128 	int ntxq10g;		/* # of NIC txq's for each 10G port */
129 	int nrxq10g;		/* # of NIC rxq's for each 10G port */
130 	int ntxq1g;		/* # of NIC txq's for each 1G port */
131 	int nrxq1g;		/* # of NIC rxq's for each 1G port */
132 #ifdef TCP_OFFLOAD_ENABLE
133 	int nofldtxq10g;	/* # of TOE txq's for each 10G port */
134 	int nofldrxq10g;	/* # of TOE rxq's for each 10G port */
135 	int nofldtxq1g;		/* # of TOE txq's for each 1G port */
136 	int nofldrxq1g;		/* # of TOE rxq's for each 1G port */
137 #endif
138 };
139 
140 struct fw_info fi[3];
141 
142 static int cpl_not_handled(struct sge_iq *iq, const struct rss_header *rss,
143     mblk_t *m);
144 static int fw_msg_not_handled(struct adapter *, const __be64 *);
145 int t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h);
146 static unsigned int getpf(struct adapter *sc);
147 static int prep_firmware(struct adapter *sc);
148 static int upload_config_file(struct adapter *sc, uint32_t *mt, uint32_t *ma);
149 static int partition_resources(struct adapter *sc);
150 static int adap__pre_init_tweaks(struct adapter *sc);
151 static int get_params__pre_init(struct adapter *sc);
152 static int get_params__post_init(struct adapter *sc);
153 static int set_params__post_init(struct adapter *);
154 static void setup_memwin(struct adapter *sc);
155 static int validate_mt_off_len(struct adapter *, int, uint32_t, int,
156     uint32_t *);
157 void memwin_info(struct adapter *, int, uint32_t *, uint32_t *);
158 uint32_t position_memwin(struct adapter *, int, uint32_t);
159 static int prop_lookup_int_array(struct adapter *sc, char *name, int *data,
160     uint_t count);
161 static int prop_lookup_int_array(struct adapter *sc, char *name, int *data,
162     uint_t count);
163 static int init_driver_props(struct adapter *sc, struct driver_properties *p);
164 static int remove_extra_props(struct adapter *sc, int n10g, int n1g);
165 static int cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g,
166     struct intrs_and_queues *iaq);
167 static int add_child_node(struct adapter *sc, int idx);
168 static int remove_child_node(struct adapter *sc, int idx);
169 static kstat_t *setup_kstats(struct adapter *sc);
170 static kstat_t *setup_wc_kstats(struct adapter *);
171 static int update_wc_kstats(kstat_t *, int);
172 #ifdef TCP_OFFLOAD_ENABLE
173 static int toe_capability(struct port_info *pi, int enable);
174 static int activate_uld(struct adapter *sc, int id, struct uld_softc *usc);
175 static int deactivate_uld(struct uld_softc *usc);
176 #endif
177 static kmutex_t t4_adapter_list_lock;
178 static SLIST_HEAD(, adapter) t4_adapter_list;
179 #ifdef TCP_OFFLOAD_ENABLE
180 static kmutex_t t4_uld_list_lock;
181 static SLIST_HEAD(, uld_info) t4_uld_list;
182 #endif
183 
184 static int t4_temperature_read(void *, sensor_ioctl_scalar_t *);
185 static int t4_voltage_read(void *, sensor_ioctl_scalar_t *);
186 static const ksensor_ops_t t4_temp_ops = {
187 	.kso_kind = ksensor_kind_temperature,
188 	.kso_scalar = t4_temperature_read
189 };
190 
191 static const ksensor_ops_t t4_volt_ops = {
192 	.kso_kind = ksensor_kind_voltage,
193 	.kso_scalar = t4_voltage_read
194 };
195 
196 static int t4_ufm_getcaps(ddi_ufm_handle_t *, void *, ddi_ufm_cap_t *);
197 static int t4_ufm_fill_image(ddi_ufm_handle_t *, void *, uint_t,
198     ddi_ufm_image_t *);
199 static int t4_ufm_fill_slot(ddi_ufm_handle_t *, void *, uint_t, uint_t,
200     ddi_ufm_slot_t *);
201 static ddi_ufm_ops_t t4_ufm_ops = {
202 	.ddi_ufm_op_fill_image = t4_ufm_fill_image,
203 	.ddi_ufm_op_fill_slot = t4_ufm_fill_slot,
204 	.ddi_ufm_op_getcaps = t4_ufm_getcaps
205 };
206 
207 int
208 _init(void)
209 {
210 	int rc;
211 
212 	rc = ddi_soft_state_init(&t4_list, sizeof (struct adapter), 0);
213 	if (rc != 0)
214 		return (rc);
215 
216 	rc = mod_install(&modlinkage);
217 	if (rc != 0)
218 		ddi_soft_state_fini(&t4_list);
219 
220 	mutex_init(&t4_adapter_list_lock, NULL, MUTEX_DRIVER, NULL);
221 	SLIST_INIT(&t4_adapter_list);
222 
223 #ifdef TCP_OFFLOAD_ENABLE
224 	mutex_init(&t4_uld_list_lock, NULL, MUTEX_DRIVER, NULL);
225 	SLIST_INIT(&t4_uld_list);
226 #endif
227 
228 	return (rc);
229 }
230 
231 int
232 _fini(void)
233 {
234 	int rc;
235 
236 	rc = mod_remove(&modlinkage);
237 	if (rc != 0)
238 		return (rc);
239 
240 	ddi_soft_state_fini(&t4_list);
241 	return (0);
242 }
243 
244 int
245 _info(struct modinfo *mi)
246 {
247 	return (mod_info(&modlinkage, mi));
248 }
249 
250 /* ARGSUSED */
251 static int
252 t4_devo_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **rp)
253 {
254 	struct adapter *sc;
255 	minor_t minor;
256 
257 	minor = getminor((dev_t)arg);	/* same as instance# in our case */
258 
259 	if (cmd == DDI_INFO_DEVT2DEVINFO) {
260 		sc = ddi_get_soft_state(t4_list, minor);
261 		if (sc == NULL)
262 			return (DDI_FAILURE);
263 
264 		ASSERT(sc->dev == (dev_t)arg);
265 		*rp = (void *)sc->dip;
266 	} else if (cmd == DDI_INFO_DEVT2INSTANCE)
267 		*rp = (void *) (unsigned long) minor;
268 	else
269 		ASSERT(0);
270 
271 	return (DDI_SUCCESS);
272 }
273 
274 static int
275 t4_devo_probe(dev_info_t *dip)
276 {
277 	int rc, id, *reg;
278 	uint_t n, pf;
279 
280 	id = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
281 	    "device-id", 0xffff);
282 	if (id == 0xffff)
283 		return (DDI_PROBE_DONTCARE);
284 
285 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
286 	    "reg", &reg, &n);
287 	if (rc != DDI_SUCCESS)
288 		return (DDI_PROBE_DONTCARE);
289 
290 	pf = PCI_REG_FUNC_G(reg[0]);
291 	ddi_prop_free(reg);
292 
293 	/* Prevent driver attachment on any PF except 0 on the FPGA */
294 	if (id == 0xa000 && pf != 0)
295 		return (DDI_PROBE_FAILURE);
296 
297 	return (DDI_PROBE_DONTCARE);
298 }
299 
300 static int
301 t4_devo_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
302 {
303 	struct adapter *sc = NULL;
304 	struct sge *s;
305 	int i, instance, rc = DDI_SUCCESS, rqidx, tqidx, q;
306 	int irq = 0, nxg = 0, n1g = 0;
307 #ifdef TCP_OFFLOAD_ENABLE
308 	int ofld_rqidx, ofld_tqidx;
309 #endif
310 	char name[16];
311 	struct driver_properties *prp;
312 	struct intrs_and_queues iaq;
313 	ddi_device_acc_attr_t da = {
314 		.devacc_attr_version = DDI_DEVICE_ATTR_V0,
315 		.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC,
316 		.devacc_attr_dataorder = DDI_STRICTORDER_ACC
317 	};
318 	ddi_device_acc_attr_t da1 = {
319 		.devacc_attr_version = DDI_DEVICE_ATTR_V0,
320 		.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC,
321 		.devacc_attr_dataorder = DDI_STRICTORDER_ACC
322 	};
323 
324 	if (cmd != DDI_ATTACH)
325 		return (DDI_FAILURE);
326 
327 	/*
328 	 * Allocate space for soft state.
329 	 */
330 	instance = ddi_get_instance(dip);
331 	rc = ddi_soft_state_zalloc(t4_list, instance);
332 	if (rc != DDI_SUCCESS) {
333 		cxgb_printf(dip, CE_WARN,
334 		    "failed to allocate soft state: %d", rc);
335 		return (DDI_FAILURE);
336 	}
337 
338 	sc = ddi_get_soft_state(t4_list, instance);
339 	sc->dip = dip;
340 	sc->dev = makedevice(ddi_driver_major(dip), instance);
341 	mutex_init(&sc->lock, NULL, MUTEX_DRIVER, NULL);
342 	cv_init(&sc->cv, NULL, CV_DRIVER, NULL);
343 	mutex_init(&sc->sfl_lock, NULL, MUTEX_DRIVER, NULL);
344 	TAILQ_INIT(&sc->sfl);
345 	mutex_init(&sc->mbox_lock, NULL, MUTEX_DRIVER, NULL);
346 	STAILQ_INIT(&sc->mbox_list);
347 
348 	mutex_enter(&t4_adapter_list_lock);
349 	SLIST_INSERT_HEAD(&t4_adapter_list, sc, link);
350 	mutex_exit(&t4_adapter_list_lock);
351 
352 	sc->pf = getpf(sc);
353 	if (sc->pf > 8) {
354 		rc = EINVAL;
355 		cxgb_printf(dip, CE_WARN,
356 		    "failed to determine PCI PF# of device");
357 		goto done;
358 	}
359 	sc->mbox = sc->pf;
360 
361 	/* Initialize the driver properties */
362 	prp = &sc->props;
363 	(void)init_driver_props(sc, prp);
364 
365 	/*
366 	 * Enable access to the PCI config space.
367 	 */
368 	rc = pci_config_setup(dip, &sc->pci_regh);
369 	if (rc != DDI_SUCCESS) {
370 		cxgb_printf(dip, CE_WARN,
371 		    "failed to enable PCI config space access: %d", rc);
372 		goto done;
373 	}
374 
375 	/* TODO: Set max read request to 4K */
376 
377 	/*
378 	 * Enable MMIO access.
379 	 */
380 	rc = ddi_regs_map_setup(dip, 1, &sc->regp, 0, 0, &da, &sc->regh);
381 	if (rc != DDI_SUCCESS) {
382 		cxgb_printf(dip, CE_WARN,
383 		    "failed to map device registers: %d", rc);
384 		goto done;
385 	}
386 
387 	(void) memset(sc->chan_map, 0xff, sizeof (sc->chan_map));
388 
389 	/*
390 	 * Initialize cpl handler.
391 	 */
392 	for (i = 0; i < ARRAY_SIZE(sc->cpl_handler); i++) {
393 		sc->cpl_handler[i] = cpl_not_handled;
394 	}
395 
396 	for (i = 0; i < ARRAY_SIZE(sc->fw_msg_handler); i++) {
397 		sc->fw_msg_handler[i] = fw_msg_not_handled;
398 	}
399 
400 	for (i = 0; i < NCHAN; i++) {
401 		(void) snprintf(name, sizeof (name), "%s-%d",
402 				"reclaim", i);
403 		sc->tq[i] = ddi_taskq_create(sc->dip,
404 		   name, 1, TASKQ_DEFAULTPRI, 0);
405 
406 		if (sc->tq[i] == NULL) {
407 			cxgb_printf(dip, CE_WARN,
408 				   "failed to create task queues");
409 			rc = DDI_FAILURE;
410 			goto done;
411 		}
412 	}
413 
414 	/*
415 	 * Prepare the adapter for operation.
416 	 */
417 	rc = -t4_prep_adapter(sc, false);
418 	if (rc != 0) {
419 		cxgb_printf(dip, CE_WARN, "failed to prepare adapter: %d", rc);
420 		goto done;
421 	}
422 
423 	/*
424 	 * Enable BAR1 access.
425 	 */
426 	sc->doorbells |= DOORBELL_KDB;
427 	rc = ddi_regs_map_setup(dip, 2, &sc->reg1p, 0, 0, &da1, &sc->reg1h);
428 	if (rc != DDI_SUCCESS) {
429 		cxgb_printf(dip, CE_WARN,
430 		    "failed to map BAR1 device registers: %d", rc);
431 		goto done;
432 	} else {
433 		if (is_t5(sc->params.chip)) {
434 			sc->doorbells |= DOORBELL_UDB;
435 			if (prp->wc) {
436 				/*
437 				 * Enable write combining on BAR2.  This is the
438 				 * userspace doorbell BAR and is split into 128B
439 				 * (UDBS_SEG_SIZE) doorbell regions, each associated
440 				 * with an egress queue.  The first 64B has the doorbell
441 				 * and the second 64B can be used to submit a tx work
442 				 * request with an implicit doorbell.
443 				 */
444 				sc->doorbells &= ~DOORBELL_UDB;
445 				sc->doorbells |= (DOORBELL_WCWR |
446 				    DOORBELL_UDBWC);
447 				t4_write_reg(sc, A_SGE_STAT_CFG,
448 				    V_STATSOURCE_T5(7) | V_STATMODE(0));
449 			}
450 		}
451 	}
452 
453 	/*
454 	 * Do this really early.  Note that minor number = instance.
455 	 */
456 	(void) snprintf(name, sizeof (name), "%s,%d", T4_NEXUS_NAME, instance);
457 	rc = ddi_create_minor_node(dip, name, S_IFCHR, instance,
458 	    DDI_NT_NEXUS, 0);
459 	if (rc != DDI_SUCCESS) {
460 		cxgb_printf(dip, CE_WARN,
461 		    "failed to create device node: %d", rc);
462 		rc = DDI_SUCCESS; /* carry on */
463 	}
464 
465 	/* Do this early. Memory window is required for loading config file. */
466 	setup_memwin(sc);
467 
468 	/* Prepare the firmware for operation */
469 	rc = prep_firmware(sc);
470 	if (rc != 0)
471 		goto done; /* error message displayed already */
472 
473 	rc = adap__pre_init_tweaks(sc);
474 	if (rc != 0)
475 		goto done;
476 
477 	rc = get_params__pre_init(sc);
478 	if (rc != 0)
479 		goto done; /* error message displayed already */
480 
481 	t4_sge_init(sc);
482 
483 	if (sc->flags & MASTER_PF) {
484 		/* get basic stuff going */
485 		rc = -t4_fw_initialize(sc, sc->mbox);
486 		if (rc != 0) {
487 			cxgb_printf(sc->dip, CE_WARN,
488 			    "early init failed: %d.\n", rc);
489 			goto done;
490 		}
491 	}
492 
493 	rc = get_params__post_init(sc);
494 	if (rc != 0)
495 		goto done; /* error message displayed already */
496 
497 	rc = set_params__post_init(sc);
498 	if (rc != 0)
499 		goto done; /* error message displayed already */
500 
501 	/*
502 	 * TODO: This is the place to call t4_set_filter_mode()
503 	 */
504 
505 	/* tweak some settings */
506 	t4_write_reg(sc, A_TP_SHIFT_CNT, V_SYNSHIFTMAX(6) | V_RXTSHIFTMAXR1(4) |
507 	    V_RXTSHIFTMAXR2(15) | V_PERSHIFTBACKOFFMAX(8) | V_PERSHIFTMAX(8) |
508 	    V_KEEPALIVEMAXR1(4) | V_KEEPALIVEMAXR2(9));
509 	t4_write_reg(sc, A_ULP_RX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
510 
511 	/*
512 	 * Work-around for bug 2619
513 	 * Set DisableVlan field in TP_RSS_CONFIG_VRT register so that the
514 	 * VLAN tag extraction is disabled.
515 	 */
516 	t4_set_reg_field(sc, A_TP_RSS_CONFIG_VRT, F_DISABLEVLAN, F_DISABLEVLAN);
517 
518 	/* Store filter mode */
519 	t4_read_indirect(sc, A_TP_PIO_ADDR, A_TP_PIO_DATA, &sc->filter_mode, 1,
520 	    A_TP_VLAN_PRI_MAP);
521 
522 	/*
523 	 * First pass over all the ports - allocate VIs and initialize some
524 	 * basic parameters like mac address, port type, etc.  We also figure
525 	 * out whether a port is 10G or 1G and use that information when
526 	 * calculating how many interrupts to attempt to allocate.
527 	 */
528 	for_each_port(sc, i) {
529 		struct port_info *pi;
530 
531 		pi = kmem_zalloc(sizeof (*pi), KM_SLEEP);
532 		sc->port[i] = pi;
533 
534 		/* These must be set before t4_port_init */
535 		pi->adapter = sc;
536 		/* LINTED: E_ASSIGN_NARROW_CONV */
537 		pi->port_id = i;
538 	}
539 
540 	/* Allocate the vi and initialize parameters like mac addr */
541 	rc = -t4_port_init(sc, sc->mbox, sc->pf, 0);
542 	if (rc) {
543 		cxgb_printf(dip, CE_WARN,
544 			    "unable to initialize port: %d", rc);
545 		goto done;
546 	}
547 
548 	for_each_port(sc, i) {
549 		struct port_info *pi = sc->port[i];
550 
551 		mutex_init(&pi->lock, NULL, MUTEX_DRIVER, NULL);
552 		pi->mtu = ETHERMTU;
553 
554 		if (is_10XG_port(pi)) {
555 			nxg++;
556 			pi->tmr_idx = prp->tmr_idx_10g;
557 			pi->pktc_idx = prp->pktc_idx_10g;
558 		} else {
559 			n1g++;
560 			pi->tmr_idx = prp->tmr_idx_1g;
561 			pi->pktc_idx = prp->pktc_idx_1g;
562 		}
563 
564 		pi->xact_addr_filt = -1;
565 		t4_mc_init(pi);
566 
567 		setbit(&sc->registered_device_map, i);
568 	}
569 
570 	(void) remove_extra_props(sc, nxg, n1g);
571 
572 	if (sc->registered_device_map == 0) {
573 		cxgb_printf(dip, CE_WARN, "no usable ports");
574 		rc = DDI_FAILURE;
575 		goto done;
576 	}
577 
578 	rc = cfg_itype_and_nqueues(sc, nxg, n1g, &iaq);
579 	if (rc != 0)
580 		goto done; /* error message displayed already */
581 
582 	sc->intr_type = iaq.intr_type;
583 	sc->intr_count = iaq.nirq;
584 
585 	if (sc->props.multi_rings && (sc->intr_type != DDI_INTR_TYPE_MSIX)) {
586 		sc->props.multi_rings = 0;
587 		cxgb_printf(dip, CE_WARN,
588 		    "Multiple rings disabled as interrupt type is not MSI-X");
589 	}
590 
591 	if (sc->props.multi_rings && iaq.intr_fwd) {
592 		sc->props.multi_rings = 0;
593 		cxgb_printf(dip, CE_WARN,
594 		    "Multiple rings disabled as interrupts are forwarded");
595 	}
596 
597 	if (!sc->props.multi_rings) {
598 		iaq.ntxq10g = 1;
599 		iaq.ntxq1g = 1;
600 	}
601 	s = &sc->sge;
602 	s->nrxq = nxg * iaq.nrxq10g + n1g * iaq.nrxq1g;
603 	s->ntxq = nxg * iaq.ntxq10g + n1g * iaq.ntxq1g;
604 	s->neq = s->ntxq + s->nrxq;	/* the fl in an rxq is an eq */
605 #ifdef TCP_OFFLOAD_ENABLE
606 	/* control queues, 1 per port + 1 mgmtq */
607 	s->neq += sc->params.nports + 1;
608 #endif
609 	s->niq = s->nrxq + 1;		/* 1 extra for firmware event queue */
610 	if (iaq.intr_fwd != 0)
611 		sc->flags |= INTR_FWD;
612 #ifdef TCP_OFFLOAD_ENABLE
613 	if (is_offload(sc) != 0) {
614 
615 		s->nofldrxq = nxg * iaq.nofldrxq10g + n1g * iaq.nofldrxq1g;
616 		s->nofldtxq = nxg * iaq.nofldtxq10g + n1g * iaq.nofldtxq1g;
617 		s->neq += s->nofldtxq + s->nofldrxq;
618 		s->niq += s->nofldrxq;
619 
620 		s->ofld_rxq = kmem_zalloc(s->nofldrxq *
621 		    sizeof (struct sge_ofld_rxq), KM_SLEEP);
622 		s->ofld_txq = kmem_zalloc(s->nofldtxq *
623 		    sizeof (struct sge_wrq), KM_SLEEP);
624 		s->ctrlq = kmem_zalloc(sc->params.nports *
625 		    sizeof (struct sge_wrq), KM_SLEEP);
626 
627 	}
628 #endif
629 	s->rxq = kmem_zalloc(s->nrxq * sizeof (struct sge_rxq), KM_SLEEP);
630 	s->txq = kmem_zalloc(s->ntxq * sizeof (struct sge_txq), KM_SLEEP);
631 	s->iqmap = kmem_zalloc(s->iqmap_sz * sizeof (struct sge_iq *), KM_SLEEP);
632 	s->eqmap = kmem_zalloc(s->eqmap_sz * sizeof (struct sge_eq *), KM_SLEEP);
633 
634 	sc->intr_handle = kmem_zalloc(sc->intr_count *
635 	    sizeof (ddi_intr_handle_t), KM_SLEEP);
636 
637 	/*
638 	 * Second pass over the ports.  This time we know the number of rx and
639 	 * tx queues that each port should get.
640 	 */
641 	rqidx = tqidx = 0;
642 #ifdef TCP_OFFLOAD_ENABLE
643 	ofld_rqidx = ofld_tqidx = 0;
644 #endif
645 	for_each_port(sc, i) {
646 		struct port_info *pi = sc->port[i];
647 
648 		if (pi == NULL)
649 			continue;
650 
651 		t4_mc_cb_init(pi);
652 		/* LINTED: E_ASSIGN_NARROW_CONV */
653 		pi->first_rxq = rqidx;
654 		/* LINTED: E_ASSIGN_NARROW_CONV */
655 		pi->nrxq = (is_10XG_port(pi)) ? iaq.nrxq10g
656 		    : iaq.nrxq1g;
657 		/* LINTED: E_ASSIGN_NARROW_CONV */
658 		pi->first_txq = tqidx;
659 		/* LINTED: E_ASSIGN_NARROW_CONV */
660 		pi->ntxq = (is_10XG_port(pi)) ? iaq.ntxq10g
661 		    : iaq.ntxq1g;
662 
663 		rqidx += pi->nrxq;
664 		tqidx += pi->ntxq;
665 
666 #ifdef TCP_OFFLOAD_ENABLE
667 		if (is_offload(sc) != 0) {
668 			/* LINTED: E_ASSIGN_NARROW_CONV */
669 			pi->first_ofld_rxq = ofld_rqidx;
670 			pi->nofldrxq = max(1, pi->nrxq / 4);
671 
672 			/* LINTED: E_ASSIGN_NARROW_CONV */
673 			pi->first_ofld_txq = ofld_tqidx;
674 			pi->nofldtxq = max(1, pi->ntxq / 2);
675 
676 			ofld_rqidx += pi->nofldrxq;
677 			ofld_tqidx += pi->nofldtxq;
678 		}
679 #endif
680 
681 		/*
682 		 * Enable hw checksumming and LSO for all ports by default.
683 		 * They can be disabled using ndd (hw_csum and hw_lso).
684 		 */
685 		pi->features |= (CXGBE_HW_CSUM | CXGBE_HW_LSO);
686 	}
687 
688 #ifdef TCP_OFFLOAD_ENABLE
689 		sc->l2t = t4_init_l2t(sc);
690 #endif
691 
692 	/*
693 	 * Setup Interrupts.
694 	 */
695 
696 	i = 0;
697 	rc = ddi_intr_alloc(dip, sc->intr_handle, sc->intr_type, 0,
698 	    sc->intr_count, &i, DDI_INTR_ALLOC_STRICT);
699 	if (rc != DDI_SUCCESS) {
700 		cxgb_printf(dip, CE_WARN,
701 		    "failed to allocate %d interrupt(s) of type %d: %d, %d",
702 		    sc->intr_count, sc->intr_type, rc, i);
703 		goto done;
704 	}
705 	ASSERT(sc->intr_count == i); /* allocation was STRICT */
706 	(void) ddi_intr_get_cap(sc->intr_handle[0], &sc->intr_cap);
707 	(void) ddi_intr_get_pri(sc->intr_handle[0], &sc->intr_pri);
708 	if (sc->intr_count == 1) {
709 		ASSERT(sc->flags & INTR_FWD);
710 		(void) ddi_intr_add_handler(sc->intr_handle[0], t4_intr_all, sc,
711 		    &s->fwq);
712 	} else {
713 		/* Multiple interrupts.  The first one is always error intr */
714 		(void) ddi_intr_add_handler(sc->intr_handle[0], t4_intr_err, sc,
715 		    NULL);
716 		irq++;
717 
718 		/* The second one is always the firmware event queue */
719 		(void) ddi_intr_add_handler(sc->intr_handle[1], t4_intr, sc,
720 		    &s->fwq);
721 		irq++;
722 		/*
723 		 * Note that if INTR_FWD is set then either the NIC rx
724 		 * queues or (exclusive or) the TOE rx queueus will be taking
725 		 * direct interrupts.
726 		 *
727 		 * There is no need to check for is_offload(sc) as nofldrxq
728 		 * will be 0 if offload is disabled.
729 		 */
730 		for_each_port(sc, i) {
731 			struct port_info *pi = sc->port[i];
732 			struct sge_rxq *rxq;
733 #ifdef TCP_OFFLOAD_ENABLE
734 			struct sge_ofld_rxq *ofld_rxq;
735 
736 			/*
737 			 * Skip over the NIC queues if they aren't taking direct
738 			 * interrupts.
739 			 */
740 			if ((sc->flags & INTR_FWD) &&
741 			    pi->nofldrxq > pi->nrxq)
742 				goto ofld_queues;
743 #endif
744 			rxq = &s->rxq[pi->first_rxq];
745 			for (q = 0; q < pi->nrxq; q++, rxq++) {
746 				(void) ddi_intr_add_handler(
747 				    sc->intr_handle[irq], t4_intr, sc,
748 				    &rxq->iq);
749 				irq++;
750 			}
751 
752 #ifdef TCP_OFFLOAD_ENABLE
753 			/*
754 			 * Skip over the offload queues if they aren't taking
755 			 * direct interrupts.
756 			 */
757 			if ((sc->flags & INTR_FWD))
758 				continue;
759 ofld_queues:
760 			ofld_rxq = &s->ofld_rxq[pi->first_ofld_rxq];
761 			for (q = 0; q < pi->nofldrxq; q++, ofld_rxq++) {
762 				(void) ddi_intr_add_handler(
763 				    sc->intr_handle[irq], t4_intr, sc,
764 				    &ofld_rxq->iq);
765 				irq++;
766 			}
767 #endif
768 		}
769 
770 	}
771 	sc->flags |= INTR_ALLOCATED;
772 
773 	if ((rc = ksensor_create_scalar_pcidev(dip, SENSOR_KIND_TEMPERATURE,
774 	    &t4_temp_ops, sc, "temp", &sc->temp_sensor)) != 0) {
775 		cxgb_printf(dip, CE_WARN, "failed to create temperature "
776 		    "sensor: %d", rc);
777 		rc = DDI_FAILURE;
778 		goto done;
779 	}
780 
781 	if ((rc = ksensor_create_scalar_pcidev(dip, SENSOR_KIND_VOLTAGE,
782 	    &t4_volt_ops, sc, "vdd", &sc->volt_sensor)) != 0) {
783 		cxgb_printf(dip, CE_WARN, "failed to create voltage "
784 		    "sensor: %d", rc);
785 		rc = DDI_FAILURE;
786 		goto done;
787 	}
788 
789 
790 	if ((rc = ddi_ufm_init(dip, DDI_UFM_CURRENT_VERSION, &t4_ufm_ops,
791 	    &sc->ufm_hdl, sc)) != 0) {
792 		cxgb_printf(dip, CE_WARN, "failed to enable UFM ops: %d", rc);
793 		rc = DDI_FAILURE;
794 		goto done;
795 	}
796 	ddi_ufm_update(sc->ufm_hdl);
797 	ddi_report_dev(dip);
798 
799 	/*
800 	 * Hardware/Firmware/etc. Version/Revision IDs.
801 	 */
802 	t4_dump_version_info(sc);
803 
804 	cxgb_printf(dip, CE_NOTE,
805 		    "(%d rxq, %d txq total) %d %s.",
806 		    rqidx, tqidx, sc->intr_count,
807 		    sc->intr_type == DDI_INTR_TYPE_MSIX ? "MSI-X interrupts" :
808 		    sc->intr_type == DDI_INTR_TYPE_MSI ? "MSI interrupts" :
809 		    "fixed interrupt");
810 
811 	sc->ksp = setup_kstats(sc);
812 	sc->ksp_stat = setup_wc_kstats(sc);
813 	sc->params.drv_memwin = MEMWIN_NIC;
814 
815 done:
816 	if (rc != DDI_SUCCESS) {
817 		(void) t4_devo_detach(dip, DDI_DETACH);
818 
819 		/* rc may have errno style errors or DDI errors */
820 		rc = DDI_FAILURE;
821 	}
822 
823 	return (rc);
824 }
825 
826 static int
827 t4_devo_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
828 {
829 	int instance, i;
830 	struct adapter *sc;
831 	struct port_info *pi;
832 	struct sge *s;
833 
834 	if (cmd != DDI_DETACH)
835 		return (DDI_FAILURE);
836 
837 	instance = ddi_get_instance(dip);
838 	sc = ddi_get_soft_state(t4_list, instance);
839 	if (sc == NULL)
840 		return (DDI_SUCCESS);
841 
842 	if (sc->flags & FULL_INIT_DONE) {
843 		t4_intr_disable(sc);
844 		for_each_port(sc, i) {
845 			pi = sc->port[i];
846 			if (pi && pi->flags & PORT_INIT_DONE)
847 				(void) port_full_uninit(pi);
848 		}
849 		(void) adapter_full_uninit(sc);
850 	}
851 
852 	/* Safe to call no matter what */
853 	if (sc->ufm_hdl != NULL) {
854 		ddi_ufm_fini(sc->ufm_hdl);
855 		sc->ufm_hdl = NULL;
856 	}
857 	(void) ksensor_remove(dip, KSENSOR_ALL_IDS);
858 	ddi_prop_remove_all(dip);
859 	ddi_remove_minor_node(dip, NULL);
860 
861 	for (i = 0; i < NCHAN; i++) {
862 		if (sc->tq[i]) {
863 			ddi_taskq_wait(sc->tq[i]);
864 			ddi_taskq_destroy(sc->tq[i]);
865 		}
866 	}
867 
868 	if (sc->ksp != NULL)
869 		kstat_delete(sc->ksp);
870 	if (sc->ksp_stat != NULL)
871 		kstat_delete(sc->ksp_stat);
872 
873 	s = &sc->sge;
874 	if (s->rxq != NULL)
875 		kmem_free(s->rxq, s->nrxq * sizeof (struct sge_rxq));
876 #ifdef TCP_OFFLOAD_ENABLE
877 	if (s->ofld_txq != NULL)
878 		kmem_free(s->ofld_txq, s->nofldtxq * sizeof (struct sge_wrq));
879 	if (s->ofld_rxq != NULL)
880 		kmem_free(s->ofld_rxq,
881 		    s->nofldrxq * sizeof (struct sge_ofld_rxq));
882 	if (s->ctrlq != NULL)
883 		kmem_free(s->ctrlq,
884 		    sc->params.nports * sizeof (struct sge_wrq));
885 #endif
886 	if (s->txq != NULL)
887 		kmem_free(s->txq, s->ntxq * sizeof (struct sge_txq));
888 	if (s->iqmap != NULL)
889 		kmem_free(s->iqmap, s->iqmap_sz * sizeof (struct sge_iq *));
890 	if (s->eqmap != NULL)
891 		kmem_free(s->eqmap, s->eqmap_sz * sizeof (struct sge_eq *));
892 
893 	if (s->rxbuf_cache != NULL)
894 		rxbuf_cache_destroy(s->rxbuf_cache);
895 
896 	if (sc->flags & INTR_ALLOCATED) {
897 		for (i = 0; i < sc->intr_count; i++) {
898 			(void) ddi_intr_remove_handler(sc->intr_handle[i]);
899 			(void) ddi_intr_free(sc->intr_handle[i]);
900 		}
901 		sc->flags &= ~INTR_ALLOCATED;
902 	}
903 
904 	if (sc->intr_handle != NULL) {
905 		kmem_free(sc->intr_handle,
906 		    sc->intr_count * sizeof (*sc->intr_handle));
907 	}
908 
909 	for_each_port(sc, i) {
910 		pi = sc->port[i];
911 		if (pi != NULL) {
912 			mutex_destroy(&pi->lock);
913 			kmem_free(pi, sizeof (*pi));
914 			clrbit(&sc->registered_device_map, i);
915 		}
916 	}
917 
918 	if (sc->flags & FW_OK)
919 		(void) t4_fw_bye(sc, sc->mbox);
920 
921 	if (sc->reg1h != NULL)
922 		ddi_regs_map_free(&sc->reg1h);
923 
924 	if (sc->regh != NULL)
925 		ddi_regs_map_free(&sc->regh);
926 
927 	if (sc->pci_regh != NULL)
928 		pci_config_teardown(&sc->pci_regh);
929 
930 	mutex_enter(&t4_adapter_list_lock);
931 	SLIST_REMOVE(&t4_adapter_list, sc, adapter, link);
932 	mutex_exit(&t4_adapter_list_lock);
933 
934 	mutex_destroy(&sc->mbox_lock);
935 	mutex_destroy(&sc->lock);
936 	cv_destroy(&sc->cv);
937 	mutex_destroy(&sc->sfl_lock);
938 
939 #ifdef DEBUG
940 	bzero(sc, sizeof (*sc));
941 #endif
942 	ddi_soft_state_free(t4_list, instance);
943 
944 	return (DDI_SUCCESS);
945 }
946 
947 static int
948 t4_devo_quiesce(dev_info_t *dip)
949 {
950 	int instance;
951 	struct adapter *sc;
952 
953 	instance = ddi_get_instance(dip);
954 	sc = ddi_get_soft_state(t4_list, instance);
955 	if (sc == NULL)
956 		return (DDI_SUCCESS);
957 
958 	t4_set_reg_field(sc, A_SGE_CONTROL, F_GLOBALENABLE, 0);
959 	t4_intr_disable(sc);
960 	t4_write_reg(sc, A_PL_RST, F_PIORSTMODE | F_PIORST);
961 
962 	return (DDI_SUCCESS);
963 }
964 
965 static int
966 t4_bus_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t op, void *arg,
967     void *result)
968 {
969 	char s[4];
970 	struct port_info *pi;
971 	dev_info_t *child = (dev_info_t *)arg;
972 
973 	switch (op) {
974 	case DDI_CTLOPS_REPORTDEV:
975 		pi = ddi_get_parent_data(rdip);
976 		pi->instance = ddi_get_instance(dip);
977 		pi->child_inst = ddi_get_instance(rdip);
978 		cmn_err(CE_CONT, "?%s%d is port %s on %s%d\n",
979 		    ddi_node_name(rdip), ddi_get_instance(rdip),
980 		    ddi_get_name_addr(rdip), ddi_driver_name(dip),
981 		    ddi_get_instance(dip));
982 		return (DDI_SUCCESS);
983 
984 	case DDI_CTLOPS_INITCHILD:
985 		pi = ddi_get_parent_data(child);
986 		if (pi == NULL)
987 			return (DDI_NOT_WELL_FORMED);
988 		(void) snprintf(s, sizeof (s), "%d", pi->port_id);
989 		ddi_set_name_addr(child, s);
990 		return (DDI_SUCCESS);
991 
992 	case DDI_CTLOPS_UNINITCHILD:
993 		ddi_set_name_addr(child, NULL);
994 		return (DDI_SUCCESS);
995 
996 	case DDI_CTLOPS_ATTACH:
997 	case DDI_CTLOPS_DETACH:
998 		return (DDI_SUCCESS);
999 
1000 	default:
1001 		return (ddi_ctlops(dip, rdip, op, arg, result));
1002 	}
1003 }
1004 
1005 static int
1006 t4_bus_config(dev_info_t *dip, uint_t flags, ddi_bus_config_op_t op, void *arg,
1007     dev_info_t **cdipp)
1008 {
1009 	int instance, i;
1010 	struct adapter *sc;
1011 
1012 	instance = ddi_get_instance(dip);
1013 	sc = ddi_get_soft_state(t4_list, instance);
1014 
1015 	if (op == BUS_CONFIG_ONE) {
1016 		char *c;
1017 
1018 		/*
1019 		 * arg is something like "cxgb@0" where 0 is the port_id hanging
1020 		 * off this nexus.
1021 		 */
1022 
1023 		c = arg;
1024 		while (*(c + 1))
1025 			c++;
1026 
1027 		/* There should be exactly 1 digit after '@' */
1028 		if (*(c - 1) != '@')
1029 			return (NDI_FAILURE);
1030 
1031 		i = *c - '0';
1032 
1033 		if (add_child_node(sc, i) != 0)
1034 			return (NDI_FAILURE);
1035 
1036 		flags |= NDI_ONLINE_ATTACH;
1037 
1038 	} else if (op == BUS_CONFIG_ALL || op == BUS_CONFIG_DRIVER) {
1039 		/* Allocate and bind all child device nodes */
1040 		for_each_port(sc, i)
1041 		    (void) add_child_node(sc, i);
1042 		flags |= NDI_ONLINE_ATTACH;
1043 	}
1044 
1045 	return (ndi_busop_bus_config(dip, flags, op, arg, cdipp, 0));
1046 }
1047 
1048 static int
1049 t4_bus_unconfig(dev_info_t *dip, uint_t flags, ddi_bus_config_op_t op,
1050     void *arg)
1051 {
1052 	int instance, i, rc;
1053 	struct adapter *sc;
1054 
1055 	instance = ddi_get_instance(dip);
1056 	sc = ddi_get_soft_state(t4_list, instance);
1057 
1058 	if (op == BUS_CONFIG_ONE || op == BUS_UNCONFIG_ALL ||
1059 	    op == BUS_UNCONFIG_DRIVER)
1060 		flags |= NDI_UNCONFIG;
1061 
1062 	rc = ndi_busop_bus_unconfig(dip, flags, op, arg);
1063 	if (rc != 0)
1064 		return (rc);
1065 
1066 	if (op == BUS_UNCONFIG_ONE) {
1067 		char *c;
1068 
1069 		c = arg;
1070 		while (*(c + 1))
1071 			c++;
1072 
1073 		if (*(c - 1) != '@')
1074 			return (NDI_SUCCESS);
1075 
1076 		i = *c - '0';
1077 
1078 		rc = remove_child_node(sc, i);
1079 
1080 	} else if (op == BUS_UNCONFIG_ALL || op == BUS_UNCONFIG_DRIVER) {
1081 
1082 		for_each_port(sc, i)
1083 		    (void) remove_child_node(sc, i);
1084 	}
1085 
1086 	return (rc);
1087 }
1088 
1089 /* ARGSUSED */
1090 static int
1091 t4_cb_open(dev_t *devp, int flag, int otyp, cred_t *credp)
1092 {
1093 	struct adapter *sc;
1094 
1095 	if (otyp != OTYP_CHR)
1096 		return (EINVAL);
1097 
1098 	sc = ddi_get_soft_state(t4_list, getminor(*devp));
1099 	if (sc == NULL)
1100 		return (ENXIO);
1101 
1102 	return (atomic_cas_uint(&sc->open, 0, EBUSY));
1103 }
1104 
1105 /* ARGSUSED */
1106 static int
1107 t4_cb_close(dev_t dev, int flag, int otyp, cred_t *credp)
1108 {
1109 	struct adapter *sc;
1110 
1111 	sc = ddi_get_soft_state(t4_list, getminor(dev));
1112 	if (sc == NULL)
1113 		return (EINVAL);
1114 
1115 	(void) atomic_swap_uint(&sc->open, 0);
1116 	return (0);
1117 }
1118 
1119 /* ARGSUSED */
1120 static int
1121 t4_cb_ioctl(dev_t dev, int cmd, intptr_t d, int mode, cred_t *credp, int *rp)
1122 {
1123 	int instance;
1124 	struct adapter *sc;
1125 	void *data = (void *)d;
1126 
1127 	if (crgetuid(credp) != 0)
1128 		return (EPERM);
1129 
1130 	instance = getminor(dev);
1131 	sc = ddi_get_soft_state(t4_list, instance);
1132 	if (sc == NULL)
1133 		return (EINVAL);
1134 
1135 	return (t4_ioctl(sc, cmd, data, mode));
1136 }
1137 
1138 static unsigned int
1139 getpf(struct adapter *sc)
1140 {
1141 	int rc, *data;
1142 	uint_t n, pf;
1143 
1144 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, sc->dip,
1145 	    DDI_PROP_DONTPASS, "reg", &data, &n);
1146 	if (rc != DDI_SUCCESS) {
1147 		cxgb_printf(sc->dip, CE_WARN,
1148 		    "failed to lookup \"reg\" property: %d", rc);
1149 		return (0xff);
1150 	}
1151 
1152 	pf = PCI_REG_FUNC_G(data[0]);
1153 	ddi_prop_free(data);
1154 
1155 	return (pf);
1156 }
1157 
1158 
1159 static struct fw_info *
1160 find_fw_info(int chip)
1161 {
1162 	u32 i;
1163 
1164 	fi[0].chip = CHELSIO_T4;
1165 	fi[0].fw_hdr.chip = FW_HDR_CHIP_T4;
1166 	fi[0].fw_hdr.fw_ver = cpu_to_be32(FW_VERSION(T4));
1167 	fi[0].fw_hdr.intfver_nic = FW_INTFVER(T4, NIC);
1168 	fi[0].fw_hdr.intfver_vnic = FW_INTFVER(T4, VNIC);
1169 	fi[0].fw_hdr.intfver_ofld = FW_INTFVER(T4, OFLD);
1170 	fi[0].fw_hdr.intfver_ri = FW_INTFVER(T4, RI);
1171 	fi[0].fw_hdr.intfver_iscsipdu = FW_INTFVER(T4, ISCSIPDU);
1172 	fi[0].fw_hdr.intfver_iscsi = FW_INTFVER(T4, ISCSI);
1173 	fi[0].fw_hdr.intfver_fcoepdu = FW_INTFVER(T4, FCOEPDU);
1174 	fi[0].fw_hdr.intfver_fcoe = FW_INTFVER(T4, FCOE);
1175 
1176 	fi[1].chip = CHELSIO_T5;
1177 	fi[1].fw_hdr.chip = FW_HDR_CHIP_T5;
1178 	fi[1].fw_hdr.fw_ver = cpu_to_be32(FW_VERSION(T5));
1179 	fi[1].fw_hdr.intfver_nic = FW_INTFVER(T5, NIC);
1180 	fi[1].fw_hdr.intfver_vnic = FW_INTFVER(T5, VNIC);
1181 	fi[1].fw_hdr.intfver_ofld = FW_INTFVER(T5, OFLD);
1182 	fi[1].fw_hdr.intfver_ri = FW_INTFVER(T5, RI);
1183 	fi[1].fw_hdr.intfver_iscsipdu = FW_INTFVER(T5, ISCSIPDU);
1184 	fi[1].fw_hdr.intfver_iscsi = FW_INTFVER(T5, ISCSI);
1185 	fi[1].fw_hdr.intfver_fcoepdu = FW_INTFVER(T5, FCOEPDU);
1186 	fi[1].fw_hdr.intfver_fcoe = FW_INTFVER(T5, FCOE);
1187 
1188 	fi[2].chip = CHELSIO_T6;
1189 	fi[2].fw_hdr.chip = FW_HDR_CHIP_T6;
1190 	fi[2].fw_hdr.fw_ver = cpu_to_be32(FW_VERSION(T6));
1191 	fi[2].fw_hdr.intfver_nic = FW_INTFVER(T6, NIC);
1192 	fi[2].fw_hdr.intfver_vnic = FW_INTFVER(T6, VNIC);
1193 	fi[2].fw_hdr.intfver_ofld = FW_INTFVER(T6, OFLD);
1194 	fi[2].fw_hdr.intfver_ri = FW_INTFVER(T6, RI);
1195 	fi[2].fw_hdr.intfver_iscsipdu = FW_INTFVER(T6, ISCSIPDU);
1196 	fi[2].fw_hdr.intfver_iscsi = FW_INTFVER(T6, ISCSI);
1197 	fi[2].fw_hdr.intfver_fcoepdu = FW_INTFVER(T6, FCOEPDU);
1198 	fi[2].fw_hdr.intfver_fcoe = FW_INTFVER(T6, FCOE);
1199 
1200 	for (i = 0; i < ARRAY_SIZE(fi); i++) {
1201 		if (fi[i].chip == chip)
1202 			return &fi[i];
1203 	}
1204 
1205 	return NULL;
1206 }
1207 
1208 /*
1209  * Install a compatible firmware (if required), establish contact with it,
1210  * become the master, and reset the device.
1211  */
1212 static int
1213 prep_firmware(struct adapter *sc)
1214 {
1215 	int rc;
1216 	int fw_size;
1217 	int reset = 1;
1218 	enum dev_state state;
1219 	unsigned char *fw_data;
1220 	struct fw_info *fw_info;
1221 	struct fw_hdr *card_fw;
1222 
1223 	struct driver_properties *p = &sc->props;
1224 
1225 	/* Contact firmware, request master */
1226 	rc = t4_fw_hello(sc, sc->mbox, sc->mbox, MASTER_MUST, &state);
1227 	if (rc < 0) {
1228 		rc = -rc;
1229 		cxgb_printf(sc->dip, CE_WARN,
1230 		    "failed to connect to the firmware: %d.", rc);
1231 		return (rc);
1232 	}
1233 
1234 	if (rc == sc->mbox)
1235 		sc->flags |= MASTER_PF;
1236 
1237 	/* We may need FW version info for later reporting */
1238 	t4_get_version_info(sc);
1239 	fw_info = find_fw_info(CHELSIO_CHIP_VERSION(sc->params.chip));
1240 	/* allocate memory to read the header of the firmware on the
1241 	 * card
1242 	 */
1243 	if (!fw_info) {
1244 		cxgb_printf(sc->dip, CE_WARN,
1245 			    "unable to look up firmware information for chip %d.\n",
1246 			    CHELSIO_CHIP_VERSION(sc->params.chip));
1247 		return EINVAL;
1248 	}
1249 	card_fw = kmem_zalloc(sizeof(*card_fw), KM_SLEEP);
1250 	if(!card_fw) {
1251 		cxgb_printf(sc->dip, CE_WARN,
1252 			    "Memory allocation for card FW header failed\n");
1253 		return ENOMEM;
1254 	}
1255 	switch(CHELSIO_CHIP_VERSION(sc->params.chip)) {
1256 	case CHELSIO_T4:
1257 		fw_data = t4fw_data;
1258 		fw_size = t4fw_size;
1259 		break;
1260 	case CHELSIO_T5:
1261 		fw_data = t5fw_data;
1262 		fw_size = t5fw_size;
1263 		break;
1264 	case CHELSIO_T6:
1265 		fw_data = t6fw_data;
1266 		fw_size = t6fw_size;
1267 		break;
1268 	default:
1269 		cxgb_printf(sc->dip, CE_WARN, "Adapter type not supported\n");
1270 		kmem_free(card_fw, sizeof(*card_fw));
1271 		return EINVAL;
1272 	}
1273 
1274 	rc = -t4_prep_fw(sc, fw_info, fw_data, fw_size, card_fw,
1275 			 p->t4_fw_install, state, &reset);
1276 
1277 	kmem_free(card_fw, sizeof(*card_fw));
1278 
1279 	if (rc != 0) {
1280 		cxgb_printf(sc->dip, CE_WARN,
1281 		    "failed to install firmware: %d", rc);
1282 		return (rc);
1283 	} else {
1284 		/* refresh */
1285 		(void) t4_check_fw_version(sc);
1286 	}
1287 
1288 	/* Reset device */
1289 	rc = -t4_fw_reset(sc, sc->mbox, F_PIORSTMODE | F_PIORST);
1290 	if (rc != 0) {
1291 		cxgb_printf(sc->dip, CE_WARN,
1292 		    "firmware reset failed: %d.", rc);
1293 		if (rc != ETIMEDOUT && rc != EIO)
1294 			(void) t4_fw_bye(sc, sc->mbox);
1295 		return (rc);
1296 	}
1297 
1298 	/* Partition adapter resources as specified in the config file. */
1299 	if (sc->flags & MASTER_PF) {
1300 		/* Handle default vs special T4 config file */
1301 
1302 		rc = partition_resources(sc);
1303 		if (rc != 0)
1304 			goto err;	/* error message displayed already */
1305 	}
1306 
1307 	sc->flags |= FW_OK;
1308 	return (0);
1309 err:
1310 	return (rc);
1311 
1312 }
1313 
1314 static const struct memwin t4_memwin[] = {
1315 	{ MEMWIN0_BASE, MEMWIN0_APERTURE },
1316 	{ MEMWIN1_BASE, MEMWIN1_APERTURE },
1317 	{ MEMWIN2_BASE, MEMWIN2_APERTURE }
1318 };
1319 
1320 static const struct memwin t5_memwin[] = {
1321 	{ MEMWIN0_BASE, MEMWIN0_APERTURE },
1322 	{ MEMWIN1_BASE, MEMWIN1_APERTURE },
1323 	{ MEMWIN2_BASE_T5, MEMWIN2_APERTURE_T5 },
1324 };
1325 
1326 #define	FW_PARAM_DEV(param) \
1327 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | \
1328 	    V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_##param))
1329 #define	FW_PARAM_PFVF(param) \
1330 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_PFVF) | \
1331 	    V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_PFVF_##param))
1332 
1333 /*
1334  * Verify that the memory range specified by the memtype/offset/len pair is
1335  * valid and lies entirely within the memtype specified.  The global address of
1336  * the start of the range is returned in addr.
1337  */
1338 int
1339 validate_mt_off_len(struct adapter *sc, int mtype, uint32_t off, int len,
1340 	uint32_t *addr)
1341 {
1342 	uint32_t em, addr_len, maddr, mlen;
1343 
1344 	/* Memory can only be accessed in naturally aligned 4 byte units */
1345 	if (off & 3 || len & 3 || len == 0)
1346 		return (EINVAL);
1347 
1348 	em = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
1349 	switch (mtype) {
1350 		case MEM_EDC0:
1351 			if (!(em & F_EDRAM0_ENABLE))
1352 				return (EINVAL);
1353 			addr_len = t4_read_reg(sc, A_MA_EDRAM0_BAR);
1354 			maddr = G_EDRAM0_BASE(addr_len) << 20;
1355 			mlen = G_EDRAM0_SIZE(addr_len) << 20;
1356 			break;
1357 		case MEM_EDC1:
1358 			if (!(em & F_EDRAM1_ENABLE))
1359 				return (EINVAL);
1360 			addr_len = t4_read_reg(sc, A_MA_EDRAM1_BAR);
1361 			maddr = G_EDRAM1_BASE(addr_len) << 20;
1362 			mlen = G_EDRAM1_SIZE(addr_len) << 20;
1363 			break;
1364 		case MEM_MC:
1365 			if (!(em & F_EXT_MEM_ENABLE))
1366 				return (EINVAL);
1367 			addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
1368 			maddr = G_EXT_MEM_BASE(addr_len) << 20;
1369 			mlen = G_EXT_MEM_SIZE(addr_len) << 20;
1370 			break;
1371 		case MEM_MC1:
1372 			if (is_t4(sc->params.chip) || !(em & F_EXT_MEM1_ENABLE))
1373 				return (EINVAL);
1374 			addr_len = t4_read_reg(sc, A_MA_EXT_MEMORY1_BAR);
1375 			maddr = G_EXT_MEM1_BASE(addr_len) << 20;
1376 			mlen = G_EXT_MEM1_SIZE(addr_len) << 20;
1377 			break;
1378 		default:
1379 			return (EINVAL);
1380 	}
1381 
1382 	if (mlen > 0 && off < mlen && off + len <= mlen) {
1383 		*addr = maddr + off;    /* global address */
1384 		return (0);
1385 	}
1386 
1387 	return (EFAULT);
1388 }
1389 
1390 void
1391 memwin_info(struct adapter *sc, int win, uint32_t *base, uint32_t *aperture)
1392 {
1393 	const struct memwin *mw;
1394 
1395 	if (is_t4(sc->params.chip)) {
1396 		mw = &t4_memwin[win];
1397 	} else {
1398 		mw = &t5_memwin[win];
1399 	}
1400 
1401 	if (base != NULL)
1402 		*base = mw->base;
1403 	if (aperture != NULL)
1404 		*aperture = mw->aperture;
1405 }
1406 
1407 /*
1408  * Upload configuration file to card's memory.
1409  */
1410 static int
1411 upload_config_file(struct adapter *sc, uint32_t *mt, uint32_t *ma)
1412 {
1413 	int rc = 0, cflen;
1414 	u_int i, n;
1415 	uint32_t param, val, addr, mtype, maddr;
1416 	uint32_t off, mw_base, mw_aperture;
1417 	const uint32_t *cfdata;
1418 
1419 	/* Figure out where the firmware wants us to upload it. */
1420 	param = FW_PARAM_DEV(CF);
1421 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
1422 	if (rc != 0) {
1423 		/* Firmwares without config file support will fail this way */
1424 		cxgb_printf(sc->dip, CE_WARN,
1425 		    "failed to query config file location: %d.\n", rc);
1426 		return (rc);
1427 	}
1428 	*mt = mtype = G_FW_PARAMS_PARAM_Y(val);
1429 	*ma = maddr = G_FW_PARAMS_PARAM_Z(val) << 16;
1430 
1431 	switch (CHELSIO_CHIP_VERSION(sc->params.chip)) {
1432 	case CHELSIO_T4:
1433 		cflen = t4cfg_size & ~3;
1434 		/* LINTED: E_BAD_PTR_CAST_ALIGN */
1435 		cfdata = (const uint32_t *)t4cfg_data;
1436 		break;
1437 	case CHELSIO_T5:
1438 		cflen = t5cfg_size & ~3;
1439 		/* LINTED: E_BAD_PTR_CAST_ALIGN */
1440 		cfdata = (const uint32_t *)t5cfg_data;
1441 		break;
1442 	case CHELSIO_T6:
1443 		cflen = t6cfg_size & ~3;
1444 		/* LINTED: E_BAD_PTR_CAST_ALIGN */
1445 		cfdata = (const uint32_t *)t6cfg_data;
1446 		break;
1447 	default:
1448 		cxgb_printf(sc->dip, CE_WARN,
1449 			    "Invalid Adapter detected\n");
1450 		return EINVAL;
1451 	}
1452 
1453 	if (cflen > FLASH_CFG_MAX_SIZE) {
1454 		cxgb_printf(sc->dip, CE_WARN,
1455 		    "config file too long (%d, max allowed is %d).  ",
1456 		    cflen, FLASH_CFG_MAX_SIZE);
1457 		return (EFBIG);
1458 	}
1459 
1460 	rc = validate_mt_off_len(sc, mtype, maddr, cflen, &addr);
1461 	if (rc != 0) {
1462 
1463 		cxgb_printf(sc->dip, CE_WARN,
1464 		    "%s: addr (%d/0x%x) or len %d is not valid: %d.  "
1465 		    "Will try to use the config on the card, if any.\n",
1466 		    __func__, mtype, maddr, cflen, rc);
1467 		return (EFAULT);
1468 	}
1469 
1470 	memwin_info(sc, 2, &mw_base, &mw_aperture);
1471 	while (cflen) {
1472 		off = position_memwin(sc, 2, addr);
1473 		n = min(cflen, mw_aperture - off);
1474 		for (i = 0; i < n; i += 4)
1475 			t4_write_reg(sc, mw_base + off + i, *cfdata++);
1476 		cflen -= n;
1477 		addr += n;
1478 	}
1479 
1480 	return (rc);
1481 }
1482 
1483 /*
1484  * Partition chip resources for use between various PFs, VFs, etc.  This is done
1485  * by uploading the firmware configuration file to the adapter and instructing
1486  * the firmware to process it.
1487  */
1488 static int
1489 partition_resources(struct adapter *sc)
1490 {
1491 	int rc;
1492 	struct fw_caps_config_cmd caps;
1493 	uint32_t mtype, maddr, finicsum, cfcsum;
1494 
1495 	rc = upload_config_file(sc, &mtype, &maddr);
1496 	if (rc != 0) {
1497 		mtype = FW_MEMTYPE_CF_FLASH;
1498 		maddr = t4_flash_cfg_addr(sc);
1499 	}
1500 
1501 	bzero(&caps, sizeof (caps));
1502 	caps.op_to_write = BE_32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
1503 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
1504 	caps.cfvalid_to_len16 = BE_32(F_FW_CAPS_CONFIG_CMD_CFVALID |
1505 	    V_FW_CAPS_CONFIG_CMD_MEMTYPE_CF(mtype) |
1506 	    V_FW_CAPS_CONFIG_CMD_MEMADDR64K_CF(maddr >> 16) | FW_LEN16(caps));
1507 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof (caps), &caps);
1508 	if (rc != 0) {
1509 		cxgb_printf(sc->dip, CE_WARN,
1510 		    "failed to pre-process config file: %d.\n", rc);
1511 		return (rc);
1512 	}
1513 
1514 	finicsum = ntohl(caps.finicsum);
1515 	cfcsum = ntohl(caps.cfcsum);
1516 	if (finicsum != cfcsum) {
1517 		cxgb_printf(sc->dip, CE_WARN,
1518 		    "WARNING: config file checksum mismatch: %08x %08x\n",
1519 		    finicsum, cfcsum);
1520 	}
1521 	sc->cfcsum = cfcsum;
1522 
1523 	/* TODO: Need to configure this correctly */
1524 	caps.toecaps = htons(FW_CAPS_CONFIG_TOE);
1525 	caps.iscsicaps = 0;
1526 	caps.rdmacaps = 0;
1527 	caps.fcoecaps = 0;
1528 	/* TODO: Disable VNIC cap for now */
1529 	caps.niccaps ^= htons(FW_CAPS_CONFIG_NIC_VM);
1530 
1531 	caps.op_to_write = htonl(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
1532 	    F_FW_CMD_REQUEST | F_FW_CMD_WRITE);
1533 	caps.cfvalid_to_len16 = htonl(FW_LEN16(caps));
1534 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof (caps), NULL);
1535 	if (rc != 0) {
1536 		cxgb_printf(sc->dip, CE_WARN,
1537 		    "failed to process config file: %d.\n", rc);
1538 		return (rc);
1539 	}
1540 
1541 	return (0);
1542 }
1543 
1544 /*
1545  * Tweak configuration based on module parameters, etc.  Most of these have
1546  * defaults assigned to them by Firmware Configuration Files (if we're using
1547  * them) but need to be explicitly set if we're using hard-coded
1548  * initialization.  But even in the case of using Firmware Configuration
1549  * Files, we'd like to expose the ability to change these via module
1550  * parameters so these are essentially common tweaks/settings for
1551  * Configuration Files and hard-coded initialization ...
1552  */
1553 static int
1554 adap__pre_init_tweaks(struct adapter *sc)
1555 {
1556 	int rx_dma_offset = 2; /* Offset of RX packets into DMA buffers */
1557 
1558 	/*
1559 	 * Fix up various Host-Dependent Parameters like Page Size, Cache
1560 	 * Line Size, etc.  The firmware default is for a 4KB Page Size and
1561 	 * 64B Cache Line Size ...
1562 	 */
1563 	(void) t4_fixup_host_params_compat(sc, PAGE_SIZE, CACHE_LINE, T5_LAST_REV);
1564 
1565 	t4_set_reg_field(sc, A_SGE_CONTROL,
1566 			 V_PKTSHIFT(M_PKTSHIFT), V_PKTSHIFT(rx_dma_offset));
1567 
1568 	return 0;
1569 }
1570 /*
1571  * Retrieve parameters that are needed (or nice to have) prior to calling
1572  * t4_sge_init and t4_fw_initialize.
1573  */
1574 static int
1575 get_params__pre_init(struct adapter *sc)
1576 {
1577 	int rc;
1578 	uint32_t param[2], val[2];
1579 	struct fw_devlog_cmd cmd;
1580 	struct devlog_params *dlog = &sc->params.devlog;
1581 
1582 	/*
1583 	 * Grab the raw VPD parameters.
1584 	 */
1585 	rc = -t4_get_raw_vpd_params(sc, &sc->params.vpd);
1586 	if (rc != 0) {
1587 		cxgb_printf(sc->dip, CE_WARN,
1588 		    "failed to query VPD parameters (pre_init): %d.\n", rc);
1589 		return (rc);
1590 	}
1591 
1592 	param[0] = FW_PARAM_DEV(PORTVEC);
1593 	param[1] = FW_PARAM_DEV(CCLK);
1594 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
1595 	if (rc != 0) {
1596 		cxgb_printf(sc->dip, CE_WARN,
1597 		    "failed to query parameters (pre_init): %d.\n", rc);
1598 		return (rc);
1599 	}
1600 
1601 	sc->params.portvec = val[0];
1602 	sc->params.nports = 0;
1603 	while (val[0]) {
1604 		sc->params.nports++;
1605 		val[0] &= val[0] - 1;
1606 	}
1607 
1608 	sc->params.vpd.cclk = val[1];
1609 
1610 	/* Read device log parameters. */
1611 	bzero(&cmd, sizeof (cmd));
1612 	cmd.op_to_write = htonl(V_FW_CMD_OP(FW_DEVLOG_CMD) |
1613 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
1614 	cmd.retval_len16 = htonl(FW_LEN16(cmd));
1615 	rc = -t4_wr_mbox(sc, sc->mbox, &cmd, sizeof (cmd), &cmd);
1616 	if (rc != 0) {
1617 		cxgb_printf(sc->dip, CE_WARN,
1618 		    "failed to get devlog parameters: %d.\n", rc);
1619 		bzero(dlog, sizeof (*dlog));
1620 		rc = 0;	/* devlog isn't critical for device operation */
1621 	} else {
1622 		val[0] = ntohl(cmd.memtype_devlog_memaddr16_devlog);
1623 		dlog->memtype = G_FW_DEVLOG_CMD_MEMTYPE_DEVLOG(val[0]);
1624 		dlog->start = G_FW_DEVLOG_CMD_MEMADDR16_DEVLOG(val[0]) << 4;
1625 		dlog->size = ntohl(cmd.memsize_devlog);
1626 	}
1627 
1628 	return (rc);
1629 }
1630 
1631 /*
1632  * Retrieve various parameters that are of interest to the driver.  The device
1633  * has been initialized by the firmware at this point.
1634  */
1635 static int
1636 get_params__post_init(struct adapter *sc)
1637 {
1638 	int rc;
1639 	uint32_t param[7], val[7];
1640 	struct fw_caps_config_cmd caps;
1641 
1642 	param[0] = FW_PARAM_PFVF(IQFLINT_START);
1643 	param[1] = FW_PARAM_PFVF(EQ_START);
1644 	param[2] = FW_PARAM_PFVF(FILTER_START);
1645 	param[3] = FW_PARAM_PFVF(FILTER_END);
1646 	param[4] = FW_PARAM_PFVF(L2T_START);
1647 	param[5] = FW_PARAM_PFVF(L2T_END);
1648 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
1649 	if (rc != 0) {
1650 		cxgb_printf(sc->dip, CE_WARN,
1651 		    "failed to query parameters (post_init): %d.\n", rc);
1652 		return (rc);
1653 	}
1654 
1655 	/* LINTED: E_ASSIGN_NARROW_CONV */
1656 	sc->sge.iq_start = val[0];
1657 	sc->sge.eq_start = val[1];
1658 	sc->tids.ftid_base = val[2];
1659 	sc->tids.nftids = val[3] - val[2] + 1;
1660 	sc->vres.l2t.start = val[4];
1661 	sc->vres.l2t.size = val[5] - val[4] + 1;
1662 
1663 	param[0] = FW_PARAM_PFVF(IQFLINT_END);
1664 	param[1] = FW_PARAM_PFVF(EQ_END);
1665 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
1666 	if (rc != 0) {
1667 		cxgb_printf(sc->dip, CE_WARN,
1668 			    "failed to query eq/iq map size parameters (post_init): %d.\n",
1669 			    rc);
1670 		return (rc);
1671 	}
1672 
1673 	sc->sge.iqmap_sz = val[0] - sc->sge.iq_start + 1;
1674 	sc->sge.eqmap_sz = val[1] - sc->sge.eq_start + 1;
1675 
1676 	/* get capabilites */
1677 	bzero(&caps, sizeof (caps));
1678 	caps.op_to_write = htonl(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
1679 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
1680 	caps.cfvalid_to_len16 = htonl(FW_LEN16(caps));
1681 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof (caps), &caps);
1682 	if (rc != 0) {
1683 		cxgb_printf(sc->dip, CE_WARN,
1684 		    "failed to get card capabilities: %d.\n", rc);
1685 		return (rc);
1686 	}
1687 
1688 	if (caps.toecaps != 0) {
1689 		/* query offload-related parameters */
1690 		param[0] = FW_PARAM_DEV(NTID);
1691 		param[1] = FW_PARAM_PFVF(SERVER_START);
1692 		param[2] = FW_PARAM_PFVF(SERVER_END);
1693 		param[3] = FW_PARAM_PFVF(TDDP_START);
1694 		param[4] = FW_PARAM_PFVF(TDDP_END);
1695 		param[5] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ);
1696 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
1697 		if (rc != 0) {
1698 			cxgb_printf(sc->dip, CE_WARN,
1699 			    "failed to query TOE parameters: %d.\n", rc);
1700 			return (rc);
1701 		}
1702 		sc->tids.ntids = val[0];
1703 		sc->tids.natids = min(sc->tids.ntids / 2, MAX_ATIDS);
1704 		sc->tids.stid_base = val[1];
1705 		sc->tids.nstids = val[2] - val[1] + 1;
1706 		sc->vres.ddp.start = val[3];
1707 		sc->vres.ddp.size = val[4] - val[3] + 1;
1708 		sc->params.ofldq_wr_cred = val[5];
1709 		sc->params.offload = 1;
1710 	}
1711 
1712 	rc = -t4_get_pfres(sc);
1713 	if (rc != 0) {
1714 		cxgb_printf(sc->dip, CE_WARN,
1715 			    "failed to query PF resource params: %d.\n", rc);
1716 		return (rc);
1717 	}
1718 
1719 	/* These are finalized by FW initialization, load their values now */
1720 	val[0] = t4_read_reg(sc, A_TP_TIMER_RESOLUTION);
1721 	sc->params.tp.tre = G_TIMERRESOLUTION(val[0]);
1722 	sc->params.tp.dack_re = G_DELAYEDACKRESOLUTION(val[0]);
1723 	t4_read_mtu_tbl(sc, sc->params.mtus, NULL);
1724 
1725 	return (rc);
1726 }
1727 
1728 static int
1729 set_params__post_init(struct adapter *sc)
1730 {
1731 	uint32_t param, val;
1732 
1733 	/* ask for encapsulated CPLs */
1734 	param = FW_PARAM_PFVF(CPLFW4MSG_ENCAP);
1735 	val = 1;
1736 	(void)t4_set_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
1737 
1738 	return (0);
1739 }
1740 
1741 /* TODO: verify */
1742 static void
1743 setup_memwin(struct adapter *sc)
1744 {
1745 	pci_regspec_t *data;
1746 	int rc;
1747 	uint_t n;
1748 	uintptr_t bar0;
1749 	uintptr_t mem_win0_base, mem_win1_base, mem_win2_base;
1750 	uintptr_t mem_win2_aperture;
1751 
1752 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, sc->dip,
1753 	    DDI_PROP_DONTPASS, "assigned-addresses", (int **)&data, &n);
1754 	if (rc != DDI_SUCCESS) {
1755 		cxgb_printf(sc->dip, CE_WARN,
1756 		    "failed to lookup \"assigned-addresses\" property: %d", rc);
1757 		return;
1758 	}
1759 	n /= sizeof (*data);
1760 
1761 	bar0 = ((uint64_t)data[0].pci_phys_mid << 32) | data[0].pci_phys_low;
1762 	ddi_prop_free(data);
1763 
1764 	if (is_t4(sc->params.chip)) {
1765 		mem_win0_base = bar0 + MEMWIN0_BASE;
1766 		mem_win1_base = bar0 + MEMWIN1_BASE;
1767 		mem_win2_base = bar0 + MEMWIN2_BASE;
1768 		mem_win2_aperture = MEMWIN2_APERTURE;
1769 	} else {
1770 		/* For T5, only relative offset inside the PCIe BAR is passed */
1771 		mem_win0_base = MEMWIN0_BASE;
1772 		mem_win1_base = MEMWIN1_BASE;
1773 		mem_win2_base = MEMWIN2_BASE_T5;
1774 		mem_win2_aperture = MEMWIN2_APERTURE_T5;
1775 	}
1776 
1777 	t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 0),
1778 	    mem_win0_base | V_BIR(0) |
1779 	    V_WINDOW(ilog2(MEMWIN0_APERTURE) - 10));
1780 
1781 	t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 1),
1782 	    mem_win1_base | V_BIR(0) |
1783 	    V_WINDOW(ilog2(MEMWIN1_APERTURE) - 10));
1784 
1785 	t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2),
1786 	    mem_win2_base | V_BIR(0) |
1787 	    V_WINDOW(ilog2(mem_win2_aperture) - 10));
1788 
1789 	/* flush */
1790 	(void)t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2));
1791 }
1792 
1793 /*
1794  * Positions the memory window such that it can be used to access the specified
1795  * address in the chip's address space.  The return value is the offset of addr
1796  * from the start of the window.
1797  */
1798 uint32_t
1799 position_memwin(struct adapter *sc, int n, uint32_t addr)
1800 {
1801 	uint32_t start, pf;
1802 	uint32_t reg;
1803 
1804 	if (addr & 3) {
1805 		cxgb_printf(sc->dip, CE_WARN,
1806 		    "addr (0x%x) is not at a 4B boundary.\n", addr);
1807 		return (EFAULT);
1808 	}
1809 
1810 	if (is_t4(sc->params.chip)) {
1811 		pf = 0;
1812 		start = addr & ~0xf;    /* start must be 16B aligned */
1813 	} else {
1814 		pf = V_PFNUM(sc->pf);
1815 		start = addr & ~0x7f;   /* start must be 128B aligned */
1816 	}
1817 	reg = PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, n);
1818 
1819 	t4_write_reg(sc, reg, start | pf);
1820 	(void) t4_read_reg(sc, reg);
1821 
1822 	return (addr - start);
1823 }
1824 
1825 
1826 /*
1827  * Reads the named property and fills up the "data" array (which has at least
1828  * "count" elements).  We first try and lookup the property for our dev_t and
1829  * then retry with DDI_DEV_T_ANY if it's not found.
1830  *
1831  * Returns non-zero if the property was found and "data" has been updated.
1832  */
1833 static int
1834 prop_lookup_int_array(struct adapter *sc, char *name, int *data, uint_t count)
1835 {
1836 	dev_info_t *dip = sc->dip;
1837 	dev_t dev = sc->dev;
1838 	int rc, *d;
1839 	uint_t i, n;
1840 
1841 	rc = ddi_prop_lookup_int_array(dev, dip, DDI_PROP_DONTPASS,
1842 	    name, &d, &n);
1843 	if (rc == DDI_PROP_SUCCESS)
1844 		goto found;
1845 
1846 	if (rc != DDI_PROP_NOT_FOUND) {
1847 		cxgb_printf(dip, CE_WARN,
1848 		    "failed to lookup property %s for minor %d: %d.",
1849 		    name, getminor(dev), rc);
1850 		return (0);
1851 	}
1852 
1853 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1854 	    name, &d, &n);
1855 	if (rc == DDI_PROP_SUCCESS)
1856 		goto found;
1857 
1858 	if (rc != DDI_PROP_NOT_FOUND) {
1859 		cxgb_printf(dip, CE_WARN,
1860 		    "failed to lookup property %s: %d.", name, rc);
1861 		return (0);
1862 	}
1863 
1864 	return (0);
1865 
1866 found:
1867 	if (n > count) {
1868 		cxgb_printf(dip, CE_NOTE,
1869 		    "property %s has too many elements (%d), ignoring extras",
1870 		    name, n);
1871 	}
1872 
1873 	for (i = 0; i < n && i < count; i++)
1874 		data[i] = d[i];
1875 	ddi_prop_free(d);
1876 
1877 	return (1);
1878 }
1879 
1880 static int
1881 prop_lookup_int(struct adapter *sc, char *name, int defval)
1882 {
1883 	int rc;
1884 
1885 	rc = ddi_prop_get_int(sc->dev, sc->dip, DDI_PROP_DONTPASS, name, -1);
1886 	if (rc != -1)
1887 		return (rc);
1888 
1889 	return (ddi_prop_get_int(DDI_DEV_T_ANY, sc->dip, DDI_PROP_DONTPASS,
1890 	    name, defval));
1891 }
1892 
1893 static int
1894 init_driver_props(struct adapter *sc, struct driver_properties *p)
1895 {
1896 	dev_t dev = sc->dev;
1897 	dev_info_t *dip = sc->dip;
1898 	int i, *data;
1899 	uint_t tmr[SGE_NTIMERS] = {5, 10, 20, 50, 100, 200};
1900 	uint_t cnt[SGE_NCOUNTERS] = {1, 8, 16, 32}; /* 63 max */
1901 
1902 	/*
1903 	 * Holdoff timer
1904 	 */
1905 	data = &p->timer_val[0];
1906 	for (i = 0; i < SGE_NTIMERS; i++)
1907 		data[i] = tmr[i];
1908 	(void) prop_lookup_int_array(sc, "holdoff-timer-values", data,
1909 	    SGE_NTIMERS);
1910 	for (i = 0; i < SGE_NTIMERS; i++) {
1911 		int limit = 200U;
1912 		if (data[i] > limit) {
1913 			cxgb_printf(dip, CE_WARN,
1914 			    "holdoff timer %d is too high (%d), lowered to %d.",
1915 			    i, data[i], limit);
1916 			data[i] = limit;
1917 		}
1918 	}
1919 	(void) ddi_prop_update_int_array(dev, dip, "holdoff-timer-values",
1920 	    data, SGE_NTIMERS);
1921 
1922 	/*
1923 	 * Holdoff packet counter
1924 	 */
1925 	data = &p->counter_val[0];
1926 	for (i = 0; i < SGE_NCOUNTERS; i++)
1927 		data[i] = cnt[i];
1928 	(void) prop_lookup_int_array(sc, "holdoff-pkt-counter-values", data,
1929 	    SGE_NCOUNTERS);
1930 	for (i = 0; i < SGE_NCOUNTERS; i++) {
1931 		int limit = M_THRESHOLD_0;
1932 		if (data[i] > limit) {
1933 			cxgb_printf(dip, CE_WARN,
1934 			    "holdoff pkt-counter %d is too high (%d), "
1935 			    "lowered to %d.", i, data[i], limit);
1936 			data[i] = limit;
1937 		}
1938 	}
1939 	(void) ddi_prop_update_int_array(dev, dip, "holdoff-pkt-counter-values",
1940 	    data, SGE_NCOUNTERS);
1941 
1942 	/*
1943 	 * Maximum # of tx and rx queues to use for each
1944 	 * 100G, 40G, 25G, 10G and 1G port.
1945 	 */
1946 	p->max_ntxq_10g = prop_lookup_int(sc, "max-ntxq-10G-port", 8);
1947 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-10G-port",
1948 	    p->max_ntxq_10g);
1949 
1950 	p->max_nrxq_10g = prop_lookup_int(sc, "max-nrxq-10G-port", 8);
1951 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-10G-port",
1952 	    p->max_nrxq_10g);
1953 
1954 	p->max_ntxq_1g = prop_lookup_int(sc, "max-ntxq-1G-port", 2);
1955 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-1G-port",
1956 	    p->max_ntxq_1g);
1957 
1958 	p->max_nrxq_1g = prop_lookup_int(sc, "max-nrxq-1G-port", 2);
1959 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-1G-port",
1960 	    p->max_nrxq_1g);
1961 
1962 #ifdef TCP_OFFLOAD_ENABLE
1963 	p->max_nofldtxq_10g = prop_lookup_int(sc, "max-nofldtxq-10G-port", 8);
1964 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-10G-port",
1965 	    p->max_nofldtxq_10g);
1966 
1967 	p->max_nofldrxq_10g = prop_lookup_int(sc, "max-nofldrxq-10G-port", 2);
1968 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-10G-port",
1969 	    p->max_nofldrxq_10g);
1970 
1971 	p->max_nofldtxq_1g = prop_lookup_int(sc, "max-nofldtxq-1G-port", 2);
1972 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-1G-port",
1973 	    p->max_nofldtxq_1g);
1974 
1975 	p->max_nofldrxq_1g = prop_lookup_int(sc, "max-nofldrxq-1G-port", 1);
1976 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-1G-port",
1977 	    p->max_nofldrxq_1g);
1978 #endif
1979 
1980 	/*
1981 	 * Holdoff parameters for 10G and 1G ports.
1982 	 */
1983 	p->tmr_idx_10g = prop_lookup_int(sc, "holdoff-timer-idx-10G", 0);
1984 	(void) ddi_prop_update_int(dev, dip, "holdoff-timer-idx-10G",
1985 	    p->tmr_idx_10g);
1986 
1987 	p->pktc_idx_10g = prop_lookup_int(sc, "holdoff-pktc-idx-10G", 2);
1988 	(void) ddi_prop_update_int(dev, dip, "holdoff-pktc-idx-10G",
1989 	    p->pktc_idx_10g);
1990 
1991 	p->tmr_idx_1g = prop_lookup_int(sc, "holdoff-timer-idx-1G", 0);
1992 	(void) ddi_prop_update_int(dev, dip, "holdoff-timer-idx-1G",
1993 	    p->tmr_idx_1g);
1994 
1995 	p->pktc_idx_1g = prop_lookup_int(sc, "holdoff-pktc-idx-1G", 2);
1996 	(void) ddi_prop_update_int(dev, dip, "holdoff-pktc-idx-1G",
1997 	    p->pktc_idx_1g);
1998 
1999 	/*
2000 	 * Size (number of entries) of each tx and rx queue.
2001 	 */
2002 	i = prop_lookup_int(sc, "qsize-txq", TX_EQ_QSIZE);
2003 	p->qsize_txq = max(i, 128);
2004 	if (p->qsize_txq != i) {
2005 		cxgb_printf(dip, CE_WARN,
2006 		    "using %d instead of %d as the tx queue size",
2007 		    p->qsize_txq, i);
2008 	}
2009 	(void) ddi_prop_update_int(dev, dip, "qsize-txq", p->qsize_txq);
2010 
2011 	i = prop_lookup_int(sc, "qsize-rxq", RX_IQ_QSIZE);
2012 	p->qsize_rxq = max(i, 128);
2013 	while (p->qsize_rxq & 7)
2014 		p->qsize_rxq--;
2015 	if (p->qsize_rxq != i) {
2016 		cxgb_printf(dip, CE_WARN,
2017 		    "using %d instead of %d as the rx queue size",
2018 		    p->qsize_rxq, i);
2019 	}
2020 	(void) ddi_prop_update_int(dev, dip, "qsize-rxq", p->qsize_rxq);
2021 
2022 	/*
2023 	 * Interrupt types allowed.
2024 	 * Bits 0, 1, 2 = INTx, MSI, MSI-X respectively.  See sys/ddi_intr.h
2025 	 */
2026 	p->intr_types = prop_lookup_int(sc, "interrupt-types",
2027 	    DDI_INTR_TYPE_MSIX | DDI_INTR_TYPE_MSI | DDI_INTR_TYPE_FIXED);
2028 	(void) ddi_prop_update_int(dev, dip, "interrupt-types", p->intr_types);
2029 
2030 	/*
2031 	 * Forwarded interrupt queues.  Create this property to force the driver
2032 	 * to use forwarded interrupt queues.
2033 	 */
2034 	if (ddi_prop_exists(dev, dip, DDI_PROP_DONTPASS,
2035 	    "interrupt-forwarding") != 0 ||
2036 	    ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
2037 	    "interrupt-forwarding") != 0) {
2038 		UNIMPLEMENTED();
2039 		(void) ddi_prop_create(dev, dip, DDI_PROP_CANSLEEP,
2040 		    "interrupt-forwarding", NULL, 0);
2041 	}
2042 
2043 	/*
2044 	 * Write combining
2045 	 * 0 to disable, 1 to enable
2046 	 */
2047 	p->wc = prop_lookup_int(sc, "write-combine", 1);
2048 	cxgb_printf(dip, CE_WARN, "write-combine: using of %d", p->wc);
2049 	if (p->wc != 0 && p->wc != 1) {
2050 		cxgb_printf(dip, CE_WARN,
2051 		    "write-combine: using 1 instead of %d", p->wc);
2052 		p->wc = 1;
2053 	}
2054 	(void) ddi_prop_update_int(dev, dip, "write-combine", p->wc);
2055 
2056 	p->t4_fw_install = prop_lookup_int(sc, "t4_fw_install", 1);
2057 	if (p->t4_fw_install != 0 && p->t4_fw_install != 2)
2058 		p->t4_fw_install = 1;
2059 	(void) ddi_prop_update_int(dev, dip, "t4_fw_install", p->t4_fw_install);
2060 
2061 	/* Multiple Rings */
2062 	p->multi_rings = prop_lookup_int(sc, "multi-rings", 1);
2063 	if (p->multi_rings != 0 && p->multi_rings != 1) {
2064 		cxgb_printf(dip, CE_NOTE,
2065 			   "multi-rings: using value 1 instead of %d", p->multi_rings);
2066 		p->multi_rings = 1;
2067 	}
2068 
2069 	(void) ddi_prop_update_int(dev, dip, "multi-rings", p->multi_rings);
2070 
2071 	return (0);
2072 }
2073 
2074 static int
2075 remove_extra_props(struct adapter *sc, int n10g, int n1g)
2076 {
2077 	if (n10g == 0) {
2078 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-ntxq-10G-port");
2079 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-nrxq-10G-port");
2080 		(void) ddi_prop_remove(sc->dev, sc->dip,
2081 		    "holdoff-timer-idx-10G");
2082 		(void) ddi_prop_remove(sc->dev, sc->dip,
2083 		    "holdoff-pktc-idx-10G");
2084 	}
2085 
2086 	if (n1g == 0) {
2087 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-ntxq-1G-port");
2088 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-nrxq-1G-port");
2089 		(void) ddi_prop_remove(sc->dev, sc->dip,
2090 		    "holdoff-timer-idx-1G");
2091 		(void) ddi_prop_remove(sc->dev, sc->dip, "holdoff-pktc-idx-1G");
2092 	}
2093 
2094 	return (0);
2095 }
2096 
2097 static int
2098 cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g,
2099     struct intrs_and_queues *iaq)
2100 {
2101 	struct driver_properties *p = &sc->props;
2102 	int rc, itype, itypes, navail, nc, n;
2103 	int pfres_rxq, pfres_txq, pfresq;
2104 
2105 	bzero(iaq, sizeof (*iaq));
2106 	nc = ncpus;	/* our snapshot of the number of CPUs */
2107 	iaq->ntxq10g = min(nc, p->max_ntxq_10g);
2108 	iaq->ntxq1g = min(nc, p->max_ntxq_1g);
2109 	iaq->nrxq10g = min(nc, p->max_nrxq_10g);
2110 	iaq->nrxq1g = min(nc, p->max_nrxq_1g);
2111 #ifdef TCP_OFFLOAD_ENABLE
2112 	iaq->nofldtxq10g = min(nc, p->max_nofldtxq_10g);
2113 	iaq->nofldtxq1g = min(nc, p->max_nofldtxq_1g);
2114 	iaq->nofldrxq10g = min(nc, p->max_nofldrxq_10g);
2115 	iaq->nofldrxq1g = min(nc, p->max_nofldrxq_1g);
2116 #endif
2117 
2118 	pfres_rxq = iaq->nrxq10g * n10g + iaq->nrxq1g * n1g;
2119 	pfres_txq = iaq->ntxq10g * n10g + iaq->ntxq1g * n1g;
2120 #ifdef TCP_OFFLOAD_ENABLE
2121 	pfres_rxq += iaq->nofldrxq10g * n10g + iaq->nofldrxq1g * n1g;
2122 	pfres_txq += iaq->nofldtxq10g * n10g + iaq->nofldtxq1g * n1g;
2123 #endif
2124 
2125 	/* If current configuration of max number of Rxqs and Txqs exceed
2126 	 * the max available for all the ports under this PF, then shrink
2127 	 * the queues to max available. Reduce them in a way that each
2128 	 * port under this PF has equally distributed number of queues.
2129 	 * Must guarantee at least 1 queue for each port for both NIC
2130 	 * and Offload queues.
2131 	 *
2132 	 * neq - fixed max number of Egress queues on Tx path and Free List
2133 	 * queues that hold Rx payload data on Rx path. Half are reserved
2134 	 * for Egress queues and the other half for Free List queues.
2135 	 * Hence, the division by 2.
2136 	 *
2137 	 * niqflint - max number of Ingress queues with interrupts on Rx
2138 	 * path to receive completions that indicate Rx payload has been
2139 	 * posted in its associated Free List queue. Also handles Tx
2140 	 * completions for packets successfully transmitted on Tx path.
2141 	 *
2142 	 * nethctrl - max number of Egress queues only for Tx path. This
2143 	 * number is usually half of neq. However, if it became less than
2144 	 * neq due to lack of resources based on firmware configuration,
2145 	 * then take the lower value.
2146 	 */
2147 	while (pfres_rxq >
2148 	       min(sc->params.pfres.neq / 2, sc->params.pfres.niqflint)) {
2149 		pfresq = pfres_rxq;
2150 
2151 		if (iaq->nrxq10g > 1) {
2152 			iaq->nrxq10g--;
2153 			pfres_rxq -= n10g;
2154 		}
2155 
2156 		if (iaq->nrxq1g > 1) {
2157 			iaq->nrxq1g--;
2158 			pfres_rxq -= n1g;
2159 		}
2160 
2161 #ifdef TCP_OFFLOAD_ENABLE
2162 		if (iaq->nofldrxq10g > 1) {
2163 			iaq->nofldrxq10g--;
2164 			pfres_rxq -= n10g;
2165 		}
2166 
2167 		if (iaq->nofldrxq1g > 1) {
2168 			iaq->nofldrxq1g--;
2169 			pfres_rxq -= n1g;
2170 		}
2171 #endif
2172 
2173 		/* Break if nothing changed */
2174 		if (pfresq == pfres_rxq)
2175 			break;
2176 	}
2177 
2178 	while (pfres_txq >
2179 	       min(sc->params.pfres.neq / 2, sc->params.pfres.nethctrl)) {
2180 		pfresq = pfres_txq;
2181 
2182 		if (iaq->ntxq10g > 1) {
2183 			iaq->ntxq10g--;
2184 			pfres_txq -= n10g;
2185 		}
2186 
2187 		if (iaq->ntxq1g > 1) {
2188 			iaq->ntxq1g--;
2189 			pfres_txq -= n1g;
2190 		}
2191 
2192 #ifdef TCP_OFFLOAD_ENABLE
2193 		if (iaq->nofldtxq10g > 1) {
2194 			iaq->nofldtxq10g--;
2195 			pfres_txq -= n10g;
2196 		}
2197 
2198 		if (iaq->nofldtxq1g > 1) {
2199 			iaq->nofldtxq1g--;
2200 			pfres_txq -= n1g;
2201 		}
2202 #endif
2203 
2204 		/* Break if nothing changed */
2205 		if (pfresq == pfres_txq)
2206 			break;
2207 	}
2208 
2209 	rc = ddi_intr_get_supported_types(sc->dip, &itypes);
2210 	if (rc != DDI_SUCCESS) {
2211 		cxgb_printf(sc->dip, CE_WARN,
2212 		    "failed to determine supported interrupt types: %d", rc);
2213 		return (rc);
2214 	}
2215 
2216 	for (itype = DDI_INTR_TYPE_MSIX; itype; itype >>= 1) {
2217 		ASSERT(itype == DDI_INTR_TYPE_MSIX ||
2218 		    itype == DDI_INTR_TYPE_MSI ||
2219 		    itype == DDI_INTR_TYPE_FIXED);
2220 
2221 		if ((itype & itypes & p->intr_types) == 0)
2222 			continue;	/* not supported or not allowed */
2223 
2224 		navail = 0;
2225 		rc = ddi_intr_get_navail(sc->dip, itype, &navail);
2226 		if (rc != DDI_SUCCESS || navail == 0) {
2227 			cxgb_printf(sc->dip, CE_WARN,
2228 			    "failed to get # of interrupts for type %d: %d",
2229 			    itype, rc);
2230 			continue;	/* carry on */
2231 		}
2232 
2233 		iaq->intr_type = itype;
2234 		if (navail == 0)
2235 			continue;
2236 
2237 		/*
2238 		 * Best option: an interrupt vector for errors, one for the
2239 		 * firmware event queue, and one each for each rxq (NIC as well
2240 		 * as offload).
2241 		 */
2242 		iaq->nirq = T4_EXTRA_INTR;
2243 		iaq->nirq += n10g * iaq->nrxq10g;
2244 		iaq->nirq += n1g * iaq->nrxq1g;
2245 #ifdef TCP_OFFLOAD_ENABLE
2246 		iaq->nirq += n10g * iaq->nofldrxq10g;
2247 		iaq->nirq += n1g * iaq->nofldrxq1g;
2248 #endif
2249 
2250 		if (iaq->nirq <= navail &&
2251 		    (itype != DDI_INTR_TYPE_MSI || ISP2(iaq->nirq))) {
2252 			iaq->intr_fwd = 0;
2253 			goto allocate;
2254 		}
2255 
2256 		/*
2257 		 * Second best option: an interrupt vector for errors, one for
2258 		 * the firmware event queue, and one each for either NIC or
2259 		 * offload rxq's.
2260 		 */
2261 		iaq->nirq = T4_EXTRA_INTR;
2262 #ifdef TCP_OFFLOAD_ENABLE
2263 		iaq->nirq += n10g * max(iaq->nrxq10g, iaq->nofldrxq10g);
2264 		iaq->nirq += n1g * max(iaq->nrxq1g, iaq->nofldrxq1g);
2265 #else
2266 		iaq->nirq += n10g * iaq->nrxq10g;
2267 		iaq->nirq += n1g * iaq->nrxq1g;
2268 #endif
2269 		if (iaq->nirq <= navail &&
2270 		    (itype != DDI_INTR_TYPE_MSI || ISP2(iaq->nirq))) {
2271 			iaq->intr_fwd = 1;
2272 			goto allocate;
2273 		}
2274 
2275 		/*
2276 		 * Next best option: an interrupt vector for errors, one for the
2277 		 * firmware event queue, and at least one per port.  At this
2278 		 * point we know we'll have to downsize nrxq or nofldrxq to fit
2279 		 * what's available to us.
2280 		 */
2281 		iaq->nirq = T4_EXTRA_INTR;
2282 		iaq->nirq += n10g + n1g;
2283 		if (iaq->nirq <= navail) {
2284 			int leftover = navail - iaq->nirq;
2285 
2286 			if (n10g > 0) {
2287 				int target = iaq->nrxq10g;
2288 
2289 #ifdef TCP_OFFLOAD_ENABLE
2290 				target = max(target, iaq->nofldrxq10g);
2291 #endif
2292 				n = 1;
2293 				while (n < target && leftover >= n10g) {
2294 					leftover -= n10g;
2295 					iaq->nirq += n10g;
2296 					n++;
2297 				}
2298 				iaq->nrxq10g = min(n, iaq->nrxq10g);
2299 #ifdef TCP_OFFLOAD_ENABLE
2300 				iaq->nofldrxq10g = min(n, iaq->nofldrxq10g);
2301 #endif
2302 			}
2303 
2304 			if (n1g > 0) {
2305 				int target = iaq->nrxq1g;
2306 
2307 #ifdef TCP_OFFLOAD_ENABLE
2308 				target = max(target, iaq->nofldrxq1g);
2309 #endif
2310 				n = 1;
2311 				while (n < target && leftover >= n1g) {
2312 					leftover -= n1g;
2313 					iaq->nirq += n1g;
2314 					n++;
2315 				}
2316 				iaq->nrxq1g = min(n, iaq->nrxq1g);
2317 #ifdef TCP_OFFLOAD_ENABLE
2318 				iaq->nofldrxq1g = min(n, iaq->nofldrxq1g);
2319 #endif
2320 			}
2321 
2322 			/* We have arrived at a minimum value required to enable
2323 			 * per queue irq(either NIC or offload). Thus for non-
2324 			 * offload case, we will get a vector per queue, while
2325 			 * offload case, we will get a vector per offload/NIC q.
2326 			 * Hence enable Interrupt forwarding only for offload
2327 			 * case.
2328 			 */
2329 #ifdef TCP_OFFLOAD_ENABLE
2330 			if (itype != DDI_INTR_TYPE_MSI || ISP2(iaq->nirq)) {
2331 				iaq->intr_fwd = 1;
2332 #else
2333 			if (itype != DDI_INTR_TYPE_MSI) {
2334 #endif
2335 				goto allocate;
2336 			}
2337 		}
2338 
2339 		/*
2340 		 * Least desirable option: one interrupt vector for everything.
2341 		 */
2342 		iaq->nirq = iaq->nrxq10g = iaq->nrxq1g = 1;
2343 #ifdef TCP_OFFLOAD_ENABLE
2344 		iaq->nofldrxq10g = iaq->nofldrxq1g = 1;
2345 #endif
2346 		iaq->intr_fwd = 1;
2347 
2348 allocate:
2349 		return (0);
2350 	}
2351 
2352 	cxgb_printf(sc->dip, CE_WARN,
2353 	    "failed to find a usable interrupt type.  supported=%d, allowed=%d",
2354 	    itypes, p->intr_types);
2355 	return (DDI_FAILURE);
2356 }
2357 
2358 static int
2359 add_child_node(struct adapter *sc, int idx)
2360 {
2361 	int rc;
2362 	struct port_info *pi;
2363 
2364 	if (idx < 0 || idx >= sc->params.nports)
2365 		return (EINVAL);
2366 
2367 	pi = sc->port[idx];
2368 	if (pi == NULL)
2369 		return (ENODEV);	/* t4_port_init failed earlier */
2370 
2371 	PORT_LOCK(pi);
2372 	if (pi->dip != NULL) {
2373 		rc = 0;		/* EEXIST really, but then bus_config fails */
2374 		goto done;
2375 	}
2376 
2377 	rc = ndi_devi_alloc(sc->dip, T4_PORT_NAME, DEVI_SID_NODEID, &pi->dip);
2378 	if (rc != DDI_SUCCESS || pi->dip == NULL) {
2379 		rc = ENOMEM;
2380 		goto done;
2381 	}
2382 
2383 	(void) ddi_set_parent_data(pi->dip, pi);
2384 	(void) ndi_devi_bind_driver(pi->dip, 0);
2385 	rc = 0;
2386 done:
2387 	PORT_UNLOCK(pi);
2388 	return (rc);
2389 }
2390 
2391 static int
2392 remove_child_node(struct adapter *sc, int idx)
2393 {
2394 	int rc;
2395 	struct port_info *pi;
2396 
2397 	if (idx < 0 || idx >= sc->params.nports)
2398 		return (EINVAL);
2399 
2400 	pi = sc->port[idx];
2401 	if (pi == NULL)
2402 		return (ENODEV);
2403 
2404 	PORT_LOCK(pi);
2405 	if (pi->dip == NULL) {
2406 		rc = ENODEV;
2407 		goto done;
2408 	}
2409 
2410 	rc = ndi_devi_free(pi->dip);
2411 	if (rc == 0)
2412 		pi->dip = NULL;
2413 done:
2414 	PORT_UNLOCK(pi);
2415 	return (rc);
2416 }
2417 
2418 static char *
2419 print_port_speed(const struct port_info *pi)
2420 {
2421 	if (!pi)
2422 		return "-";
2423 
2424 	if (is_100G_port(pi))
2425 		return "100G";
2426 	else if (is_50G_port(pi))
2427 		return "50G";
2428 	else if (is_40G_port(pi))
2429 		return "40G";
2430 	else if (is_25G_port(pi))
2431 		return "25G";
2432 	else if (is_10G_port(pi))
2433 		return "10G";
2434 	else
2435 		return "1G";
2436 }
2437 
2438 #define	KS_UINIT(x)	kstat_named_init(&kstatp->x, #x, KSTAT_DATA_ULONG)
2439 #define	KS_CINIT(x)	kstat_named_init(&kstatp->x, #x, KSTAT_DATA_CHAR)
2440 #define	KS_U_SET(x, y)	kstatp->x.value.ul = (y)
2441 #define	KS_C_SET(x, ...)	\
2442 			(void) snprintf(kstatp->x.value.c, 16,  __VA_ARGS__)
2443 
2444 /*
2445  * t4nex:X:config
2446  */
2447 struct t4_kstats {
2448 	kstat_named_t chip_ver;
2449 	kstat_named_t fw_vers;
2450 	kstat_named_t tp_vers;
2451 	kstat_named_t driver_version;
2452 	kstat_named_t serial_number;
2453 	kstat_named_t ec_level;
2454 	kstat_named_t id;
2455 	kstat_named_t bus_type;
2456 	kstat_named_t bus_width;
2457 	kstat_named_t bus_speed;
2458 	kstat_named_t core_clock;
2459 	kstat_named_t port_cnt;
2460 	kstat_named_t port_type;
2461 	kstat_named_t pci_vendor_id;
2462 	kstat_named_t pci_device_id;
2463 };
2464 static kstat_t *
2465 setup_kstats(struct adapter *sc)
2466 {
2467 	kstat_t *ksp;
2468 	struct t4_kstats *kstatp;
2469 	int ndata;
2470 	struct pci_params *p = &sc->params.pci;
2471 	struct vpd_params *v = &sc->params.vpd;
2472 	uint16_t pci_vendor, pci_device;
2473 
2474 	ndata = sizeof (struct t4_kstats) / sizeof (kstat_named_t);
2475 
2476 	ksp = kstat_create(T4_NEXUS_NAME, ddi_get_instance(sc->dip), "config",
2477 	    "nexus", KSTAT_TYPE_NAMED, ndata, 0);
2478 	if (ksp == NULL) {
2479 		cxgb_printf(sc->dip, CE_WARN, "failed to initialize kstats.");
2480 		return (NULL);
2481 	}
2482 
2483 	kstatp = (struct t4_kstats *)ksp->ks_data;
2484 
2485 	KS_UINIT(chip_ver);
2486 	KS_CINIT(fw_vers);
2487 	KS_CINIT(tp_vers);
2488 	KS_CINIT(driver_version);
2489 	KS_CINIT(serial_number);
2490 	KS_CINIT(ec_level);
2491 	KS_CINIT(id);
2492 	KS_CINIT(bus_type);
2493 	KS_CINIT(bus_width);
2494 	KS_CINIT(bus_speed);
2495 	KS_UINIT(core_clock);
2496 	KS_UINIT(port_cnt);
2497 	KS_CINIT(port_type);
2498 	KS_CINIT(pci_vendor_id);
2499 	KS_CINIT(pci_device_id);
2500 
2501 	KS_U_SET(chip_ver, sc->params.chip);
2502 	KS_C_SET(fw_vers, "%d.%d.%d.%d",
2503 	    G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers),
2504 	    G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers),
2505 	    G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers),
2506 	    G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers));
2507 	KS_C_SET(tp_vers, "%d.%d.%d.%d",
2508 	    G_FW_HDR_FW_VER_MAJOR(sc->params.tp_vers),
2509 	    G_FW_HDR_FW_VER_MINOR(sc->params.tp_vers),
2510 	    G_FW_HDR_FW_VER_MICRO(sc->params.tp_vers),
2511 	    G_FW_HDR_FW_VER_BUILD(sc->params.tp_vers));
2512 	KS_C_SET(driver_version, DRV_VERSION);
2513 	KS_C_SET(serial_number, "%s", v->sn);
2514 	KS_C_SET(ec_level, "%s", v->ec);
2515 	KS_C_SET(id, "%s", v->id);
2516 	KS_C_SET(bus_type, "pci-express");
2517 	KS_C_SET(bus_width, "x%d lanes", p->width);
2518 	KS_C_SET(bus_speed, "%d", p->speed);
2519 	KS_U_SET(core_clock, v->cclk);
2520 	KS_U_SET(port_cnt, sc->params.nports);
2521 
2522 	t4_os_pci_read_cfg2(sc, PCI_CONF_VENID, &pci_vendor);
2523 	KS_C_SET(pci_vendor_id, "0x%x", pci_vendor);
2524 
2525 	t4_os_pci_read_cfg2(sc, PCI_CONF_DEVID, &pci_device);
2526 	KS_C_SET(pci_device_id, "0x%x", pci_device);
2527 
2528 	KS_C_SET(port_type, "%s/%s/%s/%s",
2529 		 print_port_speed(sc->port[0]),
2530 		 print_port_speed(sc->port[1]),
2531 		 print_port_speed(sc->port[2]),
2532 		 print_port_speed(sc->port[3]));
2533 
2534 	/* Do NOT set ksp->ks_update.  These kstats do not change. */
2535 
2536 	/* Install the kstat */
2537 	ksp->ks_private = (void *)sc;
2538 	kstat_install(ksp);
2539 
2540 	return (ksp);
2541 }
2542 
2543 /*
2544  * t4nex:X:stat
2545  */
2546 struct t4_wc_kstats {
2547 	kstat_named_t write_coal_success;
2548 	kstat_named_t write_coal_failure;
2549 };
2550 static kstat_t *
2551 setup_wc_kstats(struct adapter *sc)
2552 {
2553 	kstat_t *ksp;
2554 	struct t4_wc_kstats *kstatp;
2555 	int ndata;
2556 
2557 	ndata = sizeof(struct t4_wc_kstats) / sizeof(kstat_named_t);
2558 	ksp = kstat_create(T4_NEXUS_NAME, ddi_get_instance(sc->dip), "stats",
2559 	    "nexus", KSTAT_TYPE_NAMED, ndata, 0);
2560 	if (ksp == NULL) {
2561 		cxgb_printf(sc->dip, CE_WARN, "failed to initialize kstats.");
2562 		return (NULL);
2563 	}
2564 
2565 	kstatp = (struct t4_wc_kstats *)ksp->ks_data;
2566 
2567 	KS_UINIT(write_coal_success);
2568 	KS_UINIT(write_coal_failure);
2569 
2570 	ksp->ks_update = update_wc_kstats;
2571 	/* Install the kstat */
2572 	ksp->ks_private = (void *)sc;
2573 	kstat_install(ksp);
2574 
2575 	return (ksp);
2576 }
2577 
2578 static int
2579 update_wc_kstats(kstat_t *ksp, int rw)
2580 {
2581 	struct t4_wc_kstats *kstatp = (struct t4_wc_kstats *)ksp->ks_data;
2582 	struct adapter *sc = ksp->ks_private;
2583 	uint32_t wc_total, wc_success, wc_failure;
2584 
2585 	if (rw == KSTAT_WRITE)
2586 		return (0);
2587 
2588 	if (is_t5(sc->params.chip)) {
2589 		wc_total = t4_read_reg(sc, A_SGE_STAT_TOTAL);
2590 		wc_failure = t4_read_reg(sc, A_SGE_STAT_MATCH);
2591 		wc_success = wc_total - wc_failure;
2592 	} else {
2593 		wc_success = 0;
2594 		wc_failure = 0;
2595 	}
2596 
2597 	KS_U_SET(write_coal_success, wc_success);
2598 	KS_U_SET(write_coal_failure, wc_failure);
2599 
2600 	return (0);
2601 }
2602 
2603 int
2604 adapter_full_init(struct adapter *sc)
2605 {
2606 	int i, rc = 0;
2607 
2608 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
2609 
2610 	rc = t4_setup_adapter_queues(sc);
2611 	if (rc != 0)
2612 		goto done;
2613 
2614 	if (sc->intr_cap & DDI_INTR_FLAG_BLOCK)
2615 		(void) ddi_intr_block_enable(sc->intr_handle, sc->intr_count);
2616 	else {
2617 		for (i = 0; i < sc->intr_count; i++)
2618 			(void) ddi_intr_enable(sc->intr_handle[i]);
2619 	}
2620 	t4_intr_enable(sc);
2621 	sc->flags |= FULL_INIT_DONE;
2622 
2623 #ifdef TCP_OFFLOAD_ENABLE
2624 	/* TODO: wrong place to enable TOE capability */
2625 	if (is_offload(sc) != 0) {
2626 		for_each_port(sc, i) {
2627 			struct port_info *pi = sc->port[i];
2628 			rc = toe_capability(pi, 1);
2629 			if (rc != 0) {
2630 				cxgb_printf(pi->dip, CE_WARN,
2631 				    "Failed to activate toe capability: %d",
2632 				    rc);
2633 				rc = 0;		/* not a fatal error */
2634 			}
2635 		}
2636 	}
2637 #endif
2638 
2639 done:
2640 	if (rc != 0)
2641 		(void) adapter_full_uninit(sc);
2642 
2643 	return (rc);
2644 }
2645 
2646 int
2647 adapter_full_uninit(struct adapter *sc)
2648 {
2649 	int i, rc = 0;
2650 
2651 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
2652 
2653 	if (sc->intr_cap & DDI_INTR_FLAG_BLOCK)
2654 		(void) ddi_intr_block_disable(sc->intr_handle, sc->intr_count);
2655 	else {
2656 		for (i = 0; i < sc->intr_count; i++)
2657 			(void) ddi_intr_disable(sc->intr_handle[i]);
2658 	}
2659 
2660 	rc = t4_teardown_adapter_queues(sc);
2661 	if (rc != 0)
2662 		return (rc);
2663 
2664 	sc->flags &= ~FULL_INIT_DONE;
2665 
2666 	return (0);
2667 }
2668 
2669 int
2670 port_full_init(struct port_info *pi)
2671 {
2672 	struct adapter *sc = pi->adapter;
2673 	uint16_t *rss;
2674 	struct sge_rxq *rxq;
2675 	int rc, i;
2676 
2677 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
2678 	ASSERT((pi->flags & PORT_INIT_DONE) == 0);
2679 
2680 	/*
2681 	 * Allocate tx/rx/fl queues for this port.
2682 	 */
2683 	rc = t4_setup_port_queues(pi);
2684 	if (rc != 0)
2685 		goto done;	/* error message displayed already */
2686 
2687 	/*
2688 	 * Setup RSS for this port.
2689 	 */
2690 	rss = kmem_zalloc(pi->nrxq * sizeof (*rss), KM_SLEEP);
2691 	for_each_rxq(pi, i, rxq) {
2692 		rss[i] = rxq->iq.abs_id;
2693 	}
2694 	rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0,
2695 	    pi->rss_size, rss, pi->nrxq);
2696 	kmem_free(rss, pi->nrxq * sizeof (*rss));
2697 	if (rc != 0) {
2698 		cxgb_printf(pi->dip, CE_WARN, "rss_config failed: %d", rc);
2699 		goto done;
2700 	}
2701 
2702 	pi->flags |= PORT_INIT_DONE;
2703 done:
2704 	if (rc != 0)
2705 		(void) port_full_uninit(pi);
2706 
2707 	return (rc);
2708 }
2709 
2710 /*
2711  * Idempotent.
2712  */
2713 int
2714 port_full_uninit(struct port_info *pi)
2715 {
2716 
2717 	ASSERT(pi->flags & PORT_INIT_DONE);
2718 
2719 	(void) t4_teardown_port_queues(pi);
2720 	pi->flags &= ~PORT_INIT_DONE;
2721 
2722 	return (0);
2723 }
2724 
2725 void
2726 enable_port_queues(struct port_info *pi)
2727 {
2728 	struct adapter *sc = pi->adapter;
2729 	int i;
2730 	struct sge_iq *iq;
2731 	struct sge_rxq *rxq;
2732 #ifdef TCP_OFFLOAD_ENABLE
2733 	struct sge_ofld_rxq *ofld_rxq;
2734 #endif
2735 
2736 	ASSERT(pi->flags & PORT_INIT_DONE);
2737 
2738 	/*
2739 	 * TODO: whatever was queued up after we set iq->state to IQS_DISABLED
2740 	 * back in disable_port_queues will be processed now, after an unbounded
2741 	 * delay.  This can't be good.
2742 	 */
2743 
2744 #ifdef TCP_OFFLOAD_ENABLE
2745 	for_each_ofld_rxq(pi, i, ofld_rxq) {
2746 		iq = &ofld_rxq->iq;
2747 		if (atomic_cas_uint(&iq->state, IQS_DISABLED, IQS_IDLE) !=
2748 		    IQS_DISABLED)
2749 			panic("%s: iq %p wasn't disabled", __func__,
2750 			    (void *)iq);
2751 		t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
2752 		    V_SEINTARM(iq->intr_params) | V_INGRESSQID(iq->cntxt_id));
2753 	}
2754 #endif
2755 
2756 	for_each_rxq(pi, i, rxq) {
2757 		iq = &rxq->iq;
2758 		if (atomic_cas_uint(&iq->state, IQS_DISABLED, IQS_IDLE) !=
2759 		    IQS_DISABLED)
2760 			panic("%s: iq %p wasn't disabled", __func__,
2761 			    (void *) iq);
2762 		t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
2763 		    V_SEINTARM(iq->intr_params) | V_INGRESSQID(iq->cntxt_id));
2764 	}
2765 }
2766 
2767 void
2768 disable_port_queues(struct port_info *pi)
2769 {
2770 	int i;
2771 	struct adapter *sc = pi->adapter;
2772 	struct sge_rxq *rxq;
2773 #ifdef TCP_OFFLOAD_ENABLE
2774 	struct sge_ofld_rxq *ofld_rxq;
2775 #endif
2776 
2777 	ASSERT(pi->flags & PORT_INIT_DONE);
2778 
2779 	/*
2780 	 * TODO: need proper implementation for all tx queues (ctrl, eth, ofld).
2781 	 */
2782 
2783 #ifdef TCP_OFFLOAD_ENABLE
2784 	for_each_ofld_rxq(pi, i, ofld_rxq) {
2785 		while (atomic_cas_uint(&ofld_rxq->iq.state, IQS_IDLE,
2786 		    IQS_DISABLED) != IQS_IDLE)
2787 			msleep(1);
2788 	}
2789 #endif
2790 
2791 	for_each_rxq(pi, i, rxq) {
2792 		while (atomic_cas_uint(&rxq->iq.state, IQS_IDLE,
2793 		    IQS_DISABLED) != IQS_IDLE)
2794 			msleep(1);
2795 	}
2796 
2797 	mutex_enter(&sc->sfl_lock);
2798 #ifdef TCP_OFFLOAD_ENABLE
2799 	for_each_ofld_rxq(pi, i, ofld_rxq)
2800 	    ofld_rxq->fl.flags |= FL_DOOMED;
2801 #endif
2802 	for_each_rxq(pi, i, rxq)
2803 	    rxq->fl.flags |= FL_DOOMED;
2804 	mutex_exit(&sc->sfl_lock);
2805 	/* TODO: need to wait for all fl's to be removed from sc->sfl */
2806 }
2807 
2808 void
2809 t4_fatal_err(struct adapter *sc)
2810 {
2811 	t4_set_reg_field(sc, A_SGE_CONTROL, F_GLOBALENABLE, 0);
2812 	t4_intr_disable(sc);
2813 	cxgb_printf(sc->dip, CE_WARN,
2814 	    "encountered fatal error, adapter stopped.");
2815 }
2816 
2817 int
2818 t4_os_find_pci_capability(struct adapter *sc, int cap)
2819 {
2820 	uint16_t stat;
2821 	uint8_t cap_ptr, cap_id;
2822 
2823 	t4_os_pci_read_cfg2(sc, PCI_CONF_STAT, &stat);
2824 	if ((stat & PCI_STAT_CAP) == 0)
2825 		return (0); /* does not implement capabilities */
2826 
2827 	t4_os_pci_read_cfg1(sc, PCI_CONF_CAP_PTR, &cap_ptr);
2828 	while (cap_ptr) {
2829 		t4_os_pci_read_cfg1(sc, cap_ptr + PCI_CAP_ID, &cap_id);
2830 		if (cap_id == cap)
2831 			return (cap_ptr); /* found */
2832 		t4_os_pci_read_cfg1(sc, cap_ptr + PCI_CAP_NEXT_PTR, &cap_ptr);
2833 	}
2834 
2835 	return (0); /* not found */
2836 }
2837 
2838 void
2839 t4_os_portmod_changed(struct adapter *sc, int idx)
2840 {
2841 	static const char *mod_str[] = {
2842 		NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM"
2843 	};
2844 	struct port_info *pi = sc->port[idx];
2845 
2846 	if (pi->mod_type == FW_PORT_MOD_TYPE_NONE)
2847 		cxgb_printf(pi->dip, CE_NOTE, "transceiver unplugged.");
2848 	else if (pi->mod_type == FW_PORT_MOD_TYPE_UNKNOWN)
2849 		cxgb_printf(pi->dip, CE_NOTE,
2850 		    "unknown transceiver inserted.\n");
2851 	else if (pi->mod_type == FW_PORT_MOD_TYPE_NOTSUPPORTED)
2852 		cxgb_printf(pi->dip, CE_NOTE,
2853 		    "unsupported transceiver inserted.\n");
2854 	else if (pi->mod_type > 0 && pi->mod_type < ARRAY_SIZE(mod_str))
2855 		cxgb_printf(pi->dip, CE_NOTE, "%s transceiver inserted.\n",
2856 		    mod_str[pi->mod_type]);
2857 	else
2858 		cxgb_printf(pi->dip, CE_NOTE, "transceiver (type %d) inserted.",
2859 		    pi->mod_type);
2860 
2861 	if ((isset(&sc->open_device_map, pi->port_id) != 0) &&
2862 	    pi->link_cfg.new_module)
2863 		pi->link_cfg.redo_l1cfg = true;
2864 }
2865 
2866 /* ARGSUSED */
2867 static int
2868 cpl_not_handled(struct sge_iq *iq, const struct rss_header *rss, mblk_t *m)
2869 {
2870 	if (m != NULL)
2871 		freemsg(m);
2872 	return (0);
2873 }
2874 
2875 int
2876 t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h)
2877 {
2878 	uint_t *loc, new;
2879 
2880 	if (opcode >= ARRAY_SIZE(sc->cpl_handler))
2881 		return (EINVAL);
2882 
2883 	new = (uint_t)(unsigned long) (h ? h : cpl_not_handled);
2884 	loc = (uint_t *)&sc->cpl_handler[opcode];
2885 	(void) atomic_swap_uint(loc, new);
2886 
2887 	return (0);
2888 }
2889 
2890 static int
2891 fw_msg_not_handled(struct adapter *sc, const __be64 *data)
2892 {
2893 	struct cpl_fw6_msg *cpl;
2894 
2895 	cpl = __containerof((void *)data, struct cpl_fw6_msg, data);
2896 
2897 	cxgb_printf(sc->dip, CE_WARN, "%s fw_msg type %d", __func__, cpl->type);
2898 	return (0);
2899 }
2900 
2901 int
2902 t4_register_fw_msg_handler(struct adapter *sc, int type, fw_msg_handler_t h)
2903 {
2904 	fw_msg_handler_t *loc, new;
2905 
2906 	if (type >= ARRAY_SIZE(sc->fw_msg_handler))
2907 		return (EINVAL);
2908 
2909 	/*
2910 	 * These are dispatched by the handler for FW{4|6}_CPL_MSG using the CPL
2911 	 * handler dispatch table.  Reject any attempt to install a handler for
2912 	 * this subtype.
2913 	 */
2914 	if (type == FW_TYPE_RSSCPL || type == FW6_TYPE_RSSCPL)
2915 		return (EINVAL);
2916 
2917 	new = h ? h : fw_msg_not_handled;
2918 	loc = &sc->fw_msg_handler[type];
2919 	(void)atomic_swap_ptr(loc, (void *)new);
2920 
2921 	return (0);
2922 }
2923 
2924 #ifdef TCP_OFFLOAD_ENABLE
2925 static int
2926 toe_capability(struct port_info *pi, int enable)
2927 {
2928 	int rc;
2929 	struct adapter *sc = pi->adapter;
2930 
2931 	if (!is_offload(sc))
2932 		return (ENODEV);
2933 
2934 	if (enable != 0) {
2935 		if (isset(&sc->offload_map, pi->port_id) != 0)
2936 			return (0);
2937 
2938 		if (sc->offload_map == 0) {
2939 			rc = activate_uld(sc, ULD_TOM, &sc->tom);
2940 			if (rc != 0)
2941 				return (rc);
2942 		}
2943 
2944 		setbit(&sc->offload_map, pi->port_id);
2945 	} else {
2946 		if (!isset(&sc->offload_map, pi->port_id))
2947 			return (0);
2948 
2949 		clrbit(&sc->offload_map, pi->port_id);
2950 
2951 		if (sc->offload_map == 0) {
2952 			rc = deactivate_uld(&sc->tom);
2953 			if (rc != 0) {
2954 				setbit(&sc->offload_map, pi->port_id);
2955 				return (rc);
2956 			}
2957 		}
2958 	}
2959 
2960 	return (0);
2961 }
2962 
2963 /*
2964  * Add an upper layer driver to the global list.
2965  */
2966 int
2967 t4_register_uld(struct uld_info *ui)
2968 {
2969 	int rc = 0;
2970 	struct uld_info *u;
2971 
2972 	mutex_enter(&t4_uld_list_lock);
2973 	SLIST_FOREACH(u, &t4_uld_list, link) {
2974 		if (u->uld_id == ui->uld_id) {
2975 			rc = EEXIST;
2976 			goto done;
2977 		}
2978 	}
2979 
2980 	SLIST_INSERT_HEAD(&t4_uld_list, ui, link);
2981 	ui->refcount = 0;
2982 done:
2983 	mutex_exit(&t4_uld_list_lock);
2984 	return (rc);
2985 }
2986 
2987 int
2988 t4_unregister_uld(struct uld_info *ui)
2989 {
2990 	int rc = EINVAL;
2991 	struct uld_info *u;
2992 
2993 	mutex_enter(&t4_uld_list_lock);
2994 
2995 	SLIST_FOREACH(u, &t4_uld_list, link) {
2996 		if (u == ui) {
2997 			if (ui->refcount > 0) {
2998 				rc = EBUSY;
2999 				goto done;
3000 			}
3001 
3002 			SLIST_REMOVE(&t4_uld_list, ui, uld_info, link);
3003 			rc = 0;
3004 			goto done;
3005 		}
3006 	}
3007 done:
3008 	mutex_exit(&t4_uld_list_lock);
3009 	return (rc);
3010 }
3011 
3012 static int
3013 activate_uld(struct adapter *sc, int id, struct uld_softc *usc)
3014 {
3015 	int rc = EAGAIN;
3016 	struct uld_info *ui;
3017 
3018 	mutex_enter(&t4_uld_list_lock);
3019 
3020 	SLIST_FOREACH(ui, &t4_uld_list, link) {
3021 		if (ui->uld_id == id) {
3022 			rc = ui->attach(sc, &usc->softc);
3023 			if (rc == 0) {
3024 				ASSERT(usc->softc != NULL);
3025 				ui->refcount++;
3026 				usc->uld = ui;
3027 			}
3028 			goto done;
3029 		}
3030 	}
3031 done:
3032 	mutex_exit(&t4_uld_list_lock);
3033 
3034 	return (rc);
3035 }
3036 
3037 static int
3038 deactivate_uld(struct uld_softc *usc)
3039 {
3040 	int rc;
3041 
3042 	mutex_enter(&t4_uld_list_lock);
3043 
3044 	if (usc->uld == NULL || usc->softc == NULL) {
3045 		rc = EINVAL;
3046 		goto done;
3047 	}
3048 
3049 	rc = usc->uld->detach(usc->softc);
3050 	if (rc == 0) {
3051 		ASSERT(usc->uld->refcount > 0);
3052 		usc->uld->refcount--;
3053 		usc->uld = NULL;
3054 		usc->softc = NULL;
3055 	}
3056 done:
3057 	mutex_exit(&t4_uld_list_lock);
3058 
3059 	return (rc);
3060 }
3061 
3062 void
3063 t4_iterate(void (*func)(int, void *), void *arg)
3064 {
3065 	struct adapter *sc;
3066 
3067 	mutex_enter(&t4_adapter_list_lock);
3068 	SLIST_FOREACH(sc, &t4_adapter_list, link) {
3069 		/*
3070 		 * func should not make any assumptions about what state sc is
3071 		 * in - the only guarantee is that sc->sc_lock is a valid lock.
3072 		 */
3073 		func(ddi_get_instance(sc->dip), arg);
3074 	}
3075 	mutex_exit(&t4_adapter_list_lock);
3076 }
3077 
3078 #endif
3079 
3080 static int
3081 t4_sensor_read(struct adapter *sc, uint32_t diag, uint32_t *valp)
3082 {
3083 	int rc;
3084 	struct port_info *pi = sc->port[0];
3085 	uint32_t param, val;
3086 
3087 	rc = begin_synchronized_op(pi, 1, 1);
3088 	if (rc != 0) {
3089 		return (rc);
3090 	}
3091 	param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
3092 	    V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_DIAG) |
3093 	    V_FW_PARAMS_PARAM_Y(diag);
3094 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
3095 	end_synchronized_op(pi, 1);
3096 
3097 	if (rc != 0) {
3098 		return (rc);
3099 	}
3100 
3101 	if (val == 0) {
3102 		return (EIO);
3103 	}
3104 
3105 	*valp = val;
3106 	return (0);
3107 }
3108 
3109 static int
3110 t4_temperature_read(void *arg, sensor_ioctl_scalar_t *scalar)
3111 {
3112 	int ret;
3113 	struct adapter *sc = arg;
3114 	uint32_t val;
3115 
3116 	ret = t4_sensor_read(sc, FW_PARAM_DEV_DIAG_TMP, &val);
3117 	if (ret != 0) {
3118 		return (ret);
3119 	}
3120 
3121 	/*
3122 	 * The device measures temperature in units of 1 degree Celsius. We
3123 	 * don't know its precision.
3124 	 */
3125 	scalar->sis_unit = SENSOR_UNIT_CELSIUS;
3126 	scalar->sis_gran = 1;
3127 	scalar->sis_prec = 0;
3128 	scalar->sis_value = val;
3129 
3130 	return (0);
3131 }
3132 
3133 static int
3134 t4_voltage_read(void *arg, sensor_ioctl_scalar_t *scalar)
3135 {
3136 	int ret;
3137 	struct adapter *sc = arg;
3138 	uint32_t val;
3139 
3140 	ret = t4_sensor_read(sc, FW_PARAM_DEV_DIAG_VDD, &val);
3141 	if (ret != 0) {
3142 		return (ret);
3143 	}
3144 
3145 	scalar->sis_unit = SENSOR_UNIT_VOLTS;
3146 	scalar->sis_gran = 1000;
3147 	scalar->sis_prec = 0;
3148 	scalar->sis_value = val;
3149 
3150 	return (0);
3151 }
3152 
3153 /*
3154  * While the hardware supports the ability to read and write the flash image,
3155  * this is not currently wired up.
3156  */
3157 static int
3158 t4_ufm_getcaps(ddi_ufm_handle_t *ufmh, void *arg, ddi_ufm_cap_t *caps)
3159 {
3160 	*caps = DDI_UFM_CAP_REPORT;
3161 	return (0);
3162 }
3163 
3164 static int
3165 t4_ufm_fill_image(ddi_ufm_handle_t *ufmh, void *arg, uint_t imgno,
3166     ddi_ufm_image_t *imgp)
3167 {
3168 	if (imgno != 0) {
3169 		return (EINVAL);
3170 	}
3171 
3172 	ddi_ufm_image_set_desc(imgp, "Firmware");
3173 	ddi_ufm_image_set_nslots(imgp, 1);
3174 
3175 	return (0);
3176 }
3177 
3178 static int
3179 t4_ufm_fill_slot_version(nvlist_t *nvl, const char *key, uint32_t vers)
3180 {
3181 	char buf[128];
3182 
3183 	if (vers == 0) {
3184 		return (0);
3185 	}
3186 
3187 	if (snprintf(buf, sizeof (buf), "%u.%u.%u.%u",
3188 	    G_FW_HDR_FW_VER_MAJOR(vers), G_FW_HDR_FW_VER_MINOR(vers),
3189 	    G_FW_HDR_FW_VER_MICRO(vers), G_FW_HDR_FW_VER_BUILD(vers)) >=
3190 	    sizeof (buf)) {
3191 		return (EOVERFLOW);
3192 	}
3193 
3194 	return (nvlist_add_string(nvl, key, buf));
3195 }
3196 
3197 static int
3198 t4_ufm_fill_slot(ddi_ufm_handle_t *ufmh, void *arg, uint_t imgno, uint_t slotno,
3199     ddi_ufm_slot_t *slotp)
3200 {
3201 	int ret;
3202 	struct adapter *sc = arg;
3203 	nvlist_t *misc = NULL;
3204 	char buf[128];
3205 
3206 	if (imgno != 0 || slotno != 0) {
3207 		return (EINVAL);
3208 	}
3209 
3210 	if (snprintf(buf, sizeof (buf), "%u.%u.%u.%u",
3211 	    G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers),
3212 	    G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers),
3213 	    G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers),
3214 	    G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers)) >= sizeof (buf)) {
3215 		return (EOVERFLOW);
3216 	}
3217 
3218 	ddi_ufm_slot_set_version(slotp, buf);
3219 
3220 	(void) nvlist_alloc(&misc, NV_UNIQUE_NAME, KM_SLEEP);
3221 	if ((ret = t4_ufm_fill_slot_version(misc, "TP Microcode",
3222 	    sc->params.tp_vers)) != 0) {
3223 		goto err;
3224 	}
3225 
3226 	if ((ret = t4_ufm_fill_slot_version(misc, "Bootstrap",
3227 	    sc->params.bs_vers)) != 0) {
3228 		goto err;
3229 	}
3230 
3231 	if ((ret = t4_ufm_fill_slot_version(misc, "Expansion ROM",
3232 	    sc->params.er_vers)) != 0) {
3233 		goto err;
3234 	}
3235 
3236 	if ((ret = nvlist_add_uint32(misc, "Serial Configuration",
3237 	    sc->params.scfg_vers)) != 0) {
3238 		goto err;
3239 	}
3240 
3241 	if ((ret = nvlist_add_uint32(misc, "VPD Version",
3242 	    sc->params.vpd_vers)) != 0) {
3243 		goto err;
3244 	}
3245 
3246 	ddi_ufm_slot_set_misc(slotp, misc);
3247 	ddi_ufm_slot_set_attrs(slotp, DDI_UFM_ATTR_ACTIVE |
3248 	    DDI_UFM_ATTR_WRITEABLE | DDI_UFM_ATTR_READABLE);
3249 	return (0);
3250 
3251 err:
3252 	nvlist_free(misc);
3253 	return (ret);
3254 
3255 }
3256