xref: /freebsd/sys/dev/cxgb/cxgb_main.c (revision 1b99d52f261bfacfb9bb149d33ed6444364ac219)
1 /**************************************************************************
2 
3 Copyright (c) 2007-2009, Chelsio Inc.
4 All rights reserved.
5 
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8 
9  1. Redistributions of source code must retain the above copyright notice,
10     this list of conditions and the following disclaimer.
11 
12  2. Neither the name of the Chelsio Corporation nor the names of its
13     contributors may be used to endorse or promote products derived from
14     this software without specific prior written permission.
15 
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 POSSIBILITY OF SUCH DAMAGE.
27 
28 ***************************************************************************/
29 
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32 
33 #include "opt_inet.h"
34 
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/kernel.h>
38 #include <sys/bus.h>
39 #include <sys/module.h>
40 #include <sys/pciio.h>
41 #include <sys/conf.h>
42 #include <machine/bus.h>
43 #include <machine/resource.h>
44 #include <sys/ktr.h>
45 #include <sys/rman.h>
46 #include <sys/ioccom.h>
47 #include <sys/mbuf.h>
48 #include <sys/linker.h>
49 #include <sys/firmware.h>
50 #include <sys/socket.h>
51 #include <sys/sockio.h>
52 #include <sys/smp.h>
53 #include <sys/sysctl.h>
54 #include <sys/syslog.h>
55 #include <sys/queue.h>
56 #include <sys/taskqueue.h>
57 #include <sys/proc.h>
58 
59 #include <net/bpf.h>
60 #include <net/ethernet.h>
61 #include <net/if.h>
62 #include <net/if_var.h>
63 #include <net/if_arp.h>
64 #include <net/if_dl.h>
65 #include <net/if_media.h>
66 #include <net/if_types.h>
67 #include <net/if_vlan_var.h>
68 
69 #include <netinet/in_systm.h>
70 #include <netinet/in.h>
71 #include <netinet/if_ether.h>
72 #include <netinet/ip.h>
73 #include <netinet/ip.h>
74 #include <netinet/tcp.h>
75 #include <netinet/udp.h>
76 
77 #include <dev/pci/pcireg.h>
78 #include <dev/pci/pcivar.h>
79 #include <dev/pci/pci_private.h>
80 
81 #include <cxgb_include.h>
82 
83 #ifdef PRIV_SUPPORTED
84 #include <sys/priv.h>
85 #endif
86 
87 static int cxgb_setup_interrupts(adapter_t *);
88 static void cxgb_teardown_interrupts(adapter_t *);
89 static void cxgb_init(void *);
90 static int cxgb_init_locked(struct port_info *);
91 static int cxgb_uninit_locked(struct port_info *);
92 static int cxgb_uninit_synchronized(struct port_info *);
93 static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t);
94 static int cxgb_media_change(struct ifnet *);
95 static int cxgb_ifm_type(int);
96 static void cxgb_build_medialist(struct port_info *);
97 static void cxgb_media_status(struct ifnet *, struct ifmediareq *);
98 static uint64_t cxgb_get_counter(struct ifnet *, ift_counter);
99 static int setup_sge_qsets(adapter_t *);
100 static void cxgb_async_intr(void *);
101 static void cxgb_tick_handler(void *, int);
102 static void cxgb_tick(void *);
103 static void link_check_callout(void *);
104 static void check_link_status(void *, int);
105 static void setup_rss(adapter_t *sc);
106 static int alloc_filters(struct adapter *);
107 static int setup_hw_filters(struct adapter *);
108 static int set_filter(struct adapter *, int, const struct filter_info *);
109 static inline void mk_set_tcb_field(struct cpl_set_tcb_field *, unsigned int,
110     unsigned int, u64, u64);
111 static inline void set_tcb_field_ulp(struct cpl_set_tcb_field *, unsigned int,
112     unsigned int, u64, u64);
113 #ifdef TCP_OFFLOAD
114 static int cpl_not_handled(struct sge_qset *, struct rsp_desc *, struct mbuf *);
115 #endif
116 
117 /* Attachment glue for the PCI controller end of the device.  Each port of
118  * the device is attached separately, as defined later.
119  */
120 static int cxgb_controller_probe(device_t);
121 static int cxgb_controller_attach(device_t);
122 static int cxgb_controller_detach(device_t);
123 static void cxgb_free(struct adapter *);
124 static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
125     unsigned int end);
126 static void cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf);
127 static int cxgb_get_regs_len(void);
128 static void touch_bars(device_t dev);
129 static void cxgb_update_mac_settings(struct port_info *p);
130 #ifdef TCP_OFFLOAD
131 static int toe_capability(struct port_info *, int);
132 #endif
133 
134 static device_method_t cxgb_controller_methods[] = {
135 	DEVMETHOD(device_probe,		cxgb_controller_probe),
136 	DEVMETHOD(device_attach,	cxgb_controller_attach),
137 	DEVMETHOD(device_detach,	cxgb_controller_detach),
138 
139 	DEVMETHOD_END
140 };
141 
142 static driver_t cxgb_controller_driver = {
143 	"cxgbc",
144 	cxgb_controller_methods,
145 	sizeof(struct adapter)
146 };
147 
148 static int cxgbc_mod_event(module_t, int, void *);
149 static devclass_t	cxgb_controller_devclass;
150 DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass,
151     cxgbc_mod_event, 0);
152 MODULE_VERSION(cxgbc, 1);
153 MODULE_DEPEND(cxgbc, firmware, 1, 1, 1);
154 
155 /*
156  * Attachment glue for the ports.  Attachment is done directly to the
157  * controller device.
158  */
159 static int cxgb_port_probe(device_t);
160 static int cxgb_port_attach(device_t);
161 static int cxgb_port_detach(device_t);
162 
163 static device_method_t cxgb_port_methods[] = {
164 	DEVMETHOD(device_probe,		cxgb_port_probe),
165 	DEVMETHOD(device_attach,	cxgb_port_attach),
166 	DEVMETHOD(device_detach,	cxgb_port_detach),
167 	{ 0, 0 }
168 };
169 
170 static driver_t cxgb_port_driver = {
171 	"cxgb",
172 	cxgb_port_methods,
173 	0
174 };
175 
176 static d_ioctl_t cxgb_extension_ioctl;
177 static d_open_t cxgb_extension_open;
178 static d_close_t cxgb_extension_close;
179 
180 static struct cdevsw cxgb_cdevsw = {
181        .d_version =    D_VERSION,
182        .d_flags =      0,
183        .d_open =       cxgb_extension_open,
184        .d_close =      cxgb_extension_close,
185        .d_ioctl =      cxgb_extension_ioctl,
186        .d_name =       "cxgb",
187 };
188 
189 static devclass_t	cxgb_port_devclass;
190 DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
191 MODULE_VERSION(cxgb, 1);
192 
193 static struct mtx t3_list_lock;
194 static SLIST_HEAD(, adapter) t3_list;
195 #ifdef TCP_OFFLOAD
196 static struct mtx t3_uld_list_lock;
197 static SLIST_HEAD(, uld_info) t3_uld_list;
198 #endif
199 
200 /*
201  * The driver uses the best interrupt scheme available on a platform in the
202  * order MSI-X, MSI, legacy pin interrupts.  This parameter determines which
203  * of these schemes the driver may consider as follows:
204  *
205  * msi = 2: choose from among all three options
206  * msi = 1 : only consider MSI and pin interrupts
207  * msi = 0: force pin interrupts
208  */
209 static int msi_allowed = 2;
210 
211 SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD, 0, "CXGB driver parameters");
212 SYSCTL_INT(_hw_cxgb, OID_AUTO, msi_allowed, CTLFLAG_RDTUN, &msi_allowed, 0,
213     "MSI-X, MSI, INTx selector");
214 
215 /*
216  * The driver uses an auto-queue algorithm by default.
217  * To disable it and force a single queue-set per port, use multiq = 0
218  */
219 static int multiq = 1;
220 SYSCTL_INT(_hw_cxgb, OID_AUTO, multiq, CTLFLAG_RDTUN, &multiq, 0,
221     "use min(ncpus/ports, 8) queue-sets per port");
222 
223 /*
224  * By default the driver will not update the firmware unless
225  * it was compiled against a newer version
226  *
227  */
228 static int force_fw_update = 0;
229 SYSCTL_INT(_hw_cxgb, OID_AUTO, force_fw_update, CTLFLAG_RDTUN, &force_fw_update, 0,
230     "update firmware even if up to date");
231 
232 int cxgb_use_16k_clusters = -1;
233 SYSCTL_INT(_hw_cxgb, OID_AUTO, use_16k_clusters, CTLFLAG_RDTUN,
234     &cxgb_use_16k_clusters, 0, "use 16kB clusters for the jumbo queue ");
235 
236 static int nfilters = -1;
237 SYSCTL_INT(_hw_cxgb, OID_AUTO, nfilters, CTLFLAG_RDTUN,
238     &nfilters, 0, "max number of entries in the filter table");
239 
240 enum {
241 	MAX_TXQ_ENTRIES      = 16384,
242 	MAX_CTRL_TXQ_ENTRIES = 1024,
243 	MAX_RSPQ_ENTRIES     = 16384,
244 	MAX_RX_BUFFERS       = 16384,
245 	MAX_RX_JUMBO_BUFFERS = 16384,
246 	MIN_TXQ_ENTRIES      = 4,
247 	MIN_CTRL_TXQ_ENTRIES = 4,
248 	MIN_RSPQ_ENTRIES     = 32,
249 	MIN_FL_ENTRIES       = 32,
250 	MIN_FL_JUMBO_ENTRIES = 32
251 };
252 
253 struct filter_info {
254 	u32 sip;
255 	u32 sip_mask;
256 	u32 dip;
257 	u16 sport;
258 	u16 dport;
259 	u32 vlan:12;
260 	u32 vlan_prio:3;
261 	u32 mac_hit:1;
262 	u32 mac_idx:4;
263 	u32 mac_vld:1;
264 	u32 pkt_type:2;
265 	u32 report_filter_id:1;
266 	u32 pass:1;
267 	u32 rss:1;
268 	u32 qset:3;
269 	u32 locked:1;
270 	u32 valid:1;
271 };
272 
273 enum { FILTER_NO_VLAN_PRI = 7 };
274 
275 #define EEPROM_MAGIC 0x38E2F10C
276 
277 #define PORT_MASK ((1 << MAX_NPORTS) - 1)
278 
279 /* Table for probing the cards.  The desc field isn't actually used */
280 struct cxgb_ident {
281 	uint16_t	vendor;
282 	uint16_t	device;
283 	int		index;
284 	char		*desc;
285 } cxgb_identifiers[] = {
286 	{PCI_VENDOR_ID_CHELSIO, 0x0020, 0, "PE9000"},
287 	{PCI_VENDOR_ID_CHELSIO, 0x0021, 1, "T302E"},
288 	{PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"},
289 	{PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"},
290 	{PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"},
291 	{PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"},
292 	{PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"},
293 	{PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
294 	{PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
295 	{PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
296 	{PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
297 	{PCI_VENDOR_ID_CHELSIO, 0x0035, 6, "T3C10"},
298 	{PCI_VENDOR_ID_CHELSIO, 0x0036, 3, "S320E-CR"},
299 	{PCI_VENDOR_ID_CHELSIO, 0x0037, 7, "N320E-G2"},
300 	{0, 0, 0, NULL}
301 };
302 
303 static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset);
304 
305 
306 static __inline char
307 t3rev2char(struct adapter *adapter)
308 {
309 	char rev = 'z';
310 
311 	switch(adapter->params.rev) {
312 	case T3_REV_A:
313 		rev = 'a';
314 		break;
315 	case T3_REV_B:
316 	case T3_REV_B2:
317 		rev = 'b';
318 		break;
319 	case T3_REV_C:
320 		rev = 'c';
321 		break;
322 	}
323 	return rev;
324 }
325 
326 static struct cxgb_ident *
327 cxgb_get_ident(device_t dev)
328 {
329 	struct cxgb_ident *id;
330 
331 	for (id = cxgb_identifiers; id->desc != NULL; id++) {
332 		if ((id->vendor == pci_get_vendor(dev)) &&
333 		    (id->device == pci_get_device(dev))) {
334 			return (id);
335 		}
336 	}
337 	return (NULL);
338 }
339 
340 static const struct adapter_info *
341 cxgb_get_adapter_info(device_t dev)
342 {
343 	struct cxgb_ident *id;
344 	const struct adapter_info *ai;
345 
346 	id = cxgb_get_ident(dev);
347 	if (id == NULL)
348 		return (NULL);
349 
350 	ai = t3_get_adapter_info(id->index);
351 
352 	return (ai);
353 }
354 
355 static int
356 cxgb_controller_probe(device_t dev)
357 {
358 	const struct adapter_info *ai;
359 	char *ports, buf[80];
360 	int nports;
361 
362 	ai = cxgb_get_adapter_info(dev);
363 	if (ai == NULL)
364 		return (ENXIO);
365 
366 	nports = ai->nports0 + ai->nports1;
367 	if (nports == 1)
368 		ports = "port";
369 	else
370 		ports = "ports";
371 
372 	snprintf(buf, sizeof(buf), "%s, %d %s", ai->desc, nports, ports);
373 	device_set_desc_copy(dev, buf);
374 	return (BUS_PROBE_DEFAULT);
375 }
376 
377 #define FW_FNAME "cxgb_t3fw"
378 #define TPEEPROM_NAME "cxgb_t3%c_tp_eeprom"
379 #define TPSRAM_NAME "cxgb_t3%c_protocol_sram"
380 
381 static int
382 upgrade_fw(adapter_t *sc)
383 {
384 	const struct firmware *fw;
385 	int status;
386 	u32 vers;
387 
388 	if ((fw = firmware_get(FW_FNAME)) == NULL)  {
389 		device_printf(sc->dev, "Could not find firmware image %s\n", FW_FNAME);
390 		return (ENOENT);
391 	} else
392 		device_printf(sc->dev, "installing firmware on card\n");
393 	status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize);
394 
395 	if (status != 0) {
396 		device_printf(sc->dev, "failed to install firmware: %d\n",
397 		    status);
398 	} else {
399 		t3_get_fw_version(sc, &vers);
400 		snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
401 		    G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
402 		    G_FW_VERSION_MICRO(vers));
403 	}
404 
405 	firmware_put(fw, FIRMWARE_UNLOAD);
406 
407 	return (status);
408 }
409 
410 /*
411  * The cxgb_controller_attach function is responsible for the initial
412  * bringup of the device.  Its responsibilities include:
413  *
414  *  1. Determine if the device supports MSI or MSI-X.
415  *  2. Allocate bus resources so that we can access the Base Address Register
416  *  3. Create and initialize mutexes for the controller and its control
417  *     logic such as SGE and MDIO.
418  *  4. Call hardware specific setup routine for the adapter as a whole.
419  *  5. Allocate the BAR for doing MSI-X.
420  *  6. Setup the line interrupt iff MSI-X is not supported.
421  *  7. Create the driver's taskq.
422  *  8. Start one task queue service thread.
423  *  9. Check if the firmware and SRAM are up-to-date.  They will be
424  *     auto-updated later (before FULL_INIT_DONE), if required.
425  * 10. Create a child device for each MAC (port)
426  * 11. Initialize T3 private state.
427  * 12. Trigger the LED
428  * 13. Setup offload iff supported.
429  * 14. Reset/restart the tick callout.
430  * 15. Attach sysctls
431  *
432  * NOTE: Any modification or deviation from this list MUST be reflected in
433  * the above comment.  Failure to do so will result in problems on various
434  * error conditions including link flapping.
435  */
436 static int
437 cxgb_controller_attach(device_t dev)
438 {
439 	device_t child;
440 	const struct adapter_info *ai;
441 	struct adapter *sc;
442 	int i, error = 0;
443 	uint32_t vers;
444 	int port_qsets = 1;
445 	int msi_needed, reg;
446 	char buf[80];
447 
448 	sc = device_get_softc(dev);
449 	sc->dev = dev;
450 	sc->msi_count = 0;
451 	ai = cxgb_get_adapter_info(dev);
452 
453 	snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d",
454 	    device_get_unit(dev));
455 	ADAPTER_LOCK_INIT(sc, sc->lockbuf);
456 
457 	snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d",
458 	    device_get_unit(dev));
459 	snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d",
460 	    device_get_unit(dev));
461 	snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d",
462 	    device_get_unit(dev));
463 
464 	MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_SPIN);
465 	MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF);
466 	MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF);
467 
468 	mtx_lock(&t3_list_lock);
469 	SLIST_INSERT_HEAD(&t3_list, sc, link);
470 	mtx_unlock(&t3_list_lock);
471 
472 	/* find the PCIe link width and set max read request to 4KB*/
473 	if (pci_find_cap(dev, PCIY_EXPRESS, &reg) == 0) {
474 		uint16_t lnk;
475 
476 		lnk = pci_read_config(dev, reg + PCIER_LINK_STA, 2);
477 		sc->link_width = (lnk & PCIEM_LINK_STA_WIDTH) >> 4;
478 		if (sc->link_width < 8 &&
479 		    (ai->caps & SUPPORTED_10000baseT_Full)) {
480 			device_printf(sc->dev,
481 			    "PCIe x%d Link, expect reduced performance\n",
482 			    sc->link_width);
483 		}
484 
485 		pci_set_max_read_req(dev, 4096);
486 	}
487 
488 	touch_bars(dev);
489 	pci_enable_busmaster(dev);
490 	/*
491 	 * Allocate the registers and make them available to the driver.
492 	 * The registers that we care about for NIC mode are in BAR 0
493 	 */
494 	sc->regs_rid = PCIR_BAR(0);
495 	if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
496 	    &sc->regs_rid, RF_ACTIVE)) == NULL) {
497 		device_printf(dev, "Cannot allocate BAR region 0\n");
498 		error = ENXIO;
499 		goto out;
500 	}
501 
502 	sc->bt = rman_get_bustag(sc->regs_res);
503 	sc->bh = rman_get_bushandle(sc->regs_res);
504 	sc->mmio_len = rman_get_size(sc->regs_res);
505 
506 	for (i = 0; i < MAX_NPORTS; i++)
507 		sc->port[i].adapter = sc;
508 
509 	if (t3_prep_adapter(sc, ai, 1) < 0) {
510 		printf("prep adapter failed\n");
511 		error = ENODEV;
512 		goto out;
513 	}
514 
515 	sc->udbs_rid = PCIR_BAR(2);
516 	sc->udbs_res = NULL;
517 	if (is_offload(sc) &&
518 	    ((sc->udbs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
519 		   &sc->udbs_rid, RF_ACTIVE)) == NULL)) {
520 		device_printf(dev, "Cannot allocate BAR region 1\n");
521 		error = ENXIO;
522 		goto out;
523 	}
524 
525         /* Allocate the BAR for doing MSI-X.  If it succeeds, try to allocate
526 	 * enough messages for the queue sets.  If that fails, try falling
527 	 * back to MSI.  If that fails, then try falling back to the legacy
528 	 * interrupt pin model.
529 	 */
530 	sc->msix_regs_rid = 0x20;
531 	if ((msi_allowed >= 2) &&
532 	    (sc->msix_regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
533 	    &sc->msix_regs_rid, RF_ACTIVE)) != NULL) {
534 
535 		if (multiq)
536 			port_qsets = min(SGE_QSETS/sc->params.nports, mp_ncpus);
537 		msi_needed = sc->msi_count = sc->params.nports * port_qsets + 1;
538 
539 		if (pci_msix_count(dev) == 0 ||
540 		    (error = pci_alloc_msix(dev, &sc->msi_count)) != 0 ||
541 		    sc->msi_count != msi_needed) {
542 			device_printf(dev, "alloc msix failed - "
543 				      "msi_count=%d, msi_needed=%d, err=%d; "
544 				      "will try MSI\n", sc->msi_count,
545 				      msi_needed, error);
546 			sc->msi_count = 0;
547 			port_qsets = 1;
548 			pci_release_msi(dev);
549 			bus_release_resource(dev, SYS_RES_MEMORY,
550 			    sc->msix_regs_rid, sc->msix_regs_res);
551 			sc->msix_regs_res = NULL;
552 		} else {
553 			sc->flags |= USING_MSIX;
554 			sc->cxgb_intr = cxgb_async_intr;
555 			device_printf(dev,
556 				      "using MSI-X interrupts (%u vectors)\n",
557 				      sc->msi_count);
558 		}
559 	}
560 
561 	if ((msi_allowed >= 1) && (sc->msi_count == 0)) {
562 		sc->msi_count = 1;
563 		if ((error = pci_alloc_msi(dev, &sc->msi_count)) != 0) {
564 			device_printf(dev, "alloc msi failed - "
565 				      "err=%d; will try INTx\n", error);
566 			sc->msi_count = 0;
567 			port_qsets = 1;
568 			pci_release_msi(dev);
569 		} else {
570 			sc->flags |= USING_MSI;
571 			sc->cxgb_intr = t3_intr_msi;
572 			device_printf(dev, "using MSI interrupts\n");
573 		}
574 	}
575 	if (sc->msi_count == 0) {
576 		device_printf(dev, "using line interrupts\n");
577 		sc->cxgb_intr = t3b_intr;
578 	}
579 
580 	/* Create a private taskqueue thread for handling driver events */
581 	sc->tq = taskqueue_create("cxgb_taskq", M_NOWAIT,
582 	    taskqueue_thread_enqueue, &sc->tq);
583 	if (sc->tq == NULL) {
584 		device_printf(dev, "failed to allocate controller task queue\n");
585 		goto out;
586 	}
587 
588 	taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq",
589 	    device_get_nameunit(dev));
590 	TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc);
591 
592 
593 	/* Create a periodic callout for checking adapter status */
594 	callout_init(&sc->cxgb_tick_ch, 1);
595 
596 	if (t3_check_fw_version(sc) < 0 || force_fw_update) {
597 		/*
598 		 * Warn user that a firmware update will be attempted in init.
599 		 */
600 		device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n",
601 		    FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO);
602 		sc->flags &= ~FW_UPTODATE;
603 	} else {
604 		sc->flags |= FW_UPTODATE;
605 	}
606 
607 	if (t3_check_tpsram_version(sc) < 0) {
608 		/*
609 		 * Warn user that a firmware update will be attempted in init.
610 		 */
611 		device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n",
612 		    t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
613 		sc->flags &= ~TPS_UPTODATE;
614 	} else {
615 		sc->flags |= TPS_UPTODATE;
616 	}
617 
618 	/*
619 	 * Create a child device for each MAC.  The ethernet attachment
620 	 * will be done in these children.
621 	 */
622 	for (i = 0; i < (sc)->params.nports; i++) {
623 		struct port_info *pi;
624 
625 		if ((child = device_add_child(dev, "cxgb", -1)) == NULL) {
626 			device_printf(dev, "failed to add child port\n");
627 			error = EINVAL;
628 			goto out;
629 		}
630 		pi = &sc->port[i];
631 		pi->adapter = sc;
632 		pi->nqsets = port_qsets;
633 		pi->first_qset = i*port_qsets;
634 		pi->port_id = i;
635 		pi->tx_chan = i >= ai->nports0;
636 		pi->txpkt_intf = pi->tx_chan ? 2 * (i - ai->nports0) + 1 : 2 * i;
637 		sc->rxpkt_map[pi->txpkt_intf] = i;
638 		sc->port[i].tx_chan = i >= ai->nports0;
639 		sc->portdev[i] = child;
640 		device_set_softc(child, pi);
641 	}
642 	if ((error = bus_generic_attach(dev)) != 0)
643 		goto out;
644 
645 	/* initialize sge private state */
646 	t3_sge_init_adapter(sc);
647 
648 	t3_led_ready(sc);
649 
650 	error = t3_get_fw_version(sc, &vers);
651 	if (error)
652 		goto out;
653 
654 	snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
655 	    G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
656 	    G_FW_VERSION_MICRO(vers));
657 
658 	snprintf(buf, sizeof(buf), "%s %sNIC\t E/C: %s S/N: %s",
659 		 ai->desc, is_offload(sc) ? "R" : "",
660 		 sc->params.vpd.ec, sc->params.vpd.sn);
661 	device_set_desc_copy(dev, buf);
662 
663 	snprintf(&sc->port_types[0], sizeof(sc->port_types), "%x%x%x%x",
664 		 sc->params.vpd.port_type[0], sc->params.vpd.port_type[1],
665 		 sc->params.vpd.port_type[2], sc->params.vpd.port_type[3]);
666 
667 	device_printf(sc->dev, "Firmware Version %s\n", &sc->fw_version[0]);
668 	callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
669 	t3_add_attach_sysctls(sc);
670 
671 #ifdef TCP_OFFLOAD
672 	for (i = 0; i < NUM_CPL_HANDLERS; i++)
673 		sc->cpl_handler[i] = cpl_not_handled;
674 #endif
675 
676 	t3_intr_clear(sc);
677 	error = cxgb_setup_interrupts(sc);
678 out:
679 	if (error)
680 		cxgb_free(sc);
681 
682 	return (error);
683 }
684 
685 /*
686  * The cxgb_controller_detach routine is called with the device is
687  * unloaded from the system.
688  */
689 
690 static int
691 cxgb_controller_detach(device_t dev)
692 {
693 	struct adapter *sc;
694 
695 	sc = device_get_softc(dev);
696 
697 	cxgb_free(sc);
698 
699 	return (0);
700 }
701 
702 /*
703  * The cxgb_free() is called by the cxgb_controller_detach() routine
704  * to tear down the structures that were built up in
705  * cxgb_controller_attach(), and should be the final piece of work
706  * done when fully unloading the driver.
707  *
708  *
709  *  1. Shutting down the threads started by the cxgb_controller_attach()
710  *     routine.
711  *  2. Stopping the lower level device and all callouts (cxgb_down_locked()).
712  *  3. Detaching all of the port devices created during the
713  *     cxgb_controller_attach() routine.
714  *  4. Removing the device children created via cxgb_controller_attach().
715  *  5. Releasing PCI resources associated with the device.
716  *  6. Turning off the offload support, iff it was turned on.
717  *  7. Destroying the mutexes created in cxgb_controller_attach().
718  *
719  */
720 static void
721 cxgb_free(struct adapter *sc)
722 {
723 	int i, nqsets = 0;
724 
725 	ADAPTER_LOCK(sc);
726 	sc->flags |= CXGB_SHUTDOWN;
727 	ADAPTER_UNLOCK(sc);
728 
729 	/*
730 	 * Make sure all child devices are gone.
731 	 */
732 	bus_generic_detach(sc->dev);
733 	for (i = 0; i < (sc)->params.nports; i++) {
734 		if (sc->portdev[i] &&
735 		    device_delete_child(sc->dev, sc->portdev[i]) != 0)
736 			device_printf(sc->dev, "failed to delete child port\n");
737 		nqsets += sc->port[i].nqsets;
738 	}
739 
740 	/*
741 	 * At this point, it is as if cxgb_port_detach has run on all ports, and
742 	 * cxgb_down has run on the adapter.  All interrupts have been silenced,
743 	 * all open devices have been closed.
744 	 */
745 	KASSERT(sc->open_device_map == 0, ("%s: device(s) still open (%x)",
746 					   __func__, sc->open_device_map));
747 	for (i = 0; i < sc->params.nports; i++) {
748 		KASSERT(sc->port[i].ifp == NULL, ("%s: port %i undead!",
749 						  __func__, i));
750 	}
751 
752 	/*
753 	 * Finish off the adapter's callouts.
754 	 */
755 	callout_drain(&sc->cxgb_tick_ch);
756 	callout_drain(&sc->sge_timer_ch);
757 
758 	/*
759 	 * Release resources grabbed under FULL_INIT_DONE by cxgb_up.  The
760 	 * sysctls are cleaned up by the kernel linker.
761 	 */
762 	if (sc->flags & FULL_INIT_DONE) {
763  		t3_free_sge_resources(sc, nqsets);
764  		sc->flags &= ~FULL_INIT_DONE;
765  	}
766 
767 	/*
768 	 * Release all interrupt resources.
769 	 */
770 	cxgb_teardown_interrupts(sc);
771 	if (sc->flags & (USING_MSI | USING_MSIX)) {
772 		device_printf(sc->dev, "releasing msi message(s)\n");
773 		pci_release_msi(sc->dev);
774 	} else {
775 		device_printf(sc->dev, "no msi message to release\n");
776 	}
777 
778 	if (sc->msix_regs_res != NULL) {
779 		bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid,
780 		    sc->msix_regs_res);
781 	}
782 
783 	/*
784 	 * Free the adapter's taskqueue.
785 	 */
786 	if (sc->tq != NULL) {
787 		taskqueue_free(sc->tq);
788 		sc->tq = NULL;
789 	}
790 
791 	free(sc->filters, M_DEVBUF);
792 	t3_sge_free(sc);
793 
794 	if (sc->udbs_res != NULL)
795 		bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->udbs_rid,
796 		    sc->udbs_res);
797 
798 	if (sc->regs_res != NULL)
799 		bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
800 		    sc->regs_res);
801 
802 	MTX_DESTROY(&sc->mdio_lock);
803 	MTX_DESTROY(&sc->sge.reg_lock);
804 	MTX_DESTROY(&sc->elmer_lock);
805 	mtx_lock(&t3_list_lock);
806 	SLIST_REMOVE(&t3_list, sc, adapter, link);
807 	mtx_unlock(&t3_list_lock);
808 	ADAPTER_LOCK_DEINIT(sc);
809 }
810 
811 /**
812  *	setup_sge_qsets - configure SGE Tx/Rx/response queues
813  *	@sc: the controller softc
814  *
815  *	Determines how many sets of SGE queues to use and initializes them.
816  *	We support multiple queue sets per port if we have MSI-X, otherwise
817  *	just one queue set per port.
818  */
819 static int
820 setup_sge_qsets(adapter_t *sc)
821 {
822 	int i, j, err, irq_idx = 0, qset_idx = 0;
823 	u_int ntxq = SGE_TXQ_PER_SET;
824 
825 	if ((err = t3_sge_alloc(sc)) != 0) {
826 		device_printf(sc->dev, "t3_sge_alloc returned %d\n", err);
827 		return (err);
828 	}
829 
830 	if (sc->params.rev > 0 && !(sc->flags & USING_MSI))
831 		irq_idx = -1;
832 
833 	for (i = 0; i < (sc)->params.nports; i++) {
834 		struct port_info *pi = &sc->port[i];
835 
836 		for (j = 0; j < pi->nqsets; j++, qset_idx++) {
837 			err = t3_sge_alloc_qset(sc, qset_idx, (sc)->params.nports,
838 			    (sc->flags & USING_MSIX) ? qset_idx + 1 : irq_idx,
839 			    &sc->params.sge.qset[qset_idx], ntxq, pi);
840 			if (err) {
841 				t3_free_sge_resources(sc, qset_idx);
842 				device_printf(sc->dev,
843 				    "t3_sge_alloc_qset failed with %d\n", err);
844 				return (err);
845 			}
846 		}
847 	}
848 
849 	return (0);
850 }
851 
852 static void
853 cxgb_teardown_interrupts(adapter_t *sc)
854 {
855 	int i;
856 
857 	for (i = 0; i < SGE_QSETS; i++) {
858 		if (sc->msix_intr_tag[i] == NULL) {
859 
860 			/* Should have been setup fully or not at all */
861 			KASSERT(sc->msix_irq_res[i] == NULL &&
862 				sc->msix_irq_rid[i] == 0,
863 				("%s: half-done interrupt (%d).", __func__, i));
864 
865 			continue;
866 		}
867 
868 		bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
869 				  sc->msix_intr_tag[i]);
870 		bus_release_resource(sc->dev, SYS_RES_IRQ, sc->msix_irq_rid[i],
871 				     sc->msix_irq_res[i]);
872 
873 		sc->msix_irq_res[i] = sc->msix_intr_tag[i] = NULL;
874 		sc->msix_irq_rid[i] = 0;
875 	}
876 
877 	if (sc->intr_tag) {
878 		KASSERT(sc->irq_res != NULL,
879 			("%s: half-done interrupt.", __func__));
880 
881 		bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
882 		bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
883 				     sc->irq_res);
884 
885 		sc->irq_res = sc->intr_tag = NULL;
886 		sc->irq_rid = 0;
887 	}
888 }
889 
890 static int
891 cxgb_setup_interrupts(adapter_t *sc)
892 {
893 	struct resource *res;
894 	void *tag;
895 	int i, rid, err, intr_flag = sc->flags & (USING_MSI | USING_MSIX);
896 
897 	sc->irq_rid = intr_flag ? 1 : 0;
898 	sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &sc->irq_rid,
899 					     RF_SHAREABLE | RF_ACTIVE);
900 	if (sc->irq_res == NULL) {
901 		device_printf(sc->dev, "Cannot allocate interrupt (%x, %u)\n",
902 			      intr_flag, sc->irq_rid);
903 		err = EINVAL;
904 		sc->irq_rid = 0;
905 	} else {
906 		err = bus_setup_intr(sc->dev, sc->irq_res,
907 		    INTR_MPSAFE | INTR_TYPE_NET, NULL,
908 		    sc->cxgb_intr, sc, &sc->intr_tag);
909 
910 		if (err) {
911 			device_printf(sc->dev,
912 				      "Cannot set up interrupt (%x, %u, %d)\n",
913 				      intr_flag, sc->irq_rid, err);
914 			bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
915 					     sc->irq_res);
916 			sc->irq_res = sc->intr_tag = NULL;
917 			sc->irq_rid = 0;
918 		}
919 	}
920 
921 	/* That's all for INTx or MSI */
922 	if (!(intr_flag & USING_MSIX) || err)
923 		return (err);
924 
925 	bus_describe_intr(sc->dev, sc->irq_res, sc->intr_tag, "err");
926 	for (i = 0; i < sc->msi_count - 1; i++) {
927 		rid = i + 2;
928 		res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &rid,
929 					     RF_SHAREABLE | RF_ACTIVE);
930 		if (res == NULL) {
931 			device_printf(sc->dev, "Cannot allocate interrupt "
932 				      "for message %d\n", rid);
933 			err = EINVAL;
934 			break;
935 		}
936 
937 		err = bus_setup_intr(sc->dev, res, INTR_MPSAFE | INTR_TYPE_NET,
938 				     NULL, t3_intr_msix, &sc->sge.qs[i], &tag);
939 		if (err) {
940 			device_printf(sc->dev, "Cannot set up interrupt "
941 				      "for message %d (%d)\n", rid, err);
942 			bus_release_resource(sc->dev, SYS_RES_IRQ, rid, res);
943 			break;
944 		}
945 
946 		sc->msix_irq_rid[i] = rid;
947 		sc->msix_irq_res[i] = res;
948 		sc->msix_intr_tag[i] = tag;
949 		bus_describe_intr(sc->dev, res, tag, "qs%d", i);
950 	}
951 
952 	if (err)
953 		cxgb_teardown_interrupts(sc);
954 
955 	return (err);
956 }
957 
958 
959 static int
960 cxgb_port_probe(device_t dev)
961 {
962 	struct port_info *p;
963 	char buf[80];
964 	const char *desc;
965 
966 	p = device_get_softc(dev);
967 	desc = p->phy.desc;
968 	snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, desc);
969 	device_set_desc_copy(dev, buf);
970 	return (0);
971 }
972 
973 
974 static int
975 cxgb_makedev(struct port_info *pi)
976 {
977 
978 	pi->port_cdev = make_dev(&cxgb_cdevsw, pi->ifp->if_dunit,
979 	    UID_ROOT, GID_WHEEL, 0600, "%s", if_name(pi->ifp));
980 
981 	if (pi->port_cdev == NULL)
982 		return (ENOMEM);
983 
984 	pi->port_cdev->si_drv1 = (void *)pi;
985 
986 	return (0);
987 }
988 
989 #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \
990     IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \
991     IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6)
992 #define CXGB_CAP_ENABLE CXGB_CAP
993 
994 static int
995 cxgb_port_attach(device_t dev)
996 {
997 	struct port_info *p;
998 	struct ifnet *ifp;
999 	int err;
1000 	struct adapter *sc;
1001 
1002 	p = device_get_softc(dev);
1003 	sc = p->adapter;
1004 	snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
1005 	    device_get_unit(device_get_parent(dev)), p->port_id);
1006 	PORT_LOCK_INIT(p, p->lockbuf);
1007 
1008 	callout_init(&p->link_check_ch, 1);
1009 	TASK_INIT(&p->link_check_task, 0, check_link_status, p);
1010 
1011 	/* Allocate an ifnet object and set it up */
1012 	ifp = p->ifp = if_alloc(IFT_ETHER);
1013 	if (ifp == NULL) {
1014 		device_printf(dev, "Cannot allocate ifnet\n");
1015 		return (ENOMEM);
1016 	}
1017 
1018 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1019 	ifp->if_init = cxgb_init;
1020 	ifp->if_softc = p;
1021 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1022 	ifp->if_ioctl = cxgb_ioctl;
1023 	ifp->if_transmit = cxgb_transmit;
1024 	ifp->if_qflush = cxgb_qflush;
1025 	ifp->if_get_counter = cxgb_get_counter;
1026 
1027 	ifp->if_capabilities = CXGB_CAP;
1028 #ifdef TCP_OFFLOAD
1029 	if (is_offload(sc))
1030 		ifp->if_capabilities |= IFCAP_TOE4;
1031 #endif
1032 	ifp->if_capenable = CXGB_CAP_ENABLE;
1033 	ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO |
1034 	    CSUM_UDP_IPV6 | CSUM_TCP_IPV6;
1035 
1036 	/*
1037 	 * Disable TSO on 4-port - it isn't supported by the firmware.
1038 	 */
1039 	if (sc->params.nports > 2) {
1040 		ifp->if_capabilities &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1041 		ifp->if_capenable &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1042 		ifp->if_hwassist &= ~CSUM_TSO;
1043 	}
1044 
1045 	ether_ifattach(ifp, p->hw_addr);
1046 
1047 #ifdef DEFAULT_JUMBO
1048 	if (sc->params.nports <= 2)
1049 		ifp->if_mtu = ETHERMTU_JUMBO;
1050 #endif
1051 	if ((err = cxgb_makedev(p)) != 0) {
1052 		printf("makedev failed %d\n", err);
1053 		return (err);
1054 	}
1055 
1056 	/* Create a list of media supported by this port */
1057 	ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
1058 	    cxgb_media_status);
1059 	cxgb_build_medialist(p);
1060 
1061 	t3_sge_init_port(p);
1062 
1063 	return (err);
1064 }
1065 
1066 /*
1067  * cxgb_port_detach() is called via the device_detach methods when
1068  * cxgb_free() calls the bus_generic_detach.  It is responsible for
1069  * removing the device from the view of the kernel, i.e. from all
1070  * interfaces lists etc.  This routine is only called when the driver is
1071  * being unloaded, not when the link goes down.
1072  */
1073 static int
1074 cxgb_port_detach(device_t dev)
1075 {
1076 	struct port_info *p;
1077 	struct adapter *sc;
1078 	int i;
1079 
1080 	p = device_get_softc(dev);
1081 	sc = p->adapter;
1082 
1083 	/* Tell cxgb_ioctl and if_init that the port is going away */
1084 	ADAPTER_LOCK(sc);
1085 	SET_DOOMED(p);
1086 	wakeup(&sc->flags);
1087 	while (IS_BUSY(sc))
1088 		mtx_sleep(&sc->flags, &sc->lock, 0, "cxgbdtch", 0);
1089 	SET_BUSY(sc);
1090 	ADAPTER_UNLOCK(sc);
1091 
1092 	if (p->port_cdev != NULL)
1093 		destroy_dev(p->port_cdev);
1094 
1095 	cxgb_uninit_synchronized(p);
1096 	ether_ifdetach(p->ifp);
1097 
1098 	for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
1099 		struct sge_qset *qs = &sc->sge.qs[i];
1100 		struct sge_txq *txq = &qs->txq[TXQ_ETH];
1101 
1102 		callout_drain(&txq->txq_watchdog);
1103 		callout_drain(&txq->txq_timer);
1104 	}
1105 
1106 	PORT_LOCK_DEINIT(p);
1107 	if_free(p->ifp);
1108 	p->ifp = NULL;
1109 
1110 	ADAPTER_LOCK(sc);
1111 	CLR_BUSY(sc);
1112 	wakeup_one(&sc->flags);
1113 	ADAPTER_UNLOCK(sc);
1114 	return (0);
1115 }
1116 
1117 void
1118 t3_fatal_err(struct adapter *sc)
1119 {
1120 	u_int fw_status[4];
1121 
1122 	if (sc->flags & FULL_INIT_DONE) {
1123 		t3_sge_stop(sc);
1124 		t3_write_reg(sc, A_XGM_TX_CTRL, 0);
1125 		t3_write_reg(sc, A_XGM_RX_CTRL, 0);
1126 		t3_write_reg(sc, XGM_REG(A_XGM_TX_CTRL, 1), 0);
1127 		t3_write_reg(sc, XGM_REG(A_XGM_RX_CTRL, 1), 0);
1128 		t3_intr_disable(sc);
1129 	}
1130 	device_printf(sc->dev,"encountered fatal error, operation suspended\n");
1131 	if (!t3_cim_ctl_blk_read(sc, 0xa0, 4, fw_status))
1132 		device_printf(sc->dev, "FW_ status: 0x%x, 0x%x, 0x%x, 0x%x\n",
1133 		    fw_status[0], fw_status[1], fw_status[2], fw_status[3]);
1134 }
1135 
1136 int
1137 t3_os_find_pci_capability(adapter_t *sc, int cap)
1138 {
1139 	device_t dev;
1140 	struct pci_devinfo *dinfo;
1141 	pcicfgregs *cfg;
1142 	uint32_t status;
1143 	uint8_t ptr;
1144 
1145 	dev = sc->dev;
1146 	dinfo = device_get_ivars(dev);
1147 	cfg = &dinfo->cfg;
1148 
1149 	status = pci_read_config(dev, PCIR_STATUS, 2);
1150 	if (!(status & PCIM_STATUS_CAPPRESENT))
1151 		return (0);
1152 
1153 	switch (cfg->hdrtype & PCIM_HDRTYPE) {
1154 	case 0:
1155 	case 1:
1156 		ptr = PCIR_CAP_PTR;
1157 		break;
1158 	case 2:
1159 		ptr = PCIR_CAP_PTR_2;
1160 		break;
1161 	default:
1162 		return (0);
1163 		break;
1164 	}
1165 	ptr = pci_read_config(dev, ptr, 1);
1166 
1167 	while (ptr != 0) {
1168 		if (pci_read_config(dev, ptr + PCICAP_ID, 1) == cap)
1169 			return (ptr);
1170 		ptr = pci_read_config(dev, ptr + PCICAP_NEXTPTR, 1);
1171 	}
1172 
1173 	return (0);
1174 }
1175 
1176 int
1177 t3_os_pci_save_state(struct adapter *sc)
1178 {
1179 	device_t dev;
1180 	struct pci_devinfo *dinfo;
1181 
1182 	dev = sc->dev;
1183 	dinfo = device_get_ivars(dev);
1184 
1185 	pci_cfg_save(dev, dinfo, 0);
1186 	return (0);
1187 }
1188 
1189 int
1190 t3_os_pci_restore_state(struct adapter *sc)
1191 {
1192 	device_t dev;
1193 	struct pci_devinfo *dinfo;
1194 
1195 	dev = sc->dev;
1196 	dinfo = device_get_ivars(dev);
1197 
1198 	pci_cfg_restore(dev, dinfo);
1199 	return (0);
1200 }
1201 
1202 /**
1203  *	t3_os_link_changed - handle link status changes
1204  *	@sc: the adapter associated with the link change
1205  *	@port_id: the port index whose link status has changed
1206  *	@link_status: the new status of the link
1207  *	@speed: the new speed setting
1208  *	@duplex: the new duplex setting
1209  *	@fc: the new flow-control setting
1210  *
1211  *	This is the OS-dependent handler for link status changes.  The OS
1212  *	neutral handler takes care of most of the processing for these events,
1213  *	then calls this handler for any OS-specific processing.
1214  */
1215 void
1216 t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
1217      int duplex, int fc, int mac_was_reset)
1218 {
1219 	struct port_info *pi = &adapter->port[port_id];
1220 	struct ifnet *ifp = pi->ifp;
1221 
1222 	/* no race with detach, so ifp should always be good */
1223 	KASSERT(ifp, ("%s: if detached.", __func__));
1224 
1225 	/* Reapply mac settings if they were lost due to a reset */
1226 	if (mac_was_reset) {
1227 		PORT_LOCK(pi);
1228 		cxgb_update_mac_settings(pi);
1229 		PORT_UNLOCK(pi);
1230 	}
1231 
1232 	if (link_status) {
1233 		ifp->if_baudrate = IF_Mbps(speed);
1234 		if_link_state_change(ifp, LINK_STATE_UP);
1235 	} else
1236 		if_link_state_change(ifp, LINK_STATE_DOWN);
1237 }
1238 
1239 /**
1240  *	t3_os_phymod_changed - handle PHY module changes
1241  *	@phy: the PHY reporting the module change
1242  *	@mod_type: new module type
1243  *
1244  *	This is the OS-dependent handler for PHY module changes.  It is
1245  *	invoked when a PHY module is removed or inserted for any OS-specific
1246  *	processing.
1247  */
1248 void t3_os_phymod_changed(struct adapter *adap, int port_id)
1249 {
1250 	static const char *mod_str[] = {
1251 		NULL, "SR", "LR", "LRM", "TWINAX", "TWINAX-L", "unknown"
1252 	};
1253 	struct port_info *pi = &adap->port[port_id];
1254 	int mod = pi->phy.modtype;
1255 
1256 	if (mod != pi->media.ifm_cur->ifm_data)
1257 		cxgb_build_medialist(pi);
1258 
1259 	if (mod == phy_modtype_none)
1260 		if_printf(pi->ifp, "PHY module unplugged\n");
1261 	else {
1262 		KASSERT(mod < ARRAY_SIZE(mod_str),
1263 			("invalid PHY module type %d", mod));
1264 		if_printf(pi->ifp, "%s PHY module inserted\n", mod_str[mod]);
1265 	}
1266 }
1267 
1268 void
1269 t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[])
1270 {
1271 
1272 	/*
1273 	 * The ifnet might not be allocated before this gets called,
1274 	 * as this is called early on in attach by t3_prep_adapter
1275 	 * save the address off in the port structure
1276 	 */
1277 	if (cxgb_debug)
1278 		printf("set_hw_addr on idx %d addr %6D\n", port_idx, hw_addr, ":");
1279 	bcopy(hw_addr, adapter->port[port_idx].hw_addr, ETHER_ADDR_LEN);
1280 }
1281 
1282 /*
1283  * Programs the XGMAC based on the settings in the ifnet.  These settings
1284  * include MTU, MAC address, mcast addresses, etc.
1285  */
1286 static void
1287 cxgb_update_mac_settings(struct port_info *p)
1288 {
1289 	struct ifnet *ifp = p->ifp;
1290 	struct t3_rx_mode rm;
1291 	struct cmac *mac = &p->mac;
1292 	int mtu, hwtagging;
1293 
1294 	PORT_LOCK_ASSERT_OWNED(p);
1295 
1296 	bcopy(IF_LLADDR(ifp), p->hw_addr, ETHER_ADDR_LEN);
1297 
1298 	mtu = ifp->if_mtu;
1299 	if (ifp->if_capenable & IFCAP_VLAN_MTU)
1300 		mtu += ETHER_VLAN_ENCAP_LEN;
1301 
1302 	hwtagging = (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0;
1303 
1304 	t3_mac_set_mtu(mac, mtu);
1305 	t3_set_vlan_accel(p->adapter, 1 << p->tx_chan, hwtagging);
1306 	t3_mac_set_address(mac, 0, p->hw_addr);
1307 	t3_init_rx_mode(&rm, p);
1308 	t3_mac_set_rx_mode(mac, &rm);
1309 }
1310 
1311 
1312 static int
1313 await_mgmt_replies(struct adapter *adap, unsigned long init_cnt,
1314 			      unsigned long n)
1315 {
1316 	int attempts = 5;
1317 
1318 	while (adap->sge.qs[0].rspq.offload_pkts < init_cnt + n) {
1319 		if (!--attempts)
1320 			return (ETIMEDOUT);
1321 		t3_os_sleep(10);
1322 	}
1323 	return 0;
1324 }
1325 
1326 static int
1327 init_tp_parity(struct adapter *adap)
1328 {
1329 	int i;
1330 	struct mbuf *m;
1331 	struct cpl_set_tcb_field *greq;
1332 	unsigned long cnt = adap->sge.qs[0].rspq.offload_pkts;
1333 
1334 	t3_tp_set_offload_mode(adap, 1);
1335 
1336 	for (i = 0; i < 16; i++) {
1337 		struct cpl_smt_write_req *req;
1338 
1339 		m = m_gethdr(M_WAITOK, MT_DATA);
1340 		req = mtod(m, struct cpl_smt_write_req *);
1341 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1342 		memset(req, 0, sizeof(*req));
1343 		req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1344 		OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i));
1345 		req->iff = i;
1346 		t3_mgmt_tx(adap, m);
1347 	}
1348 
1349 	for (i = 0; i < 2048; i++) {
1350 		struct cpl_l2t_write_req *req;
1351 
1352 		m = m_gethdr(M_WAITOK, MT_DATA);
1353 		req = mtod(m, struct cpl_l2t_write_req *);
1354 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1355 		memset(req, 0, sizeof(*req));
1356 		req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1357 		OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, i));
1358 		req->params = htonl(V_L2T_W_IDX(i));
1359 		t3_mgmt_tx(adap, m);
1360 	}
1361 
1362 	for (i = 0; i < 2048; i++) {
1363 		struct cpl_rte_write_req *req;
1364 
1365 		m = m_gethdr(M_WAITOK, MT_DATA);
1366 		req = mtod(m, struct cpl_rte_write_req *);
1367 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1368 		memset(req, 0, sizeof(*req));
1369 		req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1370 		OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RTE_WRITE_REQ, i));
1371 		req->l2t_idx = htonl(V_L2T_W_IDX(i));
1372 		t3_mgmt_tx(adap, m);
1373 	}
1374 
1375 	m = m_gethdr(M_WAITOK, MT_DATA);
1376 	greq = mtod(m, struct cpl_set_tcb_field *);
1377 	m->m_len = m->m_pkthdr.len = sizeof(*greq);
1378 	memset(greq, 0, sizeof(*greq));
1379 	greq->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1380 	OPCODE_TID(greq) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, 0));
1381 	greq->mask = htobe64(1);
1382 	t3_mgmt_tx(adap, m);
1383 
1384 	i = await_mgmt_replies(adap, cnt, 16 + 2048 + 2048 + 1);
1385 	t3_tp_set_offload_mode(adap, 0);
1386 	return (i);
1387 }
1388 
1389 /**
1390  *	setup_rss - configure Receive Side Steering (per-queue connection demux)
1391  *	@adap: the adapter
1392  *
1393  *	Sets up RSS to distribute packets to multiple receive queues.  We
1394  *	configure the RSS CPU lookup table to distribute to the number of HW
1395  *	receive queues, and the response queue lookup table to narrow that
1396  *	down to the response queues actually configured for each port.
1397  *	We always configure the RSS mapping for two ports since the mapping
1398  *	table has plenty of entries.
1399  */
1400 static void
1401 setup_rss(adapter_t *adap)
1402 {
1403 	int i;
1404 	u_int nq[2];
1405 	uint8_t cpus[SGE_QSETS + 1];
1406 	uint16_t rspq_map[RSS_TABLE_SIZE];
1407 
1408 	for (i = 0; i < SGE_QSETS; ++i)
1409 		cpus[i] = i;
1410 	cpus[SGE_QSETS] = 0xff;
1411 
1412 	nq[0] = nq[1] = 0;
1413 	for_each_port(adap, i) {
1414 		const struct port_info *pi = adap2pinfo(adap, i);
1415 
1416 		nq[pi->tx_chan] += pi->nqsets;
1417 	}
1418 	for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) {
1419 		rspq_map[i] = nq[0] ? i % nq[0] : 0;
1420 		rspq_map[i + RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0;
1421 	}
1422 
1423 	/* Calculate the reverse RSS map table */
1424 	for (i = 0; i < SGE_QSETS; ++i)
1425 		adap->rrss_map[i] = 0xff;
1426 	for (i = 0; i < RSS_TABLE_SIZE; ++i)
1427 		if (adap->rrss_map[rspq_map[i]] == 0xff)
1428 			adap->rrss_map[rspq_map[i]] = i;
1429 
1430 	t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN |
1431 		      F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN |
1432 	              F_RRCPLMAPEN | V_RRCPLCPUSIZE(6) | F_HASHTOEPLITZ,
1433 	              cpus, rspq_map);
1434 
1435 }
1436 static void
1437 send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo,
1438 			      int hi, int port)
1439 {
1440 	struct mbuf *m;
1441 	struct mngt_pktsched_wr *req;
1442 
1443 	m = m_gethdr(M_NOWAIT, MT_DATA);
1444 	if (m) {
1445 		req = mtod(m, struct mngt_pktsched_wr *);
1446 		req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT));
1447 		req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET;
1448 		req->sched = sched;
1449 		req->idx = qidx;
1450 		req->min = lo;
1451 		req->max = hi;
1452 		req->binding = port;
1453 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1454 		t3_mgmt_tx(adap, m);
1455 	}
1456 }
1457 
1458 static void
1459 bind_qsets(adapter_t *sc)
1460 {
1461 	int i, j;
1462 
1463 	for (i = 0; i < (sc)->params.nports; ++i) {
1464 		const struct port_info *pi = adap2pinfo(sc, i);
1465 
1466 		for (j = 0; j < pi->nqsets; ++j) {
1467 			send_pktsched_cmd(sc, 1, pi->first_qset + j, -1,
1468 					  -1, pi->tx_chan);
1469 
1470 		}
1471 	}
1472 }
1473 
1474 static void
1475 update_tpeeprom(struct adapter *adap)
1476 {
1477 	const struct firmware *tpeeprom;
1478 
1479 	uint32_t version;
1480 	unsigned int major, minor;
1481 	int ret, len;
1482 	char rev, name[32];
1483 
1484 	t3_seeprom_read(adap, TP_SRAM_OFFSET, &version);
1485 
1486 	major = G_TP_VERSION_MAJOR(version);
1487 	minor = G_TP_VERSION_MINOR(version);
1488 	if (major == TP_VERSION_MAJOR  && minor == TP_VERSION_MINOR)
1489 		return;
1490 
1491 	rev = t3rev2char(adap);
1492 	snprintf(name, sizeof(name), TPEEPROM_NAME, rev);
1493 
1494 	tpeeprom = firmware_get(name);
1495 	if (tpeeprom == NULL) {
1496 		device_printf(adap->dev,
1497 			      "could not load TP EEPROM: unable to load %s\n",
1498 			      name);
1499 		return;
1500 	}
1501 
1502 	len = tpeeprom->datasize - 4;
1503 
1504 	ret = t3_check_tpsram(adap, tpeeprom->data, tpeeprom->datasize);
1505 	if (ret)
1506 		goto release_tpeeprom;
1507 
1508 	if (len != TP_SRAM_LEN) {
1509 		device_printf(adap->dev,
1510 			      "%s length is wrong len=%d expected=%d\n", name,
1511 			      len, TP_SRAM_LEN);
1512 		return;
1513 	}
1514 
1515 	ret = set_eeprom(&adap->port[0], tpeeprom->data, tpeeprom->datasize,
1516 	    TP_SRAM_OFFSET);
1517 
1518 	if (!ret) {
1519 		device_printf(adap->dev,
1520 			"Protocol SRAM image updated in EEPROM to %d.%d.%d\n",
1521 			 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
1522 	} else
1523 		device_printf(adap->dev,
1524 			      "Protocol SRAM image update in EEPROM failed\n");
1525 
1526 release_tpeeprom:
1527 	firmware_put(tpeeprom, FIRMWARE_UNLOAD);
1528 
1529 	return;
1530 }
1531 
1532 static int
1533 update_tpsram(struct adapter *adap)
1534 {
1535 	const struct firmware *tpsram;
1536 	int ret;
1537 	char rev, name[32];
1538 
1539 	rev = t3rev2char(adap);
1540 	snprintf(name, sizeof(name), TPSRAM_NAME, rev);
1541 
1542 	update_tpeeprom(adap);
1543 
1544 	tpsram = firmware_get(name);
1545 	if (tpsram == NULL){
1546 		device_printf(adap->dev, "could not load TP SRAM\n");
1547 		return (EINVAL);
1548 	} else
1549 		device_printf(adap->dev, "updating TP SRAM\n");
1550 
1551 	ret = t3_check_tpsram(adap, tpsram->data, tpsram->datasize);
1552 	if (ret)
1553 		goto release_tpsram;
1554 
1555 	ret = t3_set_proto_sram(adap, tpsram->data);
1556 	if (ret)
1557 		device_printf(adap->dev, "loading protocol SRAM failed\n");
1558 
1559 release_tpsram:
1560 	firmware_put(tpsram, FIRMWARE_UNLOAD);
1561 
1562 	return ret;
1563 }
1564 
1565 /**
1566  *	cxgb_up - enable the adapter
1567  *	@adap: adapter being enabled
1568  *
1569  *	Called when the first port is enabled, this function performs the
1570  *	actions necessary to make an adapter operational, such as completing
1571  *	the initialization of HW modules, and enabling interrupts.
1572  */
1573 static int
1574 cxgb_up(struct adapter *sc)
1575 {
1576 	int err = 0;
1577 	unsigned int mxf = t3_mc5_size(&sc->mc5) - MC5_MIN_TIDS;
1578 
1579 	KASSERT(sc->open_device_map == 0, ("%s: device(s) already open (%x)",
1580 					   __func__, sc->open_device_map));
1581 
1582 	if ((sc->flags & FULL_INIT_DONE) == 0) {
1583 
1584 		ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1585 
1586 		if ((sc->flags & FW_UPTODATE) == 0)
1587 			if ((err = upgrade_fw(sc)))
1588 				goto out;
1589 
1590 		if ((sc->flags & TPS_UPTODATE) == 0)
1591 			if ((err = update_tpsram(sc)))
1592 				goto out;
1593 
1594 		if (is_offload(sc) && nfilters != 0) {
1595 			sc->params.mc5.nservers = 0;
1596 
1597 			if (nfilters < 0)
1598 				sc->params.mc5.nfilters = mxf;
1599 			else
1600 				sc->params.mc5.nfilters = min(nfilters, mxf);
1601 		}
1602 
1603 		err = t3_init_hw(sc, 0);
1604 		if (err)
1605 			goto out;
1606 
1607 		t3_set_reg_field(sc, A_TP_PARA_REG5, 0, F_RXDDPOFFINIT);
1608 		t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
1609 
1610 		err = setup_sge_qsets(sc);
1611 		if (err)
1612 			goto out;
1613 
1614 		alloc_filters(sc);
1615 		setup_rss(sc);
1616 
1617 		t3_add_configured_sysctls(sc);
1618 		sc->flags |= FULL_INIT_DONE;
1619 	}
1620 
1621 	t3_intr_clear(sc);
1622 	t3_sge_start(sc);
1623 	t3_intr_enable(sc);
1624 
1625 	if (sc->params.rev >= T3_REV_C && !(sc->flags & TP_PARITY_INIT) &&
1626 	    is_offload(sc) && init_tp_parity(sc) == 0)
1627 		sc->flags |= TP_PARITY_INIT;
1628 
1629 	if (sc->flags & TP_PARITY_INIT) {
1630 		t3_write_reg(sc, A_TP_INT_CAUSE, F_CMCACHEPERR | F_ARPLUTPERR);
1631 		t3_write_reg(sc, A_TP_INT_ENABLE, 0x7fbfffff);
1632 	}
1633 
1634 	if (!(sc->flags & QUEUES_BOUND)) {
1635 		bind_qsets(sc);
1636 		setup_hw_filters(sc);
1637 		sc->flags |= QUEUES_BOUND;
1638 	}
1639 
1640 	t3_sge_reset_adapter(sc);
1641 out:
1642 	return (err);
1643 }
1644 
1645 /*
1646  * Called when the last open device is closed.  Does NOT undo all of cxgb_up's
1647  * work.  Specifically, the resources grabbed under FULL_INIT_DONE are released
1648  * during controller_detach, not here.
1649  */
1650 static void
1651 cxgb_down(struct adapter *sc)
1652 {
1653 	t3_sge_stop(sc);
1654 	t3_intr_disable(sc);
1655 }
1656 
1657 /*
1658  * if_init for cxgb ports.
1659  */
1660 static void
1661 cxgb_init(void *arg)
1662 {
1663 	struct port_info *p = arg;
1664 	struct adapter *sc = p->adapter;
1665 
1666 	ADAPTER_LOCK(sc);
1667 	cxgb_init_locked(p); /* releases adapter lock */
1668 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1669 }
1670 
1671 static int
1672 cxgb_init_locked(struct port_info *p)
1673 {
1674 	struct adapter *sc = p->adapter;
1675 	struct ifnet *ifp = p->ifp;
1676 	struct cmac *mac = &p->mac;
1677 	int i, rc = 0, may_sleep = 0, gave_up_lock = 0;
1678 
1679 	ADAPTER_LOCK_ASSERT_OWNED(sc);
1680 
1681 	while (!IS_DOOMED(p) && IS_BUSY(sc)) {
1682 		gave_up_lock = 1;
1683 		if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbinit", 0)) {
1684 			rc = EINTR;
1685 			goto done;
1686 		}
1687 	}
1688 	if (IS_DOOMED(p)) {
1689 		rc = ENXIO;
1690 		goto done;
1691 	}
1692 	KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
1693 
1694 	/*
1695 	 * The code that runs during one-time adapter initialization can sleep
1696 	 * so it's important not to hold any locks across it.
1697 	 */
1698 	may_sleep = sc->flags & FULL_INIT_DONE ? 0 : 1;
1699 
1700 	if (may_sleep) {
1701 		SET_BUSY(sc);
1702 		gave_up_lock = 1;
1703 		ADAPTER_UNLOCK(sc);
1704 	}
1705 
1706 	if (sc->open_device_map == 0 && ((rc = cxgb_up(sc)) != 0))
1707 			goto done;
1708 
1709 	PORT_LOCK(p);
1710 	if (isset(&sc->open_device_map, p->port_id) &&
1711 	    (ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1712 		PORT_UNLOCK(p);
1713 		goto done;
1714 	}
1715 	t3_port_intr_enable(sc, p->port_id);
1716 	if (!mac->multiport)
1717 		t3_mac_init(mac);
1718 	cxgb_update_mac_settings(p);
1719 	t3_link_start(&p->phy, mac, &p->link_config);
1720 	t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1721 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
1722 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1723 	PORT_UNLOCK(p);
1724 
1725 	for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
1726 		struct sge_qset *qs = &sc->sge.qs[i];
1727 		struct sge_txq *txq = &qs->txq[TXQ_ETH];
1728 
1729 		callout_reset_on(&txq->txq_watchdog, hz, cxgb_tx_watchdog, qs,
1730 				 txq->txq_watchdog.c_cpu);
1731 	}
1732 
1733 	/* all ok */
1734 	setbit(&sc->open_device_map, p->port_id);
1735 	callout_reset(&p->link_check_ch,
1736 	    p->phy.caps & SUPPORTED_LINK_IRQ ?  hz * 3 : hz / 4,
1737 	    link_check_callout, p);
1738 
1739 done:
1740 	if (may_sleep) {
1741 		ADAPTER_LOCK(sc);
1742 		KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
1743 		CLR_BUSY(sc);
1744 	}
1745 	if (gave_up_lock)
1746 		wakeup_one(&sc->flags);
1747 	ADAPTER_UNLOCK(sc);
1748 	return (rc);
1749 }
1750 
1751 static int
1752 cxgb_uninit_locked(struct port_info *p)
1753 {
1754 	struct adapter *sc = p->adapter;
1755 	int rc;
1756 
1757 	ADAPTER_LOCK_ASSERT_OWNED(sc);
1758 
1759 	while (!IS_DOOMED(p) && IS_BUSY(sc)) {
1760 		if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbunin", 0)) {
1761 			rc = EINTR;
1762 			goto done;
1763 		}
1764 	}
1765 	if (IS_DOOMED(p)) {
1766 		rc = ENXIO;
1767 		goto done;
1768 	}
1769 	KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
1770 	SET_BUSY(sc);
1771 	ADAPTER_UNLOCK(sc);
1772 
1773 	rc = cxgb_uninit_synchronized(p);
1774 
1775 	ADAPTER_LOCK(sc);
1776 	KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
1777 	CLR_BUSY(sc);
1778 	wakeup_one(&sc->flags);
1779 done:
1780 	ADAPTER_UNLOCK(sc);
1781 	return (rc);
1782 }
1783 
1784 /*
1785  * Called on "ifconfig down", and from port_detach
1786  */
1787 static int
1788 cxgb_uninit_synchronized(struct port_info *pi)
1789 {
1790 	struct adapter *sc = pi->adapter;
1791 	struct ifnet *ifp = pi->ifp;
1792 
1793 	/*
1794 	 * taskqueue_drain may cause a deadlock if the adapter lock is held.
1795 	 */
1796 	ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1797 
1798 	/*
1799 	 * Clear this port's bit from the open device map, and then drain all
1800 	 * the tasks that can access/manipulate this port's port_info or ifp.
1801 	 * We disable this port's interrupts here and so the slow/ext
1802 	 * interrupt tasks won't be enqueued.  The tick task will continue to
1803 	 * be enqueued every second but the runs after this drain will not see
1804 	 * this port in the open device map.
1805 	 *
1806 	 * A well behaved task must take open_device_map into account and ignore
1807 	 * ports that are not open.
1808 	 */
1809 	clrbit(&sc->open_device_map, pi->port_id);
1810 	t3_port_intr_disable(sc, pi->port_id);
1811 	taskqueue_drain(sc->tq, &sc->slow_intr_task);
1812 	taskqueue_drain(sc->tq, &sc->tick_task);
1813 
1814 	callout_drain(&pi->link_check_ch);
1815 	taskqueue_drain(sc->tq, &pi->link_check_task);
1816 
1817 	PORT_LOCK(pi);
1818 	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1819 
1820 	/* disable pause frames */
1821 	t3_set_reg_field(sc, A_XGM_TX_CFG + pi->mac.offset, F_TXPAUSEEN, 0);
1822 
1823 	/* Reset RX FIFO HWM */
1824 	t3_set_reg_field(sc, A_XGM_RXFIFO_CFG +  pi->mac.offset,
1825 			 V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM), 0);
1826 
1827 	DELAY(100 * 1000);
1828 
1829 	/* Wait for TXFIFO empty */
1830 	t3_wait_op_done(sc, A_XGM_TXFIFO_CFG + pi->mac.offset,
1831 			F_TXFIFO_EMPTY, 1, 20, 5);
1832 
1833 	DELAY(100 * 1000);
1834 	t3_mac_disable(&pi->mac, MAC_DIRECTION_RX);
1835 
1836 	pi->phy.ops->power_down(&pi->phy, 1);
1837 
1838 	PORT_UNLOCK(pi);
1839 
1840 	pi->link_config.link_ok = 0;
1841 	t3_os_link_changed(sc, pi->port_id, 0, 0, 0, 0, 0);
1842 
1843 	if (sc->open_device_map == 0)
1844 		cxgb_down(pi->adapter);
1845 
1846 	return (0);
1847 }
1848 
1849 /*
1850  * Mark lro enabled or disabled in all qsets for this port
1851  */
1852 static int
1853 cxgb_set_lro(struct port_info *p, int enabled)
1854 {
1855 	int i;
1856 	struct adapter *adp = p->adapter;
1857 	struct sge_qset *q;
1858 
1859 	for (i = 0; i < p->nqsets; i++) {
1860 		q = &adp->sge.qs[p->first_qset + i];
1861 		q->lro.enabled = (enabled != 0);
1862 	}
1863 	return (0);
1864 }
1865 
1866 static int
1867 cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
1868 {
1869 	struct port_info *p = ifp->if_softc;
1870 	struct adapter *sc = p->adapter;
1871 	struct ifreq *ifr = (struct ifreq *)data;
1872 	int flags, error = 0, mtu;
1873 	uint32_t mask;
1874 
1875 	switch (command) {
1876 	case SIOCSIFMTU:
1877 		ADAPTER_LOCK(sc);
1878 		error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
1879 		if (error) {
1880 fail:
1881 			ADAPTER_UNLOCK(sc);
1882 			return (error);
1883 		}
1884 
1885 		mtu = ifr->ifr_mtu;
1886 		if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO)) {
1887 			error = EINVAL;
1888 		} else {
1889 			ifp->if_mtu = mtu;
1890 			PORT_LOCK(p);
1891 			cxgb_update_mac_settings(p);
1892 			PORT_UNLOCK(p);
1893 		}
1894 		ADAPTER_UNLOCK(sc);
1895 		break;
1896 	case SIOCSIFFLAGS:
1897 		ADAPTER_LOCK(sc);
1898 		if (IS_DOOMED(p)) {
1899 			error = ENXIO;
1900 			goto fail;
1901 		}
1902 		if (ifp->if_flags & IFF_UP) {
1903 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1904 				flags = p->if_flags;
1905 				if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
1906 				    ((ifp->if_flags ^ flags) & IFF_ALLMULTI)) {
1907 					if (IS_BUSY(sc)) {
1908 						error = EBUSY;
1909 						goto fail;
1910 					}
1911 					PORT_LOCK(p);
1912 					cxgb_update_mac_settings(p);
1913 					PORT_UNLOCK(p);
1914 				}
1915 				ADAPTER_UNLOCK(sc);
1916 			} else
1917 				error = cxgb_init_locked(p);
1918 			p->if_flags = ifp->if_flags;
1919 		} else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1920 			error = cxgb_uninit_locked(p);
1921 		else
1922 			ADAPTER_UNLOCK(sc);
1923 
1924 		ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1925 		break;
1926 	case SIOCADDMULTI:
1927 	case SIOCDELMULTI:
1928 		ADAPTER_LOCK(sc);
1929 		error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
1930 		if (error)
1931 			goto fail;
1932 
1933 		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1934 			PORT_LOCK(p);
1935 			cxgb_update_mac_settings(p);
1936 			PORT_UNLOCK(p);
1937 		}
1938 		ADAPTER_UNLOCK(sc);
1939 
1940 		break;
1941 	case SIOCSIFCAP:
1942 		ADAPTER_LOCK(sc);
1943 		error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
1944 		if (error)
1945 			goto fail;
1946 
1947 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1948 		if (mask & IFCAP_TXCSUM) {
1949 			ifp->if_capenable ^= IFCAP_TXCSUM;
1950 			ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
1951 
1952 			if (IFCAP_TSO4 & ifp->if_capenable &&
1953 			    !(IFCAP_TXCSUM & ifp->if_capenable)) {
1954 				ifp->if_capenable &= ~IFCAP_TSO4;
1955 				if_printf(ifp,
1956 				    "tso4 disabled due to -txcsum.\n");
1957 			}
1958 		}
1959 		if (mask & IFCAP_TXCSUM_IPV6) {
1960 			ifp->if_capenable ^= IFCAP_TXCSUM_IPV6;
1961 			ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6);
1962 
1963 			if (IFCAP_TSO6 & ifp->if_capenable &&
1964 			    !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
1965 				ifp->if_capenable &= ~IFCAP_TSO6;
1966 				if_printf(ifp,
1967 				    "tso6 disabled due to -txcsum6.\n");
1968 			}
1969 		}
1970 		if (mask & IFCAP_RXCSUM)
1971 			ifp->if_capenable ^= IFCAP_RXCSUM;
1972 		if (mask & IFCAP_RXCSUM_IPV6)
1973 			ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
1974 
1975 		/*
1976 		 * Note that we leave CSUM_TSO alone (it is always set).  The
1977 		 * kernel takes both IFCAP_TSOx and CSUM_TSO into account before
1978 		 * sending a TSO request our way, so it's sufficient to toggle
1979 		 * IFCAP_TSOx only.
1980 		 */
1981 		if (mask & IFCAP_TSO4) {
1982 			if (!(IFCAP_TSO4 & ifp->if_capenable) &&
1983 			    !(IFCAP_TXCSUM & ifp->if_capenable)) {
1984 				if_printf(ifp, "enable txcsum first.\n");
1985 				error = EAGAIN;
1986 				goto fail;
1987 			}
1988 			ifp->if_capenable ^= IFCAP_TSO4;
1989 		}
1990 		if (mask & IFCAP_TSO6) {
1991 			if (!(IFCAP_TSO6 & ifp->if_capenable) &&
1992 			    !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
1993 				if_printf(ifp, "enable txcsum6 first.\n");
1994 				error = EAGAIN;
1995 				goto fail;
1996 			}
1997 			ifp->if_capenable ^= IFCAP_TSO6;
1998 		}
1999 		if (mask & IFCAP_LRO) {
2000 			ifp->if_capenable ^= IFCAP_LRO;
2001 
2002 			/* Safe to do this even if cxgb_up not called yet */
2003 			cxgb_set_lro(p, ifp->if_capenable & IFCAP_LRO);
2004 		}
2005 #ifdef TCP_OFFLOAD
2006 		if (mask & IFCAP_TOE4) {
2007 			int enable = (ifp->if_capenable ^ mask) & IFCAP_TOE4;
2008 
2009 			error = toe_capability(p, enable);
2010 			if (error == 0)
2011 				ifp->if_capenable ^= mask;
2012 		}
2013 #endif
2014 		if (mask & IFCAP_VLAN_HWTAGGING) {
2015 			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
2016 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2017 				PORT_LOCK(p);
2018 				cxgb_update_mac_settings(p);
2019 				PORT_UNLOCK(p);
2020 			}
2021 		}
2022 		if (mask & IFCAP_VLAN_MTU) {
2023 			ifp->if_capenable ^= IFCAP_VLAN_MTU;
2024 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2025 				PORT_LOCK(p);
2026 				cxgb_update_mac_settings(p);
2027 				PORT_UNLOCK(p);
2028 			}
2029 		}
2030 		if (mask & IFCAP_VLAN_HWTSO)
2031 			ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
2032 		if (mask & IFCAP_VLAN_HWCSUM)
2033 			ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
2034 
2035 #ifdef VLAN_CAPABILITIES
2036 		VLAN_CAPABILITIES(ifp);
2037 #endif
2038 		ADAPTER_UNLOCK(sc);
2039 		break;
2040 	case SIOCSIFMEDIA:
2041 	case SIOCGIFMEDIA:
2042 		error = ifmedia_ioctl(ifp, ifr, &p->media, command);
2043 		break;
2044 	default:
2045 		error = ether_ioctl(ifp, command, data);
2046 	}
2047 
2048 	return (error);
2049 }
2050 
2051 static int
2052 cxgb_media_change(struct ifnet *ifp)
2053 {
2054 	return (EOPNOTSUPP);
2055 }
2056 
2057 /*
2058  * Translates phy->modtype to the correct Ethernet media subtype.
2059  */
2060 static int
2061 cxgb_ifm_type(int mod)
2062 {
2063 	switch (mod) {
2064 	case phy_modtype_sr:
2065 		return (IFM_10G_SR);
2066 	case phy_modtype_lr:
2067 		return (IFM_10G_LR);
2068 	case phy_modtype_lrm:
2069 		return (IFM_10G_LRM);
2070 	case phy_modtype_twinax:
2071 		return (IFM_10G_TWINAX);
2072 	case phy_modtype_twinax_long:
2073 		return (IFM_10G_TWINAX_LONG);
2074 	case phy_modtype_none:
2075 		return (IFM_NONE);
2076 	case phy_modtype_unknown:
2077 		return (IFM_UNKNOWN);
2078 	}
2079 
2080 	KASSERT(0, ("%s: modtype %d unknown", __func__, mod));
2081 	return (IFM_UNKNOWN);
2082 }
2083 
2084 /*
2085  * Rebuilds the ifmedia list for this port, and sets the current media.
2086  */
2087 static void
2088 cxgb_build_medialist(struct port_info *p)
2089 {
2090 	struct cphy *phy = &p->phy;
2091 	struct ifmedia *media = &p->media;
2092 	int mod = phy->modtype;
2093 	int m = IFM_ETHER | IFM_FDX;
2094 
2095 	PORT_LOCK(p);
2096 
2097 	ifmedia_removeall(media);
2098 	if (phy->caps & SUPPORTED_TP && phy->caps & SUPPORTED_Autoneg) {
2099 		/* Copper (RJ45) */
2100 
2101 		if (phy->caps & SUPPORTED_10000baseT_Full)
2102 			ifmedia_add(media, m | IFM_10G_T, mod, NULL);
2103 
2104 		if (phy->caps & SUPPORTED_1000baseT_Full)
2105 			ifmedia_add(media, m | IFM_1000_T, mod, NULL);
2106 
2107 		if (phy->caps & SUPPORTED_100baseT_Full)
2108 			ifmedia_add(media, m | IFM_100_TX, mod, NULL);
2109 
2110 		if (phy->caps & SUPPORTED_10baseT_Full)
2111 			ifmedia_add(media, m | IFM_10_T, mod, NULL);
2112 
2113 		ifmedia_add(media, IFM_ETHER | IFM_AUTO, mod, NULL);
2114 		ifmedia_set(media, IFM_ETHER | IFM_AUTO);
2115 
2116 	} else if (phy->caps & SUPPORTED_TP) {
2117 		/* Copper (CX4) */
2118 
2119 		KASSERT(phy->caps & SUPPORTED_10000baseT_Full,
2120 			("%s: unexpected cap 0x%x", __func__, phy->caps));
2121 
2122 		ifmedia_add(media, m | IFM_10G_CX4, mod, NULL);
2123 		ifmedia_set(media, m | IFM_10G_CX4);
2124 
2125 	} else if (phy->caps & SUPPORTED_FIBRE &&
2126 		   phy->caps & SUPPORTED_10000baseT_Full) {
2127 		/* 10G optical (but includes SFP+ twinax) */
2128 
2129 		m |= cxgb_ifm_type(mod);
2130 		if (IFM_SUBTYPE(m) == IFM_NONE)
2131 			m &= ~IFM_FDX;
2132 
2133 		ifmedia_add(media, m, mod, NULL);
2134 		ifmedia_set(media, m);
2135 
2136 	} else if (phy->caps & SUPPORTED_FIBRE &&
2137 		   phy->caps & SUPPORTED_1000baseT_Full) {
2138 		/* 1G optical */
2139 
2140 		/* XXX: Lie and claim to be SX, could actually be any 1G-X */
2141 		ifmedia_add(media, m | IFM_1000_SX, mod, NULL);
2142 		ifmedia_set(media, m | IFM_1000_SX);
2143 
2144 	} else {
2145 		KASSERT(0, ("%s: don't know how to handle 0x%x.", __func__,
2146 			    phy->caps));
2147 	}
2148 
2149 	PORT_UNLOCK(p);
2150 }
2151 
2152 static void
2153 cxgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2154 {
2155 	struct port_info *p = ifp->if_softc;
2156 	struct ifmedia_entry *cur = p->media.ifm_cur;
2157 	int speed = p->link_config.speed;
2158 
2159 	if (cur->ifm_data != p->phy.modtype) {
2160 		cxgb_build_medialist(p);
2161 		cur = p->media.ifm_cur;
2162 	}
2163 
2164 	ifmr->ifm_status = IFM_AVALID;
2165 	if (!p->link_config.link_ok)
2166 		return;
2167 
2168 	ifmr->ifm_status |= IFM_ACTIVE;
2169 
2170 	/*
2171 	 * active and current will differ iff current media is autoselect.  That
2172 	 * can happen only for copper RJ45.
2173 	 */
2174 	if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
2175 		return;
2176 	KASSERT(p->phy.caps & SUPPORTED_TP && p->phy.caps & SUPPORTED_Autoneg,
2177 		("%s: unexpected PHY caps 0x%x", __func__, p->phy.caps));
2178 
2179 	ifmr->ifm_active = IFM_ETHER | IFM_FDX;
2180 	if (speed == SPEED_10000)
2181 		ifmr->ifm_active |= IFM_10G_T;
2182 	else if (speed == SPEED_1000)
2183 		ifmr->ifm_active |= IFM_1000_T;
2184 	else if (speed == SPEED_100)
2185 		ifmr->ifm_active |= IFM_100_TX;
2186 	else if (speed == SPEED_10)
2187 		ifmr->ifm_active |= IFM_10_T;
2188 	else
2189 		KASSERT(0, ("%s: link up but speed unknown (%u)", __func__,
2190 			    speed));
2191 }
2192 
2193 static uint64_t
2194 cxgb_get_counter(struct ifnet *ifp, ift_counter c)
2195 {
2196 	struct port_info *pi = ifp->if_softc;
2197 	struct adapter *sc = pi->adapter;
2198 	struct cmac *mac = &pi->mac;
2199 	struct mac_stats *mstats = &mac->stats;
2200 
2201 	cxgb_refresh_stats(pi);
2202 
2203 	switch (c) {
2204 	case IFCOUNTER_IPACKETS:
2205 		return (mstats->rx_frames);
2206 
2207 	case IFCOUNTER_IERRORS:
2208 		return (mstats->rx_jabber + mstats->rx_data_errs +
2209 		    mstats->rx_sequence_errs + mstats->rx_runt +
2210 		    mstats->rx_too_long + mstats->rx_mac_internal_errs +
2211 		    mstats->rx_short + mstats->rx_fcs_errs);
2212 
2213 	case IFCOUNTER_OPACKETS:
2214 		return (mstats->tx_frames);
2215 
2216 	case IFCOUNTER_OERRORS:
2217 		return (mstats->tx_excess_collisions + mstats->tx_underrun +
2218 		    mstats->tx_len_errs + mstats->tx_mac_internal_errs +
2219 		    mstats->tx_excess_deferral + mstats->tx_fcs_errs);
2220 
2221 	case IFCOUNTER_COLLISIONS:
2222 		return (mstats->tx_total_collisions);
2223 
2224 	case IFCOUNTER_IBYTES:
2225 		return (mstats->rx_octets);
2226 
2227 	case IFCOUNTER_OBYTES:
2228 		return (mstats->tx_octets);
2229 
2230 	case IFCOUNTER_IMCASTS:
2231 		return (mstats->rx_mcast_frames);
2232 
2233 	case IFCOUNTER_OMCASTS:
2234 		return (mstats->tx_mcast_frames);
2235 
2236 	case IFCOUNTER_IQDROPS:
2237 		return (mstats->rx_cong_drops);
2238 
2239 	case IFCOUNTER_OQDROPS: {
2240 		int i;
2241 		uint64_t drops;
2242 
2243 		drops = 0;
2244 		if (sc->flags & FULL_INIT_DONE) {
2245 			for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; i++)
2246 				drops += sc->sge.qs[i].txq[TXQ_ETH].txq_mr->br_drops;
2247 		}
2248 
2249 		return (drops);
2250 
2251 	}
2252 
2253 	default:
2254 		return (if_get_counter_default(ifp, c));
2255 	}
2256 }
2257 
2258 static void
2259 cxgb_async_intr(void *data)
2260 {
2261 	adapter_t *sc = data;
2262 
2263 	t3_write_reg(sc, A_PL_INT_ENABLE0, 0);
2264 	(void) t3_read_reg(sc, A_PL_INT_ENABLE0);
2265 	taskqueue_enqueue(sc->tq, &sc->slow_intr_task);
2266 }
2267 
2268 static void
2269 link_check_callout(void *arg)
2270 {
2271 	struct port_info *pi = arg;
2272 	struct adapter *sc = pi->adapter;
2273 
2274 	if (!isset(&sc->open_device_map, pi->port_id))
2275 		return;
2276 
2277 	taskqueue_enqueue(sc->tq, &pi->link_check_task);
2278 }
2279 
2280 static void
2281 check_link_status(void *arg, int pending)
2282 {
2283 	struct port_info *pi = arg;
2284 	struct adapter *sc = pi->adapter;
2285 
2286 	if (!isset(&sc->open_device_map, pi->port_id))
2287 		return;
2288 
2289 	t3_link_changed(sc, pi->port_id);
2290 
2291 	if (pi->link_fault || !(pi->phy.caps & SUPPORTED_LINK_IRQ) ||
2292 	    pi->link_config.link_ok == 0)
2293 		callout_reset(&pi->link_check_ch, hz, link_check_callout, pi);
2294 }
2295 
2296 void
2297 t3_os_link_intr(struct port_info *pi)
2298 {
2299 	/*
2300 	 * Schedule a link check in the near future.  If the link is flapping
2301 	 * rapidly we'll keep resetting the callout and delaying the check until
2302 	 * things stabilize a bit.
2303 	 */
2304 	callout_reset(&pi->link_check_ch, hz / 4, link_check_callout, pi);
2305 }
2306 
2307 static void
2308 check_t3b2_mac(struct adapter *sc)
2309 {
2310 	int i;
2311 
2312 	if (sc->flags & CXGB_SHUTDOWN)
2313 		return;
2314 
2315 	for_each_port(sc, i) {
2316 		struct port_info *p = &sc->port[i];
2317 		int status;
2318 #ifdef INVARIANTS
2319 		struct ifnet *ifp = p->ifp;
2320 #endif
2321 
2322 		if (!isset(&sc->open_device_map, p->port_id) || p->link_fault ||
2323 		    !p->link_config.link_ok)
2324 			continue;
2325 
2326 		KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING,
2327 			("%s: state mismatch (drv_flags %x, device_map %x)",
2328 			 __func__, ifp->if_drv_flags, sc->open_device_map));
2329 
2330 		PORT_LOCK(p);
2331 		status = t3b2_mac_watchdog_task(&p->mac);
2332 		if (status == 1)
2333 			p->mac.stats.num_toggled++;
2334 		else if (status == 2) {
2335 			struct cmac *mac = &p->mac;
2336 
2337 			cxgb_update_mac_settings(p);
2338 			t3_link_start(&p->phy, mac, &p->link_config);
2339 			t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
2340 			t3_port_intr_enable(sc, p->port_id);
2341 			p->mac.stats.num_resets++;
2342 		}
2343 		PORT_UNLOCK(p);
2344 	}
2345 }
2346 
2347 static void
2348 cxgb_tick(void *arg)
2349 {
2350 	adapter_t *sc = (adapter_t *)arg;
2351 
2352 	if (sc->flags & CXGB_SHUTDOWN)
2353 		return;
2354 
2355 	taskqueue_enqueue(sc->tq, &sc->tick_task);
2356 	callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
2357 }
2358 
2359 void
2360 cxgb_refresh_stats(struct port_info *pi)
2361 {
2362 	struct timeval tv;
2363 	const struct timeval interval = {0, 250000};    /* 250ms */
2364 
2365 	getmicrotime(&tv);
2366 	timevalsub(&tv, &interval);
2367 	if (timevalcmp(&tv, &pi->last_refreshed, <))
2368 		return;
2369 
2370 	PORT_LOCK(pi);
2371 	t3_mac_update_stats(&pi->mac);
2372 	PORT_UNLOCK(pi);
2373 	getmicrotime(&pi->last_refreshed);
2374 }
2375 
2376 static void
2377 cxgb_tick_handler(void *arg, int count)
2378 {
2379 	adapter_t *sc = (adapter_t *)arg;
2380 	const struct adapter_params *p = &sc->params;
2381 	int i;
2382 	uint32_t cause, reset;
2383 
2384 	if (sc->flags & CXGB_SHUTDOWN || !(sc->flags & FULL_INIT_DONE))
2385 		return;
2386 
2387 	if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map)
2388 		check_t3b2_mac(sc);
2389 
2390 	cause = t3_read_reg(sc, A_SG_INT_CAUSE) & (F_RSPQSTARVE | F_FLEMPTY);
2391 	if (cause) {
2392 		struct sge_qset *qs = &sc->sge.qs[0];
2393 		uint32_t mask, v;
2394 
2395 		v = t3_read_reg(sc, A_SG_RSPQ_FL_STATUS) & ~0xff00;
2396 
2397 		mask = 1;
2398 		for (i = 0; i < SGE_QSETS; i++) {
2399 			if (v & mask)
2400 				qs[i].rspq.starved++;
2401 			mask <<= 1;
2402 		}
2403 
2404 		mask <<= SGE_QSETS; /* skip RSPQXDISABLED */
2405 
2406 		for (i = 0; i < SGE_QSETS * 2; i++) {
2407 			if (v & mask) {
2408 				qs[i / 2].fl[i % 2].empty++;
2409 			}
2410 			mask <<= 1;
2411 		}
2412 
2413 		/* clear */
2414 		t3_write_reg(sc, A_SG_RSPQ_FL_STATUS, v);
2415 		t3_write_reg(sc, A_SG_INT_CAUSE, cause);
2416 	}
2417 
2418 	for (i = 0; i < sc->params.nports; i++) {
2419 		struct port_info *pi = &sc->port[i];
2420 		struct cmac *mac = &pi->mac;
2421 
2422 		if (!isset(&sc->open_device_map, pi->port_id))
2423 			continue;
2424 
2425 		cxgb_refresh_stats(pi);
2426 
2427 		if (mac->multiport)
2428 			continue;
2429 
2430 		/* Count rx fifo overflows, once per second */
2431 		cause = t3_read_reg(sc, A_XGM_INT_CAUSE + mac->offset);
2432 		reset = 0;
2433 		if (cause & F_RXFIFO_OVERFLOW) {
2434 			mac->stats.rx_fifo_ovfl++;
2435 			reset |= F_RXFIFO_OVERFLOW;
2436 		}
2437 		t3_write_reg(sc, A_XGM_INT_CAUSE + mac->offset, reset);
2438 	}
2439 }
2440 
2441 static void
2442 touch_bars(device_t dev)
2443 {
2444 	/*
2445 	 * Don't enable yet
2446 	 */
2447 #if !defined(__LP64__) && 0
2448 	u32 v;
2449 
2450 	pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1, &v);
2451 	pci_write_config_dword(pdev, PCI_BASE_ADDRESS_1, v);
2452 	pci_read_config_dword(pdev, PCI_BASE_ADDRESS_3, &v);
2453 	pci_write_config_dword(pdev, PCI_BASE_ADDRESS_3, v);
2454 	pci_read_config_dword(pdev, PCI_BASE_ADDRESS_5, &v);
2455 	pci_write_config_dword(pdev, PCI_BASE_ADDRESS_5, v);
2456 #endif
2457 }
2458 
2459 static int
2460 set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset)
2461 {
2462 	uint8_t *buf;
2463 	int err = 0;
2464 	u32 aligned_offset, aligned_len, *p;
2465 	struct adapter *adapter = pi->adapter;
2466 
2467 
2468 	aligned_offset = offset & ~3;
2469 	aligned_len = (len + (offset & 3) + 3) & ~3;
2470 
2471 	if (aligned_offset != offset || aligned_len != len) {
2472 		buf = malloc(aligned_len, M_DEVBUF, M_WAITOK|M_ZERO);
2473 		if (!buf)
2474 			return (ENOMEM);
2475 		err = t3_seeprom_read(adapter, aligned_offset, (u32 *)buf);
2476 		if (!err && aligned_len > 4)
2477 			err = t3_seeprom_read(adapter,
2478 					      aligned_offset + aligned_len - 4,
2479 					      (u32 *)&buf[aligned_len - 4]);
2480 		if (err)
2481 			goto out;
2482 		memcpy(buf + (offset & 3), data, len);
2483 	} else
2484 		buf = (uint8_t *)(uintptr_t)data;
2485 
2486 	err = t3_seeprom_wp(adapter, 0);
2487 	if (err)
2488 		goto out;
2489 
2490 	for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) {
2491 		err = t3_seeprom_write(adapter, aligned_offset, *p);
2492 		aligned_offset += 4;
2493 	}
2494 
2495 	if (!err)
2496 		err = t3_seeprom_wp(adapter, 1);
2497 out:
2498 	if (buf != data)
2499 		free(buf, M_DEVBUF);
2500 	return err;
2501 }
2502 
2503 
2504 static int
2505 in_range(int val, int lo, int hi)
2506 {
2507 	return val < 0 || (val <= hi && val >= lo);
2508 }
2509 
2510 static int
2511 cxgb_extension_open(struct cdev *dev, int flags, int fmp, struct thread *td)
2512 {
2513        return (0);
2514 }
2515 
2516 static int
2517 cxgb_extension_close(struct cdev *dev, int flags, int fmt, struct thread *td)
2518 {
2519        return (0);
2520 }
2521 
2522 static int
2523 cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
2524     int fflag, struct thread *td)
2525 {
2526 	int mmd, error = 0;
2527 	struct port_info *pi = dev->si_drv1;
2528 	adapter_t *sc = pi->adapter;
2529 
2530 #ifdef PRIV_SUPPORTED
2531 	if (priv_check(td, PRIV_DRIVER)) {
2532 		if (cxgb_debug)
2533 			printf("user does not have access to privileged ioctls\n");
2534 		return (EPERM);
2535 	}
2536 #else
2537 	if (suser(td)) {
2538 		if (cxgb_debug)
2539 			printf("user does not have access to privileged ioctls\n");
2540 		return (EPERM);
2541 	}
2542 #endif
2543 
2544 	switch (cmd) {
2545 	case CHELSIO_GET_MIIREG: {
2546 		uint32_t val;
2547 		struct cphy *phy = &pi->phy;
2548 		struct ch_mii_data *mid = (struct ch_mii_data *)data;
2549 
2550 		if (!phy->mdio_read)
2551 			return (EOPNOTSUPP);
2552 		if (is_10G(sc)) {
2553 			mmd = mid->phy_id >> 8;
2554 			if (!mmd)
2555 				mmd = MDIO_DEV_PCS;
2556 			else if (mmd > MDIO_DEV_VEND2)
2557 				return (EINVAL);
2558 
2559 			error = phy->mdio_read(sc, mid->phy_id & 0x1f, mmd,
2560 					     mid->reg_num, &val);
2561 		} else
2562 		        error = phy->mdio_read(sc, mid->phy_id & 0x1f, 0,
2563 					     mid->reg_num & 0x1f, &val);
2564 		if (error == 0)
2565 			mid->val_out = val;
2566 		break;
2567 	}
2568 	case CHELSIO_SET_MIIREG: {
2569 		struct cphy *phy = &pi->phy;
2570 		struct ch_mii_data *mid = (struct ch_mii_data *)data;
2571 
2572 		if (!phy->mdio_write)
2573 			return (EOPNOTSUPP);
2574 		if (is_10G(sc)) {
2575 			mmd = mid->phy_id >> 8;
2576 			if (!mmd)
2577 				mmd = MDIO_DEV_PCS;
2578 			else if (mmd > MDIO_DEV_VEND2)
2579 				return (EINVAL);
2580 
2581 			error = phy->mdio_write(sc, mid->phy_id & 0x1f,
2582 					      mmd, mid->reg_num, mid->val_in);
2583 		} else
2584 			error = phy->mdio_write(sc, mid->phy_id & 0x1f, 0,
2585 					      mid->reg_num & 0x1f,
2586 					      mid->val_in);
2587 		break;
2588 	}
2589 	case CHELSIO_SETREG: {
2590 		struct ch_reg *edata = (struct ch_reg *)data;
2591 		if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2592 			return (EFAULT);
2593 		t3_write_reg(sc, edata->addr, edata->val);
2594 		break;
2595 	}
2596 	case CHELSIO_GETREG: {
2597 		struct ch_reg *edata = (struct ch_reg *)data;
2598 		if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2599 			return (EFAULT);
2600 		edata->val = t3_read_reg(sc, edata->addr);
2601 		break;
2602 	}
2603 	case CHELSIO_GET_SGE_CONTEXT: {
2604 		struct ch_cntxt *ecntxt = (struct ch_cntxt *)data;
2605 		mtx_lock_spin(&sc->sge.reg_lock);
2606 		switch (ecntxt->cntxt_type) {
2607 		case CNTXT_TYPE_EGRESS:
2608 			error = -t3_sge_read_ecntxt(sc, ecntxt->cntxt_id,
2609 			    ecntxt->data);
2610 			break;
2611 		case CNTXT_TYPE_FL:
2612 			error = -t3_sge_read_fl(sc, ecntxt->cntxt_id,
2613 			    ecntxt->data);
2614 			break;
2615 		case CNTXT_TYPE_RSP:
2616 			error = -t3_sge_read_rspq(sc, ecntxt->cntxt_id,
2617 			    ecntxt->data);
2618 			break;
2619 		case CNTXT_TYPE_CQ:
2620 			error = -t3_sge_read_cq(sc, ecntxt->cntxt_id,
2621 			    ecntxt->data);
2622 			break;
2623 		default:
2624 			error = EINVAL;
2625 			break;
2626 		}
2627 		mtx_unlock_spin(&sc->sge.reg_lock);
2628 		break;
2629 	}
2630 	case CHELSIO_GET_SGE_DESC: {
2631 		struct ch_desc *edesc = (struct ch_desc *)data;
2632 		int ret;
2633 		if (edesc->queue_num >= SGE_QSETS * 6)
2634 			return (EINVAL);
2635 		ret = t3_get_desc(&sc->sge.qs[edesc->queue_num / 6],
2636 		    edesc->queue_num % 6, edesc->idx, edesc->data);
2637 		if (ret < 0)
2638 			return (EINVAL);
2639 		edesc->size = ret;
2640 		break;
2641 	}
2642 	case CHELSIO_GET_QSET_PARAMS: {
2643 		struct qset_params *q;
2644 		struct ch_qset_params *t = (struct ch_qset_params *)data;
2645 		int q1 = pi->first_qset;
2646 		int nqsets = pi->nqsets;
2647 		int i;
2648 
2649 		if (t->qset_idx >= nqsets)
2650 			return EINVAL;
2651 
2652 		i = q1 + t->qset_idx;
2653 		q = &sc->params.sge.qset[i];
2654 		t->rspq_size   = q->rspq_size;
2655 		t->txq_size[0] = q->txq_size[0];
2656 		t->txq_size[1] = q->txq_size[1];
2657 		t->txq_size[2] = q->txq_size[2];
2658 		t->fl_size[0]  = q->fl_size;
2659 		t->fl_size[1]  = q->jumbo_size;
2660 		t->polling     = q->polling;
2661 		t->lro         = q->lro;
2662 		t->intr_lat    = q->coalesce_usecs;
2663 		t->cong_thres  = q->cong_thres;
2664 		t->qnum        = i;
2665 
2666 		if ((sc->flags & FULL_INIT_DONE) == 0)
2667 			t->vector = 0;
2668 		else if (sc->flags & USING_MSIX)
2669 			t->vector = rman_get_start(sc->msix_irq_res[i]);
2670 		else
2671 			t->vector = rman_get_start(sc->irq_res);
2672 
2673 		break;
2674 	}
2675 	case CHELSIO_GET_QSET_NUM: {
2676 		struct ch_reg *edata = (struct ch_reg *)data;
2677 		edata->val = pi->nqsets;
2678 		break;
2679 	}
2680 	case CHELSIO_LOAD_FW: {
2681 		uint8_t *fw_data;
2682 		uint32_t vers;
2683 		struct ch_mem_range *t = (struct ch_mem_range *)data;
2684 
2685 		/*
2686 		 * You're allowed to load a firmware only before FULL_INIT_DONE
2687 		 *
2688 		 * FW_UPTODATE is also set so the rest of the initialization
2689 		 * will not overwrite what was loaded here.  This gives you the
2690 		 * flexibility to load any firmware (and maybe shoot yourself in
2691 		 * the foot).
2692 		 */
2693 
2694 		ADAPTER_LOCK(sc);
2695 		if (sc->open_device_map || sc->flags & FULL_INIT_DONE) {
2696 			ADAPTER_UNLOCK(sc);
2697 			return (EBUSY);
2698 		}
2699 
2700 		fw_data = malloc(t->len, M_DEVBUF, M_NOWAIT);
2701 		if (!fw_data)
2702 			error = ENOMEM;
2703 		else
2704 			error = copyin(t->buf, fw_data, t->len);
2705 
2706 		if (!error)
2707 			error = -t3_load_fw(sc, fw_data, t->len);
2708 
2709 		if (t3_get_fw_version(sc, &vers) == 0) {
2710 			snprintf(&sc->fw_version[0], sizeof(sc->fw_version),
2711 			    "%d.%d.%d", G_FW_VERSION_MAJOR(vers),
2712 			    G_FW_VERSION_MINOR(vers), G_FW_VERSION_MICRO(vers));
2713 		}
2714 
2715 		if (!error)
2716 			sc->flags |= FW_UPTODATE;
2717 
2718 		free(fw_data, M_DEVBUF);
2719 		ADAPTER_UNLOCK(sc);
2720 		break;
2721 	}
2722 	case CHELSIO_LOAD_BOOT: {
2723 		uint8_t *boot_data;
2724 		struct ch_mem_range *t = (struct ch_mem_range *)data;
2725 
2726 		boot_data = malloc(t->len, M_DEVBUF, M_NOWAIT);
2727 		if (!boot_data)
2728 			return ENOMEM;
2729 
2730 		error = copyin(t->buf, boot_data, t->len);
2731 		if (!error)
2732 			error = -t3_load_boot(sc, boot_data, t->len);
2733 
2734 		free(boot_data, M_DEVBUF);
2735 		break;
2736 	}
2737 	case CHELSIO_GET_PM: {
2738 		struct ch_pm *m = (struct ch_pm *)data;
2739 		struct tp_params *p = &sc->params.tp;
2740 
2741 		if (!is_offload(sc))
2742 			return (EOPNOTSUPP);
2743 
2744 		m->tx_pg_sz = p->tx_pg_size;
2745 		m->tx_num_pg = p->tx_num_pgs;
2746 		m->rx_pg_sz  = p->rx_pg_size;
2747 		m->rx_num_pg = p->rx_num_pgs;
2748 		m->pm_total  = p->pmtx_size + p->chan_rx_size * p->nchan;
2749 
2750 		break;
2751 	}
2752 	case CHELSIO_SET_PM: {
2753 		struct ch_pm *m = (struct ch_pm *)data;
2754 		struct tp_params *p = &sc->params.tp;
2755 
2756 		if (!is_offload(sc))
2757 			return (EOPNOTSUPP);
2758 		if (sc->flags & FULL_INIT_DONE)
2759 			return (EBUSY);
2760 
2761 		if (!m->rx_pg_sz || (m->rx_pg_sz & (m->rx_pg_sz - 1)) ||
2762 		    !m->tx_pg_sz || (m->tx_pg_sz & (m->tx_pg_sz - 1)))
2763 			return (EINVAL);	/* not power of 2 */
2764 		if (!(m->rx_pg_sz & 0x14000))
2765 			return (EINVAL);	/* not 16KB or 64KB */
2766 		if (!(m->tx_pg_sz & 0x1554000))
2767 			return (EINVAL);
2768 		if (m->tx_num_pg == -1)
2769 			m->tx_num_pg = p->tx_num_pgs;
2770 		if (m->rx_num_pg == -1)
2771 			m->rx_num_pg = p->rx_num_pgs;
2772 		if (m->tx_num_pg % 24 || m->rx_num_pg % 24)
2773 			return (EINVAL);
2774 		if (m->rx_num_pg * m->rx_pg_sz > p->chan_rx_size ||
2775 		    m->tx_num_pg * m->tx_pg_sz > p->chan_tx_size)
2776 			return (EINVAL);
2777 
2778 		p->rx_pg_size = m->rx_pg_sz;
2779 		p->tx_pg_size = m->tx_pg_sz;
2780 		p->rx_num_pgs = m->rx_num_pg;
2781 		p->tx_num_pgs = m->tx_num_pg;
2782 		break;
2783 	}
2784 	case CHELSIO_SETMTUTAB: {
2785 		struct ch_mtus *m = (struct ch_mtus *)data;
2786 		int i;
2787 
2788 		if (!is_offload(sc))
2789 			return (EOPNOTSUPP);
2790 		if (offload_running(sc))
2791 			return (EBUSY);
2792 		if (m->nmtus != NMTUS)
2793 			return (EINVAL);
2794 		if (m->mtus[0] < 81)         /* accommodate SACK */
2795 			return (EINVAL);
2796 
2797 		/*
2798 		 * MTUs must be in ascending order
2799 		 */
2800 		for (i = 1; i < NMTUS; ++i)
2801 			if (m->mtus[i] < m->mtus[i - 1])
2802 				return (EINVAL);
2803 
2804 		memcpy(sc->params.mtus, m->mtus, sizeof(sc->params.mtus));
2805 		break;
2806 	}
2807 	case CHELSIO_GETMTUTAB: {
2808 		struct ch_mtus *m = (struct ch_mtus *)data;
2809 
2810 		if (!is_offload(sc))
2811 			return (EOPNOTSUPP);
2812 
2813 		memcpy(m->mtus, sc->params.mtus, sizeof(m->mtus));
2814 		m->nmtus = NMTUS;
2815 		break;
2816 	}
2817 	case CHELSIO_GET_MEM: {
2818 		struct ch_mem_range *t = (struct ch_mem_range *)data;
2819 		struct mc7 *mem;
2820 		uint8_t *useraddr;
2821 		u64 buf[32];
2822 
2823 		/*
2824 		 * Use these to avoid modifying len/addr in the return
2825 		 * struct
2826 		 */
2827 		uint32_t len = t->len, addr = t->addr;
2828 
2829 		if (!is_offload(sc))
2830 			return (EOPNOTSUPP);
2831 		if (!(sc->flags & FULL_INIT_DONE))
2832 			return (EIO);         /* need the memory controllers */
2833 		if ((addr & 0x7) || (len & 0x7))
2834 			return (EINVAL);
2835 		if (t->mem_id == MEM_CM)
2836 			mem = &sc->cm;
2837 		else if (t->mem_id == MEM_PMRX)
2838 			mem = &sc->pmrx;
2839 		else if (t->mem_id == MEM_PMTX)
2840 			mem = &sc->pmtx;
2841 		else
2842 			return (EINVAL);
2843 
2844 		/*
2845 		 * Version scheme:
2846 		 * bits 0..9: chip version
2847 		 * bits 10..15: chip revision
2848 		 */
2849 		t->version = 3 | (sc->params.rev << 10);
2850 
2851 		/*
2852 		 * Read 256 bytes at a time as len can be large and we don't
2853 		 * want to use huge intermediate buffers.
2854 		 */
2855 		useraddr = (uint8_t *)t->buf;
2856 		while (len) {
2857 			unsigned int chunk = min(len, sizeof(buf));
2858 
2859 			error = t3_mc7_bd_read(mem, addr / 8, chunk / 8, buf);
2860 			if (error)
2861 				return (-error);
2862 			if (copyout(buf, useraddr, chunk))
2863 				return (EFAULT);
2864 			useraddr += chunk;
2865 			addr += chunk;
2866 			len -= chunk;
2867 		}
2868 		break;
2869 	}
2870 	case CHELSIO_READ_TCAM_WORD: {
2871 		struct ch_tcam_word *t = (struct ch_tcam_word *)data;
2872 
2873 		if (!is_offload(sc))
2874 			return (EOPNOTSUPP);
2875 		if (!(sc->flags & FULL_INIT_DONE))
2876 			return (EIO);         /* need MC5 */
2877 		return -t3_read_mc5_range(&sc->mc5, t->addr, 1, t->buf);
2878 		break;
2879 	}
2880 	case CHELSIO_SET_TRACE_FILTER: {
2881 		struct ch_trace *t = (struct ch_trace *)data;
2882 		const struct trace_params *tp;
2883 
2884 		tp = (const struct trace_params *)&t->sip;
2885 		if (t->config_tx)
2886 			t3_config_trace_filter(sc, tp, 0, t->invert_match,
2887 					       t->trace_tx);
2888 		if (t->config_rx)
2889 			t3_config_trace_filter(sc, tp, 1, t->invert_match,
2890 					       t->trace_rx);
2891 		break;
2892 	}
2893 	case CHELSIO_SET_PKTSCHED: {
2894 		struct ch_pktsched_params *p = (struct ch_pktsched_params *)data;
2895 		if (sc->open_device_map == 0)
2896 			return (EAGAIN);
2897 		send_pktsched_cmd(sc, p->sched, p->idx, p->min, p->max,
2898 		    p->binding);
2899 		break;
2900 	}
2901 	case CHELSIO_IFCONF_GETREGS: {
2902 		struct ch_ifconf_regs *regs = (struct ch_ifconf_regs *)data;
2903 		int reglen = cxgb_get_regs_len();
2904 		uint8_t *buf = malloc(reglen, M_DEVBUF, M_NOWAIT);
2905 		if (buf == NULL) {
2906 			return (ENOMEM);
2907 		}
2908 		if (regs->len > reglen)
2909 			regs->len = reglen;
2910 		else if (regs->len < reglen)
2911 			error = ENOBUFS;
2912 
2913 		if (!error) {
2914 			cxgb_get_regs(sc, regs, buf);
2915 			error = copyout(buf, regs->data, reglen);
2916 		}
2917 		free(buf, M_DEVBUF);
2918 
2919 		break;
2920 	}
2921 	case CHELSIO_SET_HW_SCHED: {
2922 		struct ch_hw_sched *t = (struct ch_hw_sched *)data;
2923 		unsigned int ticks_per_usec = core_ticks_per_usec(sc);
2924 
2925 		if ((sc->flags & FULL_INIT_DONE) == 0)
2926 			return (EAGAIN);       /* need TP to be initialized */
2927 		if (t->sched >= NTX_SCHED || !in_range(t->mode, 0, 1) ||
2928 		    !in_range(t->channel, 0, 1) ||
2929 		    !in_range(t->kbps, 0, 10000000) ||
2930 		    !in_range(t->class_ipg, 0, 10000 * 65535 / ticks_per_usec) ||
2931 		    !in_range(t->flow_ipg, 0,
2932 			      dack_ticks_to_usec(sc, 0x7ff)))
2933 			return (EINVAL);
2934 
2935 		if (t->kbps >= 0) {
2936 			error = t3_config_sched(sc, t->kbps, t->sched);
2937 			if (error < 0)
2938 				return (-error);
2939 		}
2940 		if (t->class_ipg >= 0)
2941 			t3_set_sched_ipg(sc, t->sched, t->class_ipg);
2942 		if (t->flow_ipg >= 0) {
2943 			t->flow_ipg *= 1000;     /* us -> ns */
2944 			t3_set_pace_tbl(sc, &t->flow_ipg, t->sched, 1);
2945 		}
2946 		if (t->mode >= 0) {
2947 			int bit = 1 << (S_TX_MOD_TIMER_MODE + t->sched);
2948 
2949 			t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
2950 					 bit, t->mode ? bit : 0);
2951 		}
2952 		if (t->channel >= 0)
2953 			t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
2954 					 1 << t->sched, t->channel << t->sched);
2955 		break;
2956 	}
2957 	case CHELSIO_GET_EEPROM: {
2958 		int i;
2959 		struct ch_eeprom *e = (struct ch_eeprom *)data;
2960 		uint8_t *buf = malloc(EEPROMSIZE, M_DEVBUF, M_NOWAIT);
2961 
2962 		if (buf == NULL) {
2963 			return (ENOMEM);
2964 		}
2965 		e->magic = EEPROM_MAGIC;
2966 		for (i = e->offset & ~3; !error && i < e->offset + e->len; i += 4)
2967 			error = -t3_seeprom_read(sc, i, (uint32_t *)&buf[i]);
2968 
2969 		if (!error)
2970 			error = copyout(buf + e->offset, e->data, e->len);
2971 
2972 		free(buf, M_DEVBUF);
2973 		break;
2974 	}
2975 	case CHELSIO_CLEAR_STATS: {
2976 		if (!(sc->flags & FULL_INIT_DONE))
2977 			return EAGAIN;
2978 
2979 		PORT_LOCK(pi);
2980 		t3_mac_update_stats(&pi->mac);
2981 		memset(&pi->mac.stats, 0, sizeof(pi->mac.stats));
2982 		PORT_UNLOCK(pi);
2983 		break;
2984 	}
2985 	case CHELSIO_GET_UP_LA: {
2986 		struct ch_up_la *la = (struct ch_up_la *)data;
2987 		uint8_t *buf = malloc(LA_BUFSIZE, M_DEVBUF, M_NOWAIT);
2988 		if (buf == NULL) {
2989 			return (ENOMEM);
2990 		}
2991 		if (la->bufsize < LA_BUFSIZE)
2992 			error = ENOBUFS;
2993 
2994 		if (!error)
2995 			error = -t3_get_up_la(sc, &la->stopped, &la->idx,
2996 					      &la->bufsize, buf);
2997 		if (!error)
2998 			error = copyout(buf, la->data, la->bufsize);
2999 
3000 		free(buf, M_DEVBUF);
3001 		break;
3002 	}
3003 	case CHELSIO_GET_UP_IOQS: {
3004 		struct ch_up_ioqs *ioqs = (struct ch_up_ioqs *)data;
3005 		uint8_t *buf = malloc(IOQS_BUFSIZE, M_DEVBUF, M_NOWAIT);
3006 		uint32_t *v;
3007 
3008 		if (buf == NULL) {
3009 			return (ENOMEM);
3010 		}
3011 		if (ioqs->bufsize < IOQS_BUFSIZE)
3012 			error = ENOBUFS;
3013 
3014 		if (!error)
3015 			error = -t3_get_up_ioqs(sc, &ioqs->bufsize, buf);
3016 
3017 		if (!error) {
3018 			v = (uint32_t *)buf;
3019 
3020 			ioqs->ioq_rx_enable = *v++;
3021 			ioqs->ioq_tx_enable = *v++;
3022 			ioqs->ioq_rx_status = *v++;
3023 			ioqs->ioq_tx_status = *v++;
3024 
3025 			error = copyout(v, ioqs->data, ioqs->bufsize);
3026 		}
3027 
3028 		free(buf, M_DEVBUF);
3029 		break;
3030 	}
3031 	case CHELSIO_SET_FILTER: {
3032 		struct ch_filter *f = (struct ch_filter *)data;
3033 		struct filter_info *p;
3034 		unsigned int nfilters = sc->params.mc5.nfilters;
3035 
3036 		if (!is_offload(sc))
3037 			return (EOPNOTSUPP);	/* No TCAM */
3038 		if (!(sc->flags & FULL_INIT_DONE))
3039 			return (EAGAIN);	/* mc5 not setup yet */
3040 		if (nfilters == 0)
3041 			return (EBUSY);		/* TOE will use TCAM */
3042 
3043 		/* sanity checks */
3044 		if (f->filter_id >= nfilters ||
3045 		    (f->val.dip && f->mask.dip != 0xffffffff) ||
3046 		    (f->val.sport && f->mask.sport != 0xffff) ||
3047 		    (f->val.dport && f->mask.dport != 0xffff) ||
3048 		    (f->val.vlan && f->mask.vlan != 0xfff) ||
3049 		    (f->val.vlan_prio &&
3050 			f->mask.vlan_prio != FILTER_NO_VLAN_PRI) ||
3051 		    (f->mac_addr_idx != 0xffff && f->mac_addr_idx > 15) ||
3052 		    f->qset >= SGE_QSETS ||
3053 		    sc->rrss_map[f->qset] >= RSS_TABLE_SIZE)
3054 			return (EINVAL);
3055 
3056 		/* Was allocated with M_WAITOK */
3057 		KASSERT(sc->filters, ("filter table NULL\n"));
3058 
3059 		p = &sc->filters[f->filter_id];
3060 		if (p->locked)
3061 			return (EPERM);
3062 
3063 		bzero(p, sizeof(*p));
3064 		p->sip = f->val.sip;
3065 		p->sip_mask = f->mask.sip;
3066 		p->dip = f->val.dip;
3067 		p->sport = f->val.sport;
3068 		p->dport = f->val.dport;
3069 		p->vlan = f->mask.vlan ? f->val.vlan : 0xfff;
3070 		p->vlan_prio = f->mask.vlan_prio ? (f->val.vlan_prio & 6) :
3071 		    FILTER_NO_VLAN_PRI;
3072 		p->mac_hit = f->mac_hit;
3073 		p->mac_vld = f->mac_addr_idx != 0xffff;
3074 		p->mac_idx = f->mac_addr_idx;
3075 		p->pkt_type = f->proto;
3076 		p->report_filter_id = f->want_filter_id;
3077 		p->pass = f->pass;
3078 		p->rss = f->rss;
3079 		p->qset = f->qset;
3080 
3081 		error = set_filter(sc, f->filter_id, p);
3082 		if (error == 0)
3083 			p->valid = 1;
3084 		break;
3085 	}
3086 	case CHELSIO_DEL_FILTER: {
3087 		struct ch_filter *f = (struct ch_filter *)data;
3088 		struct filter_info *p;
3089 		unsigned int nfilters = sc->params.mc5.nfilters;
3090 
3091 		if (!is_offload(sc))
3092 			return (EOPNOTSUPP);
3093 		if (!(sc->flags & FULL_INIT_DONE))
3094 			return (EAGAIN);
3095 		if (nfilters == 0 || sc->filters == NULL)
3096 			return (EINVAL);
3097 		if (f->filter_id >= nfilters)
3098 		       return (EINVAL);
3099 
3100 		p = &sc->filters[f->filter_id];
3101 		if (p->locked)
3102 			return (EPERM);
3103 		if (!p->valid)
3104 			return (EFAULT); /* Read "Bad address" as "Bad index" */
3105 
3106 		bzero(p, sizeof(*p));
3107 		p->sip = p->sip_mask = 0xffffffff;
3108 		p->vlan = 0xfff;
3109 		p->vlan_prio = FILTER_NO_VLAN_PRI;
3110 		p->pkt_type = 1;
3111 		error = set_filter(sc, f->filter_id, p);
3112 		break;
3113 	}
3114 	case CHELSIO_GET_FILTER: {
3115 		struct ch_filter *f = (struct ch_filter *)data;
3116 		struct filter_info *p;
3117 		unsigned int i, nfilters = sc->params.mc5.nfilters;
3118 
3119 		if (!is_offload(sc))
3120 			return (EOPNOTSUPP);
3121 		if (!(sc->flags & FULL_INIT_DONE))
3122 			return (EAGAIN);
3123 		if (nfilters == 0 || sc->filters == NULL)
3124 			return (EINVAL);
3125 
3126 		i = f->filter_id == 0xffffffff ? 0 : f->filter_id + 1;
3127 		for (; i < nfilters; i++) {
3128 			p = &sc->filters[i];
3129 			if (!p->valid)
3130 				continue;
3131 
3132 			bzero(f, sizeof(*f));
3133 
3134 			f->filter_id = i;
3135 			f->val.sip = p->sip;
3136 			f->mask.sip = p->sip_mask;
3137 			f->val.dip = p->dip;
3138 			f->mask.dip = p->dip ? 0xffffffff : 0;
3139 			f->val.sport = p->sport;
3140 			f->mask.sport = p->sport ? 0xffff : 0;
3141 			f->val.dport = p->dport;
3142 			f->mask.dport = p->dport ? 0xffff : 0;
3143 			f->val.vlan = p->vlan == 0xfff ? 0 : p->vlan;
3144 			f->mask.vlan = p->vlan == 0xfff ? 0 : 0xfff;
3145 			f->val.vlan_prio = p->vlan_prio == FILTER_NO_VLAN_PRI ?
3146 			    0 : p->vlan_prio;
3147 			f->mask.vlan_prio = p->vlan_prio == FILTER_NO_VLAN_PRI ?
3148 			    0 : FILTER_NO_VLAN_PRI;
3149 			f->mac_hit = p->mac_hit;
3150 			f->mac_addr_idx = p->mac_vld ? p->mac_idx : 0xffff;
3151 			f->proto = p->pkt_type;
3152 			f->want_filter_id = p->report_filter_id;
3153 			f->pass = p->pass;
3154 			f->rss = p->rss;
3155 			f->qset = p->qset;
3156 
3157 			break;
3158 		}
3159 
3160 		if (i == nfilters)
3161 			f->filter_id = 0xffffffff;
3162 		break;
3163 	}
3164 	default:
3165 		return (EOPNOTSUPP);
3166 		break;
3167 	}
3168 
3169 	return (error);
3170 }
3171 
3172 static __inline void
3173 reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
3174     unsigned int end)
3175 {
3176 	uint32_t *p = (uint32_t *)(buf + start);
3177 
3178 	for ( ; start <= end; start += sizeof(uint32_t))
3179 		*p++ = t3_read_reg(ap, start);
3180 }
3181 
3182 #define T3_REGMAP_SIZE (3 * 1024)
3183 static int
3184 cxgb_get_regs_len(void)
3185 {
3186 	return T3_REGMAP_SIZE;
3187 }
3188 
3189 static void
3190 cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf)
3191 {
3192 
3193 	/*
3194 	 * Version scheme:
3195 	 * bits 0..9: chip version
3196 	 * bits 10..15: chip revision
3197 	 * bit 31: set for PCIe cards
3198 	 */
3199 	regs->version = 3 | (sc->params.rev << 10) | (is_pcie(sc) << 31);
3200 
3201 	/*
3202 	 * We skip the MAC statistics registers because they are clear-on-read.
3203 	 * Also reading multi-register stats would need to synchronize with the
3204 	 * periodic mac stats accumulation.  Hard to justify the complexity.
3205 	 */
3206 	memset(buf, 0, cxgb_get_regs_len());
3207 	reg_block_dump(sc, buf, 0, A_SG_RSPQ_CREDIT_RETURN);
3208 	reg_block_dump(sc, buf, A_SG_HI_DRB_HI_THRSH, A_ULPRX_PBL_ULIMIT);
3209 	reg_block_dump(sc, buf, A_ULPTX_CONFIG, A_MPS_INT_CAUSE);
3210 	reg_block_dump(sc, buf, A_CPL_SWITCH_CNTRL, A_CPL_MAP_TBL_DATA);
3211 	reg_block_dump(sc, buf, A_SMB_GLOBAL_TIME_CFG, A_XGM_SERDES_STAT3);
3212 	reg_block_dump(sc, buf, A_XGM_SERDES_STATUS0,
3213 		       XGM_REG(A_XGM_SERDES_STAT3, 1));
3214 	reg_block_dump(sc, buf, XGM_REG(A_XGM_SERDES_STATUS0, 1),
3215 		       XGM_REG(A_XGM_RX_SPI4_SOP_EOP_CNT, 1));
3216 }
3217 
3218 static int
3219 alloc_filters(struct adapter *sc)
3220 {
3221 	struct filter_info *p;
3222 	unsigned int nfilters = sc->params.mc5.nfilters;
3223 
3224 	if (nfilters == 0)
3225 		return (0);
3226 
3227 	p = malloc(sizeof(*p) * nfilters, M_DEVBUF, M_WAITOK | M_ZERO);
3228 	sc->filters = p;
3229 
3230 	p = &sc->filters[nfilters - 1];
3231 	p->vlan = 0xfff;
3232 	p->vlan_prio = FILTER_NO_VLAN_PRI;
3233 	p->pass = p->rss = p->valid = p->locked = 1;
3234 
3235 	return (0);
3236 }
3237 
3238 static int
3239 setup_hw_filters(struct adapter *sc)
3240 {
3241 	int i, rc;
3242 	unsigned int nfilters = sc->params.mc5.nfilters;
3243 
3244 	if (!sc->filters)
3245 		return (0);
3246 
3247 	t3_enable_filters(sc);
3248 
3249 	for (i = rc = 0; i < nfilters && !rc; i++) {
3250 		if (sc->filters[i].locked)
3251 			rc = set_filter(sc, i, &sc->filters[i]);
3252 	}
3253 
3254 	return (rc);
3255 }
3256 
3257 static int
3258 set_filter(struct adapter *sc, int id, const struct filter_info *f)
3259 {
3260 	int len;
3261 	struct mbuf *m;
3262 	struct ulp_txpkt *txpkt;
3263 	struct work_request_hdr *wr;
3264 	struct cpl_pass_open_req *oreq;
3265 	struct cpl_set_tcb_field *sreq;
3266 
3267 	len = sizeof(*wr) + sizeof(*oreq) + 2 * sizeof(*sreq);
3268 	KASSERT(len <= MHLEN, ("filter request too big for an mbuf"));
3269 
3270 	id += t3_mc5_size(&sc->mc5) - sc->params.mc5.nroutes -
3271 	      sc->params.mc5.nfilters;
3272 
3273 	m = m_gethdr(M_WAITOK, MT_DATA);
3274 	m->m_len = m->m_pkthdr.len = len;
3275 	bzero(mtod(m, char *), len);
3276 
3277 	wr = mtod(m, struct work_request_hdr *);
3278 	wr->wrh_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS) | F_WR_ATOMIC);
3279 
3280 	oreq = (struct cpl_pass_open_req *)(wr + 1);
3281 	txpkt = (struct ulp_txpkt *)oreq;
3282 	txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT));
3283 	txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*oreq) / 8));
3284 	OPCODE_TID(oreq) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, id));
3285 	oreq->local_port = htons(f->dport);
3286 	oreq->peer_port = htons(f->sport);
3287 	oreq->local_ip = htonl(f->dip);
3288 	oreq->peer_ip = htonl(f->sip);
3289 	oreq->peer_netmask = htonl(f->sip_mask);
3290 	oreq->opt0h = 0;
3291 	oreq->opt0l = htonl(F_NO_OFFLOAD);
3292 	oreq->opt1 = htonl(V_MAC_MATCH_VALID(f->mac_vld) |
3293 			 V_CONN_POLICY(CPL_CONN_POLICY_FILTER) |
3294 			 V_VLAN_PRI(f->vlan_prio >> 1) |
3295 			 V_VLAN_PRI_VALID(f->vlan_prio != FILTER_NO_VLAN_PRI) |
3296 			 V_PKT_TYPE(f->pkt_type) | V_OPT1_VLAN(f->vlan) |
3297 			 V_MAC_MATCH(f->mac_idx | (f->mac_hit << 4)));
3298 
3299 	sreq = (struct cpl_set_tcb_field *)(oreq + 1);
3300 	set_tcb_field_ulp(sreq, id, 1, 0x1800808000ULL,
3301 			  (f->report_filter_id << 15) | (1 << 23) |
3302 			  ((u64)f->pass << 35) | ((u64)!f->rss << 36));
3303 	set_tcb_field_ulp(sreq + 1, id, 0, 0xffffffff, (2 << 19) | 1);
3304 	t3_mgmt_tx(sc, m);
3305 
3306 	if (f->pass && !f->rss) {
3307 		len = sizeof(*sreq);
3308 		m = m_gethdr(M_WAITOK, MT_DATA);
3309 		m->m_len = m->m_pkthdr.len = len;
3310 		bzero(mtod(m, char *), len);
3311 		sreq = mtod(m, struct cpl_set_tcb_field *);
3312 		sreq->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
3313 		mk_set_tcb_field(sreq, id, 25, 0x3f80000,
3314 				 (u64)sc->rrss_map[f->qset] << 19);
3315 		t3_mgmt_tx(sc, m);
3316 	}
3317 	return 0;
3318 }
3319 
3320 static inline void
3321 mk_set_tcb_field(struct cpl_set_tcb_field *req, unsigned int tid,
3322     unsigned int word, u64 mask, u64 val)
3323 {
3324 	OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid));
3325 	req->reply = V_NO_REPLY(1);
3326 	req->cpu_idx = 0;
3327 	req->word = htons(word);
3328 	req->mask = htobe64(mask);
3329 	req->val = htobe64(val);
3330 }
3331 
3332 static inline void
3333 set_tcb_field_ulp(struct cpl_set_tcb_field *req, unsigned int tid,
3334     unsigned int word, u64 mask, u64 val)
3335 {
3336 	struct ulp_txpkt *txpkt = (struct ulp_txpkt *)req;
3337 
3338 	txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT));
3339 	txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*req) / 8));
3340 	mk_set_tcb_field(req, tid, word, mask, val);
3341 }
3342 
3343 void
3344 t3_iterate(void (*func)(struct adapter *, void *), void *arg)
3345 {
3346 	struct adapter *sc;
3347 
3348 	mtx_lock(&t3_list_lock);
3349 	SLIST_FOREACH(sc, &t3_list, link) {
3350 		/*
3351 		 * func should not make any assumptions about what state sc is
3352 		 * in - the only guarantee is that sc->sc_lock is a valid lock.
3353 		 */
3354 		func(sc, arg);
3355 	}
3356 	mtx_unlock(&t3_list_lock);
3357 }
3358 
3359 #ifdef TCP_OFFLOAD
3360 static int
3361 toe_capability(struct port_info *pi, int enable)
3362 {
3363 	int rc;
3364 	struct adapter *sc = pi->adapter;
3365 
3366 	ADAPTER_LOCK_ASSERT_OWNED(sc);
3367 
3368 	if (!is_offload(sc))
3369 		return (ENODEV);
3370 
3371 	if (enable) {
3372 		if (!(sc->flags & FULL_INIT_DONE)) {
3373 			log(LOG_WARNING,
3374 			    "You must enable a cxgb interface first\n");
3375 			return (EAGAIN);
3376 		}
3377 
3378 		if (isset(&sc->offload_map, pi->port_id))
3379 			return (0);
3380 
3381 		if (!(sc->flags & TOM_INIT_DONE)) {
3382 			rc = t3_activate_uld(sc, ULD_TOM);
3383 			if (rc == EAGAIN) {
3384 				log(LOG_WARNING,
3385 				    "You must kldload t3_tom.ko before trying "
3386 				    "to enable TOE on a cxgb interface.\n");
3387 			}
3388 			if (rc != 0)
3389 				return (rc);
3390 			KASSERT(sc->tom_softc != NULL,
3391 			    ("%s: TOM activated but softc NULL", __func__));
3392 			KASSERT(sc->flags & TOM_INIT_DONE,
3393 			    ("%s: TOM activated but flag not set", __func__));
3394 		}
3395 
3396 		setbit(&sc->offload_map, pi->port_id);
3397 
3398 		/*
3399 		 * XXX: Temporary code to allow iWARP to be enabled when TOE is
3400 		 * enabled on any port.  Need to figure out how to enable,
3401 		 * disable, load, and unload iWARP cleanly.
3402 		 */
3403 		if (!isset(&sc->offload_map, MAX_NPORTS) &&
3404 		    t3_activate_uld(sc, ULD_IWARP) == 0)
3405 			setbit(&sc->offload_map, MAX_NPORTS);
3406 	} else {
3407 		if (!isset(&sc->offload_map, pi->port_id))
3408 			return (0);
3409 
3410 		KASSERT(sc->flags & TOM_INIT_DONE,
3411 		    ("%s: TOM never initialized?", __func__));
3412 		clrbit(&sc->offload_map, pi->port_id);
3413 	}
3414 
3415 	return (0);
3416 }
3417 
3418 /*
3419  * Add an upper layer driver to the global list.
3420  */
3421 int
3422 t3_register_uld(struct uld_info *ui)
3423 {
3424 	int rc = 0;
3425 	struct uld_info *u;
3426 
3427 	mtx_lock(&t3_uld_list_lock);
3428 	SLIST_FOREACH(u, &t3_uld_list, link) {
3429 	    if (u->uld_id == ui->uld_id) {
3430 		    rc = EEXIST;
3431 		    goto done;
3432 	    }
3433 	}
3434 
3435 	SLIST_INSERT_HEAD(&t3_uld_list, ui, link);
3436 	ui->refcount = 0;
3437 done:
3438 	mtx_unlock(&t3_uld_list_lock);
3439 	return (rc);
3440 }
3441 
3442 int
3443 t3_unregister_uld(struct uld_info *ui)
3444 {
3445 	int rc = EINVAL;
3446 	struct uld_info *u;
3447 
3448 	mtx_lock(&t3_uld_list_lock);
3449 
3450 	SLIST_FOREACH(u, &t3_uld_list, link) {
3451 	    if (u == ui) {
3452 		    if (ui->refcount > 0) {
3453 			    rc = EBUSY;
3454 			    goto done;
3455 		    }
3456 
3457 		    SLIST_REMOVE(&t3_uld_list, ui, uld_info, link);
3458 		    rc = 0;
3459 		    goto done;
3460 	    }
3461 	}
3462 done:
3463 	mtx_unlock(&t3_uld_list_lock);
3464 	return (rc);
3465 }
3466 
3467 int
3468 t3_activate_uld(struct adapter *sc, int id)
3469 {
3470 	int rc = EAGAIN;
3471 	struct uld_info *ui;
3472 
3473 	mtx_lock(&t3_uld_list_lock);
3474 
3475 	SLIST_FOREACH(ui, &t3_uld_list, link) {
3476 		if (ui->uld_id == id) {
3477 			rc = ui->activate(sc);
3478 			if (rc == 0)
3479 				ui->refcount++;
3480 			goto done;
3481 		}
3482 	}
3483 done:
3484 	mtx_unlock(&t3_uld_list_lock);
3485 
3486 	return (rc);
3487 }
3488 
3489 int
3490 t3_deactivate_uld(struct adapter *sc, int id)
3491 {
3492 	int rc = EINVAL;
3493 	struct uld_info *ui;
3494 
3495 	mtx_lock(&t3_uld_list_lock);
3496 
3497 	SLIST_FOREACH(ui, &t3_uld_list, link) {
3498 		if (ui->uld_id == id) {
3499 			rc = ui->deactivate(sc);
3500 			if (rc == 0)
3501 				ui->refcount--;
3502 			goto done;
3503 		}
3504 	}
3505 done:
3506 	mtx_unlock(&t3_uld_list_lock);
3507 
3508 	return (rc);
3509 }
3510 
3511 static int
3512 cpl_not_handled(struct sge_qset *qs __unused, struct rsp_desc *r __unused,
3513     struct mbuf *m)
3514 {
3515 	m_freem(m);
3516 	return (EDOOFUS);
3517 }
3518 
3519 int
3520 t3_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h)
3521 {
3522 	uintptr_t *loc, new;
3523 
3524 	if (opcode >= NUM_CPL_HANDLERS)
3525 		return (EINVAL);
3526 
3527 	new = h ? (uintptr_t)h : (uintptr_t)cpl_not_handled;
3528 	loc = (uintptr_t *) &sc->cpl_handler[opcode];
3529 	atomic_store_rel_ptr(loc, new);
3530 
3531 	return (0);
3532 }
3533 #endif
3534 
3535 static int
3536 cxgbc_mod_event(module_t mod, int cmd, void *arg)
3537 {
3538 	int rc = 0;
3539 
3540 	switch (cmd) {
3541 	case MOD_LOAD:
3542 		mtx_init(&t3_list_lock, "T3 adapters", 0, MTX_DEF);
3543 		SLIST_INIT(&t3_list);
3544 #ifdef TCP_OFFLOAD
3545 		mtx_init(&t3_uld_list_lock, "T3 ULDs", 0, MTX_DEF);
3546 		SLIST_INIT(&t3_uld_list);
3547 #endif
3548 		break;
3549 
3550 	case MOD_UNLOAD:
3551 #ifdef TCP_OFFLOAD
3552 		mtx_lock(&t3_uld_list_lock);
3553 		if (!SLIST_EMPTY(&t3_uld_list)) {
3554 			rc = EBUSY;
3555 			mtx_unlock(&t3_uld_list_lock);
3556 			break;
3557 		}
3558 		mtx_unlock(&t3_uld_list_lock);
3559 		mtx_destroy(&t3_uld_list_lock);
3560 #endif
3561 		mtx_lock(&t3_list_lock);
3562 		if (!SLIST_EMPTY(&t3_list)) {
3563 			rc = EBUSY;
3564 			mtx_unlock(&t3_list_lock);
3565 			break;
3566 		}
3567 		mtx_unlock(&t3_list_lock);
3568 		mtx_destroy(&t3_list_lock);
3569 		break;
3570 	}
3571 
3572 	return (rc);
3573 }
3574