xref: /illumos-gate/usr/src/uts/common/io/cxgbe/t4nex/t4_nexus.c (revision 67a4bb8f9ad4c49e9aa9e21e2114a7c093c3a73a)
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 
40 #include "version.h"
41 #include "common/common.h"
42 #include "common/t4_regs.h"
43 #include "firmware/t4_fw.h"
44 #include "firmware/t4_cfg.h"
45 #include "t4_l2t.h"
46 
47 static int t4_cb_open(dev_t *devp, int flag, int otyp, cred_t *credp);
48 static int t4_cb_close(dev_t dev, int flag, int otyp, cred_t *credp);
49 static int t4_cb_ioctl(dev_t dev, int cmd, intptr_t d, int mode, cred_t *credp,
50     int *rp);
51 struct cb_ops t4_cb_ops = {
52 	.cb_open =		t4_cb_open,
53 	.cb_close =		t4_cb_close,
54 	.cb_strategy =		nodev,
55 	.cb_print = 		nodev,
56 	.cb_dump =		nodev,
57 	.cb_read =		nodev,
58 	.cb_write =		nodev,
59 	.cb_ioctl =		t4_cb_ioctl,
60 	.cb_devmap =		nodev,
61 	.cb_mmap =		nodev,
62 	.cb_segmap =		nodev,
63 	.cb_chpoll =		nochpoll,
64 	.cb_prop_op =		ddi_prop_op,
65 	.cb_flag =		D_MP,
66 	.cb_rev =		CB_REV,
67 	.cb_aread =		nodev,
68 	.cb_awrite =		nodev
69 };
70 
71 static int t4_bus_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t op,
72     void *arg, void *result);
73 static int t4_bus_config(dev_info_t *dip, uint_t flags, ddi_bus_config_op_t op,
74     void *arg, dev_info_t **cdipp);
75 static int t4_bus_unconfig(dev_info_t *dip, uint_t flags,
76     ddi_bus_config_op_t op, void *arg);
77 struct bus_ops t4_bus_ops = {
78 	.busops_rev =		BUSO_REV,
79 	.bus_ctl =		t4_bus_ctl,
80 	.bus_prop_op =		ddi_bus_prop_op,
81 	.bus_config =		t4_bus_config,
82 	.bus_unconfig =		t4_bus_unconfig,
83 };
84 
85 static int t4_devo_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg,
86     void **rp);
87 static int t4_devo_probe(dev_info_t *dip);
88 static int t4_devo_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
89 static int t4_devo_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
90 static int t4_devo_quiesce(dev_info_t *dip);
91 struct dev_ops t4_dev_ops = {
92 	.devo_rev =		DEVO_REV,
93 	.devo_getinfo =		t4_devo_getinfo,
94 	.devo_identify =	nulldev,
95 	.devo_probe =		t4_devo_probe,
96 	.devo_attach =		t4_devo_attach,
97 	.devo_detach =		t4_devo_detach,
98 	.devo_reset =		nodev,
99 	.devo_cb_ops =		&t4_cb_ops,
100 	.devo_bus_ops =		&t4_bus_ops,
101 	.devo_quiesce =		&t4_devo_quiesce,
102 };
103 
104 static struct modldrv modldrv = {
105 	.drv_modops =		&mod_driverops,
106 	.drv_linkinfo =		"Chelsio T4 nexus " DRV_VERSION,
107 	.drv_dev_ops =		&t4_dev_ops
108 };
109 
110 static struct modlinkage modlinkage = {
111 	.ml_rev =		MODREV_1,
112 	.ml_linkage =		{&modldrv, NULL},
113 };
114 
115 void *t4_list;
116 
117 struct intrs_and_queues {
118 	int intr_type;		/* DDI_INTR_TYPE_* */
119 	int nirq;		/* Number of vectors */
120 	int intr_fwd;		/* Interrupts forwarded */
121 	int ntxq10g;		/* # of NIC txq's for each 10G port */
122 	int nrxq10g;		/* # of NIC rxq's for each 10G port */
123 	int ntxq1g;		/* # of NIC txq's for each 1G port */
124 	int nrxq1g;		/* # of NIC rxq's for each 1G port */
125 #ifndef TCP_OFFLOAD_DISABLE
126 	int nofldtxq10g;	/* # of TOE txq's for each 10G port */
127 	int nofldrxq10g;	/* # of TOE rxq's for each 10G port */
128 	int nofldtxq1g;		/* # of TOE txq's for each 1G port */
129 	int nofldrxq1g;		/* # of TOE rxq's for each 1G port */
130 #endif
131 };
132 
133 static int cpl_not_handled(struct sge_iq *iq, const struct rss_header *rss,
134     mblk_t *m);
135 int t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h);
136 static unsigned int getpf(struct adapter *sc);
137 static int prep_firmware(struct adapter *sc);
138 static int upload_config_file(struct adapter *sc, uint32_t *mt, uint32_t *ma);
139 static int partition_resources(struct adapter *sc);
140 static int get_params__pre_init(struct adapter *sc);
141 static int get_params__post_init(struct adapter *sc);
142 static void setup_memwin(struct adapter *sc);
143 static int prop_lookup_int_array(struct adapter *sc, char *name, int *data,
144     uint_t count);
145 static int prop_lookup_int_array(struct adapter *sc, char *name, int *data,
146     uint_t count);
147 static int init_driver_props(struct adapter *sc, struct driver_properties *p);
148 static int remove_extra_props(struct adapter *sc, int n10g, int n1g);
149 static int cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g,
150     struct intrs_and_queues *iaq);
151 static int add_child_node(struct adapter *sc, int idx);
152 static int remove_child_node(struct adapter *sc, int idx);
153 static kstat_t *setup_kstats(struct adapter *sc);
154 #ifndef TCP_OFFLOAD_DISABLE
155 static int toe_capability(struct port_info *pi, int enable);
156 static int activate_uld(struct adapter *sc, int id, struct uld_softc *usc);
157 static int deactivate_uld(struct uld_softc *usc);
158 #endif
159 static kmutex_t t4_adapter_list_lock;
160 static SLIST_HEAD(, adapter) t4_adapter_list;
161 #ifndef TCP_OFFLOAD_DISABLE
162 static kmutex_t t4_uld_list_lock;
163 static SLIST_HEAD(, uld_info) t4_uld_list;
164 #endif
165 
166 int
167 _init(void)
168 {
169 	int rc;
170 
171 	rc = ddi_soft_state_init(&t4_list, sizeof (struct adapter), 0);
172 	if (rc != 0)
173 		return (rc);
174 
175 	rc = mod_install(&modlinkage);
176 	if (rc != 0)
177 		ddi_soft_state_fini(&t4_list);
178 
179 	mutex_init(&t4_adapter_list_lock, NULL, MUTEX_DRIVER, NULL);
180 	SLIST_INIT(&t4_adapter_list);
181 
182 #ifndef TCP_OFFLOAD_DISABLE
183 	mutex_init(&t4_uld_list_lock, NULL, MUTEX_DRIVER, NULL);
184 	SLIST_INIT(&t4_uld_list);
185 #endif
186 
187 	return (rc);
188 }
189 
190 int
191 _fini(void)
192 {
193 	int rc;
194 
195 	rc = mod_remove(&modlinkage);
196 	if (rc != 0)
197 		return (rc);
198 
199 	ddi_soft_state_fini(&t4_list);
200 	return (0);
201 }
202 
203 int
204 _info(struct modinfo *mi)
205 {
206 	return (mod_info(&modlinkage, mi));
207 }
208 
209 /* ARGSUSED */
210 static int
211 t4_devo_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **rp)
212 {
213 	struct adapter *sc;
214 	minor_t minor;
215 
216 	minor = getminor((dev_t)arg);	/* same as instance# in our case */
217 
218 	if (cmd == DDI_INFO_DEVT2DEVINFO) {
219 		sc = ddi_get_soft_state(t4_list, minor);
220 		if (sc == NULL)
221 			return (DDI_FAILURE);
222 
223 		ASSERT(sc->dev == (dev_t)arg);
224 		*rp = (void *)sc->dip;
225 	} else if (cmd == DDI_INFO_DEVT2INSTANCE)
226 		*rp = (void *) (unsigned long) minor;
227 	else
228 		ASSERT(0);
229 
230 	return (DDI_SUCCESS);
231 }
232 
233 static int
234 t4_devo_probe(dev_info_t *dip)
235 {
236 	int rc, id, *reg;
237 	uint_t n, pf;
238 
239 	id = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
240 	    "device-id", 0xffff);
241 	if (id == 0xffff)
242 		return (DDI_PROBE_DONTCARE);
243 
244 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
245 	    "reg", &reg, &n);
246 	if (rc != DDI_SUCCESS)
247 		return (DDI_PROBE_DONTCARE);
248 
249 	pf = PCI_REG_FUNC_G(reg[0]);
250 	ddi_prop_free(reg);
251 
252 	/* Prevent driver attachment on any PF except 0 on the FPGA */
253 	if (id == 0xa000 && pf != 0)
254 		return (DDI_PROBE_FAILURE);
255 
256 	return (DDI_PROBE_DONTCARE);
257 }
258 
259 static int
260 t4_devo_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
261 {
262 	struct adapter *sc = NULL;
263 	struct sge *s;
264 	int i, instance, rc = DDI_SUCCESS, n10g, n1g, rqidx, tqidx, q;
265 	int irq = 0;
266 #ifndef TCP_OFFLOAD_DISABLE
267 	int ofld_rqidx, ofld_tqidx;
268 #endif
269 	char name[16];
270 	struct driver_properties *prp;
271 	struct intrs_and_queues iaq;
272 	ddi_device_acc_attr_t da = {
273 		.devacc_attr_version = DDI_DEVICE_ATTR_V0,
274 		.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC,
275 		.devacc_attr_dataorder = DDI_UNORDERED_OK_ACC
276 	};
277 
278 	if (cmd != DDI_ATTACH)
279 		return (DDI_FAILURE);
280 
281 	/*
282 	 * Allocate space for soft state.
283 	 */
284 	instance = ddi_get_instance(dip);
285 	rc = ddi_soft_state_zalloc(t4_list, instance);
286 	if (rc != DDI_SUCCESS) {
287 		cxgb_printf(dip, CE_WARN,
288 		    "failed to allocate soft state: %d", rc);
289 		return (DDI_FAILURE);
290 	}
291 
292 	sc = ddi_get_soft_state(t4_list, instance);
293 	sc->dip = dip;
294 	sc->dev = makedevice(ddi_driver_major(dip), instance);
295 	mutex_init(&sc->lock, NULL, MUTEX_DRIVER, NULL);
296 	cv_init(&sc->cv, NULL, CV_DRIVER, NULL);
297 	mutex_init(&sc->sfl_lock, NULL, MUTEX_DRIVER, NULL);
298 
299 	mutex_enter(&t4_adapter_list_lock);
300 	SLIST_INSERT_HEAD(&t4_adapter_list, sc, link);
301 	mutex_exit(&t4_adapter_list_lock);
302 
303 	sc->pf = getpf(sc);
304 	if (sc->pf > 8) {
305 		rc = EINVAL;
306 		cxgb_printf(dip, CE_WARN,
307 		    "failed to determine PCI PF# of device");
308 		goto done;
309 	}
310 	sc->mbox = sc->pf;
311 
312 	/*
313 	 * Enable access to the PCI config space.
314 	 */
315 	rc = pci_config_setup(dip, &sc->pci_regh);
316 	if (rc != DDI_SUCCESS) {
317 		cxgb_printf(dip, CE_WARN,
318 		    "failed to enable PCI config space access: %d", rc);
319 		goto done;
320 	}
321 
322 	/* TODO: Set max read request to 4K */
323 
324 	/*
325 	 * Enable MMIO access.
326 	 */
327 	rc = ddi_regs_map_setup(dip, 1, &sc->regp, 0, 0, &da, &sc->regh);
328 	if (rc != DDI_SUCCESS) {
329 		cxgb_printf(dip, CE_WARN,
330 		    "failed to map device registers: %d", rc);
331 		goto done;
332 	}
333 
334 	(void) memset(sc->chan_map, 0xff, sizeof (sc->chan_map));
335 
336 	/*
337 	 * Initialize cpl handler.
338 	 */
339 	for (i = 0; i < ARRAY_SIZE(sc->cpl_handler); i++) {
340 		sc->cpl_handler[i] = cpl_not_handled;
341 	}
342 
343 	/*
344 	 * Prepare the adapter for operation.
345 	 */
346 	rc = -t4_prep_adapter(sc);
347 	if (rc != 0) {
348 		cxgb_printf(dip, CE_WARN, "failed to prepare adapter: %d", rc);
349 		goto done;
350 	}
351 
352 	/*
353 	 * Do this really early.  Note that minor number = instance.
354 	 */
355 	(void) snprintf(name, sizeof (name), "%s,%d", T4_NEXUS_NAME, instance);
356 	rc = ddi_create_minor_node(dip, name, S_IFCHR, instance,
357 	    DDI_NT_NEXUS, 0);
358 	if (rc != DDI_SUCCESS) {
359 		cxgb_printf(dip, CE_WARN,
360 		    "failed to create device node: %d", rc);
361 		rc = DDI_SUCCESS; /* carry on */
362 	}
363 
364 	/* Initialize the driver properties */
365 	prp = &sc->props;
366 	(void) init_driver_props(sc, prp);
367 
368 	/* Do this early. Memory window is required for loading config file. */
369 	setup_memwin(sc);
370 
371 	/* Prepare the firmware for operation */
372 	rc = prep_firmware(sc);
373 	if (rc != 0)
374 		goto done; /* error message displayed already */
375 
376 	rc = get_params__pre_init(sc);
377 	if (rc != 0)
378 		goto done; /* error message displayed already */
379 
380 	t4_sge_init(sc);
381 
382 	if (sc->flags & MASTER_PF) {
383 		/* get basic stuff going */
384 		rc = -t4_fw_initialize(sc, sc->mbox);
385 		if (rc != 0) {
386 			cxgb_printf(sc->dip, CE_WARN,
387 			    "early init failed: %d.\n", rc);
388 			goto done;
389 		}
390 	}
391 
392 	rc = get_params__post_init(sc);
393 	if (rc != 0)
394 		goto done; /* error message displayed already */
395 
396 	/*
397 	 * TODO: This is the place to call t4_set_filter_mode()
398 	 */
399 
400 	/* tweak some settings */
401 	t4_write_reg(sc, A_TP_SHIFT_CNT, V_SYNSHIFTMAX(6) | V_RXTSHIFTMAXR1(4) |
402 	    V_RXTSHIFTMAXR2(15) | V_PERSHIFTBACKOFFMAX(8) | V_PERSHIFTMAX(8) |
403 	    V_KEEPALIVEMAXR1(4) | V_KEEPALIVEMAXR2(9));
404 	t4_write_reg(sc, A_ULP_RX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
405 
406 	/*
407 	 * Work-around for bug 2619
408 	 * Set DisableVlan field in TP_RSS_CONFIG_VRT register so that the
409 	 * VLAN tag extraction is disabled.
410 	 */
411 	t4_set_reg_field(sc, A_TP_RSS_CONFIG_VRT, F_DISABLEVLAN, F_DISABLEVLAN);
412 
413 	/* Store filter mode */
414 	t4_read_indirect(sc, A_TP_PIO_ADDR, A_TP_PIO_DATA, &sc->filter_mode, 1,
415 	    A_TP_VLAN_PRI_MAP);
416 
417 	/*
418 	 * First pass over all the ports - allocate VIs and initialize some
419 	 * basic parameters like mac address, port type, etc.  We also figure
420 	 * out whether a port is 10G or 1G and use that information when
421 	 * calculating how many interrupts to attempt to allocate.
422 	 */
423 	n10g = n1g = 0;
424 	for_each_port(sc, i) {
425 		struct port_info *pi;
426 
427 		pi = kmem_zalloc(sizeof (*pi), KM_SLEEP);
428 		sc->port[i] = pi;
429 
430 		/* These must be set before t4_port_init */
431 		pi->adapter = sc;
432 		/* LINTED: E_ASSIGN_NARROW_CONV */
433 		pi->port_id = i;
434 
435 		/* Allocate the vi and initialize parameters like mac addr */
436 		rc = -t4_port_init(pi, sc->mbox, sc->pf, 0);
437 		if (rc != 0) {
438 			cxgb_printf(dip, CE_WARN,
439 			    "unable to initialize port %d: %d", i, rc);
440 			kmem_free(pi, sizeof (*pi));
441 			sc->port[i] = NULL;	/* indicates init failed */
442 			continue;
443 		}
444 
445 		mutex_init(&pi->lock, NULL, MUTEX_DRIVER, NULL);
446 		pi->mtu = ETHERMTU;
447 
448 		if (is_10G_port(pi) != 0) {
449 			n10g++;
450 			pi->tmr_idx = prp->tmr_idx_10g;
451 			pi->pktc_idx = prp->pktc_idx_10g;
452 		} else {
453 			n1g++;
454 			pi->tmr_idx = prp->tmr_idx_1g;
455 			pi->pktc_idx = prp->pktc_idx_1g;
456 		}
457 
458 		pi->xact_addr_filt = -1;
459 		t4_mc_init(pi);
460 
461 		setbit(&sc->registered_device_map, i);
462 	}
463 	(void) remove_extra_props(sc, n10g, n1g);
464 
465 	if (sc->registered_device_map == 0) {
466 		cxgb_printf(dip, CE_WARN, "no usable ports");
467 		rc = DDI_FAILURE;
468 		goto done;
469 	}
470 
471 	rc = cfg_itype_and_nqueues(sc, n10g, n1g, &iaq);
472 	if (rc != 0)
473 		goto done; /* error message displayed already */
474 
475 	sc->intr_type = iaq.intr_type;
476 	sc->intr_count = iaq.nirq;
477 
478 	s = &sc->sge;
479 	s->nrxq = n10g * iaq.nrxq10g + n1g * iaq.nrxq1g;
480 	s->ntxq = n10g * iaq.ntxq10g + n1g * iaq.ntxq1g;
481 	s->neq = s->ntxq + s->nrxq;	/* the fl in an rxq is an eq */
482 #ifndef TCP_OFFLOAD_DISABLE
483 	/* control queues, 1 per port + 1 mgmtq */
484 	s->neq += sc->params.nports + 1;
485 #endif
486 	s->niq = s->nrxq + 1;		/* 1 extra for firmware event queue */
487 	if (iaq.intr_fwd != 0)
488 		sc->flags |= INTR_FWD;
489 #ifndef TCP_OFFLOAD_DISABLE
490 	if (is_offload(sc) != 0) {
491 
492 		s->nofldrxq = n10g * iaq.nofldrxq10g + n1g * iaq.nofldrxq1g;
493 		s->nofldtxq = n10g * iaq.nofldtxq10g + n1g * iaq.nofldtxq1g;
494 		s->neq += s->nofldtxq + s->nofldrxq;
495 		s->niq += s->nofldrxq;
496 
497 		s->ofld_rxq = kmem_zalloc(s->nofldrxq *
498 		    sizeof (struct sge_ofld_rxq), KM_SLEEP);
499 		s->ofld_txq = kmem_zalloc(s->nofldtxq *
500 		    sizeof (struct sge_wrq), KM_SLEEP);
501 		s->ctrlq = kmem_zalloc(sc->params.nports *
502 		    sizeof (struct sge_wrq), KM_SLEEP);
503 
504 	}
505 #endif
506 	s->rxq = kmem_zalloc(s->nrxq * sizeof (struct sge_rxq), KM_SLEEP);
507 	s->txq = kmem_zalloc(s->ntxq * sizeof (struct sge_txq), KM_SLEEP);
508 	s->iqmap = kmem_zalloc(s->niq * sizeof (struct sge_iq *), KM_SLEEP);
509 	s->eqmap = kmem_zalloc(s->neq * sizeof (struct sge_eq *), KM_SLEEP);
510 
511 	sc->intr_handle = kmem_zalloc(sc->intr_count *
512 	    sizeof (ddi_intr_handle_t), KM_SLEEP);
513 
514 	/*
515 	 * Second pass over the ports.  This time we know the number of rx and
516 	 * tx queues that each port should get.
517 	 */
518 	rqidx = tqidx = 0;
519 #ifndef TCP_OFFLOAD_DISABLE
520 	ofld_rqidx = ofld_tqidx = 0;
521 #endif
522 	for_each_port(sc, i) {
523 		struct port_info *pi = sc->port[i];
524 
525 		if (pi == NULL)
526 			continue;
527 
528 		/* LINTED: E_ASSIGN_NARROW_CONV */
529 		pi->first_rxq = rqidx;
530 		/* LINTED: E_ASSIGN_NARROW_CONV */
531 		pi->nrxq = is_10G_port(pi) ? iaq.nrxq10g : iaq.nrxq1g;
532 
533 		/* LINTED: E_ASSIGN_NARROW_CONV */
534 		pi->first_txq = tqidx;
535 		/* LINTED: E_ASSIGN_NARROW_CONV */
536 		pi->ntxq = is_10G_port(pi) ? iaq.ntxq10g : iaq.ntxq1g;
537 
538 		rqidx += pi->nrxq;
539 		tqidx += pi->ntxq;
540 
541 #ifndef TCP_OFFLOAD_DISABLE
542 		if (is_offload(sc) != 0) {
543 			/* LINTED: E_ASSIGN_NARROW_CONV */
544 			pi->first_ofld_rxq = ofld_rqidx;
545 			pi->nofldrxq = max(1, pi->nrxq / 4);
546 
547 			/* LINTED: E_ASSIGN_NARROW_CONV */
548 			pi->first_ofld_txq = ofld_tqidx;
549 			pi->nofldtxq = max(1, pi->ntxq / 2);
550 
551 			ofld_rqidx += pi->nofldrxq;
552 			ofld_tqidx += pi->nofldtxq;
553 		}
554 #endif
555 
556 		/*
557 		 * Enable hw checksumming and LSO for all ports by default.
558 		 * They can be disabled using ndd (hw_csum and hw_lso).
559 		 */
560 		pi->features |= (CXGBE_HW_CSUM | CXGBE_HW_LSO);
561 	}
562 
563 #ifndef TCP_OFFLOAD_DISABLE
564 		sc->l2t = t4_init_l2t(sc);
565 #endif
566 
567 	/*
568 	 * Setup Interrupts.
569 	 */
570 
571 	i = 0;
572 	rc = ddi_intr_alloc(dip, sc->intr_handle, sc->intr_type, 0,
573 	    sc->intr_count, &i, DDI_INTR_ALLOC_STRICT);
574 	if (rc != DDI_SUCCESS) {
575 		cxgb_printf(dip, CE_WARN,
576 		    "failed to allocate %d interrupt(s) of type %d: %d, %d",
577 		    sc->intr_count, sc->intr_type, rc, i);
578 		goto done;
579 	}
580 	ASSERT(sc->intr_count == i); /* allocation was STRICT */
581 	(void) ddi_intr_get_cap(sc->intr_handle[0], &sc->intr_cap);
582 	(void) ddi_intr_get_pri(sc->intr_handle[0], &sc->intr_pri);
583 	if (sc->intr_count == 1) {
584 		ASSERT(sc->flags & INTR_FWD);
585 		(void) ddi_intr_add_handler(sc->intr_handle[0], t4_intr_all, sc,
586 		    &s->fwq);
587 	} else {
588 		/* Multiple interrupts.  The first one is always error intr */
589 		(void) ddi_intr_add_handler(sc->intr_handle[0], t4_intr_err, sc,
590 		    NULL);
591 		irq++;
592 
593 		/* The second one is always the firmware event queue */
594 		(void) ddi_intr_add_handler(sc->intr_handle[1], t4_intr, sc,
595 		    &s->fwq);
596 		irq++;
597 		/*
598 		 * Note that if INTR_FWD is set then either the NIC rx
599 		 * queues or (exclusive or) the TOE rx queueus will be taking
600 		 * direct interrupts.
601 		 *
602 		 * There is no need to check for is_offload(sc) as nofldrxq
603 		 * will be 0 if offload is disabled.
604 		 */
605 		for_each_port(sc, i) {
606 			struct port_info *pi = sc->port[i];
607 			struct sge_rxq *rxq;
608 			struct sge_ofld_rxq *ofld_rxq;
609 
610 #ifndef TCP_OFFLOAD_DISABLE
611 			/*
612 			 * Skip over the NIC queues if they aren't taking direct
613 			 * interrupts.
614 			 */
615 			if ((sc->flags & INTR_FWD) &&
616 			    pi->nofldrxq > pi->nrxq)
617 				goto ofld_queues;
618 #endif
619 			rxq = &s->rxq[pi->first_rxq];
620 			for (q = 0; q < pi->nrxq; q++, rxq++) {
621 				(void) ddi_intr_add_handler(
622 				    sc->intr_handle[irq], t4_intr, sc,
623 				    &rxq->iq);
624 				irq++;
625 			}
626 
627 #ifndef TCP_OFFLOAD_DISABLE
628 			/*
629 			 * Skip over the offload queues if they aren't taking
630 			 * direct interrupts.
631 			 */
632 			if ((sc->flags & INTR_FWD))
633 				continue;
634 ofld_queues:
635 			ofld_rxq = &s->ofld_rxq[pi->first_ofld_rxq];
636 			for (q = 0; q < pi->nofldrxq; q++, ofld_rxq++) {
637 				(void) ddi_intr_add_handler(
638 				    sc->intr_handle[irq], t4_intr, sc,
639 				    &ofld_rxq->iq);
640 				irq++;
641 			}
642 #endif
643 		}
644 
645 	}
646 	sc->flags |= INTR_ALLOCATED;
647 
648 	ASSERT(rc == DDI_SUCCESS);
649 	ddi_report_dev(dip);
650 
651 	if (n10g && n1g) {
652 		cxgb_printf(dip, CE_NOTE,
653 		    "%dx10G %dx1G (%d rxq, %d txq total) %d %s.",
654 		    n10g, n1g, rqidx, tqidx, sc->intr_count,
655 		    sc->intr_type == DDI_INTR_TYPE_MSIX ? "MSI-X interrupts" :
656 		    sc->intr_type == DDI_INTR_TYPE_MSI ? "MSI interrupts" :
657 		    "fixed interrupt");
658 	} else {
659 		cxgb_printf(dip, CE_NOTE,
660 		    "%dx%sG (%d rxq, %d txq per port) %d %s.",
661 		    n10g ? n10g : n1g,
662 		    n10g ? "10" : "1",
663 		    n10g ? iaq.nrxq10g : iaq.nrxq1g,
664 		    n10g ? iaq.ntxq10g : iaq.ntxq1g,
665 		    sc->intr_count,
666 		    sc->intr_type == DDI_INTR_TYPE_MSIX ? "MSI-X interrupts" :
667 		    sc->intr_type == DDI_INTR_TYPE_MSI ? "MSI interrupts" :
668 		    "fixed interrupt");
669 	}
670 
671 	sc->ksp = setup_kstats(sc);
672 
673 done:
674 	if (rc != DDI_SUCCESS) {
675 		(void) t4_devo_detach(dip, DDI_DETACH);
676 
677 		/* rc may have errno style errors or DDI errors */
678 		rc = DDI_FAILURE;
679 	}
680 
681 	return (rc);
682 }
683 
684 static int
685 t4_devo_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
686 {
687 	int instance, i;
688 	struct adapter *sc;
689 	struct port_info *pi;
690 	struct sge *s;
691 
692 	if (cmd != DDI_DETACH)
693 		return (DDI_FAILURE);
694 
695 	instance = ddi_get_instance(dip);
696 	sc = ddi_get_soft_state(t4_list, instance);
697 	if (sc == NULL)
698 		return (DDI_SUCCESS);
699 
700 	if (sc->flags & FULL_INIT_DONE) {
701 		t4_intr_disable(sc);
702 		for_each_port(sc, i) {
703 			pi = sc->port[i];
704 			if (pi && pi->flags & PORT_INIT_DONE)
705 				(void) port_full_uninit(pi);
706 		}
707 		(void) adapter_full_uninit(sc);
708 	}
709 
710 	/* Safe to call no matter what */
711 	ddi_prop_remove_all(dip);
712 	ddi_remove_minor_node(dip, NULL);
713 
714 	if (sc->ksp != NULL)
715 		kstat_delete(sc->ksp);
716 
717 	s = &sc->sge;
718 	if (s->rxq != NULL)
719 		kmem_free(s->rxq, s->nrxq * sizeof (struct sge_rxq));
720 #ifndef TCP_OFFLOAD_DISABLE
721 	if (s->ofld_txq != NULL)
722 		kmem_free(s->ofld_txq, s->nofldtxq * sizeof (struct sge_wrq));
723 	if (s->ofld_rxq != NULL)
724 		kmem_free(s->ofld_rxq,
725 		    s->nofldrxq * sizeof (struct sge_ofld_rxq));
726 	if (s->ctrlq != NULL)
727 		kmem_free(s->ctrlq,
728 		    sc->params.nports * sizeof (struct sge_wrq));
729 #endif
730 	if (s->txq != NULL)
731 		kmem_free(s->txq, s->ntxq * sizeof (struct sge_txq));
732 	if (s->iqmap != NULL)
733 		kmem_free(s->iqmap, s->niq * sizeof (struct sge_iq *));
734 	if (s->eqmap != NULL)
735 		kmem_free(s->eqmap, s->neq * sizeof (struct sge_eq *));
736 
737 	if (s->rxbuf_cache != NULL)
738 		rxbuf_cache_destroy(s->rxbuf_cache);
739 
740 	if (sc->flags & INTR_ALLOCATED) {
741 		for (i = 0; i < sc->intr_count; i++) {
742 			(void) ddi_intr_remove_handler(sc->intr_handle[i]);
743 			(void) ddi_intr_free(sc->intr_handle[i]);
744 		}
745 		sc->flags &= ~INTR_ALLOCATED;
746 	}
747 
748 	if (sc->intr_handle != NULL) {
749 		kmem_free(sc->intr_handle,
750 		    sc->intr_count * sizeof (*sc->intr_handle));
751 	}
752 
753 	for_each_port(sc, i) {
754 		pi = sc->port[i];
755 		if (pi != NULL) {
756 			mutex_destroy(&pi->lock);
757 			kmem_free(pi, sizeof (*pi));
758 			clrbit(&sc->registered_device_map, i);
759 		}
760 	}
761 
762 	if (sc->flags & FW_OK)
763 		(void) t4_fw_bye(sc, sc->mbox);
764 
765 	if (sc->regh != NULL)
766 		ddi_regs_map_free(&sc->regh);
767 
768 	if (sc->pci_regh != NULL)
769 		pci_config_teardown(&sc->pci_regh);
770 
771 	mutex_enter(&t4_adapter_list_lock);
772 	SLIST_REMOVE_HEAD(&t4_adapter_list, link);
773 	mutex_exit(&t4_adapter_list_lock);
774 
775 	mutex_destroy(&sc->lock);
776 	cv_destroy(&sc->cv);
777 	mutex_destroy(&sc->sfl_lock);
778 
779 #ifdef DEBUG
780 	bzero(sc, sizeof (*sc));
781 #endif
782 	ddi_soft_state_free(t4_list, instance);
783 
784 	return (DDI_SUCCESS);
785 }
786 
787 static int
788 t4_devo_quiesce(dev_info_t *dip)
789 {
790 	int instance;
791 	struct adapter *sc;
792 
793 	instance = ddi_get_instance(dip);
794 	sc = ddi_get_soft_state(t4_list, instance);
795 	if (sc == NULL)
796 		return (DDI_SUCCESS);
797 
798 	t4_set_reg_field(sc, A_SGE_CONTROL, F_GLOBALENABLE, 0);
799 	t4_intr_disable(sc);
800 	t4_write_reg(sc, A_PL_RST, F_PIORSTMODE | F_PIORST);
801 
802 	return (DDI_SUCCESS);
803 }
804 
805 static int
806 t4_bus_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t op, void *arg,
807     void *result)
808 {
809 	char s[4];
810 	struct port_info *pi;
811 	dev_info_t *child = (dev_info_t *)arg;
812 
813 	switch (op) {
814 	case DDI_CTLOPS_REPORTDEV:
815 		pi = ddi_get_parent_data(rdip);
816 		pi->instance = ddi_get_instance(dip);
817 		pi->child_inst = ddi_get_instance(rdip);
818 		cmn_err(CE_CONT, "?%s%d is port %s on %s%d\n",
819 		    ddi_node_name(rdip), ddi_get_instance(rdip),
820 		    ddi_get_name_addr(rdip), ddi_driver_name(dip),
821 		    ddi_get_instance(dip));
822 		return (DDI_SUCCESS);
823 
824 	case DDI_CTLOPS_INITCHILD:
825 		pi = ddi_get_parent_data(child);
826 		if (pi == NULL)
827 			return (DDI_NOT_WELL_FORMED);
828 		(void) snprintf(s, sizeof (s), "%d", pi->port_id);
829 		ddi_set_name_addr(child, s);
830 		return (DDI_SUCCESS);
831 
832 	case DDI_CTLOPS_UNINITCHILD:
833 		ddi_set_name_addr(child, NULL);
834 		return (DDI_SUCCESS);
835 
836 	case DDI_CTLOPS_ATTACH:
837 	case DDI_CTLOPS_DETACH:
838 		return (DDI_SUCCESS);
839 
840 	default:
841 		return (ddi_ctlops(dip, rdip, op, arg, result));
842 	}
843 }
844 
845 static int
846 t4_bus_config(dev_info_t *dip, uint_t flags, ddi_bus_config_op_t op, void *arg,
847     dev_info_t **cdipp)
848 {
849 	int instance, i;
850 	struct adapter *sc;
851 
852 	instance = ddi_get_instance(dip);
853 	sc = ddi_get_soft_state(t4_list, instance);
854 
855 	if (op == BUS_CONFIG_ONE) {
856 		char *c;
857 
858 		/*
859 		 * arg is something like "cxgb@0" where 0 is the port_id hanging
860 		 * off this nexus.
861 		 */
862 
863 		c = arg;
864 		while (*(c + 1))
865 			c++;
866 
867 		/* There should be exactly 1 digit after '@' */
868 		if (*(c - 1) != '@')
869 			return (NDI_FAILURE);
870 
871 		i = *c - '0';
872 
873 		if (add_child_node(sc, i) != 0)
874 			return (NDI_FAILURE);
875 
876 		flags |= NDI_ONLINE_ATTACH;
877 
878 	} else if (op == BUS_CONFIG_ALL || op == BUS_CONFIG_DRIVER) {
879 		/* Allocate and bind all child device nodes */
880 		for_each_port(sc, i)
881 		    (void) add_child_node(sc, i);
882 		flags |= NDI_ONLINE_ATTACH;
883 	}
884 
885 	return (ndi_busop_bus_config(dip, flags, op, arg, cdipp, 0));
886 }
887 
888 static int
889 t4_bus_unconfig(dev_info_t *dip, uint_t flags, ddi_bus_config_op_t op,
890     void *arg)
891 {
892 	int instance, i, rc;
893 	struct adapter *sc;
894 
895 	instance = ddi_get_instance(dip);
896 	sc = ddi_get_soft_state(t4_list, instance);
897 
898 	if (op == BUS_CONFIG_ONE || op == BUS_UNCONFIG_ALL ||
899 	    op == BUS_UNCONFIG_DRIVER)
900 		flags |= NDI_UNCONFIG;
901 
902 	rc = ndi_busop_bus_unconfig(dip, flags, op, arg);
903 	if (rc != 0)
904 		return (rc);
905 
906 	if (op == BUS_UNCONFIG_ONE) {
907 		char *c;
908 
909 		c = arg;
910 		while (*(c + 1))
911 			c++;
912 
913 		if (*(c - 1) != '@')
914 			return (NDI_SUCCESS);
915 
916 		i = *c - '0';
917 
918 		rc = remove_child_node(sc, i);
919 
920 	} else if (op == BUS_UNCONFIG_ALL || op == BUS_UNCONFIG_DRIVER) {
921 
922 		for_each_port(sc, i)
923 		    (void) remove_child_node(sc, i);
924 	}
925 
926 	return (rc);
927 }
928 
929 /* ARGSUSED */
930 static int
931 t4_cb_open(dev_t *devp, int flag, int otyp, cred_t *credp)
932 {
933 	struct adapter *sc;
934 
935 	if (otyp != OTYP_CHR)
936 		return (EINVAL);
937 
938 	sc = ddi_get_soft_state(t4_list, getminor(*devp));
939 	if (sc == NULL)
940 		return (ENXIO);
941 
942 	return (atomic_cas_uint(&sc->open, 0, EBUSY));
943 }
944 
945 /* ARGSUSED */
946 static int
947 t4_cb_close(dev_t dev, int flag, int otyp, cred_t *credp)
948 {
949 	struct adapter *sc;
950 
951 	sc = ddi_get_soft_state(t4_list, getminor(dev));
952 	if (sc == NULL)
953 		return (EINVAL);
954 
955 	(void) atomic_swap_uint(&sc->open, 0);
956 	return (0);
957 }
958 
959 /* ARGSUSED */
960 static int
961 t4_cb_ioctl(dev_t dev, int cmd, intptr_t d, int mode, cred_t *credp, int *rp)
962 {
963 	int instance;
964 	struct adapter *sc;
965 	void *data = (void *)d;
966 
967 	if (crgetuid(credp) != 0)
968 		return (EPERM);
969 
970 	instance = getminor(dev);
971 	sc = ddi_get_soft_state(t4_list, instance);
972 	if (sc == NULL)
973 		return (EINVAL);
974 
975 	return (t4_ioctl(sc, cmd, data, mode));
976 }
977 
978 static unsigned int
979 getpf(struct adapter *sc)
980 {
981 	int rc, *data;
982 	uint_t n, pf;
983 
984 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, sc->dip,
985 	    DDI_PROP_DONTPASS, "reg", &data, &n);
986 	if (rc != DDI_SUCCESS) {
987 		cxgb_printf(sc->dip, CE_WARN,
988 		    "failed to lookup \"reg\" property: %d", rc);
989 		return (0xff);
990 	}
991 
992 	pf = PCI_REG_FUNC_G(data[0]);
993 	ddi_prop_free(data);
994 
995 	return (pf);
996 }
997 
998 /*
999  * Install a compatible firmware (if required), establish contact with it,
1000  * become the master, and reset the device.
1001  */
1002 static int
1003 prep_firmware(struct adapter *sc)
1004 {
1005 	int rc;
1006 	enum dev_state state;
1007 
1008 	/* Check firmware version and install a different one if necessary */
1009 	rc = t4_check_fw_version(sc);
1010 	if (rc != 0) {
1011 		uint32_t v;
1012 
1013 		/* This is what the driver has */
1014 		v = V_FW_HDR_FW_VER_MAJOR(T4FW_VERSION_MAJOR) |
1015 		    V_FW_HDR_FW_VER_MINOR(T4FW_VERSION_MINOR) |
1016 		    V_FW_HDR_FW_VER_MICRO(T4FW_VERSION_MICRO) |
1017 		    V_FW_HDR_FW_VER_BUILD(T4FW_VERSION_BUILD);
1018 
1019 		/*
1020 		 * Always upgrade, even for minor/micro/build mismatches.
1021 		 * Downgrade only for a major version mismatch.
1022 		 */
1023 		if (rc < 0 || v > sc->params.fw_vers) {
1024 			cxgb_printf(sc->dip, CE_NOTE,
1025 			    "installing firmware %d.%d.%d.%d on card.",
1026 			    T4FW_VERSION_MAJOR, T4FW_VERSION_MINOR,
1027 			    T4FW_VERSION_MICRO, T4FW_VERSION_BUILD);
1028 			rc = -t4_load_fw(sc, t4fw_data, t4fw_size);
1029 			if (rc != 0) {
1030 				cxgb_printf(sc->dip, CE_WARN,
1031 				    "failed to install firmware: %d", rc);
1032 				return (rc);
1033 			} else {
1034 				/* refresh */
1035 				(void) t4_check_fw_version(sc);
1036 			}
1037 		}
1038 	}
1039 
1040 	/* Contact firmware, request master */
1041 	rc = t4_fw_hello(sc, sc->mbox, sc->mbox, MASTER_MUST, &state);
1042 	if (rc < 0) {
1043 		rc = -rc;
1044 		cxgb_printf(sc->dip, CE_WARN,
1045 		    "failed to connect to the firmware: %d.", rc);
1046 		return (rc);
1047 	}
1048 
1049 	if (rc == sc->mbox)
1050 		sc->flags |= MASTER_PF;
1051 
1052 	/* Reset device */
1053 	rc = -t4_fw_reset(sc, sc->mbox, F_PIORSTMODE | F_PIORST);
1054 	if (rc != 0) {
1055 		cxgb_printf(sc->dip, CE_WARN,
1056 		    "firmware reset failed: %d.", rc);
1057 		if (rc != ETIMEDOUT && rc != EIO)
1058 			(void) t4_fw_bye(sc, sc->mbox);
1059 		return (rc);
1060 	}
1061 
1062 	/* Partition adapter resources as specified in the config file. */
1063 	if (sc->flags & MASTER_PF) {
1064 		/* Handle default vs special T4 config file */
1065 
1066 		rc = partition_resources(sc);
1067 		if (rc != 0)
1068 			goto err;	/* error message displayed already */
1069 	}
1070 
1071 	sc->flags |= FW_OK;
1072 	return (0);
1073 err:
1074 	return (rc);
1075 
1076 }
1077 
1078 #define	FW_PARAM_DEV(param) \
1079 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | \
1080 	    V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_##param))
1081 #define	FW_PARAM_PFVF(param) \
1082 	(V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_PFVF) | \
1083 	    V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_PFVF_##param))
1084 
1085 /*
1086  * Upload configuration file to card's memory.
1087  */
1088 static int
1089 upload_config_file(struct adapter *sc, uint32_t *mt, uint32_t *ma)
1090 {
1091 	int rc, i;
1092 	uint32_t param, val, mtype, maddr, bar, off, win, remaining;
1093 	const uint32_t *b;
1094 
1095 	/* Figure out where the firmware wants us to upload it. */
1096 	param = FW_PARAM_DEV(CF);
1097 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
1098 	if (rc != 0) {
1099 		/* Firmwares without config file support will fail this way */
1100 		cxgb_printf(sc->dip, CE_WARN,
1101 		    "failed to query config file location: %d.\n", rc);
1102 		return (rc);
1103 	}
1104 	*mt = mtype = G_FW_PARAMS_PARAM_Y(val);
1105 	*ma = maddr = G_FW_PARAMS_PARAM_Z(val) << 16;
1106 
1107 	if (maddr & 3) {
1108 		cxgb_printf(sc->dip, CE_WARN,
1109 		    "cannot upload config file (type %u, addr %x).\n",
1110 		    mtype, maddr);
1111 		return (EFAULT);
1112 	}
1113 
1114 	/* Translate mtype/maddr to an address suitable for the PCIe window */
1115 	val = t4_read_reg(sc, A_MA_TARGET_MEM_ENABLE);
1116 	val &= F_EDRAM0_ENABLE | F_EDRAM1_ENABLE | F_EXT_MEM_ENABLE;
1117 	switch (mtype) {
1118 	case FW_MEMTYPE_CF_EDC0:
1119 		if (!(val & F_EDRAM0_ENABLE))
1120 			goto err;
1121 		bar = t4_read_reg(sc, A_MA_EDRAM0_BAR);
1122 		maddr += G_EDRAM0_BASE(bar) << 20;
1123 		break;
1124 
1125 	case FW_MEMTYPE_CF_EDC1:
1126 		if (!(val & F_EDRAM1_ENABLE))
1127 			goto err;
1128 		bar = t4_read_reg(sc, A_MA_EDRAM1_BAR);
1129 		maddr += G_EDRAM1_BASE(bar) << 20;
1130 		break;
1131 
1132 	case FW_MEMTYPE_CF_EXTMEM:
1133 		if (!(val & F_EXT_MEM_ENABLE))
1134 			goto err;
1135 		bar = t4_read_reg(sc, A_MA_EXT_MEMORY_BAR);
1136 		maddr += G_EXT_MEM_BASE(bar) << 20;
1137 		break;
1138 
1139 	default:
1140 err:
1141 		cxgb_printf(sc->dip, CE_WARN,
1142 		    "cannot upload config file (type %u, enabled %u).\n",
1143 		    mtype, val);
1144 		return (EFAULT);
1145 	}
1146 
1147 	/*
1148 	 * Position the PCIe window (we use memwin2) to the 16B aligned area
1149 	 * just at/before the upload location.
1150 	 */
1151 	win = maddr & ~0xf;
1152 	off = maddr - win;  /* offset from the start of the window. */
1153 	t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2), win);
1154 	(void) t4_read_reg(sc,
1155 	    PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2));
1156 
1157 	remaining = t4cfg_size;
1158 	if (remaining > FLASH_CFG_MAX_SIZE ||
1159 	    remaining > MEMWIN2_APERTURE - off) {
1160 		cxgb_printf(sc->dip, CE_WARN, "cannot upload config file all at"
1161 		    " once (size %u, max %u, room %u).\n",
1162 		    remaining, FLASH_CFG_MAX_SIZE, MEMWIN2_APERTURE - off);
1163 		return (EFBIG);
1164 	}
1165 
1166 	/*
1167 	 * TODO: sheer laziness.  We deliberately added 4 bytes of useless
1168 	 * stuffing/comments at the end of the config file so it's ok to simply
1169 	 * throw away the last remaining bytes when the config file is not an
1170 	 * exact multiple of 4.
1171 	 */
1172 	/* LINTED: E_BAD_PTR_CAST_ALIGN */
1173 	b =  (const uint32_t *)t4cfg_data;
1174 	for (i = 0; remaining >= 4; i += 4, remaining -= 4)
1175 		t4_write_reg(sc, MEMWIN2_BASE + off + i, *b++);
1176 
1177 	return (rc);
1178 }
1179 
1180 /*
1181  * Partition chip resources for use between various PFs, VFs, etc.  This is done
1182  * by uploading the firmware configuration file to the adapter and instructing
1183  * the firmware to process it.
1184  */
1185 static int
1186 partition_resources(struct adapter *sc)
1187 {
1188 	int rc;
1189 	struct fw_caps_config_cmd caps;
1190 	uint32_t mtype, maddr, finicsum, cfcsum;
1191 
1192 	rc = upload_config_file(sc, &mtype, &maddr);
1193 	if (rc != 0) {
1194 		mtype = FW_MEMTYPE_CF_FLASH;
1195 		maddr = t4_flash_cfg_addr(sc);
1196 	}
1197 
1198 	bzero(&caps, sizeof (caps));
1199 	caps.op_to_write = BE_32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
1200 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
1201 	caps.cfvalid_to_len16 = BE_32(F_FW_CAPS_CONFIG_CMD_CFVALID |
1202 	    V_FW_CAPS_CONFIG_CMD_MEMTYPE_CF(mtype) |
1203 	    V_FW_CAPS_CONFIG_CMD_MEMADDR64K_CF(maddr >> 16) | FW_LEN16(caps));
1204 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof (caps), &caps);
1205 	if (rc != 0) {
1206 		cxgb_printf(sc->dip, CE_WARN,
1207 		    "failed to pre-process config file: %d.\n", rc);
1208 		return (rc);
1209 	}
1210 
1211 	finicsum = ntohl(caps.finicsum);
1212 	cfcsum = ntohl(caps.cfcsum);
1213 	if (finicsum != cfcsum) {
1214 		cxgb_printf(sc->dip, CE_WARN,
1215 		    "WARNING: config file checksum mismatch: %08x %08x\n",
1216 		    finicsum, cfcsum);
1217 	}
1218 	sc->cfcsum = cfcsum;
1219 
1220 	/* TODO: Need to configure this correctly */
1221 	caps.toecaps = htons(FW_CAPS_CONFIG_TOE);
1222 	caps.iscsicaps = 0;
1223 	caps.rdmacaps = 0;
1224 	caps.fcoecaps = 0;
1225 	/* TODO: Disable VNIC cap for now */
1226 	caps.niccaps ^= htons(FW_CAPS_CONFIG_NIC_VM);
1227 
1228 	caps.op_to_write = htonl(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
1229 	    F_FW_CMD_REQUEST | F_FW_CMD_WRITE);
1230 	caps.cfvalid_to_len16 = htonl(FW_LEN16(caps));
1231 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof (caps), NULL);
1232 	if (rc != 0) {
1233 		cxgb_printf(sc->dip, CE_WARN,
1234 		    "failed to process config file: %d.\n", rc);
1235 		return (rc);
1236 	}
1237 
1238 	return (0);
1239 }
1240 
1241 /*
1242  * Retrieve parameters that are needed (or nice to have) prior to calling
1243  * t4_sge_init and t4_fw_initialize.
1244  */
1245 static int
1246 get_params__pre_init(struct adapter *sc)
1247 {
1248 	int rc;
1249 	uint32_t param[2], val[2];
1250 	struct fw_devlog_cmd cmd;
1251 	struct devlog_params *dlog = &sc->params.devlog;
1252 
1253 	param[0] = FW_PARAM_DEV(PORTVEC);
1254 	param[1] = FW_PARAM_DEV(CCLK);
1255 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
1256 	if (rc != 0) {
1257 		cxgb_printf(sc->dip, CE_WARN,
1258 		    "failed to query parameters (pre_init): %d.\n", rc);
1259 		return (rc);
1260 	}
1261 
1262 	sc->params.portvec = val[0];
1263 	sc->params.nports = 0;
1264 	while (val[0]) {
1265 		sc->params.nports++;
1266 		val[0] &= val[0] - 1;
1267 	}
1268 
1269 	sc->params.vpd.cclk = val[1];
1270 
1271 	/* Read device log parameters. */
1272 	bzero(&cmd, sizeof (cmd));
1273 	cmd.op_to_write = htonl(V_FW_CMD_OP(FW_DEVLOG_CMD) |
1274 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
1275 	cmd.retval_len16 = htonl(FW_LEN16(cmd));
1276 	rc = -t4_wr_mbox(sc, sc->mbox, &cmd, sizeof (cmd), &cmd);
1277 	if (rc != 0) {
1278 		cxgb_printf(sc->dip, CE_WARN,
1279 		    "failed to get devlog parameters: %d.\n", rc);
1280 		bzero(dlog, sizeof (*dlog));
1281 		rc = 0;	/* devlog isn't critical for device operation */
1282 	} else {
1283 		val[0] = ntohl(cmd.memtype_devlog_memaddr16_devlog);
1284 		dlog->memtype = G_FW_DEVLOG_CMD_MEMTYPE_DEVLOG(val[0]);
1285 		dlog->start = G_FW_DEVLOG_CMD_MEMADDR16_DEVLOG(val[0]) << 4;
1286 		dlog->size = ntohl(cmd.memsize_devlog);
1287 	}
1288 
1289 	return (rc);
1290 }
1291 
1292 /*
1293  * Retrieve various parameters that are of interest to the driver.  The device
1294  * has been initialized by the firmware at this point.
1295  */
1296 static int
1297 get_params__post_init(struct adapter *sc)
1298 {
1299 	int rc;
1300 	uint32_t param[7], val[7];
1301 	struct fw_caps_config_cmd caps;
1302 
1303 	param[0] = FW_PARAM_PFVF(IQFLINT_START);
1304 	param[1] = FW_PARAM_PFVF(EQ_START);
1305 	param[2] = FW_PARAM_PFVF(FILTER_START);
1306 	param[3] = FW_PARAM_PFVF(FILTER_END);
1307 	rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 4, param, val);
1308 	if (rc != 0) {
1309 		cxgb_printf(sc->dip, CE_WARN,
1310 		    "failed to query parameters (post_init): %d.\n", rc);
1311 		return (rc);
1312 	}
1313 
1314 	/* LINTED: E_ASSIGN_NARROW_CONV */
1315 	sc->sge.iq_start = val[0];
1316 	sc->sge.eq_start = val[1];
1317 	sc->tids.ftid_base = val[2];
1318 	sc->tids.nftids = val[3] - val[2] + 1;
1319 
1320 	/* get capabilites */
1321 	bzero(&caps, sizeof (caps));
1322 	caps.op_to_write = htonl(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
1323 	    F_FW_CMD_REQUEST | F_FW_CMD_READ);
1324 	caps.cfvalid_to_len16 = htonl(FW_LEN16(caps));
1325 	rc = -t4_wr_mbox(sc, sc->mbox, &caps, sizeof (caps), &caps);
1326 	if (rc != 0) {
1327 		cxgb_printf(sc->dip, CE_WARN,
1328 		    "failed to get card capabilities: %d.\n", rc);
1329 		return (rc);
1330 	}
1331 
1332 	if (caps.toecaps != 0) {
1333 		/* query offload-related parameters */
1334 		param[0] = FW_PARAM_DEV(NTID);
1335 		param[1] = FW_PARAM_PFVF(SERVER_START);
1336 		param[2] = FW_PARAM_PFVF(SERVER_END);
1337 		param[3] = FW_PARAM_PFVF(TDDP_START);
1338 		param[4] = FW_PARAM_PFVF(TDDP_END);
1339 		param[5] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ);
1340 		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 6, param, val);
1341 		if (rc != 0) {
1342 			cxgb_printf(sc->dip, CE_WARN,
1343 			    "failed to query TOE parameters: %d.\n", rc);
1344 			return (rc);
1345 		}
1346 		sc->tids.ntids = val[0];
1347 		sc->tids.natids = min(sc->tids.ntids / 2, MAX_ATIDS);
1348 		sc->tids.stid_base = val[1];
1349 		sc->tids.nstids = val[2] - val[1] + 1;
1350 		sc->vres.ddp.start = val[3];
1351 		sc->vres.ddp.size = val[4] - val[3] + 1;
1352 		sc->params.ofldq_wr_cred = val[5];
1353 		sc->params.offload = 1;
1354 	}
1355 
1356 	/* These are finalized by FW initialization, load their values now */
1357 	val[0] = t4_read_reg(sc, A_TP_TIMER_RESOLUTION);
1358 	sc->params.tp.tre = G_TIMERRESOLUTION(val[0]);
1359 	sc->params.tp.dack_re = G_DELAYEDACKRESOLUTION(val[0]);
1360 	t4_read_mtu_tbl(sc, sc->params.mtus, NULL);
1361 
1362 	return (rc);
1363 }
1364 
1365 /* TODO: verify */
1366 static void
1367 setup_memwin(struct adapter *sc)
1368 {
1369 	pci_regspec_t *data;
1370 	int rc;
1371 	uint_t n;
1372 	uintptr_t bar0;
1373 
1374 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, sc->dip,
1375 	    DDI_PROP_DONTPASS, "assigned-addresses", (int **)&data, &n);
1376 	if (rc != DDI_SUCCESS) {
1377 		cxgb_printf(sc->dip, CE_WARN,
1378 		    "failed to lookup \"assigned-addresses\" property: %d", rc);
1379 		return;
1380 	}
1381 	n /= sizeof (*data);
1382 
1383 	bar0 = ((uint64_t)data[0].pci_phys_mid << 32) | data[0].pci_phys_low;
1384 	ddi_prop_free(data);
1385 
1386 	t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 0),
1387 	    (bar0 + MEMWIN0_BASE) | V_BIR(0) |
1388 	    V_WINDOW(ilog2(MEMWIN0_APERTURE) - 10));
1389 
1390 	t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 1),
1391 	    (bar0 + MEMWIN1_BASE) | V_BIR(0) |
1392 	    V_WINDOW(ilog2(MEMWIN1_APERTURE) - 10));
1393 
1394 	t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, 2),
1395 	    (bar0 + MEMWIN2_BASE) | V_BIR(0) |
1396 	    V_WINDOW(ilog2(MEMWIN2_APERTURE) - 10));
1397 }
1398 
1399 /*
1400  * Reads the named property and fills up the "data" array (which has at least
1401  * "count" elements).  We first try and lookup the property for our dev_t and
1402  * then retry with DDI_DEV_T_ANY if it's not found.
1403  *
1404  * Returns non-zero if the property was found and "data" has been updated.
1405  */
1406 static int
1407 prop_lookup_int_array(struct adapter *sc, char *name, int *data, uint_t count)
1408 {
1409 	dev_info_t *dip = sc->dip;
1410 	dev_t dev = sc->dev;
1411 	int rc, *d;
1412 	uint_t i, n;
1413 
1414 	rc = ddi_prop_lookup_int_array(dev, dip, DDI_PROP_DONTPASS,
1415 	    name, &d, &n);
1416 	if (rc == DDI_PROP_SUCCESS)
1417 		goto found;
1418 
1419 	if (rc != DDI_PROP_NOT_FOUND) {
1420 		cxgb_printf(dip, CE_WARN,
1421 		    "failed to lookup property %s for minor %d: %d.",
1422 		    name, getminor(dev), rc);
1423 		return (0);
1424 	}
1425 
1426 	rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1427 	    name, &d, &n);
1428 	if (rc == DDI_PROP_SUCCESS)
1429 		goto found;
1430 
1431 	if (rc != DDI_PROP_NOT_FOUND) {
1432 		cxgb_printf(dip, CE_WARN,
1433 		    "failed to lookup property %s: %d.", name, rc);
1434 		return (0);
1435 	}
1436 
1437 	return (0);
1438 
1439 found:
1440 	if (n > count) {
1441 		cxgb_printf(dip, CE_NOTE,
1442 		    "property %s has too many elements (%d), ignoring extras",
1443 		    name, n);
1444 	}
1445 
1446 	for (i = 0; i < n && i < count; i++)
1447 		data[i] = d[i];
1448 	ddi_prop_free(d);
1449 
1450 	return (1);
1451 }
1452 
1453 static int
1454 prop_lookup_int(struct adapter *sc, char *name, int defval)
1455 {
1456 	int rc;
1457 
1458 	rc = ddi_prop_get_int(sc->dev, sc->dip, DDI_PROP_DONTPASS, name, -1);
1459 	if (rc != -1)
1460 		return (rc);
1461 
1462 	return (ddi_prop_get_int(DDI_DEV_T_ANY, sc->dip, DDI_PROP_DONTPASS,
1463 	    name, defval));
1464 }
1465 
1466 static int
1467 init_driver_props(struct adapter *sc, struct driver_properties *p)
1468 {
1469 	dev_t dev = sc->dev;
1470 	dev_info_t *dip = sc->dip;
1471 	int i, *data;
1472 	uint_t tmr[SGE_NTIMERS] = {5, 10, 20, 50, 100, 200};
1473 	uint_t cnt[SGE_NCOUNTERS] = {1, 8, 16, 32}; /* 63 max */
1474 
1475 	/*
1476 	 * Holdoff timer
1477 	 */
1478 	data = &p->timer_val[0];
1479 	for (i = 0; i < SGE_NTIMERS; i++)
1480 		data[i] = tmr[i];
1481 	(void) prop_lookup_int_array(sc, "holdoff-timer-values", data,
1482 	    SGE_NTIMERS);
1483 	for (i = 0; i < SGE_NTIMERS; i++) {
1484 		int limit = 200U;
1485 		if (data[i] > limit) {
1486 			cxgb_printf(dip, CE_WARN,
1487 			    "holdoff timer %d is too high (%d), lowered to %d.",
1488 			    i, data[i], limit);
1489 			data[i] = limit;
1490 		}
1491 	}
1492 	(void) ddi_prop_update_int_array(dev, dip, "holdoff-timer-values",
1493 	    data, SGE_NTIMERS);
1494 
1495 	/*
1496 	 * Holdoff packet counter
1497 	 */
1498 	data = &p->counter_val[0];
1499 	for (i = 0; i < SGE_NCOUNTERS; i++)
1500 		data[i] = cnt[i];
1501 	(void) prop_lookup_int_array(sc, "holdoff-pkt-counter-values", data,
1502 	    SGE_NCOUNTERS);
1503 	for (i = 0; i < SGE_NCOUNTERS; i++) {
1504 		int limit = M_THRESHOLD_0;
1505 		if (data[i] > limit) {
1506 			cxgb_printf(dip, CE_WARN,
1507 			    "holdoff pkt-counter %d is too high (%d), "
1508 			    "lowered to %d.", i, data[i], limit);
1509 			data[i] = limit;
1510 		}
1511 	}
1512 	(void) ddi_prop_update_int_array(dev, dip, "holdoff-pkt-counter-values",
1513 	    data, SGE_NCOUNTERS);
1514 
1515 	/*
1516 	 * Maximum # of tx and rx queues to use for each 10G and 1G port.
1517 	 */
1518 	p->max_ntxq_10g = prop_lookup_int(sc, "max-ntxq-10G-port", 8);
1519 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-10G-port",
1520 	    p->max_ntxq_10g);
1521 
1522 	p->max_nrxq_10g = prop_lookup_int(sc, "max-nrxq-10G-port", 8);
1523 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-10G-port",
1524 	    p->max_nrxq_10g);
1525 
1526 	p->max_ntxq_1g = prop_lookup_int(sc, "max-ntxq-1G-port", 2);
1527 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-1G-port",
1528 	    p->max_ntxq_1g);
1529 
1530 	p->max_nrxq_1g = prop_lookup_int(sc, "max-nrxq-1G-port", 2);
1531 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-1G-port",
1532 	    p->max_nrxq_1g);
1533 
1534 #ifndef TCP_OFFLOAD_DISABLE
1535 	p->max_nofldtxq_10g = prop_lookup_int(sc, "max-nofldtxq-10G-port", 8);
1536 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-10G-port",
1537 	    p->max_nofldtxq_10g);
1538 
1539 	p->max_nofldrxq_10g = prop_lookup_int(sc, "max-nofldrxq-10G-port", 2);
1540 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-10G-port",
1541 	    p->max_nofldrxq_10g);
1542 
1543 	p->max_nofldtxq_1g = prop_lookup_int(sc, "max-nofldtxq-1G-port", 2);
1544 	(void) ddi_prop_update_int(dev, dip, "max-ntxq-1G-port",
1545 	    p->max_nofldtxq_1g);
1546 
1547 	p->max_nofldrxq_1g = prop_lookup_int(sc, "max-nofldrxq-1G-port", 1);
1548 	(void) ddi_prop_update_int(dev, dip, "max-nrxq-1G-port",
1549 	    p->max_nofldrxq_1g);
1550 #endif
1551 
1552 	/*
1553 	 * Holdoff parameters for 10G and 1G ports.
1554 	 */
1555 	p->tmr_idx_10g = prop_lookup_int(sc, "holdoff-timer-idx-10G", 0);
1556 	(void) ddi_prop_update_int(dev, dip, "holdoff-timer-idx-10G",
1557 	    p->tmr_idx_10g);
1558 
1559 	p->pktc_idx_10g = prop_lookup_int(sc, "holdoff-pktc-idx-10G", 2);
1560 	(void) ddi_prop_update_int(dev, dip, "holdoff-pktc-idx-10G",
1561 	    p->pktc_idx_10g);
1562 
1563 	p->tmr_idx_1g = prop_lookup_int(sc, "holdoff-timer-idx-1G", 0);
1564 	(void) ddi_prop_update_int(dev, dip, "holdoff-timer-idx-1G",
1565 	    p->tmr_idx_1g);
1566 
1567 	p->pktc_idx_1g = prop_lookup_int(sc, "holdoff-pktc-idx-1G", 2);
1568 	(void) ddi_prop_update_int(dev, dip, "holdoff-pktc-idx-1G",
1569 	    p->pktc_idx_1g);
1570 
1571 	/*
1572 	 * Size (number of entries) of each tx and rx queue.
1573 	 */
1574 	i = prop_lookup_int(sc, "qsize-txq", TX_EQ_QSIZE);
1575 	p->qsize_txq = max(i, 128);
1576 	if (p->qsize_txq != i) {
1577 		cxgb_printf(dip, CE_WARN,
1578 		    "using %d instead of %d as the tx queue size",
1579 		    p->qsize_txq, i);
1580 	}
1581 	(void) ddi_prop_update_int(dev, dip, "qsize-txq", p->qsize_txq);
1582 
1583 	i = prop_lookup_int(sc, "qsize-rxq", RX_IQ_QSIZE);
1584 	p->qsize_rxq = max(i, 128);
1585 	while (p->qsize_rxq & 7)
1586 		p->qsize_rxq--;
1587 	if (p->qsize_rxq != i) {
1588 		cxgb_printf(dip, CE_WARN,
1589 		    "using %d instead of %d as the rx queue size",
1590 		    p->qsize_rxq, i);
1591 	}
1592 	(void) ddi_prop_update_int(dev, dip, "qsize-rxq", p->qsize_rxq);
1593 
1594 	/*
1595 	 * Interrupt types allowed.
1596 	 * Bits 0, 1, 2 = INTx, MSI, MSI-X respectively.  See sys/ddi_intr.h
1597 	 */
1598 	p->intr_types = prop_lookup_int(sc, "interrupt-types",
1599 	    DDI_INTR_TYPE_MSIX | DDI_INTR_TYPE_MSI | DDI_INTR_TYPE_FIXED);
1600 	(void) ddi_prop_update_int(dev, dip, "interrupt-types", p->intr_types);
1601 
1602 	/*
1603 	 * Forwarded interrupt queues.  Create this property to force the driver
1604 	 * to use forwarded interrupt queues.
1605 	 */
1606 	if (ddi_prop_exists(dev, dip, DDI_PROP_DONTPASS,
1607 	    "interrupt-forwarding") != 0 ||
1608 	    ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1609 	    "interrupt-forwarding") != 0) {
1610 		UNIMPLEMENTED();
1611 		(void) ddi_prop_create(dev, dip, DDI_PROP_CANSLEEP,
1612 		    "interrupt-forwarding", NULL, 0);
1613 	}
1614 
1615 	return (0);
1616 }
1617 
1618 static int
1619 remove_extra_props(struct adapter *sc, int n10g, int n1g)
1620 {
1621 	if (n10g == 0) {
1622 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-ntxq-10G-port");
1623 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-nrxq-10G-port");
1624 		(void) ddi_prop_remove(sc->dev, sc->dip,
1625 		    "holdoff-timer-idx-10G");
1626 		(void) ddi_prop_remove(sc->dev, sc->dip,
1627 		    "holdoff-pktc-idx-10G");
1628 	}
1629 
1630 	if (n1g == 0) {
1631 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-ntxq-1G-port");
1632 		(void) ddi_prop_remove(sc->dev, sc->dip, "max-nrxq-1G-port");
1633 		(void) ddi_prop_remove(sc->dev, sc->dip,
1634 		    "holdoff-timer-idx-1G");
1635 		(void) ddi_prop_remove(sc->dev, sc->dip, "holdoff-pktc-idx-1G");
1636 	}
1637 
1638 	return (0);
1639 }
1640 
1641 static int
1642 cfg_itype_and_nqueues(struct adapter *sc, int n10g, int n1g,
1643     struct intrs_and_queues *iaq)
1644 {
1645 	struct driver_properties *p = &sc->props;
1646 	int rc, itype, itypes, navail, nc, nrxq10g, nrxq1g, n;
1647 	int nofldrxq10g = 0, nofldrxq1g = 0;
1648 
1649 	bzero(iaq, sizeof (*iaq));
1650 	nc = ncpus;	/* our snapshot of the number of CPUs */
1651 	iaq->ntxq10g = min(nc, p->max_ntxq_10g);
1652 	iaq->ntxq1g = min(nc, p->max_ntxq_1g);
1653 	iaq->nrxq10g = nrxq10g = min(nc, p->max_nrxq_10g);
1654 	iaq->nrxq1g = nrxq1g = min(nc, p->max_nrxq_1g);
1655 #ifndef TCP_OFFLOAD_DISABLE
1656 	iaq->nofldtxq10g = min(nc, p->max_nofldtxq_10g);
1657 	iaq->nofldtxq1g = min(nc, p->max_nofldtxq_1g);
1658 	iaq->nofldrxq10g = nofldrxq10g = min(nc, p->max_nofldrxq_10g);
1659 	iaq->nofldrxq1g = nofldrxq1g = min(nc, p->max_nofldrxq_1g);
1660 #endif
1661 
1662 	rc = ddi_intr_get_supported_types(sc->dip, &itypes);
1663 	if (rc != DDI_SUCCESS) {
1664 		cxgb_printf(sc->dip, CE_WARN,
1665 		    "failed to determine supported interrupt types: %d", rc);
1666 		return (rc);
1667 	}
1668 
1669 	for (itype = DDI_INTR_TYPE_MSIX; itype; itype >>= 1) {
1670 		ASSERT(itype == DDI_INTR_TYPE_MSIX ||
1671 		    itype == DDI_INTR_TYPE_MSI ||
1672 		    itype == DDI_INTR_TYPE_FIXED);
1673 
1674 		if ((itype & itypes & p->intr_types) == 0)
1675 			continue;	/* not supported or not allowed */
1676 
1677 		navail = 0;
1678 		rc = ddi_intr_get_navail(sc->dip, itype, &navail);
1679 		if (rc != DDI_SUCCESS || navail == 0) {
1680 			cxgb_printf(sc->dip, CE_WARN,
1681 			    "failed to get # of interrupts for type %d: %d",
1682 			    itype, rc);
1683 			continue;	/* carry on */
1684 		}
1685 
1686 		iaq->intr_type = itype;
1687 
1688 #if MAC_VERSION == 1
1689 		iaq->ntxq10g = 1;
1690 		iaq->ntxq1g = 1;
1691 #endif
1692 
1693 		if (navail == 0)
1694 			continue;
1695 
1696 		/*
1697 		 * Best option: an interrupt vector for errors, one for the
1698 		 * firmware event queue, and one each for each rxq (NIC as well
1699 		 * as offload).
1700 		 */
1701 		iaq->nirq = T4_EXTRA_INTR;
1702 		iaq->nirq += n10g * (nrxq10g + nofldrxq10g);
1703 		iaq->nirq += n1g * (nrxq1g + nofldrxq1g);
1704 
1705 		if (iaq->nirq <= navail &&
1706 		    (itype != DDI_INTR_TYPE_MSI || ISP2(iaq->nirq))) {
1707 			iaq->intr_fwd = 0;
1708 			goto allocate;
1709 		}
1710 
1711 		/*
1712 		 * Second best option: an interrupt vector for errors, one for
1713 		 * the firmware event queue, and one each for either NIC or
1714 		 * offload rxq's.
1715 		 */
1716 		iaq->nirq = T4_EXTRA_INTR;
1717 		iaq->nirq += n10g * max(nrxq10g, nofldrxq10g);
1718 		iaq->nirq += n1g * max(nrxq1g, nofldrxq1g);
1719 		if (iaq->nirq <= navail &&
1720 		    (itype != DDI_INTR_TYPE_MSI || ISP2(iaq->nirq))) {
1721 			iaq->intr_fwd = 1;
1722 			goto allocate;
1723 		}
1724 
1725 		/*
1726 		 * Next best option: an interrupt vector for errors, one for the
1727 		 * firmware event queue, and at least one per port.  At this
1728 		 * point we know we'll have to downsize nrxq or nofldrxq to fit
1729 		 * what's available to us.
1730 		 */
1731 		iaq->nirq = T4_EXTRA_INTR;
1732 		iaq->nirq += n10g + n1g;
1733 		if (iaq->nirq <= navail) {
1734 			int leftover = navail - iaq->nirq;
1735 
1736 			if (n10g > 0) {
1737 				int target = max(nrxq10g, nofldrxq10g);
1738 
1739 				n = 1;
1740 				while (n < target && leftover >= n10g) {
1741 					leftover -= n10g;
1742 					iaq->nirq += n10g;
1743 					n++;
1744 				}
1745 				iaq->nrxq10g = min(n, nrxq10g);
1746 #ifndef TCP_OFFLOAD_DISABLE
1747 				iaq->nofldrxq10g = min(n, nofldrxq10g);
1748 #endif
1749 			}
1750 
1751 			if (n1g > 0) {
1752 				int target = max(nrxq1g, nofldrxq1g);
1753 
1754 				n = 1;
1755 				while (n < target && leftover >= n1g) {
1756 					leftover -= n1g;
1757 					iaq->nirq += n1g;
1758 					n++;
1759 				}
1760 				iaq->nrxq1g = min(n, nrxq1g);
1761 #ifndef TCP_OFFLOAD_DISABLE
1762 				iaq->nofldrxq1g = min(n, nofldrxq1g);
1763 #endif
1764 			}
1765 
1766 			if (itype != DDI_INTR_TYPE_MSI || ISP2(iaq->nirq)) {
1767 				iaq->intr_fwd = 1;
1768 				goto allocate;
1769 			}
1770 		}
1771 
1772 		/*
1773 		 * Least desirable option: one interrupt vector for everything.
1774 		 */
1775 		iaq->nirq = iaq->nrxq10g = iaq->nrxq1g = 1;
1776 #ifndef TCP_OFFLOAD_DISABLE
1777 		iaq->nofldrxq10g = iaq->nofldrxq1g = 1;
1778 #endif
1779 		iaq->intr_fwd = 1;
1780 
1781 allocate:
1782 		return (0);
1783 	}
1784 
1785 	cxgb_printf(sc->dip, CE_WARN,
1786 	    "failed to find a usable interrupt type.  supported=%d, allowed=%d",
1787 	    itypes, p->intr_types);
1788 	return (DDI_FAILURE);
1789 }
1790 
1791 static int
1792 add_child_node(struct adapter *sc, int idx)
1793 {
1794 	int rc;
1795 	struct port_info *pi;
1796 
1797 	if (idx < 0 || idx >= sc->params.nports)
1798 		return (EINVAL);
1799 
1800 	pi = sc->port[idx];
1801 	if (pi == NULL)
1802 		return (ENODEV);	/* t4_port_init failed earlier */
1803 
1804 	PORT_LOCK(pi);
1805 	if (pi->dip != NULL) {
1806 		rc = 0;		/* EEXIST really, but then bus_config fails */
1807 		goto done;
1808 	}
1809 
1810 	rc = ndi_devi_alloc(sc->dip, T4_PORT_NAME, DEVI_SID_NODEID, &pi->dip);
1811 	if (rc != DDI_SUCCESS || pi->dip == NULL) {
1812 		rc = ENOMEM;
1813 		goto done;
1814 	}
1815 
1816 	(void) ddi_set_parent_data(pi->dip, pi);
1817 	(void) ndi_devi_bind_driver(pi->dip, 0);
1818 	rc = 0;
1819 done:
1820 	PORT_UNLOCK(pi);
1821 	return (rc);
1822 }
1823 
1824 static int
1825 remove_child_node(struct adapter *sc, int idx)
1826 {
1827 	int rc;
1828 	struct port_info *pi;
1829 
1830 	if (idx < 0 || idx >= sc->params.nports)
1831 		return (EINVAL);
1832 
1833 	pi = sc->port[idx];
1834 	if (pi == NULL)
1835 		return (ENODEV);
1836 
1837 	PORT_LOCK(pi);
1838 	if (pi->dip == NULL) {
1839 		rc = ENODEV;
1840 		goto done;
1841 	}
1842 
1843 	rc = ndi_devi_free(pi->dip);
1844 	if (rc == 0)
1845 		pi->dip = NULL;
1846 done:
1847 	PORT_UNLOCK(pi);
1848 	return (rc);
1849 }
1850 
1851 #define	KS_UINIT(x)	kstat_named_init(&kstatp->x, #x, KSTAT_DATA_ULONG)
1852 #define	KS_CINIT(x)	kstat_named_init(&kstatp->x, #x, KSTAT_DATA_CHAR)
1853 #define	KS_U_SET(x, y)	kstatp->x.value.ul = (y)
1854 #define	KS_C_SET(x, ...)	\
1855 			(void) snprintf(kstatp->x.value.c, 16,  __VA_ARGS__)
1856 
1857 /*
1858  * t4nex:X:config
1859  */
1860 struct t4_kstats {
1861 	kstat_named_t chip_ver;
1862 	kstat_named_t fw_vers;
1863 	kstat_named_t tp_vers;
1864 	kstat_named_t driver_version;
1865 	kstat_named_t serial_number;
1866 	kstat_named_t ec_level;
1867 	kstat_named_t id;
1868 	kstat_named_t bus_type;
1869 	kstat_named_t bus_width;
1870 	kstat_named_t bus_speed;
1871 	kstat_named_t core_clock;
1872 	kstat_named_t port_cnt;
1873 	kstat_named_t port_type;
1874 	kstat_named_t pci_vendor_id;
1875 	kstat_named_t pci_device_id;
1876 };
1877 static kstat_t *
1878 setup_kstats(struct adapter *sc)
1879 {
1880 	kstat_t *ksp;
1881 	struct t4_kstats *kstatp;
1882 	int ndata;
1883 	struct pci_params *p = &sc->params.pci;
1884 	struct vpd_params *v = &sc->params.vpd;
1885 	uint16_t pci_vendor, pci_device;
1886 
1887 	ndata = sizeof (struct t4_kstats) / sizeof (kstat_named_t);
1888 
1889 	ksp = kstat_create(T4_NEXUS_NAME, ddi_get_instance(sc->dip), "config",
1890 	    "nexus", KSTAT_TYPE_NAMED, ndata, 0);
1891 	if (ksp == NULL) {
1892 		cxgb_printf(sc->dip, CE_WARN, "failed to initialize kstats.");
1893 		return (NULL);
1894 	}
1895 
1896 	kstatp = (struct t4_kstats *)ksp->ks_data;
1897 
1898 	KS_UINIT(chip_ver);
1899 	KS_CINIT(fw_vers);
1900 	KS_CINIT(tp_vers);
1901 	KS_CINIT(driver_version);
1902 	KS_CINIT(serial_number);
1903 	KS_CINIT(ec_level);
1904 	KS_CINIT(id);
1905 	KS_CINIT(bus_type);
1906 	KS_CINIT(bus_width);
1907 	KS_CINIT(bus_speed);
1908 	KS_UINIT(core_clock);
1909 	KS_UINIT(port_cnt);
1910 	KS_CINIT(port_type);
1911 	KS_CINIT(pci_vendor_id);
1912 	KS_CINIT(pci_device_id);
1913 
1914 	KS_U_SET(chip_ver, sc->params.rev);
1915 	KS_C_SET(fw_vers, "%d.%d.%d.%d",
1916 	    G_FW_HDR_FW_VER_MAJOR(sc->params.fw_vers),
1917 	    G_FW_HDR_FW_VER_MINOR(sc->params.fw_vers),
1918 	    G_FW_HDR_FW_VER_MICRO(sc->params.fw_vers),
1919 	    G_FW_HDR_FW_VER_BUILD(sc->params.fw_vers));
1920 	KS_C_SET(tp_vers, "%d.%d.%d.%d",
1921 	    G_FW_HDR_FW_VER_MAJOR(sc->params.tp_vers),
1922 	    G_FW_HDR_FW_VER_MINOR(sc->params.tp_vers),
1923 	    G_FW_HDR_FW_VER_MICRO(sc->params.tp_vers),
1924 	    G_FW_HDR_FW_VER_BUILD(sc->params.tp_vers));
1925 	KS_C_SET(driver_version, DRV_VERSION);
1926 	KS_C_SET(serial_number, "%s", v->sn);
1927 	KS_C_SET(ec_level, "%s", v->ec);
1928 	KS_C_SET(id, "%s", v->id);
1929 	KS_C_SET(bus_type, "pci-express");
1930 	KS_C_SET(bus_width, "x%d lanes", p->width);
1931 	KS_C_SET(bus_speed, "%d", p->speed);
1932 	KS_U_SET(core_clock, v->cclk);
1933 	KS_U_SET(port_cnt, sc->params.nports);
1934 
1935 	t4_os_pci_read_cfg2(sc, PCI_CONF_VENID, &pci_vendor);
1936 	KS_C_SET(pci_vendor_id, "0x%x", pci_vendor);
1937 
1938 	t4_os_pci_read_cfg2(sc, PCI_CONF_DEVID, &pci_device);
1939 	KS_C_SET(pci_device_id, "0x%x", pci_device);
1940 
1941 #define	PSTR(pi) (pi ? (is_10G_port(pi) ? "10G" : "1G") : "-")
1942 	KS_C_SET(port_type, "%s/%s/%s/%s", PSTR(sc->port[0]), PSTR(sc->port[1]),
1943 	    PSTR(sc->port[2]), PSTR(sc->port[3]));
1944 #undef PSTR
1945 
1946 	/* Do NOT set ksp->ks_update.  These kstats do not change. */
1947 
1948 	/* Install the kstat */
1949 	ksp->ks_private = (void *)sc;
1950 	kstat_install(ksp);
1951 
1952 	return (ksp);
1953 }
1954 
1955 int
1956 adapter_full_init(struct adapter *sc)
1957 {
1958 	int i, rc = 0;
1959 
1960 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1961 
1962 	rc = t4_setup_adapter_queues(sc);
1963 	if (rc != 0)
1964 		goto done;
1965 
1966 	if (sc->intr_cap & DDI_INTR_FLAG_BLOCK)
1967 		(void) ddi_intr_block_enable(sc->intr_handle, sc->intr_count);
1968 	else {
1969 		for (i = 0; i < sc->intr_count; i++)
1970 			(void) ddi_intr_enable(sc->intr_handle[i]);
1971 	}
1972 	t4_intr_enable(sc);
1973 	sc->flags |= FULL_INIT_DONE;
1974 
1975 #ifndef TCP_OFFLOAD_DISABLE
1976 	/* TODO: wrong place to enable TOE capability */
1977 	if (is_offload(sc) != 0) {
1978 		for_each_port(sc, i) {
1979 			struct port_info *pi = sc->port[i];
1980 			rc = toe_capability(pi, 1);
1981 			if (rc != 0) {
1982 				cxgb_printf(pi->dip, CE_WARN,
1983 				    "Failed to activate toe capability: %d",
1984 				    rc);
1985 				rc = 0;		/* not a fatal error */
1986 			}
1987 		}
1988 	}
1989 #endif
1990 
1991 done:
1992 	if (rc != 0)
1993 		(void) adapter_full_uninit(sc);
1994 
1995 	return (rc);
1996 }
1997 
1998 int
1999 adapter_full_uninit(struct adapter *sc)
2000 {
2001 	int i, rc = 0;
2002 
2003 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
2004 
2005 	if (sc->intr_cap & DDI_INTR_FLAG_BLOCK)
2006 		(void) ddi_intr_block_disable(sc->intr_handle, sc->intr_count);
2007 	else {
2008 		for (i = 0; i < sc->intr_count; i++)
2009 			(void) ddi_intr_disable(sc->intr_handle[i]);
2010 	}
2011 
2012 	rc = t4_teardown_adapter_queues(sc);
2013 	if (rc != 0)
2014 		return (rc);
2015 
2016 	sc->flags &= ~FULL_INIT_DONE;
2017 
2018 	return (0);
2019 }
2020 
2021 int
2022 port_full_init(struct port_info *pi)
2023 {
2024 	struct adapter *sc = pi->adapter;
2025 	uint16_t *rss;
2026 	struct sge_rxq *rxq;
2027 	int rc, i;
2028 
2029 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
2030 	ASSERT((pi->flags & PORT_INIT_DONE) == 0);
2031 
2032 	/*
2033 	 * Allocate tx/rx/fl queues for this port.
2034 	 */
2035 	rc = t4_setup_port_queues(pi);
2036 	if (rc != 0)
2037 		goto done;	/* error message displayed already */
2038 
2039 	/*
2040 	 * Setup RSS for this port.
2041 	 */
2042 	rss = kmem_zalloc(pi->nrxq * sizeof (*rss), KM_SLEEP);
2043 	for_each_rxq(pi, i, rxq) {
2044 		rss[i] = rxq->iq.abs_id;
2045 	}
2046 	rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0,
2047 	    pi->rss_size, rss, pi->nrxq);
2048 	kmem_free(rss, pi->nrxq * sizeof (*rss));
2049 	if (rc != 0) {
2050 		cxgb_printf(pi->dip, CE_WARN, "rss_config failed: %d", rc);
2051 		goto done;
2052 	}
2053 
2054 	pi->flags |= PORT_INIT_DONE;
2055 done:
2056 	if (rc != 0)
2057 		(void) port_full_uninit(pi);
2058 
2059 	return (rc);
2060 }
2061 
2062 /*
2063  * Idempotent.
2064  */
2065 int
2066 port_full_uninit(struct port_info *pi)
2067 {
2068 
2069 	ASSERT(pi->flags & PORT_INIT_DONE);
2070 
2071 	(void) t4_teardown_port_queues(pi);
2072 	pi->flags &= ~PORT_INIT_DONE;
2073 
2074 	return (0);
2075 }
2076 
2077 void
2078 enable_port_queues(struct port_info *pi)
2079 {
2080 	struct adapter *sc = pi->adapter;
2081 	int i;
2082 	struct sge_iq *iq;
2083 	struct sge_rxq *rxq;
2084 #ifndef TCP_OFFLOAD_DISABLE
2085 	struct sge_ofld_rxq *ofld_rxq;
2086 #endif
2087 
2088 	ASSERT(pi->flags & PORT_INIT_DONE);
2089 
2090 	/*
2091 	 * TODO: whatever was queued up after we set iq->state to IQS_DISABLED
2092 	 * back in disable_port_queues will be processed now, after an unbounded
2093 	 * delay.  This can't be good.
2094 	 */
2095 
2096 #ifndef TCP_OFFLOAD_DISABLE
2097 	for_each_ofld_rxq(pi, i, ofld_rxq) {
2098 		iq = &ofld_rxq->iq;
2099 		if (atomic_cas_uint(&iq->state, IQS_DISABLED, IQS_IDLE) !=
2100 		    IQS_DISABLED)
2101 			panic("%s: iq %p wasn't disabled", __func__,
2102 			    (void *)iq);
2103 		t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
2104 		    V_SEINTARM(iq->intr_params) | V_INGRESSQID(iq->cntxt_id));
2105 	}
2106 #endif
2107 
2108 	for_each_rxq(pi, i, rxq) {
2109 		iq = &rxq->iq;
2110 		if (atomic_cas_uint(&iq->state, IQS_DISABLED, IQS_IDLE) !=
2111 		    IQS_DISABLED)
2112 			panic("%s: iq %p wasn't disabled", __func__,
2113 			    (void *) iq);
2114 		t4_write_reg(sc, MYPF_REG(A_SGE_PF_GTS),
2115 		    V_SEINTARM(iq->intr_params) | V_INGRESSQID(iq->cntxt_id));
2116 	}
2117 }
2118 
2119 void
2120 disable_port_queues(struct port_info *pi)
2121 {
2122 	int i;
2123 	struct adapter *sc = pi->adapter;
2124 	struct sge_rxq *rxq;
2125 #ifndef TCP_OFFLOAD_DISABLE
2126 	struct sge_ofld_rxq *ofld_rxq;
2127 #endif
2128 
2129 	ASSERT(pi->flags & PORT_INIT_DONE);
2130 
2131 	/*
2132 	 * TODO: need proper implementation for all tx queues (ctrl, eth, ofld).
2133 	 */
2134 
2135 #ifndef TCP_OFFLOAD_DISABLE
2136 	for_each_ofld_rxq(pi, i, ofld_rxq) {
2137 		while (atomic_cas_uint(&ofld_rxq->iq.state, IQS_IDLE,
2138 		    IQS_DISABLED) != IQS_IDLE)
2139 			msleep(1);
2140 	}
2141 #endif
2142 
2143 	for_each_rxq(pi, i, rxq) {
2144 		while (atomic_cas_uint(&rxq->iq.state, IQS_IDLE,
2145 		    IQS_DISABLED) != IQS_IDLE)
2146 			msleep(1);
2147 	}
2148 
2149 	mutex_enter(&sc->sfl_lock);
2150 #ifndef TCP_OFFLOAD_DISABLE
2151 	for_each_ofld_rxq(pi, i, ofld_rxq)
2152 	    ofld_rxq->fl.flags |= FL_DOOMED;
2153 #endif
2154 	for_each_rxq(pi, i, rxq)
2155 	    rxq->fl.flags |= FL_DOOMED;
2156 	mutex_exit(&sc->sfl_lock);
2157 	/* TODO: need to wait for all fl's to be removed from sc->sfl */
2158 }
2159 
2160 void
2161 t4_fatal_err(struct adapter *sc)
2162 {
2163 	t4_set_reg_field(sc, A_SGE_CONTROL, F_GLOBALENABLE, 0);
2164 	t4_intr_disable(sc);
2165 	cxgb_printf(sc->dip, CE_WARN,
2166 	    "encountered fatal error, adapter stopped.");
2167 }
2168 
2169 int
2170 t4_os_find_pci_capability(struct adapter *sc, int cap)
2171 {
2172 	uint16_t stat;
2173 	uint8_t cap_ptr, cap_id;
2174 
2175 	t4_os_pci_read_cfg2(sc, PCI_CONF_STAT, &stat);
2176 	if ((stat & PCI_STAT_CAP) == 0)
2177 		return (0); /* does not implement capabilities */
2178 
2179 	t4_os_pci_read_cfg1(sc, PCI_CONF_CAP_PTR, &cap_ptr);
2180 	while (cap_ptr) {
2181 		t4_os_pci_read_cfg1(sc, cap_ptr + PCI_CAP_ID, &cap_id);
2182 		if (cap_id == cap)
2183 			return (cap_ptr); /* found */
2184 		t4_os_pci_read_cfg1(sc, cap_ptr + PCI_CAP_NEXT_PTR, &cap_ptr);
2185 	}
2186 
2187 	return (0); /* not found */
2188 }
2189 
2190 void
2191 t4_os_portmod_changed(const struct adapter *sc, int idx)
2192 {
2193 	static const char *mod_str[] = {
2194 		NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM"
2195 	};
2196 	const struct port_info *pi = sc->port[idx];
2197 
2198 	if (pi->mod_type == FW_PORT_MOD_TYPE_NONE)
2199 		cxgb_printf(pi->dip, CE_NOTE, "transceiver unplugged.");
2200 	else if (pi->mod_type == FW_PORT_MOD_TYPE_UNKNOWN)
2201 		cxgb_printf(pi->dip, CE_NOTE,
2202 		    "unknown transceiver inserted.\n");
2203 	else if (pi->mod_type == FW_PORT_MOD_TYPE_NOTSUPPORTED)
2204 		cxgb_printf(pi->dip, CE_NOTE,
2205 		    "unsupported transceiver inserted.\n");
2206 	else if (pi->mod_type > 0 && pi->mod_type < ARRAY_SIZE(mod_str))
2207 		cxgb_printf(pi->dip, CE_NOTE, "%s transceiver inserted.\n",
2208 		    mod_str[pi->mod_type]);
2209 	else
2210 		cxgb_printf(pi->dip, CE_NOTE, "transceiver (type %d) inserted.",
2211 		    pi->mod_type);
2212 }
2213 
2214 /* ARGSUSED */
2215 static int
2216 cpl_not_handled(struct sge_iq *iq, const struct rss_header *rss, mblk_t *m)
2217 {
2218 	if (m != NULL)
2219 		freemsg(m);
2220 	return (0);
2221 }
2222 
2223 int
2224 t4_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h)
2225 {
2226 	uint_t *loc, new;
2227 
2228 	if (opcode >= ARRAY_SIZE(sc->cpl_handler))
2229 		return (EINVAL);
2230 
2231 	new = (uint_t)(unsigned long) (h ? h : cpl_not_handled);
2232 	loc = (uint_t *)&sc->cpl_handler[opcode];
2233 	(void) atomic_swap_uint(loc, new);
2234 
2235 	return (0);
2236 }
2237 
2238 #ifndef TCP_OFFLOAD_DISABLE
2239 static int
2240 toe_capability(struct port_info *pi, int enable)
2241 {
2242 	int rc;
2243 	struct adapter *sc = pi->adapter;
2244 
2245 	if (!is_offload(sc))
2246 		return (ENODEV);
2247 
2248 	if (enable != 0) {
2249 		if (isset(&sc->offload_map, pi->port_id) != 0)
2250 			return (0);
2251 
2252 		if (sc->offload_map == 0) {
2253 			rc = activate_uld(sc, ULD_TOM, &sc->tom);
2254 			if (rc != 0)
2255 				return (rc);
2256 		}
2257 
2258 		setbit(&sc->offload_map, pi->port_id);
2259 	} else {
2260 		if (!isset(&sc->offload_map, pi->port_id))
2261 			return (0);
2262 
2263 		clrbit(&sc->offload_map, pi->port_id);
2264 
2265 		if (sc->offload_map == 0) {
2266 			rc = deactivate_uld(&sc->tom);
2267 			if (rc != 0) {
2268 				setbit(&sc->offload_map, pi->port_id);
2269 				return (rc);
2270 			}
2271 		}
2272 	}
2273 
2274 	return (0);
2275 }
2276 
2277 /*
2278  * Add an upper layer driver to the global list.
2279  */
2280 int
2281 t4_register_uld(struct uld_info *ui)
2282 {
2283 	int rc = 0;
2284 	struct uld_info *u;
2285 
2286 	mutex_enter(&t4_uld_list_lock);
2287 	SLIST_FOREACH(u, &t4_uld_list, link) {
2288 		if (u->uld_id == ui->uld_id) {
2289 			rc = EEXIST;
2290 			goto done;
2291 		}
2292 	}
2293 
2294 	SLIST_INSERT_HEAD(&t4_uld_list, ui, link);
2295 	ui->refcount = 0;
2296 done:
2297 	mutex_exit(&t4_uld_list_lock);
2298 	return (rc);
2299 }
2300 
2301 int
2302 t4_unregister_uld(struct uld_info *ui)
2303 {
2304 	int rc = EINVAL;
2305 	struct uld_info *u;
2306 
2307 	mutex_enter(&t4_uld_list_lock);
2308 
2309 	SLIST_FOREACH(u, &t4_uld_list, link) {
2310 		if (u == ui) {
2311 			if (ui->refcount > 0) {
2312 				rc = EBUSY;
2313 				goto done;
2314 			}
2315 
2316 			SLIST_REMOVE(&t4_uld_list, ui, uld_info, link);
2317 			rc = 0;
2318 			goto done;
2319 		}
2320 	}
2321 done:
2322 	mutex_exit(&t4_uld_list_lock);
2323 	return (rc);
2324 }
2325 
2326 static int
2327 activate_uld(struct adapter *sc, int id, struct uld_softc *usc)
2328 {
2329 	int rc = EAGAIN;
2330 	struct uld_info *ui;
2331 
2332 	mutex_enter(&t4_uld_list_lock);
2333 
2334 	SLIST_FOREACH(ui, &t4_uld_list, link) {
2335 		if (ui->uld_id == id) {
2336 			rc = ui->attach(sc, &usc->softc);
2337 			if (rc == 0) {
2338 				ASSERT(usc->softc != NULL);
2339 				ui->refcount++;
2340 				usc->uld = ui;
2341 			}
2342 			goto done;
2343 		}
2344 	}
2345 done:
2346 	mutex_exit(&t4_uld_list_lock);
2347 
2348 	return (rc);
2349 }
2350 
2351 static int
2352 deactivate_uld(struct uld_softc *usc)
2353 {
2354 	int rc;
2355 
2356 	mutex_enter(&t4_uld_list_lock);
2357 
2358 	if (usc->uld == NULL || usc->softc == NULL) {
2359 		rc = EINVAL;
2360 		goto done;
2361 	}
2362 
2363 	rc = usc->uld->detach(usc->softc);
2364 	if (rc == 0) {
2365 		ASSERT(usc->uld->refcount > 0);
2366 		usc->uld->refcount--;
2367 		usc->uld = NULL;
2368 		usc->softc = NULL;
2369 	}
2370 done:
2371 	mutex_exit(&t4_uld_list_lock);
2372 
2373 	return (rc);
2374 }
2375 
2376 void
2377 t4_iterate(void (*func)(int, void *), void *arg)
2378 {
2379 	struct adapter *sc;
2380 
2381 	mutex_enter(&t4_adapter_list_lock);
2382 	SLIST_FOREACH(sc, &t4_adapter_list, link) {
2383 		/*
2384 		 * func should not make any assumptions about what state sc is
2385 		 * in - the only guarantee is that sc->sc_lock is a valid lock.
2386 		 */
2387 		func(ddi_get_instance(sc->dip), arg);
2388 	}
2389 	mutex_exit(&t4_adapter_list_lock);
2390 }
2391 
2392 #endif
2393