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