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