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