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, ®) == 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