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