xref: /freebsd/sys/dev/cxgb/cxgb_main.c (revision 25292deb42c1c99213f6d603cf461b950691cc79)
1 /**************************************************************************
2 
3 Copyright (c) 2007-2008, 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 #ifdef CONFIG_DEFINED
80 #include <cxgb_include.h>
81 #else
82 #include <dev/cxgb/cxgb_include.h>
83 #endif
84 
85 #ifdef PRIV_SUPPORTED
86 #include <sys/priv.h>
87 #endif
88 
89 #ifdef IFNET_MULTIQUEUE
90 #include <machine/intr_machdep.h>
91 #endif
92 
93 static int cxgb_setup_msix(adapter_t *, int);
94 static void cxgb_teardown_msix(adapter_t *);
95 static void cxgb_init(void *);
96 static void cxgb_init_locked(struct port_info *);
97 static void cxgb_stop_locked(struct port_info *);
98 static void cxgb_set_rxmode(struct port_info *);
99 static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t);
100 static int cxgb_media_change(struct ifnet *);
101 static void cxgb_media_status(struct ifnet *, struct ifmediareq *);
102 static int setup_sge_qsets(adapter_t *);
103 static void cxgb_async_intr(void *);
104 static void cxgb_ext_intr_handler(void *, int);
105 static void cxgb_tick_handler(void *, int);
106 static void cxgb_down_locked(struct adapter *sc);
107 static void cxgb_tick(void *);
108 static void setup_rss(adapter_t *sc);
109 
110 /* Attachment glue for the PCI controller end of the device.  Each port of
111  * the device is attached separately, as defined later.
112  */
113 static int cxgb_controller_probe(device_t);
114 static int cxgb_controller_attach(device_t);
115 static int cxgb_controller_detach(device_t);
116 static void cxgb_free(struct adapter *);
117 static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
118     unsigned int end);
119 static void cxgb_get_regs(adapter_t *sc, struct ifconf_regs *regs, uint8_t *buf);
120 static int cxgb_get_regs_len(void);
121 static int offload_open(struct port_info *pi);
122 static void touch_bars(device_t dev);
123 static int offload_close(struct t3cdev *tdev);
124 static void cxgb_link_start(struct port_info *p);
125 
126 static device_method_t cxgb_controller_methods[] = {
127 	DEVMETHOD(device_probe,		cxgb_controller_probe),
128 	DEVMETHOD(device_attach,	cxgb_controller_attach),
129 	DEVMETHOD(device_detach,	cxgb_controller_detach),
130 
131 	/* bus interface */
132 	DEVMETHOD(bus_print_child,	bus_generic_print_child),
133 	DEVMETHOD(bus_driver_added,	bus_generic_driver_added),
134 
135 	{ 0, 0 }
136 };
137 
138 static driver_t cxgb_controller_driver = {
139 	"cxgbc",
140 	cxgb_controller_methods,
141 	sizeof(struct adapter)
142 };
143 
144 static devclass_t	cxgb_controller_devclass;
145 DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass, 0, 0);
146 
147 /*
148  * Attachment glue for the ports.  Attachment is done directly to the
149  * controller device.
150  */
151 static int cxgb_port_probe(device_t);
152 static int cxgb_port_attach(device_t);
153 static int cxgb_port_detach(device_t);
154 
155 static device_method_t cxgb_port_methods[] = {
156 	DEVMETHOD(device_probe,		cxgb_port_probe),
157 	DEVMETHOD(device_attach,	cxgb_port_attach),
158 	DEVMETHOD(device_detach,	cxgb_port_detach),
159 	{ 0, 0 }
160 };
161 
162 static driver_t cxgb_port_driver = {
163 	"cxgb",
164 	cxgb_port_methods,
165 	0
166 };
167 
168 static d_ioctl_t cxgb_extension_ioctl;
169 static d_open_t cxgb_extension_open;
170 static d_close_t cxgb_extension_close;
171 
172 static struct cdevsw cxgb_cdevsw = {
173        .d_version =    D_VERSION,
174        .d_flags =      0,
175        .d_open =       cxgb_extension_open,
176        .d_close =      cxgb_extension_close,
177        .d_ioctl =      cxgb_extension_ioctl,
178        .d_name =       "cxgb",
179 };
180 
181 static devclass_t	cxgb_port_devclass;
182 DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
183 
184 #define SGE_MSIX_COUNT (SGE_QSETS + 1)
185 
186 /*
187  * The driver uses the best interrupt scheme available on a platform in the
188  * order MSI-X, MSI, legacy pin interrupts.  This parameter determines which
189  * of these schemes the driver may consider as follows:
190  *
191  * msi = 2: choose from among all three options
192  * msi = 1 : only consider MSI and pin interrupts
193  * msi = 0: force pin interrupts
194  */
195 static int msi_allowed = 2;
196 
197 TUNABLE_INT("hw.cxgb.msi_allowed", &msi_allowed);
198 SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD, 0, "CXGB driver parameters");
199 SYSCTL_UINT(_hw_cxgb, OID_AUTO, msi_allowed, CTLFLAG_RDTUN, &msi_allowed, 0,
200     "MSI-X, MSI, INTx selector");
201 
202 /*
203  * The driver enables offload as a default.
204  * To disable it, use ofld_disable = 1.
205  */
206 static int ofld_disable = 0;
207 TUNABLE_INT("hw.cxgb.ofld_disable", &ofld_disable);
208 SYSCTL_UINT(_hw_cxgb, OID_AUTO, ofld_disable, CTLFLAG_RDTUN, &ofld_disable, 0,
209     "disable ULP offload");
210 
211 /*
212  * The driver uses an auto-queue algorithm by default.
213  * To disable it and force a single queue-set per port, use singleq = 1.
214  */
215 static int singleq = 0;
216 TUNABLE_INT("hw.cxgb.singleq", &singleq);
217 SYSCTL_UINT(_hw_cxgb, OID_AUTO, singleq, CTLFLAG_RDTUN, &singleq, 0,
218     "use a single queue-set per port");
219 
220 
221 /*
222  * The driver uses an auto-queue algorithm by default.
223  * To disable it and force a single queue-set per port, use singleq = 1.
224  */
225 static int force_fw_update = 0;
226 TUNABLE_INT("hw.cxgb.force_fw_update", &force_fw_update);
227 SYSCTL_UINT(_hw_cxgb, OID_AUTO, force_fw_update, CTLFLAG_RDTUN, &force_fw_update, 0,
228     "update firmware even if up to date");
229 
230 int cxgb_use_16k_clusters = 0;
231 TUNABLE_INT("hw.cxgb.use_16k_clusters", &cxgb_use_16k_clusters);
232 SYSCTL_UINT(_hw_cxgb, OID_AUTO, use_16k_clusters, CTLFLAG_RDTUN,
233     &cxgb_use_16k_clusters, 0, "use 16kB clusters for the jumbo queue ");
234 
235 enum {
236 	MAX_TXQ_ENTRIES      = 16384,
237 	MAX_CTRL_TXQ_ENTRIES = 1024,
238 	MAX_RSPQ_ENTRIES     = 16384,
239 	MAX_RX_BUFFERS       = 16384,
240 	MAX_RX_JUMBO_BUFFERS = 16384,
241 	MIN_TXQ_ENTRIES      = 4,
242 	MIN_CTRL_TXQ_ENTRIES = 4,
243 	MIN_RSPQ_ENTRIES     = 32,
244 	MIN_FL_ENTRIES       = 32,
245 	MIN_FL_JUMBO_ENTRIES = 32
246 };
247 
248 struct filter_info {
249 	u32 sip;
250 	u32 sip_mask;
251 	u32 dip;
252 	u16 sport;
253 	u16 dport;
254 	u32 vlan:12;
255 	u32 vlan_prio:3;
256 	u32 mac_hit:1;
257 	u32 mac_idx:4;
258 	u32 mac_vld:1;
259 	u32 pkt_type:2;
260 	u32 report_filter_id:1;
261 	u32 pass:1;
262 	u32 rss:1;
263 	u32 qset:3;
264 	u32 locked:1;
265 	u32 valid:1;
266 };
267 
268 enum { FILTER_NO_VLAN_PRI = 7 };
269 
270 #define PORT_MASK ((1 << MAX_NPORTS) - 1)
271 
272 /* Table for probing the cards.  The desc field isn't actually used */
273 struct cxgb_ident {
274 	uint16_t	vendor;
275 	uint16_t	device;
276 	int		index;
277 	char		*desc;
278 } cxgb_identifiers[] = {
279 	{PCI_VENDOR_ID_CHELSIO, 0x0020, 0, "PE9000"},
280 	{PCI_VENDOR_ID_CHELSIO, 0x0021, 1, "T302E"},
281 	{PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"},
282 	{PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"},
283 	{PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"},
284 	{PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"},
285 	{PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"},
286 	{PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
287 	{PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
288 	{PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
289 	{PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
290 	{0, 0, 0, NULL}
291 };
292 
293 static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset);
294 
295 
296 void
297 cxgb_log_tcb(struct adapter *sc, unsigned int tid)
298 {
299 	char buf[TCB_SIZE];
300 	uint64_t *tcb = (uint64_t *)buf;
301 	int i, error;
302 	struct mc7 *mem = &sc->cm;
303 
304 	error = t3_mc7_bd_read(mem, tid*TCB_SIZE/8, TCB_SIZE/8, tcb);
305 	if (error)
306 		printf("cxgb_tcb_log failed\n");
307 
308 	CTR1(KTR_CXGB, "TCB tid=%u", tid);
309 	for (i = 0; i < TCB_SIZE / 32; i++) {
310 		CTR5(KTR_CXGB, "%1d: %08x %08x %08x %08x",
311 		    i, (uint32_t)tcb[1], (uint32_t)(tcb[1] >> 32),
312 		    (uint32_t)tcb[0], (uint32_t)(tcb[0] >> 32));
313 		tcb += 2;
314 		CTR4(KTR_CXGB, "   %08x %08x %08x %08x",
315 		    (uint32_t)tcb[1], (uint32_t)(tcb[1] >> 32),
316 		    (uint32_t)tcb[0], (uint32_t)(tcb[0] >> 32));
317 		tcb += 2;
318 	}
319 }
320 
321 static __inline char
322 t3rev2char(struct adapter *adapter)
323 {
324 	char rev = 'z';
325 
326 	switch(adapter->params.rev) {
327 	case T3_REV_A:
328 		rev = 'a';
329 		break;
330 	case T3_REV_B:
331 	case T3_REV_B2:
332 		rev = 'b';
333 		break;
334 	case T3_REV_C:
335 		rev = 'c';
336 		break;
337 	}
338 	return rev;
339 }
340 
341 static struct cxgb_ident *
342 cxgb_get_ident(device_t dev)
343 {
344 	struct cxgb_ident *id;
345 
346 	for (id = cxgb_identifiers; id->desc != NULL; id++) {
347 		if ((id->vendor == pci_get_vendor(dev)) &&
348 		    (id->device == pci_get_device(dev))) {
349 			return (id);
350 		}
351 	}
352 	return (NULL);
353 }
354 
355 static const struct adapter_info *
356 cxgb_get_adapter_info(device_t dev)
357 {
358 	struct cxgb_ident *id;
359 	const struct adapter_info *ai;
360 
361 	id = cxgb_get_ident(dev);
362 	if (id == NULL)
363 		return (NULL);
364 
365 	ai = t3_get_adapter_info(id->index);
366 
367 	return (ai);
368 }
369 
370 static int
371 cxgb_controller_probe(device_t dev)
372 {
373 	const struct adapter_info *ai;
374 	char *ports, buf[80];
375 	int nports;
376 
377 	ai = cxgb_get_adapter_info(dev);
378 	if (ai == NULL)
379 		return (ENXIO);
380 
381 	nports = ai->nports0 + ai->nports1;
382 	if (nports == 1)
383 		ports = "port";
384 	else
385 		ports = "ports";
386 
387 	snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, nports, ports);
388 	device_set_desc_copy(dev, buf);
389 	return (BUS_PROBE_DEFAULT);
390 }
391 
392 #define FW_FNAME "cxgb_t3fw"
393 #define TPEEPROM_NAME "t3b_tp_eeprom"
394 #define TPSRAM_NAME "t3b_protocol_sram"
395 
396 static int
397 upgrade_fw(adapter_t *sc)
398 {
399 #ifdef FIRMWARE_LATEST
400 	const struct firmware *fw;
401 #else
402 	struct firmware *fw;
403 #endif
404 	int status;
405 
406 	if ((fw = firmware_get(FW_FNAME)) == NULL)  {
407 		device_printf(sc->dev, "Could not find firmware image %s\n", FW_FNAME);
408 		return (ENOENT);
409 	} else
410 		device_printf(sc->dev, "updating firmware on card\n");
411 	status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize);
412 
413 	device_printf(sc->dev, "firmware update returned %s %d\n", (status == 0) ? "success" : "fail", status);
414 
415 	firmware_put(fw, FIRMWARE_UNLOAD);
416 
417 	return (status);
418 }
419 
420 static int
421 cxgb_controller_attach(device_t dev)
422 {
423 	device_t child;
424 	const struct adapter_info *ai;
425 	struct adapter *sc;
426 	int i, error = 0;
427 	uint32_t vers;
428 	int port_qsets = 1;
429 #ifdef MSI_SUPPORTED
430 	int msi_needed, reg;
431 #endif
432 	int must_load = 0;
433 	sc = device_get_softc(dev);
434 	sc->dev = dev;
435 	sc->msi_count = 0;
436 	ai = cxgb_get_adapter_info(dev);
437 
438 	/*
439 	 * XXX not really related but a recent addition
440 	 */
441 #ifdef MSI_SUPPORTED
442 	/* find the PCIe link width and set max read request to 4KB*/
443 	if (pci_find_extcap(dev, PCIY_EXPRESS, &reg) == 0) {
444 		uint16_t lnk, pectl;
445 		lnk = pci_read_config(dev, reg + 0x12, 2);
446 		sc->link_width = (lnk >> 4) & 0x3f;
447 
448 		pectl = pci_read_config(dev, reg + 0x8, 2);
449 		pectl = (pectl & ~0x7000) | (5 << 12);
450 		pci_write_config(dev, reg + 0x8, pectl, 2);
451 	}
452 
453 	if (sc->link_width != 0 && sc->link_width <= 4 &&
454 	    (ai->nports0 + ai->nports1) <= 2) {
455 		device_printf(sc->dev,
456 		    "PCIe x%d Link, expect reduced performance\n",
457 		    sc->link_width);
458 	}
459 #endif
460 	touch_bars(dev);
461 	pci_enable_busmaster(dev);
462 	/*
463 	 * Allocate the registers and make them available to the driver.
464 	 * The registers that we care about for NIC mode are in BAR 0
465 	 */
466 	sc->regs_rid = PCIR_BAR(0);
467 	if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
468 	    &sc->regs_rid, RF_ACTIVE)) == NULL) {
469 		device_printf(dev, "Cannot allocate BAR region 0\n");
470 		return (ENXIO);
471 	}
472 	sc->udbs_rid = PCIR_BAR(2);
473 	if ((sc->udbs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
474            &sc->udbs_rid, RF_ACTIVE)) == NULL) {
475 		device_printf(dev, "Cannot allocate BAR region 1\n");
476 		error = ENXIO;
477 		goto out;
478        }
479 
480 	snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d",
481 	    device_get_unit(dev));
482 	ADAPTER_LOCK_INIT(sc, sc->lockbuf);
483 
484 	snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d",
485 	    device_get_unit(dev));
486 	snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d",
487 	    device_get_unit(dev));
488 	snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d",
489 	    device_get_unit(dev));
490 
491 	MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_SPIN);
492 	MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF);
493 	MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF);
494 
495 	sc->bt = rman_get_bustag(sc->regs_res);
496 	sc->bh = rman_get_bushandle(sc->regs_res);
497 	sc->mmio_len = rman_get_size(sc->regs_res);
498 
499 	if (t3_prep_adapter(sc, ai, 1) < 0) {
500 		printf("prep adapter failed\n");
501 		error = ENODEV;
502 		goto out;
503 	}
504         /* Allocate the BAR for doing MSI-X.  If it succeeds, try to allocate
505 	 * enough messages for the queue sets.  If that fails, try falling
506 	 * back to MSI.  If that fails, then try falling back to the legacy
507 	 * interrupt pin model.
508 	 */
509 #ifdef MSI_SUPPORTED
510 
511 	sc->msix_regs_rid = 0x20;
512 	if ((msi_allowed >= 2) &&
513 	    (sc->msix_regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
514 	    &sc->msix_regs_rid, RF_ACTIVE)) != NULL) {
515 
516 		msi_needed = sc->msi_count = SGE_MSIX_COUNT;
517 
518 		if (((error = pci_alloc_msix(dev, &sc->msi_count)) != 0) ||
519 		    (sc->msi_count != msi_needed)) {
520 			device_printf(dev, "msix allocation failed - msi_count = %d"
521 			    " msi_needed=%d will try msi err=%d\n", sc->msi_count,
522 			    msi_needed, error);
523 			sc->msi_count = 0;
524 			pci_release_msi(dev);
525 			bus_release_resource(dev, SYS_RES_MEMORY,
526 			    sc->msix_regs_rid, sc->msix_regs_res);
527 			sc->msix_regs_res = NULL;
528 		} else {
529 			sc->flags |= USING_MSIX;
530 			sc->cxgb_intr = t3_intr_msix;
531 		}
532 	}
533 
534 	if ((msi_allowed >= 1) && (sc->msi_count == 0)) {
535 		sc->msi_count = 1;
536 		if (pci_alloc_msi(dev, &sc->msi_count)) {
537 			device_printf(dev, "alloc msi failed - will try INTx\n");
538 			sc->msi_count = 0;
539 			pci_release_msi(dev);
540 		} else {
541 			sc->flags |= USING_MSI;
542 			sc->irq_rid = 1;
543 			sc->cxgb_intr = t3_intr_msi;
544 		}
545 	}
546 #endif
547 	if (sc->msi_count == 0) {
548 		device_printf(dev, "using line interrupts\n");
549 		sc->irq_rid = 0;
550 		sc->cxgb_intr = t3b_intr;
551 	}
552 
553 	if ((sc->flags & USING_MSIX) && !singleq)
554 		port_qsets = min((SGE_QSETS/(sc)->params.nports), mp_ncpus);
555 
556 	/* Create a private taskqueue thread for handling driver events */
557 #ifdef TASKQUEUE_CURRENT
558 	sc->tq = taskqueue_create("cxgb_taskq", M_NOWAIT,
559 	    taskqueue_thread_enqueue, &sc->tq);
560 #else
561 	sc->tq = taskqueue_create_fast("cxgb_taskq", M_NOWAIT,
562 	    taskqueue_thread_enqueue, &sc->tq);
563 #endif
564 	if (sc->tq == NULL) {
565 		device_printf(dev, "failed to allocate controller task queue\n");
566 		goto out;
567 	}
568 
569 	taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq",
570 	    device_get_nameunit(dev));
571 	TASK_INIT(&sc->ext_intr_task, 0, cxgb_ext_intr_handler, sc);
572 	TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc);
573 
574 
575 	/* Create a periodic callout for checking adapter status */
576 	callout_init(&sc->cxgb_tick_ch, TRUE);
577 
578 	if ((t3_check_fw_version(sc, &must_load) != 0 && must_load) || force_fw_update) {
579 		/*
580 		 * Warn user that a firmware update will be attempted in init.
581 		 */
582 		device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n",
583 		    FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO);
584 		sc->flags &= ~FW_UPTODATE;
585 	} else {
586 		sc->flags |= FW_UPTODATE;
587 	}
588 
589 	if (t3_check_tpsram_version(sc, &must_load) != 0 && must_load) {
590 		/*
591 		 * Warn user that a firmware update will be attempted in init.
592 		 */
593 		device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n",
594 		    t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
595 		sc->flags &= ~TPS_UPTODATE;
596 	} else {
597 		sc->flags |= TPS_UPTODATE;
598 	}
599 
600 	/*
601 	 * Create a child device for each MAC.  The ethernet attachment
602 	 * will be done in these children.
603 	 */
604 	for (i = 0; i < (sc)->params.nports; i++) {
605 		struct port_info *pi;
606 
607 		if ((child = device_add_child(dev, "cxgb", -1)) == NULL) {
608 			device_printf(dev, "failed to add child port\n");
609 			error = EINVAL;
610 			goto out;
611 		}
612 		pi = &sc->port[i];
613 		pi->adapter = sc;
614 		pi->nqsets = port_qsets;
615 		pi->first_qset = i*port_qsets;
616 		pi->port_id = i;
617 		pi->tx_chan = i >= ai->nports0;
618 		pi->txpkt_intf = pi->tx_chan ? 2 * (i - ai->nports0) + 1 : 2 * i;
619 		sc->rxpkt_map[pi->txpkt_intf] = i;
620 		sc->port[i].tx_chan = i >= ai->nports0;
621 		sc->portdev[i] = child;
622 		device_set_softc(child, pi);
623 	}
624 	if ((error = bus_generic_attach(dev)) != 0)
625 		goto out;
626 
627 	/*
628 	 * XXX need to poll for link status
629 	 */
630 	sc->params.stats_update_period = 1;
631 
632 	/* initialize sge private state */
633 	t3_sge_init_adapter(sc);
634 
635 	t3_led_ready(sc);
636 
637 	cxgb_offload_init();
638 	if (is_offload(sc)) {
639 		setbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT);
640 		cxgb_adapter_ofld(sc);
641         }
642 	error = t3_get_fw_version(sc, &vers);
643 	if (error)
644 		goto out;
645 
646 	snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
647 	    G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
648 	    G_FW_VERSION_MICRO(vers));
649 
650 	device_printf(sc->dev, "Firmware Version %s\n", &sc->fw_version[0]);
651 	callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
652 	t3_add_attach_sysctls(sc);
653 out:
654 	if (error)
655 		cxgb_free(sc);
656 
657 	return (error);
658 }
659 
660 static int
661 cxgb_controller_detach(device_t dev)
662 {
663 	struct adapter *sc;
664 
665 	sc = device_get_softc(dev);
666 
667 	cxgb_free(sc);
668 
669 	return (0);
670 }
671 
672 static void
673 cxgb_free(struct adapter *sc)
674 {
675 	int i;
676 
677 	ADAPTER_LOCK(sc);
678 	sc->flags |= CXGB_SHUTDOWN;
679 	ADAPTER_UNLOCK(sc);
680 	cxgb_pcpu_shutdown_threads(sc);
681 	ADAPTER_LOCK(sc);
682 
683 /*
684  * drops the lock
685  */
686 	cxgb_down_locked(sc);
687 
688 #ifdef MSI_SUPPORTED
689 	if (sc->flags & (USING_MSI | USING_MSIX)) {
690 		device_printf(sc->dev, "releasing msi message(s)\n");
691 		pci_release_msi(sc->dev);
692 	} else {
693 		device_printf(sc->dev, "no msi message to release\n");
694 	}
695 #endif
696 	if (sc->msix_regs_res != NULL) {
697 		bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid,
698 		    sc->msix_regs_res);
699 	}
700 
701 	t3_sge_deinit_sw(sc);
702 	/*
703 	 * Wait for last callout
704 	 */
705 
706 	DELAY(hz*100);
707 
708 	for (i = 0; i < (sc)->params.nports; ++i) {
709 		if (sc->portdev[i] != NULL)
710 			device_delete_child(sc->dev, sc->portdev[i]);
711 	}
712 
713 	bus_generic_detach(sc->dev);
714 	if (sc->tq != NULL) {
715 		taskqueue_free(sc->tq);
716 		sc->tq = NULL;
717 	}
718 
719 	if (is_offload(sc)) {
720 		cxgb_adapter_unofld(sc);
721 		if (isset(&sc->open_device_map,	OFFLOAD_DEVMAP_BIT))
722 			offload_close(&sc->tdev);
723 		else
724 			printf("cxgb_free: DEVMAP_BIT not set\n");
725 	} else
726 		printf("not offloading set\n");
727 #ifdef notyet
728 	if (sc->flags & CXGB_OFLD_INIT)
729 		cxgb_offload_deactivate(sc);
730 #endif
731 	free(sc->filters, M_DEVBUF);
732 	t3_sge_free(sc);
733 
734 	cxgb_offload_exit();
735 
736 	if (sc->udbs_res != NULL)
737 		bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->udbs_rid,
738 		    sc->udbs_res);
739 
740 	if (sc->regs_res != NULL)
741 		bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
742 		    sc->regs_res);
743 
744 	MTX_DESTROY(&sc->mdio_lock);
745 	MTX_DESTROY(&sc->sge.reg_lock);
746 	MTX_DESTROY(&sc->elmer_lock);
747 	ADAPTER_LOCK_DEINIT(sc);
748 }
749 
750 /**
751  *	setup_sge_qsets - configure SGE Tx/Rx/response queues
752  *	@sc: the controller softc
753  *
754  *	Determines how many sets of SGE queues to use and initializes them.
755  *	We support multiple queue sets per port if we have MSI-X, otherwise
756  *	just one queue set per port.
757  */
758 static int
759 setup_sge_qsets(adapter_t *sc)
760 {
761 	int i, j, err, irq_idx = 0, qset_idx = 0;
762 	u_int ntxq = SGE_TXQ_PER_SET;
763 
764 	if ((err = t3_sge_alloc(sc)) != 0) {
765 		device_printf(sc->dev, "t3_sge_alloc returned %d\n", err);
766 		return (err);
767 	}
768 
769 	if (sc->params.rev > 0 && !(sc->flags & USING_MSI))
770 		irq_idx = -1;
771 
772 	for (i = 0; i < (sc)->params.nports; i++) {
773 		struct port_info *pi = &sc->port[i];
774 
775 		for (j = 0; j < pi->nqsets; j++, qset_idx++) {
776 			err = t3_sge_alloc_qset(sc, qset_idx, (sc)->params.nports,
777 			    (sc->flags & USING_MSIX) ? qset_idx + 1 : irq_idx,
778 			    &sc->params.sge.qset[qset_idx], ntxq, pi);
779 			if (err) {
780 				t3_free_sge_resources(sc);
781 				device_printf(sc->dev, "t3_sge_alloc_qset failed with %d\n",
782 				    err);
783 				return (err);
784 			}
785 		}
786 	}
787 
788 	return (0);
789 }
790 
791 static void
792 cxgb_teardown_msix(adapter_t *sc)
793 {
794 	int i, nqsets;
795 
796 	for (nqsets = i = 0; i < (sc)->params.nports; i++)
797 		nqsets += sc->port[i].nqsets;
798 
799 	for (i = 0; i < nqsets; i++) {
800 		if (sc->msix_intr_tag[i] != NULL) {
801 			bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
802 			    sc->msix_intr_tag[i]);
803 			sc->msix_intr_tag[i] = NULL;
804 		}
805 		if (sc->msix_irq_res[i] != NULL) {
806 			bus_release_resource(sc->dev, SYS_RES_IRQ,
807 			    sc->msix_irq_rid[i], sc->msix_irq_res[i]);
808 			sc->msix_irq_res[i] = NULL;
809 		}
810 	}
811 }
812 
813 static int
814 cxgb_setup_msix(adapter_t *sc, int msix_count)
815 {
816 	int i, j, k, nqsets, rid;
817 
818 	/* The first message indicates link changes and error conditions */
819 	sc->irq_rid = 1;
820 	if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ,
821 	   &sc->irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
822 		device_printf(sc->dev, "Cannot allocate msix interrupt\n");
823 		return (EINVAL);
824 	}
825 
826 	if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET,
827 #ifdef INTR_FILTERS
828 		NULL,
829 #endif
830 		cxgb_async_intr, sc, &sc->intr_tag)) {
831 		device_printf(sc->dev, "Cannot set up interrupt\n");
832 		return (EINVAL);
833 	}
834 	for (i = k = 0; i < (sc)->params.nports; i++) {
835 		nqsets = sc->port[i].nqsets;
836 		for (j = 0; j < nqsets; j++, k++) {
837 			struct sge_qset *qs = &sc->sge.qs[k];
838 
839 			rid = k + 2;
840 			if (cxgb_debug)
841 				printf("rid=%d ", rid);
842 			if ((sc->msix_irq_res[k] = bus_alloc_resource_any(
843 			    sc->dev, SYS_RES_IRQ, &rid,
844 			    RF_SHAREABLE | RF_ACTIVE)) == NULL) {
845 				device_printf(sc->dev, "Cannot allocate "
846 				    "interrupt for message %d\n", rid);
847 				return (EINVAL);
848 			}
849 			sc->msix_irq_rid[k] = rid;
850 			if (bus_setup_intr(sc->dev, sc->msix_irq_res[k],
851 				INTR_MPSAFE|INTR_TYPE_NET,
852 #ifdef INTR_FILTERS
853 				NULL,
854 #endif
855 				t3_intr_msix, qs, &sc->msix_intr_tag[k])) {
856 				device_printf(sc->dev, "Cannot set up "
857 				    "interrupt for message %d\n", rid);
858 				return (EINVAL);
859 			}
860 #ifdef IFNET_MULTIQUEUE
861 			if (singleq == 0) {
862 				int vector = rman_get_start(sc->msix_irq_res[k]);
863 				if (bootverbose)
864 					device_printf(sc->dev, "binding vector=%d to cpu=%d\n", vector, k % mp_ncpus);
865 				intr_bind(vector, k % mp_ncpus);
866 			}
867 #endif
868 		}
869 	}
870 
871 	return (0);
872 }
873 
874 static int
875 cxgb_port_probe(device_t dev)
876 {
877 	struct port_info *p;
878 	char buf[80];
879 	const char *desc;
880 
881 	p = device_get_softc(dev);
882 	desc = p->phy.desc;
883 	snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, desc);
884 	device_set_desc_copy(dev, buf);
885 	return (0);
886 }
887 
888 
889 static int
890 cxgb_makedev(struct port_info *pi)
891 {
892 
893 	pi->port_cdev = make_dev(&cxgb_cdevsw, pi->ifp->if_dunit,
894 	    UID_ROOT, GID_WHEEL, 0600, if_name(pi->ifp));
895 
896 	if (pi->port_cdev == NULL)
897 		return (ENOMEM);
898 
899 	pi->port_cdev->si_drv1 = (void *)pi;
900 
901 	return (0);
902 }
903 
904 
905 #ifdef TSO_SUPPORTED
906 #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO)
907 /* Don't enable TSO6 yet */
908 #define CXGB_CAP_ENABLE (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO4 | IFCAP_JUMBO_MTU | IFCAP_LRO)
909 #else
910 #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_JUMBO_MTU)
911 /* Don't enable TSO6 yet */
912 #define CXGB_CAP_ENABLE (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM |  IFCAP_JUMBO_MTU)
913 #define IFCAP_TSO4 0x0
914 #define IFCAP_TSO6 0x0
915 #define CSUM_TSO   0x0
916 #endif
917 
918 
919 static int
920 cxgb_port_attach(device_t dev)
921 {
922 	struct port_info *p;
923 	struct ifnet *ifp;
924 	int err, media_flags;
925 	struct adapter *sc;
926 
927 
928 	p = device_get_softc(dev);
929 	sc = p->adapter;
930 	snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
931 	    device_get_unit(device_get_parent(dev)), p->port_id);
932 	PORT_LOCK_INIT(p, p->lockbuf);
933 
934 	/* Allocate an ifnet object and set it up */
935 	ifp = p->ifp = if_alloc(IFT_ETHER);
936 	if (ifp == NULL) {
937 		device_printf(dev, "Cannot allocate ifnet\n");
938 		return (ENOMEM);
939 	}
940 
941 	/*
942 	 * Note that there is currently no watchdog timer.
943 	 */
944 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
945 	ifp->if_init = cxgb_init;
946 	ifp->if_softc = p;
947 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
948 	ifp->if_ioctl = cxgb_ioctl;
949 	ifp->if_start = cxgb_start;
950 
951 #if 0
952 #ifdef IFNET_MULTIQUEUE
953 	ifp->if_flags |= IFF_MULTIQ;
954 	ifp->if_mq_start = cxgb_pcpu_start;
955 #endif
956 #endif
957 	ifp->if_timer = 0;	/* Disable ifnet watchdog */
958 	ifp->if_watchdog = NULL;
959 
960 	ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
961 	IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
962 	IFQ_SET_READY(&ifp->if_snd);
963 
964 	ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0;
965 	ifp->if_capabilities |= CXGB_CAP;
966 	ifp->if_capenable |= CXGB_CAP_ENABLE;
967 	ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO);
968 	/*
969 	 * disable TSO on 4-port - it isn't supported by the firmware yet
970 	 */
971 	if (p->adapter->params.nports > 2) {
972 		ifp->if_capabilities &= ~(IFCAP_TSO4 | IFCAP_TSO6);
973 		ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_TSO6);
974 		ifp->if_hwassist &= ~CSUM_TSO;
975 	}
976 
977 	ether_ifattach(ifp, p->hw_addr);
978 	/*
979 	 * Only default to jumbo frames on 10GigE
980 	 */
981 	if (p->adapter->params.nports <= 2)
982 		ifp->if_mtu = ETHERMTU_JUMBO;
983 	if ((err = cxgb_makedev(p)) != 0) {
984 		printf("makedev failed %d\n", err);
985 		return (err);
986 	}
987 	ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
988 	    cxgb_media_status);
989 
990 	if (!strcmp(p->phy.desc,	"10GBASE-CX4")) {
991 		media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX;
992 	} else if (!strcmp(p->phy.desc, "10GBASE-SR")) {
993 		media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX;
994 	} else if (!strcmp(p->phy.desc, "10GBASE-R")) {
995 		media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX;
996 	} else if (!strcmp(p->phy.desc, "10/100/1000BASE-T")) {
997 		ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL);
998 		ifmedia_add(&p->media, IFM_ETHER | IFM_10_T | IFM_FDX,
999 			    0, NULL);
1000 		ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX,
1001 			    0, NULL);
1002 		ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
1003 			    0, NULL);
1004 		ifmedia_add(&p->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
1005 			    0, NULL);
1006 		media_flags = 0;
1007 	} else {
1008 	        printf("unsupported media type %s\n", p->phy.desc);
1009 		return (ENXIO);
1010 	}
1011 	if (media_flags) {
1012 		ifmedia_add(&p->media, media_flags, 0, NULL);
1013 		ifmedia_set(&p->media, media_flags);
1014 	} else {
1015 		ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1016 		ifmedia_set(&p->media, IFM_ETHER | IFM_AUTO);
1017 	}
1018 
1019 
1020 	snprintf(p->taskqbuf, TASKQ_NAME_LEN, "cxgb_port_taskq%d", p->port_id);
1021 #ifdef TASKQUEUE_CURRENT
1022 	/* Create a port for handling TX without starvation */
1023 	p->tq = taskqueue_create(p->taskqbuf, M_NOWAIT,
1024 	    taskqueue_thread_enqueue, &p->tq);
1025 #else
1026 	/* Create a port for handling TX without starvation */
1027 	p->tq = taskqueue_create_fast(p->taskqbuf, M_NOWAIT,
1028 	    taskqueue_thread_enqueue, &p->tq);
1029 #endif
1030 	/* Get the latest mac address, User can use a LAA */
1031 	bcopy(IF_LLADDR(p->ifp), p->hw_addr, ETHER_ADDR_LEN);
1032 	t3_sge_init_port(p);
1033 #if defined(LINK_ATTACH)
1034 	cxgb_link_start(p);
1035 	t3_link_changed(sc, p->port_id);
1036 #endif
1037 	return (0);
1038 }
1039 
1040 static int
1041 cxgb_port_detach(device_t dev)
1042 {
1043 	struct port_info *p;
1044 
1045 	p = device_get_softc(dev);
1046 
1047 	PORT_LOCK(p);
1048 	if (p->ifp->if_drv_flags & IFF_DRV_RUNNING)
1049 		cxgb_stop_locked(p);
1050 	PORT_UNLOCK(p);
1051 
1052 	if (p->tq != NULL) {
1053 		taskqueue_drain(p->tq, &p->start_task);
1054 		taskqueue_free(p->tq);
1055 		p->tq = NULL;
1056 	}
1057 
1058 	ether_ifdetach(p->ifp);
1059 	printf("waiting for callout to stop ...");
1060 	DELAY(1000000);
1061 	printf("done\n");
1062 	/*
1063 	 * the lock may be acquired in ifdetach
1064 	 */
1065 	PORT_LOCK_DEINIT(p);
1066 	if_free(p->ifp);
1067 
1068 	if (p->port_cdev != NULL)
1069 		destroy_dev(p->port_cdev);
1070 
1071 	return (0);
1072 }
1073 
1074 void
1075 t3_fatal_err(struct adapter *sc)
1076 {
1077 	u_int fw_status[4];
1078 
1079 	if (sc->flags & FULL_INIT_DONE) {
1080 		t3_sge_stop(sc);
1081 		t3_write_reg(sc, A_XGM_TX_CTRL, 0);
1082 		t3_write_reg(sc, A_XGM_RX_CTRL, 0);
1083 		t3_write_reg(sc, XGM_REG(A_XGM_TX_CTRL, 1), 0);
1084 		t3_write_reg(sc, XGM_REG(A_XGM_RX_CTRL, 1), 0);
1085 		t3_intr_disable(sc);
1086 	}
1087 	device_printf(sc->dev,"encountered fatal error, operation suspended\n");
1088 	if (!t3_cim_ctl_blk_read(sc, 0xa0, 4, fw_status))
1089 		device_printf(sc->dev, "FW_ status: 0x%x, 0x%x, 0x%x, 0x%x\n",
1090 		    fw_status[0], fw_status[1], fw_status[2], fw_status[3]);
1091 }
1092 
1093 int
1094 t3_os_find_pci_capability(adapter_t *sc, int cap)
1095 {
1096 	device_t dev;
1097 	struct pci_devinfo *dinfo;
1098 	pcicfgregs *cfg;
1099 	uint32_t status;
1100 	uint8_t ptr;
1101 
1102 	dev = sc->dev;
1103 	dinfo = device_get_ivars(dev);
1104 	cfg = &dinfo->cfg;
1105 
1106 	status = pci_read_config(dev, PCIR_STATUS, 2);
1107 	if (!(status & PCIM_STATUS_CAPPRESENT))
1108 		return (0);
1109 
1110 	switch (cfg->hdrtype & PCIM_HDRTYPE) {
1111 	case 0:
1112 	case 1:
1113 		ptr = PCIR_CAP_PTR;
1114 		break;
1115 	case 2:
1116 		ptr = PCIR_CAP_PTR_2;
1117 		break;
1118 	default:
1119 		return (0);
1120 		break;
1121 	}
1122 	ptr = pci_read_config(dev, ptr, 1);
1123 
1124 	while (ptr != 0) {
1125 		if (pci_read_config(dev, ptr + PCICAP_ID, 1) == cap)
1126 			return (ptr);
1127 		ptr = pci_read_config(dev, ptr + PCICAP_NEXTPTR, 1);
1128 	}
1129 
1130 	return (0);
1131 }
1132 
1133 int
1134 t3_os_pci_save_state(struct adapter *sc)
1135 {
1136 	device_t dev;
1137 	struct pci_devinfo *dinfo;
1138 
1139 	dev = sc->dev;
1140 	dinfo = device_get_ivars(dev);
1141 
1142 	pci_cfg_save(dev, dinfo, 0);
1143 	return (0);
1144 }
1145 
1146 int
1147 t3_os_pci_restore_state(struct adapter *sc)
1148 {
1149 	device_t dev;
1150 	struct pci_devinfo *dinfo;
1151 
1152 	dev = sc->dev;
1153 	dinfo = device_get_ivars(dev);
1154 
1155 	pci_cfg_restore(dev, dinfo);
1156 	return (0);
1157 }
1158 
1159 /**
1160  *	t3_os_link_changed - handle link status changes
1161  *	@adapter: the adapter associated with the link change
1162  *	@port_id: the port index whose limk status has changed
1163  *	@link_status: the new status of the link
1164  *	@speed: the new speed setting
1165  *	@duplex: the new duplex setting
1166  *	@fc: the new flow-control setting
1167  *
1168  *	This is the OS-dependent handler for link status changes.  The OS
1169  *	neutral handler takes care of most of the processing for these events,
1170  *	then calls this handler for any OS-specific processing.
1171  */
1172 void
1173 t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
1174      int duplex, int fc)
1175 {
1176 	struct port_info *pi = &adapter->port[port_id];
1177 	struct cmac *mac = &adapter->port[port_id].mac;
1178 
1179 	if (link_status) {
1180 		DELAY(10);
1181 		t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1182 			/* Clear errors created by MAC enable */
1183 			t3_set_reg_field(adapter,
1184 					 A_XGM_STAT_CTRL + pi->mac.offset,
1185 					 F_CLRSTATS, 1);
1186 		if_link_state_change(pi->ifp, LINK_STATE_UP);
1187 
1188 	} else {
1189 		pi->phy.ops->power_down(&pi->phy, 1);
1190 		t3_mac_disable(mac, MAC_DIRECTION_RX);
1191 		t3_link_start(&pi->phy, mac, &pi->link_config);
1192 		t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1193 		if_link_state_change(pi->ifp, LINK_STATE_DOWN);
1194 	}
1195 }
1196 
1197 /**
1198  *	t3_os_phymod_changed - handle PHY module changes
1199  *	@phy: the PHY reporting the module change
1200  *	@mod_type: new module type
1201  *
1202  *	This is the OS-dependent handler for PHY module changes.  It is
1203  *	invoked when a PHY module is removed or inserted for any OS-specific
1204  *	processing.
1205  */
1206 void t3_os_phymod_changed(struct adapter *adap, int port_id)
1207 {
1208 	static const char *mod_str[] = {
1209 		NULL, "SR", "LR", "LRM", "TWINAX", "TWINAX", "unknown"
1210 	};
1211 
1212 	struct port_info *pi = &adap->port[port_id];
1213 
1214 	if (pi->phy.modtype == phy_modtype_none)
1215 		device_printf(adap->dev, "PHY module unplugged\n");
1216 	else {
1217 		KASSERT(pi->phy.modtype < ARRAY_SIZE(mod_str),
1218 		    ("invalid PHY module type %d", pi->phy.modtype));
1219 		device_printf(adap->dev, "%s PHY module inserted\n",
1220 		    mod_str[pi->phy.modtype]);
1221 	}
1222 }
1223 
1224 /*
1225  * Interrupt-context handler for external (PHY) interrupts.
1226  */
1227 void
1228 t3_os_ext_intr_handler(adapter_t *sc)
1229 {
1230 	if (cxgb_debug)
1231 		printf("t3_os_ext_intr_handler\n");
1232 	/*
1233 	 * Schedule a task to handle external interrupts as they may be slow
1234 	 * and we use a mutex to protect MDIO registers.  We disable PHY
1235 	 * interrupts in the meantime and let the task reenable them when
1236 	 * it's done.
1237 	 */
1238 	ADAPTER_LOCK(sc);
1239 	if (sc->slow_intr_mask) {
1240 		sc->slow_intr_mask &= ~F_T3DBG;
1241 		t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
1242 		taskqueue_enqueue(sc->tq, &sc->ext_intr_task);
1243 	}
1244 	ADAPTER_UNLOCK(sc);
1245 }
1246 
1247 void
1248 t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[])
1249 {
1250 
1251 	/*
1252 	 * The ifnet might not be allocated before this gets called,
1253 	 * as this is called early on in attach by t3_prep_adapter
1254 	 * save the address off in the port structure
1255 	 */
1256 	if (cxgb_debug)
1257 		printf("set_hw_addr on idx %d addr %6D\n", port_idx, hw_addr, ":");
1258 	bcopy(hw_addr, adapter->port[port_idx].hw_addr, ETHER_ADDR_LEN);
1259 }
1260 
1261 /**
1262  *	link_start - enable a port
1263  *	@p: the port to enable
1264  *
1265  *	Performs the MAC and PHY actions needed to enable a port.
1266  */
1267 static void
1268 cxgb_link_start(struct port_info *p)
1269 {
1270 	struct ifnet *ifp;
1271 	struct t3_rx_mode rm;
1272 	struct cmac *mac = &p->mac;
1273 	int mtu, hwtagging;
1274 
1275 	ifp = p->ifp;
1276 
1277 	bcopy(IF_LLADDR(ifp), p->hw_addr, ETHER_ADDR_LEN);
1278 
1279 	mtu = ifp->if_mtu;
1280 	if (ifp->if_capenable & IFCAP_VLAN_MTU)
1281 		mtu += ETHER_VLAN_ENCAP_LEN;
1282 
1283 	hwtagging = (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0;
1284 
1285 	t3_init_rx_mode(&rm, p);
1286 	if (!mac->multiport)
1287 		t3_mac_reset(mac);
1288 	t3_mac_set_mtu(mac, mtu);
1289 	t3_set_vlan_accel(p->adapter, 1 << p->tx_chan, hwtagging);
1290 	t3_mac_set_address(mac, 0, p->hw_addr);
1291 	t3_mac_set_rx_mode(mac, &rm);
1292 	t3_link_start(&p->phy, mac, &p->link_config);
1293 	t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1294 }
1295 
1296 
1297 static int
1298 await_mgmt_replies(struct adapter *adap, unsigned long init_cnt,
1299 			      unsigned long n)
1300 {
1301 	int attempts = 5;
1302 
1303 	while (adap->sge.qs[0].rspq.offload_pkts < init_cnt + n) {
1304 		if (!--attempts)
1305 			return (ETIMEDOUT);
1306 		t3_os_sleep(10);
1307 	}
1308 	return 0;
1309 }
1310 
1311 static int
1312 init_tp_parity(struct adapter *adap)
1313 {
1314 	int i;
1315 	struct mbuf *m;
1316 	struct cpl_set_tcb_field *greq;
1317 	unsigned long cnt = adap->sge.qs[0].rspq.offload_pkts;
1318 
1319 	t3_tp_set_offload_mode(adap, 1);
1320 
1321 	for (i = 0; i < 16; i++) {
1322 		struct cpl_smt_write_req *req;
1323 
1324 		m = m_gethdr(M_WAITOK, MT_DATA);
1325 		req = mtod(m, struct cpl_smt_write_req *);
1326 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1327 		memset(req, 0, sizeof(*req));
1328 		req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1329 		OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i));
1330 		req->iff = i;
1331 		t3_mgmt_tx(adap, m);
1332 	}
1333 
1334 	for (i = 0; i < 2048; i++) {
1335 		struct cpl_l2t_write_req *req;
1336 
1337 		m = m_gethdr(M_WAITOK, MT_DATA);
1338 		req = mtod(m, struct cpl_l2t_write_req *);
1339 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1340 		memset(req, 0, sizeof(*req));
1341 		req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1342 		OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, i));
1343 		req->params = htonl(V_L2T_W_IDX(i));
1344 		t3_mgmt_tx(adap, m);
1345 	}
1346 
1347 	for (i = 0; i < 2048; i++) {
1348 		struct cpl_rte_write_req *req;
1349 
1350 		m = m_gethdr(M_WAITOK, MT_DATA);
1351 		req = mtod(m, struct cpl_rte_write_req *);
1352 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1353 		memset(req, 0, sizeof(*req));
1354 		req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1355 		OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RTE_WRITE_REQ, i));
1356 		req->l2t_idx = htonl(V_L2T_W_IDX(i));
1357 		t3_mgmt_tx(adap, m);
1358 	}
1359 
1360 	m = m_gethdr(M_WAITOK, MT_DATA);
1361 	greq = mtod(m, struct cpl_set_tcb_field *);
1362 	m->m_len = m->m_pkthdr.len = sizeof(*greq);
1363 	memset(greq, 0, sizeof(*greq));
1364 	greq->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1365 	OPCODE_TID(greq) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, 0));
1366 	greq->mask = htobe64(1);
1367 	t3_mgmt_tx(adap, m);
1368 
1369 	i = await_mgmt_replies(adap, cnt, 16 + 2048 + 2048 + 1);
1370 	t3_tp_set_offload_mode(adap, 0);
1371 	return (i);
1372 }
1373 
1374 /**
1375  *	setup_rss - configure Receive Side Steering (per-queue connection demux)
1376  *	@adap: the adapter
1377  *
1378  *	Sets up RSS to distribute packets to multiple receive queues.  We
1379  *	configure the RSS CPU lookup table to distribute to the number of HW
1380  *	receive queues, and the response queue lookup table to narrow that
1381  *	down to the response queues actually configured for each port.
1382  *	We always configure the RSS mapping for two ports since the mapping
1383  *	table has plenty of entries.
1384  */
1385 static void
1386 setup_rss(adapter_t *adap)
1387 {
1388 	int i;
1389 	u_int nq[2];
1390 	uint8_t cpus[SGE_QSETS + 1];
1391 	uint16_t rspq_map[RSS_TABLE_SIZE];
1392 
1393 	for (i = 0; i < SGE_QSETS; ++i)
1394 		cpus[i] = i;
1395 	cpus[SGE_QSETS] = 0xff;
1396 
1397 	nq[0] = nq[1] = 0;
1398 	for_each_port(adap, i) {
1399 		const struct port_info *pi = adap2pinfo(adap, i);
1400 
1401 		nq[pi->tx_chan] += pi->nqsets;
1402 	}
1403 	for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) {
1404 		rspq_map[i] = nq[0] ? i % nq[0] : 0;
1405 		rspq_map[i + RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0;
1406 	}
1407 	/* Calculate the reverse RSS map table */
1408 	for (i = 0; i < RSS_TABLE_SIZE; ++i)
1409 		if (adap->rrss_map[rspq_map[i]] == 0xff)
1410 			adap->rrss_map[rspq_map[i]] = i;
1411 
1412 	t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN |
1413 		      F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN |
1414 	              F_RRCPLMAPEN | V_RRCPLCPUSIZE(6) | F_HASHTOEPLITZ,
1415 	              cpus, rspq_map);
1416 
1417 }
1418 
1419 /*
1420  * Sends an mbuf to an offload queue driver
1421  * after dealing with any active network taps.
1422  */
1423 static inline int
1424 offload_tx(struct t3cdev *tdev, struct mbuf *m)
1425 {
1426 	int ret;
1427 
1428 	ret = t3_offload_tx(tdev, m);
1429 	return (ret);
1430 }
1431 
1432 static int
1433 write_smt_entry(struct adapter *adapter, int idx)
1434 {
1435 	struct port_info *pi = &adapter->port[idx];
1436 	struct cpl_smt_write_req *req;
1437 	struct mbuf *m;
1438 
1439 	if ((m = m_gethdr(M_NOWAIT, MT_DATA)) == NULL)
1440 		return (ENOMEM);
1441 
1442 	req = mtod(m, struct cpl_smt_write_req *);
1443 	m->m_pkthdr.len = m->m_len = sizeof(struct cpl_smt_write_req);
1444 
1445 	req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1446 	OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, idx));
1447 	req->mtu_idx = NMTUS - 1;  /* should be 0 but there's a T3 bug */
1448 	req->iff = idx;
1449 	memset(req->src_mac1, 0, sizeof(req->src_mac1));
1450 	memcpy(req->src_mac0, pi->hw_addr, ETHER_ADDR_LEN);
1451 
1452 	m_set_priority(m, 1);
1453 
1454 	offload_tx(&adapter->tdev, m);
1455 
1456 	return (0);
1457 }
1458 
1459 static int
1460 init_smt(struct adapter *adapter)
1461 {
1462 	int i;
1463 
1464 	for_each_port(adapter, i)
1465 		write_smt_entry(adapter, i);
1466 	return 0;
1467 }
1468 
1469 static void
1470 init_port_mtus(adapter_t *adapter)
1471 {
1472 	unsigned int mtus = adapter->port[0].ifp->if_mtu;
1473 
1474 	if (adapter->port[1].ifp)
1475 		mtus |= adapter->port[1].ifp->if_mtu << 16;
1476 	t3_write_reg(adapter, A_TP_MTU_PORT_TABLE, mtus);
1477 }
1478 
1479 static void
1480 send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo,
1481 			      int hi, int port)
1482 {
1483 	struct mbuf *m;
1484 	struct mngt_pktsched_wr *req;
1485 
1486 	m = m_gethdr(M_DONTWAIT, MT_DATA);
1487 	if (m) {
1488 		req = mtod(m, struct mngt_pktsched_wr *);
1489 		req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT));
1490 		req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET;
1491 		req->sched = sched;
1492 		req->idx = qidx;
1493 		req->min = lo;
1494 		req->max = hi;
1495 		req->binding = port;
1496 		m->m_len = m->m_pkthdr.len = sizeof(*req);
1497 		t3_mgmt_tx(adap, m);
1498 	}
1499 }
1500 
1501 static void
1502 bind_qsets(adapter_t *sc)
1503 {
1504 	int i, j;
1505 
1506 	cxgb_pcpu_startup_threads(sc);
1507 	for (i = 0; i < (sc)->params.nports; ++i) {
1508 		const struct port_info *pi = adap2pinfo(sc, i);
1509 
1510 		for (j = 0; j < pi->nqsets; ++j) {
1511 			send_pktsched_cmd(sc, 1, pi->first_qset + j, -1,
1512 					  -1, pi->tx_chan);
1513 
1514 		}
1515 	}
1516 }
1517 
1518 static void
1519 update_tpeeprom(struct adapter *adap)
1520 {
1521 #ifdef FIRMWARE_LATEST
1522 	const struct firmware *tpeeprom;
1523 #else
1524 	struct firmware *tpeeprom;
1525 #endif
1526 
1527 	uint32_t version;
1528 	unsigned int major, minor;
1529 	int ret, len;
1530 	char rev;
1531 
1532 	t3_seeprom_read(adap, TP_SRAM_OFFSET, &version);
1533 
1534 	major = G_TP_VERSION_MAJOR(version);
1535 	minor = G_TP_VERSION_MINOR(version);
1536 	if (major == TP_VERSION_MAJOR  && minor == TP_VERSION_MINOR)
1537 		return;
1538 
1539 	rev = t3rev2char(adap);
1540 
1541 	tpeeprom = firmware_get(TPEEPROM_NAME);
1542 	if (tpeeprom == NULL) {
1543 		device_printf(adap->dev, "could not load TP EEPROM: unable to load %s\n",
1544 		    TPEEPROM_NAME);
1545 		return;
1546 	}
1547 
1548 	len = tpeeprom->datasize - 4;
1549 
1550 	ret = t3_check_tpsram(adap, tpeeprom->data, tpeeprom->datasize);
1551 	if (ret)
1552 		goto release_tpeeprom;
1553 
1554 	if (len != TP_SRAM_LEN) {
1555 		device_printf(adap->dev, "%s length is wrong len=%d expected=%d\n", TPEEPROM_NAME, len, TP_SRAM_LEN);
1556 		return;
1557 	}
1558 
1559 	ret = set_eeprom(&adap->port[0], tpeeprom->data, tpeeprom->datasize,
1560 	    TP_SRAM_OFFSET);
1561 
1562 	if (!ret) {
1563 		device_printf(adap->dev,
1564 			"Protocol SRAM image updated in EEPROM to %d.%d.%d\n",
1565 			 TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
1566 	} else
1567 		device_printf(adap->dev, "Protocol SRAM image update in EEPROM failed\n");
1568 
1569 release_tpeeprom:
1570 	firmware_put(tpeeprom, FIRMWARE_UNLOAD);
1571 
1572 	return;
1573 }
1574 
1575 static int
1576 update_tpsram(struct adapter *adap)
1577 {
1578 #ifdef FIRMWARE_LATEST
1579 	const struct firmware *tpsram;
1580 #else
1581 	struct firmware *tpsram;
1582 #endif
1583 	int ret;
1584 	char rev;
1585 
1586 	rev = t3rev2char(adap);
1587 	if (!rev)
1588 		return 0;
1589 
1590 	update_tpeeprom(adap);
1591 
1592 	tpsram = firmware_get(TPSRAM_NAME);
1593 	if (tpsram == NULL){
1594 		device_printf(adap->dev, "could not load TP SRAM\n");
1595 		return (EINVAL);
1596 	} else
1597 		device_printf(adap->dev, "updating TP SRAM\n");
1598 
1599 	ret = t3_check_tpsram(adap, tpsram->data, tpsram->datasize);
1600 	if (ret)
1601 		goto release_tpsram;
1602 
1603 	ret = t3_set_proto_sram(adap, tpsram->data);
1604 	if (ret)
1605 		device_printf(adap->dev, "loading protocol SRAM failed\n");
1606 
1607 release_tpsram:
1608 	firmware_put(tpsram, FIRMWARE_UNLOAD);
1609 
1610 	return ret;
1611 }
1612 
1613 /**
1614  *	cxgb_up - enable the adapter
1615  *	@adap: adapter being enabled
1616  *
1617  *	Called when the first port is enabled, this function performs the
1618  *	actions necessary to make an adapter operational, such as completing
1619  *	the initialization of HW modules, and enabling interrupts.
1620  *
1621  */
1622 static int
1623 cxgb_up(struct adapter *sc)
1624 {
1625 	int err = 0;
1626 
1627 	if ((sc->flags & FULL_INIT_DONE) == 0) {
1628 
1629 		if ((sc->flags & FW_UPTODATE) == 0)
1630 			if ((err = upgrade_fw(sc)))
1631 				goto out;
1632 		if ((sc->flags & TPS_UPTODATE) == 0)
1633 			if ((err = update_tpsram(sc)))
1634 				goto out;
1635 		err = t3_init_hw(sc, 0);
1636 		if (err)
1637 			goto out;
1638 
1639 		t3_set_reg_field(sc, A_TP_PARA_REG5, 0, F_RXDDPOFFINIT);
1640 		t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
1641 
1642 		err = setup_sge_qsets(sc);
1643 		if (err)
1644 			goto out;
1645 
1646 		setup_rss(sc);
1647 		t3_add_configured_sysctls(sc);
1648 		sc->flags |= FULL_INIT_DONE;
1649 	}
1650 
1651 	t3_intr_clear(sc);
1652 
1653 	/* If it's MSI or INTx, allocate a single interrupt for everything */
1654 	if ((sc->flags & USING_MSIX) == 0) {
1655 		if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ,
1656 		   &sc->irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
1657 			device_printf(sc->dev, "Cannot allocate interrupt rid=%d\n",
1658 			    sc->irq_rid);
1659 			err = EINVAL;
1660 			goto out;
1661 		}
1662 		device_printf(sc->dev, "allocated irq_res=%p\n", sc->irq_res);
1663 
1664 		if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET,
1665 #ifdef INTR_FILTERS
1666 			NULL,
1667 #endif
1668 			sc->cxgb_intr, sc, &sc->intr_tag)) {
1669 			device_printf(sc->dev, "Cannot set up interrupt\n");
1670 			err = EINVAL;
1671 			goto irq_err;
1672 		}
1673 	} else {
1674 		cxgb_setup_msix(sc, sc->msi_count);
1675 	}
1676 
1677 	t3_sge_start(sc);
1678 	t3_intr_enable(sc);
1679 
1680 	if (sc->params.rev >= T3_REV_C && !(sc->flags & TP_PARITY_INIT) &&
1681 	    is_offload(sc) && init_tp_parity(sc) == 0)
1682 		sc->flags |= TP_PARITY_INIT;
1683 
1684 	if (sc->flags & TP_PARITY_INIT) {
1685 		t3_write_reg(sc, A_TP_INT_CAUSE,
1686 				F_CMCACHEPERR | F_ARPLUTPERR);
1687 		t3_write_reg(sc, A_TP_INT_ENABLE, 0x7fbfffff);
1688 	}
1689 
1690 
1691 	if (!(sc->flags & QUEUES_BOUND)) {
1692 		bind_qsets(sc);
1693 		sc->flags |= QUEUES_BOUND;
1694 	}
1695 out:
1696 	return (err);
1697 irq_err:
1698 	CH_ERR(sc, "request_irq failed, err %d\n", err);
1699 	goto out;
1700 }
1701 
1702 
1703 /*
1704  * Release resources when all the ports and offloading have been stopped.
1705  */
1706 static void
1707 cxgb_down_locked(struct adapter *sc)
1708 {
1709 
1710 	t3_sge_stop(sc);
1711 	t3_intr_disable(sc);
1712 
1713 	if (sc->intr_tag != NULL) {
1714 		bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
1715 		sc->intr_tag = NULL;
1716 	}
1717 	if (sc->irq_res != NULL) {
1718 		device_printf(sc->dev, "de-allocating interrupt irq_rid=%d irq_res=%p\n",
1719 		    sc->irq_rid, sc->irq_res);
1720 		bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
1721 		    sc->irq_res);
1722 		sc->irq_res = NULL;
1723 	}
1724 
1725 	if (sc->flags & USING_MSIX)
1726 		cxgb_teardown_msix(sc);
1727 
1728 	callout_stop(&sc->cxgb_tick_ch);
1729 	callout_stop(&sc->sge_timer_ch);
1730 	callout_drain(&sc->cxgb_tick_ch);
1731 	callout_drain(&sc->sge_timer_ch);
1732 
1733 	if (sc->tq != NULL) {
1734 		printf("draining slow intr\n");
1735 
1736 		taskqueue_drain(sc->tq, &sc->slow_intr_task);
1737 			printf("draining ext intr\n");
1738 		taskqueue_drain(sc->tq, &sc->ext_intr_task);
1739 		printf("draining tick task\n");
1740 		taskqueue_drain(sc->tq, &sc->tick_task);
1741 	}
1742 	ADAPTER_UNLOCK(sc);
1743 }
1744 
1745 static int
1746 offload_open(struct port_info *pi)
1747 {
1748 	struct adapter *adapter = pi->adapter;
1749 	struct t3cdev *tdev = &adapter->tdev;
1750 #ifdef notyet
1751 	    T3CDEV(pi->ifp);
1752 #endif
1753 	int adap_up = adapter->open_device_map & PORT_MASK;
1754 	int err = 0;
1755 
1756 	CTR1(KTR_CXGB, "device_map=0x%x", adapter->open_device_map);
1757 	if (atomic_cmpset_int(&adapter->open_device_map,
1758 		(adapter->open_device_map & ~(1<<OFFLOAD_DEVMAP_BIT)),
1759 		(adapter->open_device_map | (1<<OFFLOAD_DEVMAP_BIT))) == 0)
1760 		return (0);
1761 
1762 
1763 	if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1764 		printf("offload_open: DEVMAP_BIT did not get set 0x%x\n", adapter->open_device_map);
1765 	ADAPTER_LOCK(pi->adapter);
1766 	if (!adap_up)
1767 		err = cxgb_up(adapter);
1768 	ADAPTER_UNLOCK(pi->adapter);
1769 	if (err)
1770 		return (err);
1771 
1772 	t3_tp_set_offload_mode(adapter, 1);
1773 	tdev->lldev = pi->ifp;
1774 
1775 	init_port_mtus(adapter);
1776 	t3_load_mtus(adapter, adapter->params.mtus, adapter->params.a_wnd,
1777 		     adapter->params.b_wnd,
1778 		     adapter->params.rev == 0 ?
1779 		       adapter->port[0].ifp->if_mtu : 0xffff);
1780 	init_smt(adapter);
1781 
1782 	/* Call back all registered clients */
1783 	cxgb_add_clients(tdev);
1784 
1785 
1786 	/* restore them in case the offload module has changed them */
1787 	if (err) {
1788 		t3_tp_set_offload_mode(adapter, 0);
1789 		clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
1790 		cxgb_set_dummy_ops(tdev);
1791 	}
1792 	return (err);
1793 }
1794 
1795 static int
1796 offload_close(struct t3cdev *tdev)
1797 {
1798 	struct adapter *adapter = tdev2adap(tdev);
1799 
1800 	if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1801 		return (0);
1802 
1803 	/* Call back all registered clients */
1804 	cxgb_remove_clients(tdev);
1805 
1806 	tdev->lldev = NULL;
1807 	cxgb_set_dummy_ops(tdev);
1808 	t3_tp_set_offload_mode(adapter, 0);
1809 	clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
1810 
1811 	ADAPTER_LOCK(adapter);
1812 	if (!adapter->open_device_map)
1813 		cxgb_down_locked(adapter);
1814 	else
1815 		ADAPTER_UNLOCK(adapter);
1816 	return (0);
1817 }
1818 
1819 
1820 static void
1821 cxgb_init(void *arg)
1822 {
1823 	struct port_info *p = arg;
1824 
1825 	PORT_LOCK(p);
1826 	cxgb_init_locked(p);
1827 	PORT_UNLOCK(p);
1828 }
1829 
1830 static void
1831 cxgb_init_locked(struct port_info *p)
1832 {
1833 	struct ifnet *ifp;
1834 	adapter_t *sc = p->adapter;
1835 	int err;
1836 
1837 	PORT_LOCK_ASSERT_OWNED(p);
1838 	ifp = p->ifp;
1839 
1840 	ADAPTER_LOCK(p->adapter);
1841 	if ((sc->open_device_map == 0) && (err = cxgb_up(sc))) {
1842 		ADAPTER_UNLOCK(p->adapter);
1843 		cxgb_stop_locked(p);
1844 		return;
1845 	}
1846 	if (p->adapter->open_device_map == 0) {
1847 		t3_intr_clear(sc);
1848 	}
1849 	setbit(&p->adapter->open_device_map, p->port_id);
1850 	ADAPTER_UNLOCK(p->adapter);
1851 
1852 	if (is_offload(sc) && !ofld_disable) {
1853 		err = offload_open(p);
1854 		if (err)
1855 			log(LOG_WARNING,
1856 			    "Could not initialize offload capabilities\n");
1857 	}
1858 #if !defined(LINK_ATTACH)
1859 	cxgb_link_start(p);
1860 	t3_link_changed(sc, p->port_id);
1861 #endif
1862 	ifp->if_baudrate = p->link_config.speed * 1000000;
1863 
1864 	device_printf(sc->dev, "enabling interrupts on port=%d\n", p->port_id);
1865 	t3_port_intr_enable(sc, p->port_id);
1866 
1867 	t3_sge_reset_adapter(sc);
1868 
1869 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
1870 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1871 }
1872 
1873 static void
1874 cxgb_set_rxmode(struct port_info *p)
1875 {
1876 	struct t3_rx_mode rm;
1877 	struct cmac *mac = &p->mac;
1878 
1879 	t3_init_rx_mode(&rm, p);
1880 	mtx_lock(&p->adapter->mdio_lock);
1881 	t3_mac_set_rx_mode(mac, &rm);
1882 	mtx_unlock(&p->adapter->mdio_lock);
1883 }
1884 
1885 static void
1886 cxgb_stop_locked(struct port_info *pi)
1887 {
1888 	struct ifnet *ifp;
1889 
1890 	PORT_LOCK_ASSERT_OWNED(pi);
1891 	ADAPTER_LOCK_ASSERT_NOTOWNED(pi->adapter);
1892 
1893 	ifp = pi->ifp;
1894 	t3_port_intr_disable(pi->adapter, pi->port_id);
1895 	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1896 
1897 	/* disable pause frames */
1898 	t3_set_reg_field(pi->adapter, A_XGM_TX_CFG + pi->mac.offset,
1899 			 F_TXPAUSEEN, 0);
1900 
1901 	/* Reset RX FIFO HWM */
1902         t3_set_reg_field(pi->adapter, A_XGM_RXFIFO_CFG +  pi->mac.offset,
1903 			 V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM), 0);
1904 
1905 
1906 	ADAPTER_LOCK(pi->adapter);
1907 	clrbit(&pi->adapter->open_device_map, pi->port_id);
1908 
1909 	if (pi->adapter->open_device_map == 0) {
1910 		cxgb_down_locked(pi->adapter);
1911 	} else
1912 		ADAPTER_UNLOCK(pi->adapter);
1913 
1914 #if !defined(LINK_ATTACH)
1915 	DELAY(100);
1916 
1917 	/* Wait for TXFIFO empty */
1918 	t3_wait_op_done(pi->adapter, A_XGM_TXFIFO_CFG + pi->mac.offset,
1919 			F_TXFIFO_EMPTY, 1, 20, 5);
1920 
1921 	DELAY(100);
1922 	t3_mac_disable(&pi->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
1923 
1924 	pi->phy.ops->power_down(&pi->phy, 1);
1925 #endif
1926 
1927 }
1928 
1929 static int
1930 cxgb_set_mtu(struct port_info *p, int mtu)
1931 {
1932 	struct ifnet *ifp = p->ifp;
1933 	int error = 0;
1934 
1935 	if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO))
1936 		error = EINVAL;
1937 	else if (ifp->if_mtu != mtu) {
1938 		PORT_LOCK(p);
1939 		ifp->if_mtu = mtu;
1940 		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1941 			cxgb_stop_locked(p);
1942 			cxgb_init_locked(p);
1943 		}
1944 		PORT_UNLOCK(p);
1945 	}
1946 	return (error);
1947 }
1948 
1949 /*
1950  * Mark lro enabled or disabled in all qsets for this port
1951  */
1952 static int
1953 cxgb_set_lro(struct port_info *p, int enabled)
1954 {
1955 	int i;
1956 	struct adapter *adp = p->adapter;
1957 	struct sge_qset *q;
1958 
1959 	PORT_LOCK_ASSERT_OWNED(p);
1960 	for (i = 0; i < p->nqsets; i++) {
1961 		q = &adp->sge.qs[p->first_qset + i];
1962 		q->lro.enabled = (enabled != 0);
1963 	}
1964 	return (0);
1965 }
1966 
1967 static int
1968 cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
1969 {
1970 	struct port_info *p = ifp->if_softc;
1971 	struct ifaddr *ifa = (struct ifaddr *)data;
1972 	struct ifreq *ifr = (struct ifreq *)data;
1973 	int flags, error = 0, reinit = 0;
1974 	uint32_t mask;
1975 
1976 	/*
1977 	 * XXX need to check that we aren't in the middle of an unload
1978 	 */
1979 	switch (command) {
1980 	case SIOCSIFMTU:
1981 		error = cxgb_set_mtu(p, ifr->ifr_mtu);
1982 		break;
1983 	case SIOCSIFADDR:
1984 		if (ifa->ifa_addr->sa_family == AF_INET) {
1985 			ifp->if_flags |= IFF_UP;
1986 			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1987 				PORT_LOCK(p);
1988 				cxgb_init_locked(p);
1989 				PORT_UNLOCK(p);
1990 			}
1991 			arp_ifinit(ifp, ifa);
1992 		} else
1993 			error = ether_ioctl(ifp, command, data);
1994 		break;
1995 	case SIOCSIFFLAGS:
1996 		PORT_LOCK(p);
1997 		if (ifp->if_flags & IFF_UP) {
1998 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1999 				flags = p->if_flags;
2000 				if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
2001 				    ((ifp->if_flags ^ flags) & IFF_ALLMULTI))
2002 					cxgb_set_rxmode(p);
2003 			} else
2004 				cxgb_init_locked(p);
2005 			p->if_flags = ifp->if_flags;
2006 		} else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2007 			cxgb_stop_locked(p);
2008 
2009 		PORT_UNLOCK(p);
2010 		break;
2011 	case SIOCADDMULTI:
2012 	case SIOCDELMULTI:
2013 		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2014 			cxgb_set_rxmode(p);
2015 		}
2016 		break;
2017 	case SIOCSIFMEDIA:
2018 	case SIOCGIFMEDIA:
2019 		error = ifmedia_ioctl(ifp, ifr, &p->media, command);
2020 		break;
2021 	case SIOCSIFCAP:
2022 		PORT_LOCK(p);
2023 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
2024 		if (mask & IFCAP_TXCSUM) {
2025 			if (IFCAP_TXCSUM & ifp->if_capenable) {
2026 				ifp->if_capenable &= ~(IFCAP_TXCSUM|IFCAP_TSO4);
2027 				ifp->if_hwassist &= ~(CSUM_TCP | CSUM_UDP
2028 				    | CSUM_IP | CSUM_TSO);
2029 			} else {
2030 				ifp->if_capenable |= IFCAP_TXCSUM;
2031 				ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP
2032 				    | CSUM_IP);
2033 			}
2034 		}
2035 		if (mask & IFCAP_RXCSUM) {
2036 			ifp->if_capenable ^= IFCAP_RXCSUM;
2037 		}
2038 		if (mask & IFCAP_TSO4) {
2039 			if (IFCAP_TSO4 & ifp->if_capenable) {
2040 				ifp->if_capenable &= ~IFCAP_TSO4;
2041 				ifp->if_hwassist &= ~CSUM_TSO;
2042 			} else if (IFCAP_TXCSUM & ifp->if_capenable) {
2043 				ifp->if_capenable |= IFCAP_TSO4;
2044 				ifp->if_hwassist |= CSUM_TSO;
2045 			} else {
2046 				if (cxgb_debug)
2047 					printf("cxgb requires tx checksum offload"
2048 					    " be enabled to use TSO\n");
2049 				error = EINVAL;
2050 			}
2051 		}
2052 		if (mask & IFCAP_LRO) {
2053 			ifp->if_capenable ^= IFCAP_LRO;
2054 
2055 			/* Safe to do this even if cxgb_up not called yet */
2056 			cxgb_set_lro(p, ifp->if_capenable & IFCAP_LRO);
2057 		}
2058 		if (mask & IFCAP_VLAN_HWTAGGING) {
2059 			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
2060 			reinit = ifp->if_drv_flags & IFF_DRV_RUNNING;
2061 		}
2062 		if (mask & IFCAP_VLAN_MTU) {
2063 			ifp->if_capenable ^= IFCAP_VLAN_MTU;
2064 			reinit = ifp->if_drv_flags & IFF_DRV_RUNNING;
2065 		}
2066 		if (mask & IFCAP_VLAN_HWCSUM) {
2067 			ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
2068 		}
2069 		if (reinit) {
2070 			cxgb_stop_locked(p);
2071 			cxgb_init_locked(p);
2072 		}
2073 		PORT_UNLOCK(p);
2074 
2075 #ifdef VLAN_CAPABILITIES
2076 		VLAN_CAPABILITIES(ifp);
2077 #endif
2078 		break;
2079 	default:
2080 		error = ether_ioctl(ifp, command, data);
2081 		break;
2082 	}
2083 	return (error);
2084 }
2085 
2086 static int
2087 cxgb_media_change(struct ifnet *ifp)
2088 {
2089 	if_printf(ifp, "media change not supported\n");
2090 	return (ENXIO);
2091 }
2092 
2093 static void
2094 cxgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2095 {
2096 	struct port_info *p = ifp->if_softc;
2097 
2098 	ifmr->ifm_status = IFM_AVALID;
2099 	ifmr->ifm_active = IFM_ETHER;
2100 
2101 	if (!p->link_config.link_ok)
2102 		return;
2103 
2104 	ifmr->ifm_status |= IFM_ACTIVE;
2105 
2106 	switch (p->link_config.speed) {
2107 	case 10:
2108 		ifmr->ifm_active |= IFM_10_T;
2109 		break;
2110 	case 100:
2111 		ifmr->ifm_active |= IFM_100_TX;
2112 			break;
2113 	case 1000:
2114 		ifmr->ifm_active |= IFM_1000_T;
2115 		break;
2116 	}
2117 
2118 	if (p->link_config.duplex)
2119 		ifmr->ifm_active |= IFM_FDX;
2120 	else
2121 		ifmr->ifm_active |= IFM_HDX;
2122 }
2123 
2124 static void
2125 cxgb_async_intr(void *data)
2126 {
2127 	adapter_t *sc = data;
2128 
2129 	if (cxgb_debug)
2130 		device_printf(sc->dev, "cxgb_async_intr\n");
2131 	/*
2132 	 * May need to sleep - defer to taskqueue
2133 	 */
2134 	taskqueue_enqueue(sc->tq, &sc->slow_intr_task);
2135 }
2136 
2137 static void
2138 cxgb_ext_intr_handler(void *arg, int count)
2139 {
2140 	adapter_t *sc = (adapter_t *)arg;
2141 
2142 	if (cxgb_debug)
2143 		printf("cxgb_ext_intr_handler\n");
2144 
2145 	t3_phy_intr_handler(sc);
2146 
2147 	/* Now reenable external interrupts */
2148 	ADAPTER_LOCK(sc);
2149 	if (sc->slow_intr_mask) {
2150 		sc->slow_intr_mask |= F_T3DBG;
2151 		t3_write_reg(sc, A_PL_INT_CAUSE0, F_T3DBG);
2152 		t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
2153 	}
2154 	ADAPTER_UNLOCK(sc);
2155 }
2156 
2157 static void
2158 check_link_status(adapter_t *sc)
2159 {
2160 	int i;
2161 
2162 	for (i = 0; i < (sc)->params.nports; ++i) {
2163 		struct port_info *p = &sc->port[i];
2164 
2165 		if (!(p->phy.caps & SUPPORTED_IRQ))
2166 			t3_link_changed(sc, i);
2167 		p->ifp->if_baudrate = p->link_config.speed * 1000000;
2168 	}
2169 }
2170 
2171 static void
2172 check_t3b2_mac(struct adapter *adapter)
2173 {
2174 	int i;
2175 
2176 	if(adapter->flags & CXGB_SHUTDOWN)
2177 		return;
2178 
2179 	for_each_port(adapter, i) {
2180 		struct port_info *p = &adapter->port[i];
2181 		struct ifnet *ifp = p->ifp;
2182 		int status;
2183 
2184 		if(adapter->flags & CXGB_SHUTDOWN)
2185 			return;
2186 
2187 		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
2188 			continue;
2189 
2190 		status = 0;
2191 		PORT_LOCK(p);
2192 		if ((ifp->if_drv_flags & IFF_DRV_RUNNING))
2193 			status = t3b2_mac_watchdog_task(&p->mac);
2194 		if (status == 1)
2195 			p->mac.stats.num_toggled++;
2196 		else if (status == 2) {
2197 			struct cmac *mac = &p->mac;
2198 			int mtu = ifp->if_mtu;
2199 
2200 			if (ifp->if_capenable & IFCAP_VLAN_MTU)
2201 				mtu += ETHER_VLAN_ENCAP_LEN;
2202 			t3_mac_set_mtu(mac, mtu);
2203 			t3_mac_set_address(mac, 0, p->hw_addr);
2204 			cxgb_set_rxmode(p);
2205 			t3_link_start(&p->phy, mac, &p->link_config);
2206 			t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
2207 			t3_port_intr_enable(adapter, p->port_id);
2208 			p->mac.stats.num_resets++;
2209 		}
2210 		PORT_UNLOCK(p);
2211 	}
2212 }
2213 
2214 static void
2215 cxgb_tick(void *arg)
2216 {
2217 	adapter_t *sc = (adapter_t *)arg;
2218 
2219 	if(sc->flags & CXGB_SHUTDOWN)
2220 		return;
2221 
2222 	taskqueue_enqueue(sc->tq, &sc->tick_task);
2223 	callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
2224 }
2225 
2226 static void
2227 cxgb_tick_handler(void *arg, int count)
2228 {
2229 	adapter_t *sc = (adapter_t *)arg;
2230 	const struct adapter_params *p = &sc->params;
2231 
2232 	if(sc->flags & CXGB_SHUTDOWN)
2233 		return;
2234 
2235 	ADAPTER_LOCK(sc);
2236 	if (p->linkpoll_period)
2237 		check_link_status(sc);
2238 
2239 	/*
2240 	 * adapter lock can currently only be acquired after the
2241 	 * port lock
2242 	 */
2243 	ADAPTER_UNLOCK(sc);
2244 
2245 	if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map)
2246 		check_t3b2_mac(sc);
2247 }
2248 
2249 static void
2250 touch_bars(device_t dev)
2251 {
2252 	/*
2253 	 * Don't enable yet
2254 	 */
2255 #if !defined(__LP64__) && 0
2256 	u32 v;
2257 
2258 	pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1, &v);
2259 	pci_write_config_dword(pdev, PCI_BASE_ADDRESS_1, v);
2260 	pci_read_config_dword(pdev, PCI_BASE_ADDRESS_3, &v);
2261 	pci_write_config_dword(pdev, PCI_BASE_ADDRESS_3, v);
2262 	pci_read_config_dword(pdev, PCI_BASE_ADDRESS_5, &v);
2263 	pci_write_config_dword(pdev, PCI_BASE_ADDRESS_5, v);
2264 #endif
2265 }
2266 
2267 static int
2268 set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset)
2269 {
2270 	uint8_t *buf;
2271 	int err = 0;
2272 	u32 aligned_offset, aligned_len, *p;
2273 	struct adapter *adapter = pi->adapter;
2274 
2275 
2276 	aligned_offset = offset & ~3;
2277 	aligned_len = (len + (offset & 3) + 3) & ~3;
2278 
2279 	if (aligned_offset != offset || aligned_len != len) {
2280 		buf = malloc(aligned_len, M_DEVBUF, M_WAITOK|M_ZERO);
2281 		if (!buf)
2282 			return (ENOMEM);
2283 		err = t3_seeprom_read(adapter, aligned_offset, (u32 *)buf);
2284 		if (!err && aligned_len > 4)
2285 			err = t3_seeprom_read(adapter,
2286 					      aligned_offset + aligned_len - 4,
2287 					      (u32 *)&buf[aligned_len - 4]);
2288 		if (err)
2289 			goto out;
2290 		memcpy(buf + (offset & 3), data, len);
2291 	} else
2292 		buf = (uint8_t *)(uintptr_t)data;
2293 
2294 	err = t3_seeprom_wp(adapter, 0);
2295 	if (err)
2296 		goto out;
2297 
2298 	for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) {
2299 		err = t3_seeprom_write(adapter, aligned_offset, *p);
2300 		aligned_offset += 4;
2301 	}
2302 
2303 	if (!err)
2304 		err = t3_seeprom_wp(adapter, 1);
2305 out:
2306 	if (buf != data)
2307 		free(buf, M_DEVBUF);
2308 	return err;
2309 }
2310 
2311 
2312 static int
2313 in_range(int val, int lo, int hi)
2314 {
2315 	return val < 0 || (val <= hi && val >= lo);
2316 }
2317 
2318 static int
2319 cxgb_extension_open(struct cdev *dev, int flags, int fmp, d_thread_t *td)
2320 {
2321        return (0);
2322 }
2323 
2324 static int
2325 cxgb_extension_close(struct cdev *dev, int flags, int fmt, d_thread_t *td)
2326 {
2327        return (0);
2328 }
2329 
2330 static int
2331 cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
2332     int fflag, struct thread *td)
2333 {
2334 	int mmd, error = 0;
2335 	struct port_info *pi = dev->si_drv1;
2336 	adapter_t *sc = pi->adapter;
2337 
2338 #ifdef PRIV_SUPPORTED
2339 	if (priv_check(td, PRIV_DRIVER)) {
2340 		if (cxgb_debug)
2341 			printf("user does not have access to privileged ioctls\n");
2342 		return (EPERM);
2343 	}
2344 #else
2345 	if (suser(td)) {
2346 		if (cxgb_debug)
2347 			printf("user does not have access to privileged ioctls\n");
2348 		return (EPERM);
2349 	}
2350 #endif
2351 
2352 	switch (cmd) {
2353 	case SIOCGMIIREG: {
2354 		uint32_t val;
2355 		struct cphy *phy = &pi->phy;
2356 		struct mii_data *mid = (struct mii_data *)data;
2357 
2358 		if (!phy->mdio_read)
2359 			return (EOPNOTSUPP);
2360 		if (is_10G(sc)) {
2361 			mmd = mid->phy_id >> 8;
2362 			if (!mmd)
2363 				mmd = MDIO_DEV_PCS;
2364 			else if (mmd > MDIO_DEV_XGXS)
2365 				return (EINVAL);
2366 
2367 			error = phy->mdio_read(sc, mid->phy_id & 0x1f, mmd,
2368 					     mid->reg_num, &val);
2369 		} else
2370 		        error = phy->mdio_read(sc, mid->phy_id & 0x1f, 0,
2371 					     mid->reg_num & 0x1f, &val);
2372 		if (error == 0)
2373 			mid->val_out = val;
2374 		break;
2375 	}
2376 	case SIOCSMIIREG: {
2377 		struct cphy *phy = &pi->phy;
2378 		struct mii_data *mid = (struct mii_data *)data;
2379 
2380 		if (!phy->mdio_write)
2381 			return (EOPNOTSUPP);
2382 		if (is_10G(sc)) {
2383 			mmd = mid->phy_id >> 8;
2384 			if (!mmd)
2385 				mmd = MDIO_DEV_PCS;
2386 			else if (mmd > MDIO_DEV_XGXS)
2387 				return (EINVAL);
2388 
2389 			error = phy->mdio_write(sc, mid->phy_id & 0x1f,
2390 					      mmd, mid->reg_num, mid->val_in);
2391 		} else
2392 			error = phy->mdio_write(sc, mid->phy_id & 0x1f, 0,
2393 					      mid->reg_num & 0x1f,
2394 					      mid->val_in);
2395 		break;
2396 	}
2397 	case CHELSIO_SETREG: {
2398 		struct ch_reg *edata = (struct ch_reg *)data;
2399 		if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2400 			return (EFAULT);
2401 		t3_write_reg(sc, edata->addr, edata->val);
2402 		break;
2403 	}
2404 	case CHELSIO_GETREG: {
2405 		struct ch_reg *edata = (struct ch_reg *)data;
2406 		if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2407 			return (EFAULT);
2408 		edata->val = t3_read_reg(sc, edata->addr);
2409 		break;
2410 	}
2411 	case CHELSIO_GET_SGE_CONTEXT: {
2412 		struct ch_cntxt *ecntxt = (struct ch_cntxt *)data;
2413 		mtx_lock_spin(&sc->sge.reg_lock);
2414 		switch (ecntxt->cntxt_type) {
2415 		case CNTXT_TYPE_EGRESS:
2416 			error = t3_sge_read_ecntxt(sc, ecntxt->cntxt_id,
2417 			    ecntxt->data);
2418 			break;
2419 		case CNTXT_TYPE_FL:
2420 			error = t3_sge_read_fl(sc, ecntxt->cntxt_id,
2421 			    ecntxt->data);
2422 			break;
2423 		case CNTXT_TYPE_RSP:
2424 			error = t3_sge_read_rspq(sc, ecntxt->cntxt_id,
2425 			    ecntxt->data);
2426 			break;
2427 		case CNTXT_TYPE_CQ:
2428 			error = t3_sge_read_cq(sc, ecntxt->cntxt_id,
2429 			    ecntxt->data);
2430 			break;
2431 		default:
2432 			error = EINVAL;
2433 			break;
2434 		}
2435 		mtx_unlock_spin(&sc->sge.reg_lock);
2436 		break;
2437 	}
2438 	case CHELSIO_GET_SGE_DESC: {
2439 		struct ch_desc *edesc = (struct ch_desc *)data;
2440 		int ret;
2441 		if (edesc->queue_num >= SGE_QSETS * 6)
2442 			return (EINVAL);
2443 		ret = t3_get_desc(&sc->sge.qs[edesc->queue_num / 6],
2444 		    edesc->queue_num % 6, edesc->idx, edesc->data);
2445 		if (ret < 0)
2446 			return (EINVAL);
2447 		edesc->size = ret;
2448 		break;
2449 	}
2450 	case CHELSIO_SET_QSET_PARAMS: {
2451 		struct qset_params *q;
2452 		struct ch_qset_params *t = (struct ch_qset_params *)data;
2453 		int i;
2454 
2455 		if (t->qset_idx >= SGE_QSETS)
2456 			return (EINVAL);
2457 		if (!in_range(t->intr_lat, 0, M_NEWTIMER) ||
2458 		    !in_range(t->cong_thres, 0, 255) ||
2459 		    !in_range(t->txq_size[0], MIN_TXQ_ENTRIES,
2460 			      MAX_TXQ_ENTRIES) ||
2461 		    !in_range(t->txq_size[1], MIN_TXQ_ENTRIES,
2462 			      MAX_TXQ_ENTRIES) ||
2463 		    !in_range(t->txq_size[2], MIN_CTRL_TXQ_ENTRIES,
2464 			      MAX_CTRL_TXQ_ENTRIES) ||
2465 		    !in_range(t->fl_size[0], MIN_FL_ENTRIES, MAX_RX_BUFFERS) ||
2466 		    !in_range(t->fl_size[1], MIN_FL_ENTRIES,
2467 			      MAX_RX_JUMBO_BUFFERS) ||
2468 		    !in_range(t->rspq_size, MIN_RSPQ_ENTRIES, MAX_RSPQ_ENTRIES))
2469 			return (EINVAL);
2470 
2471 		if ((sc->flags & FULL_INIT_DONE) && t->lro > 0)
2472 			for_each_port(sc, i) {
2473 				pi = adap2pinfo(sc, i);
2474 				if (t->qset_idx >= pi->first_qset &&
2475 				    t->qset_idx < pi->first_qset + pi->nqsets
2476 #if 0
2477 					&& !pi->rx_csum_offload
2478 #endif
2479 					)
2480 					return -EINVAL;
2481 			}
2482 		if ((sc->flags & FULL_INIT_DONE) &&
2483 		    (t->rspq_size >= 0 || t->fl_size[0] >= 0 ||
2484 		     t->fl_size[1] >= 0 || t->txq_size[0] >= 0 ||
2485 		     t->txq_size[1] >= 0 || t->txq_size[2] >= 0 ||
2486 		     t->polling >= 0 || t->cong_thres >= 0))
2487 			return (EBUSY);
2488 
2489 		q = &sc->params.sge.qset[t->qset_idx];
2490 
2491 		if (t->rspq_size >= 0)
2492 			q->rspq_size = t->rspq_size;
2493 		if (t->fl_size[0] >= 0)
2494 			q->fl_size = t->fl_size[0];
2495 		if (t->fl_size[1] >= 0)
2496 			q->jumbo_size = t->fl_size[1];
2497 		if (t->txq_size[0] >= 0)
2498 			q->txq_size[0] = t->txq_size[0];
2499 		if (t->txq_size[1] >= 0)
2500 			q->txq_size[1] = t->txq_size[1];
2501 		if (t->txq_size[2] >= 0)
2502 			q->txq_size[2] = t->txq_size[2];
2503 		if (t->cong_thres >= 0)
2504 			q->cong_thres = t->cong_thres;
2505 		if (t->intr_lat >= 0) {
2506 			struct sge_qset *qs = &sc->sge.qs[t->qset_idx];
2507 
2508 			q->coalesce_usecs = t->intr_lat;
2509 			t3_update_qset_coalesce(qs, q);
2510 		}
2511 		break;
2512 	}
2513 	case CHELSIO_GET_QSET_PARAMS: {
2514 		struct qset_params *q;
2515 		struct ch_qset_params *t = (struct ch_qset_params *)data;
2516 
2517 		if (t->qset_idx >= SGE_QSETS)
2518 			return (EINVAL);
2519 
2520 		q = &(sc)->params.sge.qset[t->qset_idx];
2521 		t->rspq_size   = q->rspq_size;
2522 		t->txq_size[0] = q->txq_size[0];
2523 		t->txq_size[1] = q->txq_size[1];
2524 		t->txq_size[2] = q->txq_size[2];
2525 		t->fl_size[0]  = q->fl_size;
2526 		t->fl_size[1]  = q->jumbo_size;
2527 		t->polling     = q->polling;
2528 		t->intr_lat    = q->coalesce_usecs;
2529 		t->cong_thres  = q->cong_thres;
2530 		break;
2531 	}
2532 	case CHELSIO_SET_QSET_NUM: {
2533 		struct ch_reg *edata = (struct ch_reg *)data;
2534 		unsigned int port_idx = pi->port_id;
2535 
2536 		if (sc->flags & FULL_INIT_DONE)
2537 			return (EBUSY);
2538 		if (edata->val < 1 ||
2539 		    (edata->val > 1 && !(sc->flags & USING_MSIX)))
2540 			return (EINVAL);
2541 		if (edata->val + sc->port[!port_idx].nqsets > SGE_QSETS)
2542 			return (EINVAL);
2543 		sc->port[port_idx].nqsets = edata->val;
2544 		sc->port[0].first_qset = 0;
2545 		/*
2546 		 * XXX hardcode ourselves to 2 ports just like LEEENUX
2547 		 */
2548 		sc->port[1].first_qset = sc->port[0].nqsets;
2549 		break;
2550 	}
2551 	case CHELSIO_GET_QSET_NUM: {
2552 		struct ch_reg *edata = (struct ch_reg *)data;
2553 		edata->val = pi->nqsets;
2554 		break;
2555 	}
2556 #ifdef notyet
2557 	case CHELSIO_LOAD_FW:
2558 	case CHELSIO_GET_PM:
2559 	case CHELSIO_SET_PM:
2560 		return (EOPNOTSUPP);
2561 		break;
2562 #endif
2563 	case CHELSIO_SETMTUTAB: {
2564 		struct ch_mtus *m = (struct ch_mtus *)data;
2565 		int i;
2566 
2567 		if (!is_offload(sc))
2568 			return (EOPNOTSUPP);
2569 		if (offload_running(sc))
2570 			return (EBUSY);
2571 		if (m->nmtus != NMTUS)
2572 			return (EINVAL);
2573 		if (m->mtus[0] < 81)         /* accommodate SACK */
2574 			return (EINVAL);
2575 
2576 		/*
2577 		 * MTUs must be in ascending order
2578 		 */
2579 		for (i = 1; i < NMTUS; ++i)
2580 			if (m->mtus[i] < m->mtus[i - 1])
2581 				return (EINVAL);
2582 
2583 		memcpy(sc->params.mtus, m->mtus,
2584 		       sizeof(sc->params.mtus));
2585 		break;
2586 	}
2587 	case CHELSIO_GETMTUTAB: {
2588 		struct ch_mtus *m = (struct ch_mtus *)data;
2589 
2590 		if (!is_offload(sc))
2591 			return (EOPNOTSUPP);
2592 
2593 		memcpy(m->mtus, sc->params.mtus, sizeof(m->mtus));
2594 		m->nmtus = NMTUS;
2595 		break;
2596 	}
2597 	case CHELSIO_DEVUP:
2598 		if (!is_offload(sc))
2599 			return (EOPNOTSUPP);
2600 		return offload_open(pi);
2601 		break;
2602 	case CHELSIO_GET_MEM: {
2603 		struct ch_mem_range *t = (struct ch_mem_range *)data;
2604 		struct mc7 *mem;
2605 		uint8_t *useraddr;
2606 		u64 buf[32];
2607 
2608 		if (!is_offload(sc))
2609 			return (EOPNOTSUPP);
2610 		if (!(sc->flags & FULL_INIT_DONE))
2611 			return (EIO);         /* need the memory controllers */
2612 		if ((t->addr & 0x7) || (t->len & 0x7))
2613 			return (EINVAL);
2614 		if (t->mem_id == MEM_CM)
2615 			mem = &sc->cm;
2616 		else if (t->mem_id == MEM_PMRX)
2617 			mem = &sc->pmrx;
2618 		else if (t->mem_id == MEM_PMTX)
2619 			mem = &sc->pmtx;
2620 		else
2621 			return (EINVAL);
2622 
2623 		/*
2624 		 * Version scheme:
2625 		 * bits 0..9: chip version
2626 		 * bits 10..15: chip revision
2627 		 */
2628 		t->version = 3 | (sc->params.rev << 10);
2629 
2630 		/*
2631 		 * Read 256 bytes at a time as len can be large and we don't
2632 		 * want to use huge intermediate buffers.
2633 		 */
2634 		useraddr = (uint8_t *)t->buf;
2635 		while (t->len) {
2636 			unsigned int chunk = min(t->len, sizeof(buf));
2637 
2638 			error = t3_mc7_bd_read(mem, t->addr / 8, chunk / 8, buf);
2639 			if (error)
2640 				return (-error);
2641 			if (copyout(buf, useraddr, chunk))
2642 				return (EFAULT);
2643 			useraddr += chunk;
2644 			t->addr += chunk;
2645 			t->len -= chunk;
2646 		}
2647 		break;
2648 	}
2649 	case CHELSIO_READ_TCAM_WORD: {
2650 		struct ch_tcam_word *t = (struct ch_tcam_word *)data;
2651 
2652 		if (!is_offload(sc))
2653 			return (EOPNOTSUPP);
2654 		if (!(sc->flags & FULL_INIT_DONE))
2655 			return (EIO);         /* need MC5 */
2656 		return -t3_read_mc5_range(&sc->mc5, t->addr, 1, t->buf);
2657 		break;
2658 	}
2659 	case CHELSIO_SET_TRACE_FILTER: {
2660 		struct ch_trace *t = (struct ch_trace *)data;
2661 		const struct trace_params *tp;
2662 
2663 		tp = (const struct trace_params *)&t->sip;
2664 		if (t->config_tx)
2665 			t3_config_trace_filter(sc, tp, 0, t->invert_match,
2666 					       t->trace_tx);
2667 		if (t->config_rx)
2668 			t3_config_trace_filter(sc, tp, 1, t->invert_match,
2669 					       t->trace_rx);
2670 		break;
2671 	}
2672 	case CHELSIO_SET_PKTSCHED: {
2673 		struct ch_pktsched_params *p = (struct ch_pktsched_params *)data;
2674 		if (sc->open_device_map == 0)
2675 			return (EAGAIN);
2676 		send_pktsched_cmd(sc, p->sched, p->idx, p->min, p->max,
2677 		    p->binding);
2678 		break;
2679 	}
2680 	case CHELSIO_IFCONF_GETREGS: {
2681 		struct ifconf_regs *regs = (struct ifconf_regs *)data;
2682 		int reglen = cxgb_get_regs_len();
2683 		uint8_t *buf = malloc(REGDUMP_SIZE, M_DEVBUF, M_NOWAIT);
2684 		if (buf == NULL) {
2685 			return (ENOMEM);
2686 		} if (regs->len > reglen)
2687 			regs->len = reglen;
2688 		else if (regs->len < reglen) {
2689 			error = E2BIG;
2690 			goto done;
2691 		}
2692 		cxgb_get_regs(sc, regs, buf);
2693 		error = copyout(buf, regs->data, reglen);
2694 
2695 		done:
2696 		free(buf, M_DEVBUF);
2697 
2698 		break;
2699 	}
2700 	case CHELSIO_SET_HW_SCHED: {
2701 		struct ch_hw_sched *t = (struct ch_hw_sched *)data;
2702 		unsigned int ticks_per_usec = core_ticks_per_usec(sc);
2703 
2704 		if ((sc->flags & FULL_INIT_DONE) == 0)
2705 			return (EAGAIN);       /* need TP to be initialized */
2706 		if (t->sched >= NTX_SCHED || !in_range(t->mode, 0, 1) ||
2707 		    !in_range(t->channel, 0, 1) ||
2708 		    !in_range(t->kbps, 0, 10000000) ||
2709 		    !in_range(t->class_ipg, 0, 10000 * 65535 / ticks_per_usec) ||
2710 		    !in_range(t->flow_ipg, 0,
2711 			      dack_ticks_to_usec(sc, 0x7ff)))
2712 			return (EINVAL);
2713 
2714 		if (t->kbps >= 0) {
2715 			error = t3_config_sched(sc, t->kbps, t->sched);
2716 			if (error < 0)
2717 				return (-error);
2718 		}
2719 		if (t->class_ipg >= 0)
2720 			t3_set_sched_ipg(sc, t->sched, t->class_ipg);
2721 		if (t->flow_ipg >= 0) {
2722 			t->flow_ipg *= 1000;     /* us -> ns */
2723 			t3_set_pace_tbl(sc, &t->flow_ipg, t->sched, 1);
2724 		}
2725 		if (t->mode >= 0) {
2726 			int bit = 1 << (S_TX_MOD_TIMER_MODE + t->sched);
2727 
2728 			t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
2729 					 bit, t->mode ? bit : 0);
2730 		}
2731 		if (t->channel >= 0)
2732 			t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
2733 					 1 << t->sched, t->channel << t->sched);
2734 		break;
2735 	}
2736 	default:
2737 		return (EOPNOTSUPP);
2738 		break;
2739 	}
2740 
2741 	return (error);
2742 }
2743 
2744 static __inline void
2745 reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
2746     unsigned int end)
2747 {
2748 	uint32_t *p = (uint32_t *)buf + start;
2749 
2750 	for ( ; start <= end; start += sizeof(uint32_t))
2751 		*p++ = t3_read_reg(ap, start);
2752 }
2753 
2754 #define T3_REGMAP_SIZE (3 * 1024)
2755 static int
2756 cxgb_get_regs_len(void)
2757 {
2758 	return T3_REGMAP_SIZE;
2759 }
2760 #undef T3_REGMAP_SIZE
2761 
2762 static void
2763 cxgb_get_regs(adapter_t *sc, struct ifconf_regs *regs, uint8_t *buf)
2764 {
2765 
2766 	/*
2767 	 * Version scheme:
2768 	 * bits 0..9: chip version
2769 	 * bits 10..15: chip revision
2770 	 * bit 31: set for PCIe cards
2771 	 */
2772 	regs->version = 3 | (sc->params.rev << 10) | (is_pcie(sc) << 31);
2773 
2774 	/*
2775 	 * We skip the MAC statistics registers because they are clear-on-read.
2776 	 * Also reading multi-register stats would need to synchronize with the
2777 	 * periodic mac stats accumulation.  Hard to justify the complexity.
2778 	 */
2779 	memset(buf, 0, REGDUMP_SIZE);
2780 	reg_block_dump(sc, buf, 0, A_SG_RSPQ_CREDIT_RETURN);
2781 	reg_block_dump(sc, buf, A_SG_HI_DRB_HI_THRSH, A_ULPRX_PBL_ULIMIT);
2782 	reg_block_dump(sc, buf, A_ULPTX_CONFIG, A_MPS_INT_CAUSE);
2783 	reg_block_dump(sc, buf, A_CPL_SWITCH_CNTRL, A_CPL_MAP_TBL_DATA);
2784 	reg_block_dump(sc, buf, A_SMB_GLOBAL_TIME_CFG, A_XGM_SERDES_STAT3);
2785 	reg_block_dump(sc, buf, A_XGM_SERDES_STATUS0,
2786 		       XGM_REG(A_XGM_SERDES_STAT3, 1));
2787 	reg_block_dump(sc, buf, XGM_REG(A_XGM_SERDES_STATUS0, 1),
2788 		       XGM_REG(A_XGM_RX_SPI4_SOP_EOP_CNT, 1));
2789 }
2790 
2791 
2792 MODULE_DEPEND(if_cxgb, cxgb_t3fw, 1, 1, 1);
2793