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