Deleted Added
full compact
cxgb_main.c (175389) cxgb_main.c (176472)
1/**************************************************************************
2
3Copyright (c) 2007, Chelsio Inc.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8

--- 14 unchanged lines hidden (view full) ---

23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26POSSIBILITY OF SUCH DAMAGE.
27
28***************************************************************************/
29
30#include <sys/cdefs.h>
1/**************************************************************************
2
3Copyright (c) 2007, Chelsio Inc.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8

--- 14 unchanged lines hidden (view full) ---

23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26POSSIBILITY OF SUCH DAMAGE.
27
28***************************************************************************/
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_main.c 175389 2008-01-16 21:33:34Z kmacy $");
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_main.c 176472 2008-02-23 01:06:17Z kmacy $");
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/kernel.h>
36#include <sys/bus.h>
37#include <sys/module.h>
38#include <sys/pciio.h>
39#include <sys/conf.h>
40#include <machine/bus.h>
41#include <machine/resource.h>
42#include <sys/bus_dma.h>
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/kernel.h>
36#include <sys/bus.h>
37#include <sys/module.h>
38#include <sys/pciio.h>
39#include <sys/conf.h>
40#include <machine/bus.h>
41#include <machine/resource.h>
42#include <sys/bus_dma.h>
43#include <sys/ktr.h>
43#include <sys/rman.h>
44#include <sys/ioccom.h>
45#include <sys/mbuf.h>
46#include <sys/linker.h>
47#include <sys/firmware.h>
48#include <sys/socket.h>
49#include <sys/sockio.h>
50#include <sys/smp.h>

--- 63 unchanged lines hidden (view full) ---

114static void cxgb_free(struct adapter *);
115static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
116 unsigned int end);
117static void cxgb_get_regs(adapter_t *sc, struct ifconf_regs *regs, uint8_t *buf);
118static int cxgb_get_regs_len(void);
119static int offload_open(struct port_info *pi);
120static void touch_bars(device_t dev);
121static int offload_close(struct t3cdev *tdev);
44#include <sys/rman.h>
45#include <sys/ioccom.h>
46#include <sys/mbuf.h>
47#include <sys/linker.h>
48#include <sys/firmware.h>
49#include <sys/socket.h>
50#include <sys/sockio.h>
51#include <sys/smp.h>

--- 63 unchanged lines hidden (view full) ---

115static void cxgb_free(struct adapter *);
116static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
117 unsigned int end);
118static void cxgb_get_regs(adapter_t *sc, struct ifconf_regs *regs, uint8_t *buf);
119static int cxgb_get_regs_len(void);
120static int offload_open(struct port_info *pi);
121static void touch_bars(device_t dev);
122static int offload_close(struct t3cdev *tdev);
123static void cxgb_link_start(struct port_info *p);
122
123static device_method_t cxgb_controller_methods[] = {
124 DEVMETHOD(device_probe, cxgb_controller_probe),
125 DEVMETHOD(device_attach, cxgb_controller_attach),
126 DEVMETHOD(device_detach, cxgb_controller_detach),
127
128 /* bus interface */
129 DEVMETHOD(bus_print_child, bus_generic_print_child),

--- 146 unchanged lines hidden (view full) ---

276 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
277 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
278 {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
279 {0, 0, 0, NULL}
280};
281
282static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset);
283
124
125static device_method_t cxgb_controller_methods[] = {
126 DEVMETHOD(device_probe, cxgb_controller_probe),
127 DEVMETHOD(device_attach, cxgb_controller_attach),
128 DEVMETHOD(device_detach, cxgb_controller_detach),
129
130 /* bus interface */
131 DEVMETHOD(bus_print_child, bus_generic_print_child),

--- 146 unchanged lines hidden (view full) ---

278 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
279 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
280 {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
281 {0, 0, 0, NULL}
282};
283
284static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset);
285
286
287void
288cxgb_log_tcb(struct adapter *sc, unsigned int tid)
289{
290 char buf[TCB_SIZE];
291 uint64_t *tcb = (uint64_t *)buf;
292 int i, error;
293 struct mc7 *mem = &sc->cm;
294
295 error = t3_mc7_bd_read(mem, tid*TCB_SIZE/8, TCB_SIZE/8, tcb);
296 if (error)
297 printf("cxgb_tcb_log failed\n");
298
299 CTR1(KTR_CXGB, "TCB tid=%u", tid);
300 for (i = 0; i < TCB_SIZE / 32; i++) {
301 CTR5(KTR_CXGB, "%1d: %08x %08x %08x %08x",
302 i, (uint32_t)tcb[1], (uint32_t)(tcb[1] >> 32),
303 (uint32_t)tcb[0], (uint32_t)(tcb[0] >> 32));
304 tcb += 2;
305 CTR4(KTR_CXGB, " %08x %08x %08x %08x",
306 (uint32_t)tcb[1], (uint32_t)(tcb[1] >> 32),
307 (uint32_t)tcb[0], (uint32_t)(tcb[0] >> 32));
308 tcb += 2;
309 }
310}
311
284static __inline char
285t3rev2char(struct adapter *adapter)
286{
287 char rev = 'z';
288
289 switch(adapter->params.rev) {
290 case T3_REV_A:
291 rev = 'a';

--- 100 unchanged lines hidden (view full) ---

392 device_t child;
393 const struct adapter_info *ai;
394 struct adapter *sc;
395 int i, error = 0;
396 uint32_t vers;
397 int port_qsets = 1;
398#ifdef MSI_SUPPORTED
399 int msi_needed, reg;
312static __inline char
313t3rev2char(struct adapter *adapter)
314{
315 char rev = 'z';
316
317 switch(adapter->params.rev) {
318 case T3_REV_A:
319 rev = 'a';

--- 100 unchanged lines hidden (view full) ---

420 device_t child;
421 const struct adapter_info *ai;
422 struct adapter *sc;
423 int i, error = 0;
424 uint32_t vers;
425 int port_qsets = 1;
426#ifdef MSI_SUPPORTED
427 int msi_needed, reg;
400#endif
428#endif
429 int must_load = 0;
401 sc = device_get_softc(dev);
402 sc->dev = dev;
403 sc->msi_count = 0;
404 ai = cxgb_get_adapter_info(dev);
405
406 /*
407 * XXX not really related but a recent addition
408 */

--- 20 unchanged lines hidden (view full) ---

429 pci_enable_busmaster(dev);
430 /*
431 * Allocate the registers and make them available to the driver.
432 * The registers that we care about for NIC mode are in BAR 0
433 */
434 sc->regs_rid = PCIR_BAR(0);
435 if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
436 &sc->regs_rid, RF_ACTIVE)) == NULL) {
430 sc = device_get_softc(dev);
431 sc->dev = dev;
432 sc->msi_count = 0;
433 ai = cxgb_get_adapter_info(dev);
434
435 /*
436 * XXX not really related but a recent addition
437 */

--- 20 unchanged lines hidden (view full) ---

458 pci_enable_busmaster(dev);
459 /*
460 * Allocate the registers and make them available to the driver.
461 * The registers that we care about for NIC mode are in BAR 0
462 */
463 sc->regs_rid = PCIR_BAR(0);
464 if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
465 &sc->regs_rid, RF_ACTIVE)) == NULL) {
437 device_printf(dev, "Cannot allocate BAR\n");
466 device_printf(dev, "Cannot allocate BAR region 0\n");
438 return (ENXIO);
439 }
467 return (ENXIO);
468 }
469 sc->udbs_rid = PCIR_BAR(2);
470 if ((sc->udbs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
471 &sc->udbs_rid, RF_ACTIVE)) == NULL) {
472 device_printf(dev, "Cannot allocate BAR region 1\n");
473 error = ENXIO;
474 goto out;
475 }
440
441 snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d",
442 device_get_unit(dev));
443 ADAPTER_LOCK_INIT(sc, sc->lockbuf);
444
445 snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d",
446 device_get_unit(dev));
447 snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d",
448 device_get_unit(dev));
449 snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d",
450 device_get_unit(dev));
451
476
477 snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d",
478 device_get_unit(dev));
479 ADAPTER_LOCK_INIT(sc, sc->lockbuf);
480
481 snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d",
482 device_get_unit(dev));
483 snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d",
484 device_get_unit(dev));
485 snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d",
486 device_get_unit(dev));
487
452 MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_DEF);
488 MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_SPIN);
453 MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF);
454 MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF);
455
456 sc->bt = rman_get_bustag(sc->regs_res);
457 sc->bh = rman_get_bushandle(sc->regs_res);
458 sc->mmio_len = rman_get_size(sc->regs_res);
459
460 if (t3_prep_adapter(sc, ai, 1) < 0) {

--- 68 unchanged lines hidden (view full) ---

529 device_get_nameunit(dev));
530 TASK_INIT(&sc->ext_intr_task, 0, cxgb_ext_intr_handler, sc);
531 TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc);
532
533
534 /* Create a periodic callout for checking adapter status */
535 callout_init(&sc->cxgb_tick_ch, TRUE);
536
489 MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF);
490 MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF);
491
492 sc->bt = rman_get_bustag(sc->regs_res);
493 sc->bh = rman_get_bushandle(sc->regs_res);
494 sc->mmio_len = rman_get_size(sc->regs_res);
495
496 if (t3_prep_adapter(sc, ai, 1) < 0) {

--- 68 unchanged lines hidden (view full) ---

565 device_get_nameunit(dev));
566 TASK_INIT(&sc->ext_intr_task, 0, cxgb_ext_intr_handler, sc);
567 TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc);
568
569
570 /* Create a periodic callout for checking adapter status */
571 callout_init(&sc->cxgb_tick_ch, TRUE);
572
537 if (t3_check_fw_version(sc) != 0) {
573 if (t3_check_fw_version(sc, &must_load) != 0 && must_load) {
538 /*
539 * Warn user that a firmware update will be attempted in init.
540 */
541 device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n",
542 FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO);
543 sc->flags &= ~FW_UPTODATE;
544 } else {
545 sc->flags |= FW_UPTODATE;
546 }
547
574 /*
575 * Warn user that a firmware update will be attempted in init.
576 */
577 device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n",
578 FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO);
579 sc->flags &= ~FW_UPTODATE;
580 } else {
581 sc->flags |= FW_UPTODATE;
582 }
583
548 if (t3_check_tpsram_version(sc) != 0) {
584 if (t3_check_tpsram_version(sc, &must_load) != 0 && must_load) {
549 /*
550 * Warn user that a firmware update will be attempted in init.
551 */
552 device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n",
553 t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
554 sc->flags &= ~TPS_UPTODATE;
555 } else {
556 sc->flags |= TPS_UPTODATE;

--- 47 unchanged lines hidden (view full) ---

604 error = t3_get_fw_version(sc, &vers);
605 if (error)
606 goto out;
607
608 snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
609 G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
610 G_FW_VERSION_MICRO(vers));
611
585 /*
586 * Warn user that a firmware update will be attempted in init.
587 */
588 device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n",
589 t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
590 sc->flags &= ~TPS_UPTODATE;
591 } else {
592 sc->flags |= TPS_UPTODATE;

--- 47 unchanged lines hidden (view full) ---

640 error = t3_get_fw_version(sc, &vers);
641 if (error)
642 goto out;
643
644 snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
645 G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
646 G_FW_VERSION_MICRO(vers));
647
648 device_printf(sc->dev, "Firmware Version %s\n", &sc->fw_version[0]);
649 callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
612 t3_add_attach_sysctls(sc);
613out:
614 if (error)
615 cxgb_free(sc);
616
617 return (error);
618}
619

--- 9 unchanged lines hidden (view full) ---

629 return (0);
630}
631
632static void
633cxgb_free(struct adapter *sc)
634{
635 int i;
636
650 t3_add_attach_sysctls(sc);
651out:
652 if (error)
653 cxgb_free(sc);
654
655 return (error);
656}
657

--- 9 unchanged lines hidden (view full) ---

667 return (0);
668}
669
670static void
671cxgb_free(struct adapter *sc)
672{
673 int i;
674
637
675 ADAPTER_LOCK(sc);
676 sc->flags |= CXGB_SHUTDOWN;
677 ADAPTER_UNLOCK(sc);
638 cxgb_pcpu_shutdown_threads(sc);
639 ADAPTER_LOCK(sc);
678 cxgb_pcpu_shutdown_threads(sc);
679 ADAPTER_LOCK(sc);
680
640/*
641 * drops the lock
642 */
643 cxgb_down_locked(sc);
644
645#ifdef MSI_SUPPORTED
646 if (sc->flags & (USING_MSI | USING_MSIX)) {
647 device_printf(sc->dev, "releasing msi message(s)\n");
648 pci_release_msi(sc->dev);
649 } else {
650 device_printf(sc->dev, "no msi message to release\n");
651 }
652#endif
653 if (sc->msix_regs_res != NULL) {
654 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid,
655 sc->msix_regs_res);
656 }
681/*
682 * drops the lock
683 */
684 cxgb_down_locked(sc);
685
686#ifdef MSI_SUPPORTED
687 if (sc->flags & (USING_MSI | USING_MSIX)) {
688 device_printf(sc->dev, "releasing msi message(s)\n");
689 pci_release_msi(sc->dev);
690 } else {
691 device_printf(sc->dev, "no msi message to release\n");
692 }
693#endif
694 if (sc->msix_regs_res != NULL) {
695 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid,
696 sc->msix_regs_res);
697 }
657
658 if (sc->tq != NULL) {
659 taskqueue_drain(sc->tq, &sc->ext_intr_task);
660 taskqueue_drain(sc->tq, &sc->tick_task);
661 }
698
662 t3_sge_deinit_sw(sc);
663 /*
664 * Wait for last callout
665 */
666
667 DELAY(hz*100);
668
669 for (i = 0; i < (sc)->params.nports; ++i) {
670 if (sc->portdev[i] != NULL)
671 device_delete_child(sc->dev, sc->portdev[i]);
672 }
673
674 bus_generic_detach(sc->dev);
699 t3_sge_deinit_sw(sc);
700 /*
701 * Wait for last callout
702 */
703
704 DELAY(hz*100);
705
706 for (i = 0; i < (sc)->params.nports; ++i) {
707 if (sc->portdev[i] != NULL)
708 device_delete_child(sc->dev, sc->portdev[i]);
709 }
710
711 bus_generic_detach(sc->dev);
675 if (sc->tq != NULL)
712 if (sc->tq != NULL) {
676 taskqueue_free(sc->tq);
713 taskqueue_free(sc->tq);
714 sc->tq = NULL;
715 }
716
677 if (is_offload(sc)) {
678 cxgb_adapter_unofld(sc);
679 if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT))
680 offload_close(&sc->tdev);
681 else
682 printf("cxgb_free: DEVMAP_BIT not set\n");
683 } else
684 printf("not offloading set\n");
717 if (is_offload(sc)) {
718 cxgb_adapter_unofld(sc);
719 if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT))
720 offload_close(&sc->tdev);
721 else
722 printf("cxgb_free: DEVMAP_BIT not set\n");
723 } else
724 printf("not offloading set\n");
725
726 if (sc->flags & CXGB_OFLD_INIT)
727 cxgb_offload_deactivate(sc);
685 free(sc->filters, M_DEVBUF);
686 t3_sge_free(sc);
687
688 cxgb_offload_exit();
728 free(sc->filters, M_DEVBUF);
729 t3_sge_free(sc);
730
731 cxgb_offload_exit();
689
732
733 if (sc->udbs_res != NULL)
734 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->udbs_rid,
735 sc->udbs_res);
736
690 if (sc->regs_res != NULL)
691 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
692 sc->regs_res);
693
694 MTX_DESTROY(&sc->mdio_lock);
695 MTX_DESTROY(&sc->sge.reg_lock);
696 MTX_DESTROY(&sc->elmer_lock);
697 ADAPTER_LOCK_DEINIT(sc);

--- 94 unchanged lines hidden (view full) ---

792 if ((sc->msix_irq_res[k] = bus_alloc_resource_any(
793 sc->dev, SYS_RES_IRQ, &rid,
794 RF_SHAREABLE | RF_ACTIVE)) == NULL) {
795 device_printf(sc->dev, "Cannot allocate "
796 "interrupt for message %d\n", rid);
797 return (EINVAL);
798 }
799 sc->msix_irq_rid[k] = rid;
737 if (sc->regs_res != NULL)
738 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
739 sc->regs_res);
740
741 MTX_DESTROY(&sc->mdio_lock);
742 MTX_DESTROY(&sc->sge.reg_lock);
743 MTX_DESTROY(&sc->elmer_lock);
744 ADAPTER_LOCK_DEINIT(sc);

--- 94 unchanged lines hidden (view full) ---

839 if ((sc->msix_irq_res[k] = bus_alloc_resource_any(
840 sc->dev, SYS_RES_IRQ, &rid,
841 RF_SHAREABLE | RF_ACTIVE)) == NULL) {
842 device_printf(sc->dev, "Cannot allocate "
843 "interrupt for message %d\n", rid);
844 return (EINVAL);
845 }
846 sc->msix_irq_rid[k] = rid;
800 printf("setting up interrupt for port=%d\n",
801 qs->port->port_id);
802 if (bus_setup_intr(sc->dev, sc->msix_irq_res[k],
803 INTR_MPSAFE|INTR_TYPE_NET,
804#ifdef INTR_FILTERS
805 NULL,
806#endif
807 t3_intr_msix, qs, &sc->msix_intr_tag[k])) {
808 device_printf(sc->dev, "Cannot set up "
809 "interrupt for message %d\n", rid);

--- 13 unchanged lines hidden (view full) ---

823 return (0);
824}
825
826static int
827cxgb_port_probe(device_t dev)
828{
829 struct port_info *p;
830 char buf[80];
847 if (bus_setup_intr(sc->dev, sc->msix_irq_res[k],
848 INTR_MPSAFE|INTR_TYPE_NET,
849#ifdef INTR_FILTERS
850 NULL,
851#endif
852 t3_intr_msix, qs, &sc->msix_intr_tag[k])) {
853 device_printf(sc->dev, "Cannot set up "
854 "interrupt for message %d\n", rid);

--- 13 unchanged lines hidden (view full) ---

868 return (0);
869}
870
871static int
872cxgb_port_probe(device_t dev)
873{
874 struct port_info *p;
875 char buf[80];
831
876 const char *desc;
877
832 p = device_get_softc(dev);
878 p = device_get_softc(dev);
833
834 snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, p->port_type->desc);
879 desc = p->phy.desc;
880 snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, desc);
835 device_set_desc_copy(dev, buf);
836 return (0);
837}
838
839
840static int
841cxgb_makedev(struct port_info *pi)
842{

--- 25 unchanged lines hidden (view full) ---

868
869
870static int
871cxgb_port_attach(device_t dev)
872{
873 struct port_info *p;
874 struct ifnet *ifp;
875 int err, media_flags;
881 device_set_desc_copy(dev, buf);
882 return (0);
883}
884
885
886static int
887cxgb_makedev(struct port_info *pi)
888{

--- 25 unchanged lines hidden (view full) ---

914
915
916static int
917cxgb_port_attach(device_t dev)
918{
919 struct port_info *p;
920 struct ifnet *ifp;
921 int err, media_flags;
922 struct adapter *sc;
876
923
924
877 p = device_get_softc(dev);
925 p = device_get_softc(dev);
878
926 sc = p->adapter;
879 snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
880 device_get_unit(device_get_parent(dev)), p->port_id);
881 PORT_LOCK_INIT(p, p->lockbuf);
882
883 /* Allocate an ifnet object and set it up */
884 ifp = p->ifp = if_alloc(IFT_ETHER);
885 if (ifp == NULL) {
886 device_printf(dev, "Cannot allocate ifnet\n");

--- 5 unchanged lines hidden (view full) ---

892 */
893 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
894 ifp->if_init = cxgb_init;
895 ifp->if_softc = p;
896 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
897 ifp->if_ioctl = cxgb_ioctl;
898 ifp->if_start = cxgb_start;
899
927 snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
928 device_get_unit(device_get_parent(dev)), p->port_id);
929 PORT_LOCK_INIT(p, p->lockbuf);
930
931 /* Allocate an ifnet object and set it up */
932 ifp = p->ifp = if_alloc(IFT_ETHER);
933 if (ifp == NULL) {
934 device_printf(dev, "Cannot allocate ifnet\n");

--- 5 unchanged lines hidden (view full) ---

940 */
941 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
942 ifp->if_init = cxgb_init;
943 ifp->if_softc = p;
944 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
945 ifp->if_ioctl = cxgb_ioctl;
946 ifp->if_start = cxgb_start;
947
948#if 0
900#ifdef IFNET_MULTIQUEUE
901 ifp->if_flags |= IFF_MULTIQ;
902 ifp->if_mq_start = cxgb_pcpu_start;
903#endif
949#ifdef IFNET_MULTIQUEUE
950 ifp->if_flags |= IFF_MULTIQ;
951 ifp->if_mq_start = cxgb_pcpu_start;
952#endif
904
953#endif
905 ifp->if_timer = 0; /* Disable ifnet watchdog */
906 ifp->if_watchdog = NULL;
907
908 ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
909 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
910 IFQ_SET_READY(&ifp->if_snd);
911
912 ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0;

--- 16 unchanged lines hidden (view full) ---

929 if (p->adapter->params.nports <= 2)
930 ifp->if_mtu = 9000;
931 if ((err = cxgb_makedev(p)) != 0) {
932 printf("makedev failed %d\n", err);
933 return (err);
934 }
935 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
936 cxgb_media_status);
954 ifp->if_timer = 0; /* Disable ifnet watchdog */
955 ifp->if_watchdog = NULL;
956
957 ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
958 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
959 IFQ_SET_READY(&ifp->if_snd);
960
961 ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0;

--- 16 unchanged lines hidden (view full) ---

978 if (p->adapter->params.nports <= 2)
979 ifp->if_mtu = 9000;
980 if ((err = cxgb_makedev(p)) != 0) {
981 printf("makedev failed %d\n", err);
982 return (err);
983 }
984 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
985 cxgb_media_status);
937
938 if (!strcmp(p->port_type->desc, "10GBASE-CX4")) {
986
987 if (!strcmp(p->phy.desc, "10GBASE-CX4")) {
939 media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX;
988 media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX;
940 } else if (!strcmp(p->port_type->desc, "10GBASE-SR")) {
989 } else if (!strcmp(p->phy.desc, "10GBASE-SR")) {
941 media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX;
990 media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX;
942 } else if (!strcmp(p->port_type->desc, "10GBASE-XR")) {
991 } else if (!strcmp(p->phy.desc, "10GBASE-XR")) {
943 media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX;
992 media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX;
944 } else if (!strcmp(p->port_type->desc, "10/100/1000BASE-T")) {
993 } else if (!strcmp(p->phy.desc, "10/100/1000BASE-T")) {
945 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL);
946 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T | IFM_FDX,
947 0, NULL);
948 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX,
949 0, NULL);
950 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
951 0, NULL);
952 ifmedia_add(&p->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
953 0, NULL);
954 media_flags = 0;
955 } else {
994 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL);
995 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T | IFM_FDX,
996 0, NULL);
997 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX,
998 0, NULL);
999 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
1000 0, NULL);
1001 ifmedia_add(&p->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
1002 0, NULL);
1003 media_flags = 0;
1004 } else {
956 printf("unsupported media type %s\n", p->port_type->desc);
1005 printf("unsupported media type %s\n", p->phy.desc);
957 return (ENXIO);
958 }
959 if (media_flags) {
960 ifmedia_add(&p->media, media_flags, 0, NULL);
961 ifmedia_set(&p->media, media_flags);
962 } else {
963 ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
964 ifmedia_set(&p->media, IFM_ETHER | IFM_AUTO);

--- 6 unchanged lines hidden (view full) ---

971 p->tq = taskqueue_create(p->taskqbuf, M_NOWAIT,
972 taskqueue_thread_enqueue, &p->tq);
973#else
974 /* Create a port for handling TX without starvation */
975 p->tq = taskqueue_create_fast(p->taskqbuf, M_NOWAIT,
976 taskqueue_thread_enqueue, &p->tq);
977#endif
978 t3_sge_init_port(p);
1006 return (ENXIO);
1007 }
1008 if (media_flags) {
1009 ifmedia_add(&p->media, media_flags, 0, NULL);
1010 ifmedia_set(&p->media, media_flags);
1011 } else {
1012 ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1013 ifmedia_set(&p->media, IFM_ETHER | IFM_AUTO);

--- 6 unchanged lines hidden (view full) ---

1020 p->tq = taskqueue_create(p->taskqbuf, M_NOWAIT,
1021 taskqueue_thread_enqueue, &p->tq);
1022#else
1023 /* Create a port for handling TX without starvation */
1024 p->tq = taskqueue_create_fast(p->taskqbuf, M_NOWAIT,
1025 taskqueue_thread_enqueue, &p->tq);
1026#endif
1027 t3_sge_init_port(p);
979
1028 cxgb_link_start(p);
1029 t3_link_changed(sc, p->port_id);
980 return (0);
981}
982
983static int
984cxgb_port_detach(device_t dev)
985{
986 struct port_info *p;
987

--- 126 unchanged lines hidden (view full) ---

1114 */
1115void
1116t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
1117 int duplex, int fc)
1118{
1119 struct port_info *pi = &adapter->port[port_id];
1120 struct cmac *mac = &adapter->port[port_id].mac;
1121
1030 return (0);
1031}
1032
1033static int
1034cxgb_port_detach(device_t dev)
1035{
1036 struct port_info *p;
1037

--- 126 unchanged lines hidden (view full) ---

1164 */
1165void
1166t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
1167 int duplex, int fc)
1168{
1169 struct port_info *pi = &adapter->port[port_id];
1170 struct cmac *mac = &adapter->port[port_id].mac;
1171
1122 if ((pi->ifp->if_flags & IFF_UP) == 0)
1123 return;
1124
1125 if (link_status) {
1126 t3_mac_enable(mac, MAC_DIRECTION_RX);
1127 if_link_state_change(pi->ifp, LINK_STATE_UP);
1128 } else {
1172 if (link_status) {
1173 t3_mac_enable(mac, MAC_DIRECTION_RX);
1174 if_link_state_change(pi->ifp, LINK_STATE_UP);
1175 } else {
1129 if_link_state_change(pi->ifp, LINK_STATE_DOWN);
1130 pi->phy.ops->power_down(&pi->phy, 1);
1131 t3_mac_disable(mac, MAC_DIRECTION_RX);
1132 t3_link_start(&pi->phy, mac, &pi->link_config);
1176 pi->phy.ops->power_down(&pi->phy, 1);
1177 t3_mac_disable(mac, MAC_DIRECTION_RX);
1178 t3_link_start(&pi->phy, mac, &pi->link_config);
1179 if_link_state_change(pi->ifp, LINK_STATE_DOWN);
1133 }
1134}
1135
1136/*
1137 * Interrupt-context handler for external (PHY) interrupts.
1138 */
1139void
1140t3_os_ext_intr_handler(adapter_t *sc)

--- 49 unchanged lines hidden (view full) ---

1190 t3_mac_reset(mac);
1191 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
1192 t3_mac_set_address(mac, 0, p->hw_addr);
1193 t3_mac_set_rx_mode(mac, &rm);
1194 t3_link_start(&p->phy, mac, &p->link_config);
1195 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1196}
1197
1180 }
1181}
1182
1183/*
1184 * Interrupt-context handler for external (PHY) interrupts.
1185 */
1186void
1187t3_os_ext_intr_handler(adapter_t *sc)

--- 49 unchanged lines hidden (view full) ---

1237 t3_mac_reset(mac);
1238 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
1239 t3_mac_set_address(mac, 0, p->hw_addr);
1240 t3_mac_set_rx_mode(mac, &rm);
1241 t3_link_start(&p->phy, mac, &p->link_config);
1242 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1243}
1244
1245
1246static int
1247await_mgmt_replies(struct adapter *adap, unsigned long init_cnt,
1248 unsigned long n)
1249{
1250 int attempts = 5;
1251
1252 while (adap->sge.qs[0].rspq.offload_pkts < init_cnt + n) {
1253 if (!--attempts)
1254 return (ETIMEDOUT);
1255 t3_os_sleep(10);
1256 }
1257 return 0;
1258}
1259
1260static int
1261init_tp_parity(struct adapter *adap)
1262{
1263 int i;
1264 struct mbuf *m;
1265 struct cpl_set_tcb_field *greq;
1266 unsigned long cnt = adap->sge.qs[0].rspq.offload_pkts;
1267
1268 t3_tp_set_offload_mode(adap, 1);
1269
1270 for (i = 0; i < 16; i++) {
1271 struct cpl_smt_write_req *req;
1272
1273 m = m_gethdr(M_WAITOK, MT_DATA);
1274 req = mtod(m, struct cpl_smt_write_req *);
1275 m->m_len = m->m_pkthdr.len = sizeof(*req);
1276 memset(req, 0, sizeof(*req));
1277 req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1278 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i));
1279 req->iff = i;
1280 t3_mgmt_tx(adap, m);
1281 }
1282
1283 for (i = 0; i < 2048; i++) {
1284 struct cpl_l2t_write_req *req;
1285
1286 m = m_gethdr(M_WAITOK, MT_DATA);
1287 req = mtod(m, struct cpl_l2t_write_req *);
1288 m->m_len = m->m_pkthdr.len = sizeof(*req);
1289 memset(req, 0, sizeof(*req));
1290 req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1291 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, i));
1292 req->params = htonl(V_L2T_W_IDX(i));
1293 t3_mgmt_tx(adap, m);
1294 }
1295
1296 for (i = 0; i < 2048; i++) {
1297 struct cpl_rte_write_req *req;
1298
1299 m = m_gethdr(M_WAITOK, MT_DATA);
1300 req = mtod(m, struct cpl_rte_write_req *);
1301 m->m_len = m->m_pkthdr.len = sizeof(*req);
1302 memset(req, 0, sizeof(*req));
1303 req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1304 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RTE_WRITE_REQ, i));
1305 req->l2t_idx = htonl(V_L2T_W_IDX(i));
1306 t3_mgmt_tx(adap, m);
1307 }
1308
1309 m = m_gethdr(M_WAITOK, MT_DATA);
1310 greq = mtod(m, struct cpl_set_tcb_field *);
1311 m->m_len = m->m_pkthdr.len = sizeof(*greq);
1312 memset(greq, 0, sizeof(*greq));
1313 greq->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1314 OPCODE_TID(greq) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, 0));
1315 greq->mask = htobe64(1);
1316 t3_mgmt_tx(adap, m);
1317
1318 i = await_mgmt_replies(adap, cnt, 16 + 2048 + 2048 + 1);
1319 t3_tp_set_offload_mode(adap, 0);
1320 return (i);
1321}
1322
1198/**
1199 * setup_rss - configure Receive Side Steering (per-queue connection demux)
1200 * @adap: the adapter
1201 *
1202 * Sets up RSS to distribute packets to multiple receive queues. We
1203 * configure the RSS CPU lookup table to distribute to the number of HW
1204 * receive queues, and the response queue lookup table to narrow that
1205 * down to the response queues actually configured for each port.

--- 13 unchanged lines hidden (view full) ---

1219 cpus[SGE_QSETS] = 0xff;
1220
1221 nq[0] = nq[1] = 0;
1222 for_each_port(adap, i) {
1223 const struct port_info *pi = adap2pinfo(adap, i);
1224
1225 nq[pi->tx_chan] += pi->nqsets;
1226 }
1323/**
1324 * setup_rss - configure Receive Side Steering (per-queue connection demux)
1325 * @adap: the adapter
1326 *
1327 * Sets up RSS to distribute packets to multiple receive queues. We
1328 * configure the RSS CPU lookup table to distribute to the number of HW
1329 * receive queues, and the response queue lookup table to narrow that
1330 * down to the response queues actually configured for each port.

--- 13 unchanged lines hidden (view full) ---

1344 cpus[SGE_QSETS] = 0xff;
1345
1346 nq[0] = nq[1] = 0;
1347 for_each_port(adap, i) {
1348 const struct port_info *pi = adap2pinfo(adap, i);
1349
1350 nq[pi->tx_chan] += pi->nqsets;
1351 }
1227 nq[0] = max(nq[0], 1U);
1228 nq[1] = max(nq[1], 1U);
1229 for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) {
1352 for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) {
1230 rspq_map[i] = i % nq[0];
1231 rspq_map[i + RSS_TABLE_SIZE / 2] = (i % nq[1]) + nq[0];
1353 rspq_map[i] = nq[0] ? i % nq[0] : 0;
1354 rspq_map[i + RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0;
1232 }
1233 /* Calculate the reverse RSS map table */
1234 for (i = 0; i < RSS_TABLE_SIZE; ++i)
1235 if (adap->rrss_map[rspq_map[i]] == 0xff)
1236 adap->rrss_map[rspq_map[i]] = i;
1237
1238 t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN |
1239 F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN |
1355 }
1356 /* Calculate the reverse RSS map table */
1357 for (i = 0; i < RSS_TABLE_SIZE; ++i)
1358 if (adap->rrss_map[rspq_map[i]] == 0xff)
1359 adap->rrss_map[rspq_map[i]] = i;
1360
1361 t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN |
1362 F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN |
1240 V_RRCPLCPUSIZE(6), cpus, rspq_map);
1363 F_RRCPLMAPEN | V_RRCPLCPUSIZE(6) | F_HASHTOEPLITZ,
1364 cpus, rspq_map);
1241
1242}
1243
1244/*
1245 * Sends an mbuf to an offload queue driver
1246 * after dealing with any active network taps.
1247 */
1248static inline int

--- 216 unchanged lines hidden (view full) ---

1465 goto out;
1466 if ((sc->flags & TPS_UPTODATE) == 0)
1467 if ((err = update_tpsram(sc)))
1468 goto out;
1469 err = t3_init_hw(sc, 0);
1470 if (err)
1471 goto out;
1472
1365
1366}
1367
1368/*
1369 * Sends an mbuf to an offload queue driver
1370 * after dealing with any active network taps.
1371 */
1372static inline int

--- 216 unchanged lines hidden (view full) ---

1589 goto out;
1590 if ((sc->flags & TPS_UPTODATE) == 0)
1591 if ((err = update_tpsram(sc)))
1592 goto out;
1593 err = t3_init_hw(sc, 0);
1594 if (err)
1595 goto out;
1596
1597 t3_set_reg_field(sc, A_TP_PARA_REG5, 0, F_RXDDPOFFINIT);
1473 t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
1474
1475 err = setup_sge_qsets(sc);
1476 if (err)
1477 goto out;
1478
1479 setup_rss(sc);
1480 t3_add_configured_sysctls(sc);

--- 24 unchanged lines hidden (view full) ---

1505 }
1506 } else {
1507 cxgb_setup_msix(sc, sc->msi_count);
1508 }
1509
1510 t3_sge_start(sc);
1511 t3_intr_enable(sc);
1512
1598 t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
1599
1600 err = setup_sge_qsets(sc);
1601 if (err)
1602 goto out;
1603
1604 setup_rss(sc);
1605 t3_add_configured_sysctls(sc);

--- 24 unchanged lines hidden (view full) ---

1630 }
1631 } else {
1632 cxgb_setup_msix(sc, sc->msi_count);
1633 }
1634
1635 t3_sge_start(sc);
1636 t3_intr_enable(sc);
1637
1638 if (sc->params.rev >= T3_REV_C && !(sc->flags & TP_PARITY_INIT) &&
1639 is_offload(sc) && init_tp_parity(sc) == 0)
1640 sc->flags |= TP_PARITY_INIT;
1641
1642 if (sc->flags & TP_PARITY_INIT) {
1643 t3_write_reg(sc, A_TP_INT_CAUSE,
1644 F_CMCACHEPERR | F_ARPLUTPERR);
1645 t3_write_reg(sc, A_TP_INT_ENABLE, 0x7fbfffff);
1646 }
1647
1648
1513 if (!(sc->flags & QUEUES_BOUND)) {
1649 if (!(sc->flags & QUEUES_BOUND)) {
1514 printf("bind qsets\n");
1515 bind_qsets(sc);
1516 sc->flags |= QUEUES_BOUND;
1517 }
1518out:
1519 return (err);
1520irq_err:
1521 CH_ERR(sc, "request_irq failed, err %d\n", err);
1522 goto out;
1523}
1524
1525
1526/*
1527 * Release resources when all the ports and offloading have been stopped.
1528 */
1529static void
1530cxgb_down_locked(struct adapter *sc)
1531{
1650 bind_qsets(sc);
1651 sc->flags |= QUEUES_BOUND;
1652 }
1653out:
1654 return (err);
1655irq_err:
1656 CH_ERR(sc, "request_irq failed, err %d\n", err);
1657 goto out;
1658}
1659
1660
1661/*
1662 * Release resources when all the ports and offloading have been stopped.
1663 */
1664static void
1665cxgb_down_locked(struct adapter *sc)
1666{
1532 int i;
1533
1534 t3_sge_stop(sc);
1535 t3_intr_disable(sc);
1536
1537 if (sc->intr_tag != NULL) {
1538 bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
1539 sc->intr_tag = NULL;
1540 }
1541 if (sc->irq_res != NULL) {
1542 device_printf(sc->dev, "de-allocating interrupt irq_rid=%d irq_res=%p\n",
1543 sc->irq_rid, sc->irq_res);
1544 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
1545 sc->irq_res);
1546 sc->irq_res = NULL;
1547 }
1548
1667
1668 t3_sge_stop(sc);
1669 t3_intr_disable(sc);
1670
1671 if (sc->intr_tag != NULL) {
1672 bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
1673 sc->intr_tag = NULL;
1674 }
1675 if (sc->irq_res != NULL) {
1676 device_printf(sc->dev, "de-allocating interrupt irq_rid=%d irq_res=%p\n",
1677 sc->irq_rid, sc->irq_res);
1678 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
1679 sc->irq_res);
1680 sc->irq_res = NULL;
1681 }
1682
1549 if (sc->flags & USING_MSIX)
1683 if (sc->flags & USING_MSIX)
1550 cxgb_teardown_msix(sc);
1684 cxgb_teardown_msix(sc);
1551 ADAPTER_UNLOCK(sc);
1552
1685
1553 callout_stop(&sc->cxgb_tick_ch);
1554 callout_stop(&sc->sge_timer_ch);
1555 callout_drain(&sc->cxgb_tick_ch);
1556 callout_drain(&sc->sge_timer_ch);
1557
1558 if (sc->tq != NULL) {
1686 callout_stop(&sc->cxgb_tick_ch);
1687 callout_stop(&sc->sge_timer_ch);
1688 callout_drain(&sc->cxgb_tick_ch);
1689 callout_drain(&sc->sge_timer_ch);
1690
1691 if (sc->tq != NULL) {
1692 printf("draining slow intr\n");
1693
1559 taskqueue_drain(sc->tq, &sc->slow_intr_task);
1694 taskqueue_drain(sc->tq, &sc->slow_intr_task);
1560 for (i = 0; i < sc->params.nports; i++)
1561 taskqueue_drain(sc->tq, &sc->port[i].timer_reclaim_task);
1695 printf("draining ext intr\n");
1696 taskqueue_drain(sc->tq, &sc->ext_intr_task);
1697 printf("draining tick task\n");
1698 taskqueue_drain(sc->tq, &sc->tick_task);
1562 }
1699 }
1700 ADAPTER_UNLOCK(sc);
1563}
1564
1565static int
1566offload_open(struct port_info *pi)
1567{
1568 struct adapter *adapter = pi->adapter;
1569 struct t3cdev *tdev = &adapter->tdev;
1570#ifdef notyet
1571 T3CDEV(pi->ifp);
1572#endif
1573 int adap_up = adapter->open_device_map & PORT_MASK;
1574 int err = 0;
1575
1701}
1702
1703static int
1704offload_open(struct port_info *pi)
1705{
1706 struct adapter *adapter = pi->adapter;
1707 struct t3cdev *tdev = &adapter->tdev;
1708#ifdef notyet
1709 T3CDEV(pi->ifp);
1710#endif
1711 int adap_up = adapter->open_device_map & PORT_MASK;
1712 int err = 0;
1713
1576 printf("device_map=0x%x\n", adapter->open_device_map);
1714 CTR1(KTR_CXGB, "device_map=0x%x", adapter->open_device_map);
1577 if (atomic_cmpset_int(&adapter->open_device_map,
1578 (adapter->open_device_map & ~(1<<OFFLOAD_DEVMAP_BIT)),
1579 (adapter->open_device_map | (1<<OFFLOAD_DEVMAP_BIT))) == 0)
1580 return (0);
1581
1582
1583 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1584 printf("offload_open: DEVMAP_BIT did not get set 0x%x\n", adapter->open_device_map);

--- 30 unchanged lines hidden (view full) ---

1615 return (err);
1616}
1617
1618static int
1619offload_close(struct t3cdev *tdev)
1620{
1621 struct adapter *adapter = tdev2adap(tdev);
1622
1715 if (atomic_cmpset_int(&adapter->open_device_map,
1716 (adapter->open_device_map & ~(1<<OFFLOAD_DEVMAP_BIT)),
1717 (adapter->open_device_map | (1<<OFFLOAD_DEVMAP_BIT))) == 0)
1718 return (0);
1719
1720
1721 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1722 printf("offload_open: DEVMAP_BIT did not get set 0x%x\n", adapter->open_device_map);

--- 30 unchanged lines hidden (view full) ---

1753 return (err);
1754}
1755
1756static int
1757offload_close(struct t3cdev *tdev)
1758{
1759 struct adapter *adapter = tdev2adap(tdev);
1760
1623 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT)) {
1624 printf("offload_close: DEVMAP_BIT not set\n");
1625
1761 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1626 return (0);
1762 return (0);
1627 }
1628
1629 /* Call back all registered clients */
1630 cxgb_remove_clients(tdev);
1631 tdev->lldev = NULL;
1632 cxgb_set_dummy_ops(tdev);
1633 t3_tp_set_offload_mode(adapter, 0);
1634 clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
1635
1636 ADAPTER_LOCK(adapter);
1637 if (!adapter->open_device_map)
1638 cxgb_down_locked(adapter);
1639 else
1640 ADAPTER_UNLOCK(adapter);
1763
1764 /* Call back all registered clients */
1765 cxgb_remove_clients(tdev);
1766 tdev->lldev = NULL;
1767 cxgb_set_dummy_ops(tdev);
1768 t3_tp_set_offload_mode(adapter, 0);
1769 clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
1770
1771 ADAPTER_LOCK(adapter);
1772 if (!adapter->open_device_map)
1773 cxgb_down_locked(adapter);
1774 else
1775 ADAPTER_UNLOCK(adapter);
1641 cxgb_offload_deactivate(adapter);
1642 return (0);
1643}
1644
1645
1646static void
1647cxgb_init(void *arg)
1648{
1649 struct port_info *p = arg;

--- 25 unchanged lines hidden (view full) ---

1675 setbit(&p->adapter->open_device_map, p->port_id);
1676 ADAPTER_UNLOCK(p->adapter);
1677
1678 if (is_offload(sc) && !ofld_disable) {
1679 err = offload_open(p);
1680 if (err)
1681 log(LOG_WARNING,
1682 "Could not initialize offload capabilities\n");
1776 return (0);
1777}
1778
1779
1780static void
1781cxgb_init(void *arg)
1782{
1783 struct port_info *p = arg;

--- 25 unchanged lines hidden (view full) ---

1809 setbit(&p->adapter->open_device_map, p->port_id);
1810 ADAPTER_UNLOCK(p->adapter);
1811
1812 if (is_offload(sc) && !ofld_disable) {
1813 err = offload_open(p);
1814 if (err)
1815 log(LOG_WARNING,
1816 "Could not initialize offload capabilities\n");
1683 else
1684 printf("offload opened\n");
1685 }
1817 }
1686 cxgb_link_start(p);
1687 t3_link_changed(sc, p->port_id);
1688 ifp->if_baudrate = p->link_config.speed * 1000000;
1689
1690 device_printf(sc->dev, "enabling interrupts on port=%d\n", p->port_id);
1691 t3_port_intr_enable(sc, p->port_id);
1692
1818 ifp->if_baudrate = p->link_config.speed * 1000000;
1819
1820 device_printf(sc->dev, "enabling interrupts on port=%d\n", p->port_id);
1821 t3_port_intr_enable(sc, p->port_id);
1822
1693 callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
1694 t3_sge_reset_adapter(sc);
1695
1696 ifp->if_drv_flags |= IFF_DRV_RUNNING;
1697 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1698}
1699
1700static void
1701cxgb_set_rxmode(struct port_info *p)
1702{
1703 struct t3_rx_mode rm;
1704 struct cmac *mac = &p->mac;
1705
1823 t3_sge_reset_adapter(sc);
1824
1825 ifp->if_drv_flags |= IFF_DRV_RUNNING;
1826 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1827}
1828
1829static void
1830cxgb_set_rxmode(struct port_info *p)
1831{
1832 struct t3_rx_mode rm;
1833 struct cmac *mac = &p->mac;
1834
1706 PORT_LOCK_ASSERT_OWNED(p);
1707
1708 t3_init_rx_mode(&rm, p);
1835 t3_init_rx_mode(&rm, p);
1836 mtx_lock(&p->adapter->mdio_lock);
1709 t3_mac_set_rx_mode(mac, &rm);
1837 t3_mac_set_rx_mode(mac, &rm);
1838 mtx_unlock(&p->adapter->mdio_lock);
1710}
1711
1712static void
1713cxgb_stop_locked(struct port_info *p)
1714{
1715 struct ifnet *ifp;
1716
1717 PORT_LOCK_ASSERT_OWNED(p);

--- 22 unchanged lines hidden (view full) ---

1740 int error = 0;
1741
1742 if ((mtu < ETHERMIN) || (mtu > ETHER_MAX_LEN_JUMBO))
1743 error = EINVAL;
1744 else if (ifp->if_mtu != mtu) {
1745 PORT_LOCK(p);
1746 ifp->if_mtu = mtu;
1747 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1839}
1840
1841static void
1842cxgb_stop_locked(struct port_info *p)
1843{
1844 struct ifnet *ifp;
1845
1846 PORT_LOCK_ASSERT_OWNED(p);

--- 22 unchanged lines hidden (view full) ---

1869 int error = 0;
1870
1871 if ((mtu < ETHERMIN) || (mtu > ETHER_MAX_LEN_JUMBO))
1872 error = EINVAL;
1873 else if (ifp->if_mtu != mtu) {
1874 PORT_LOCK(p);
1875 ifp->if_mtu = mtu;
1876 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1748 callout_stop(&p->adapter->cxgb_tick_ch);
1749 cxgb_stop_locked(p);
1750 cxgb_init_locked(p);
1751 }
1752 PORT_UNLOCK(p);
1753 }
1754 return (error);
1755}
1756

--- 9 unchanged lines hidden (view full) ---

1766 /*
1767 * XXX need to check that we aren't in the middle of an unload
1768 */
1769 switch (command) {
1770 case SIOCSIFMTU:
1771 error = cxgb_set_mtu(p, ifr->ifr_mtu);
1772 break;
1773 case SIOCSIFADDR:
1877 cxgb_stop_locked(p);
1878 cxgb_init_locked(p);
1879 }
1880 PORT_UNLOCK(p);
1881 }
1882 return (error);
1883}
1884

--- 9 unchanged lines hidden (view full) ---

1894 /*
1895 * XXX need to check that we aren't in the middle of an unload
1896 */
1897 switch (command) {
1898 case SIOCSIFMTU:
1899 error = cxgb_set_mtu(p, ifr->ifr_mtu);
1900 break;
1901 case SIOCSIFADDR:
1774 case SIOCGIFADDR:
1775 if (ifa->ifa_addr->sa_family == AF_INET) {
1902 if (ifa->ifa_addr->sa_family == AF_INET) {
1776 PORT_LOCK(p);
1777 ifp->if_flags |= IFF_UP;
1903 ifp->if_flags |= IFF_UP;
1778 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
1904 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1905 PORT_LOCK(p);
1779 cxgb_init_locked(p);
1906 cxgb_init_locked(p);
1907 PORT_UNLOCK(p);
1908 }
1780 arp_ifinit(ifp, ifa);
1909 arp_ifinit(ifp, ifa);
1781 PORT_UNLOCK(p);
1782 } else
1783 error = ether_ioctl(ifp, command, data);
1784 break;
1785 case SIOCSIFFLAGS:
1910 } else
1911 error = ether_ioctl(ifp, command, data);
1912 break;
1913 case SIOCSIFFLAGS:
1786 callout_drain(&p->adapter->cxgb_tick_ch);
1787 PORT_LOCK(p);
1788 if (ifp->if_flags & IFF_UP) {
1789 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1790 flags = p->if_flags;
1791 if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
1792 ((ifp->if_flags ^ flags) & IFF_ALLMULTI))
1793 cxgb_set_rxmode(p);
1794 } else
1795 cxgb_init_locked(p);
1796 p->if_flags = ifp->if_flags;
1797 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1798 cxgb_stop_locked(p);
1799
1914 PORT_LOCK(p);
1915 if (ifp->if_flags & IFF_UP) {
1916 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1917 flags = p->if_flags;
1918 if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
1919 ((ifp->if_flags ^ flags) & IFF_ALLMULTI))
1920 cxgb_set_rxmode(p);
1921 } else
1922 cxgb_init_locked(p);
1923 p->if_flags = ifp->if_flags;
1924 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1925 cxgb_stop_locked(p);
1926
1927 PORT_UNLOCK(p);
1928 break;
1929 case SIOCADDMULTI:
1930 case SIOCDELMULTI:
1800 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1931 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1801 adapter_t *sc = p->adapter;
1802 callout_reset(&sc->cxgb_tick_ch, hz,
1803 cxgb_tick, sc);
1932 cxgb_set_rxmode(p);
1804 }
1933 }
1805 PORT_UNLOCK(p);
1806 break;
1807 case SIOCSIFMEDIA:
1808 case SIOCGIFMEDIA:
1809 error = ifmedia_ioctl(ifp, ifr, &p->media, command);
1810 break;
1811 case SIOCSIFCAP:
1812 PORT_LOCK(p);
1813 mask = ifr->ifr_reqcap ^ ifp->if_capenable;

--- 110 unchanged lines hidden (view full) ---

1924static void
1925check_link_status(adapter_t *sc)
1926{
1927 int i;
1928
1929 for (i = 0; i < (sc)->params.nports; ++i) {
1930 struct port_info *p = &sc->port[i];
1931
1934 break;
1935 case SIOCSIFMEDIA:
1936 case SIOCGIFMEDIA:
1937 error = ifmedia_ioctl(ifp, ifr, &p->media, command);
1938 break;
1939 case SIOCSIFCAP:
1940 PORT_LOCK(p);
1941 mask = ifr->ifr_reqcap ^ ifp->if_capenable;

--- 110 unchanged lines hidden (view full) ---

2052static void
2053check_link_status(adapter_t *sc)
2054{
2055 int i;
2056
2057 for (i = 0; i < (sc)->params.nports; ++i) {
2058 struct port_info *p = &sc->port[i];
2059
1932 if (!(p->port_type->caps & SUPPORTED_IRQ))
2060 if (!(p->phy.caps & SUPPORTED_IRQ))
1933 t3_link_changed(sc, i);
1934 p->ifp->if_baudrate = p->link_config.speed * 1000000;
1935 }
1936}
1937
1938static void
1939check_t3b2_mac(struct adapter *adapter)
1940{
1941 int i;
1942
2061 t3_link_changed(sc, i);
2062 p->ifp->if_baudrate = p->link_config.speed * 1000000;
2063 }
2064}
2065
2066static void
2067check_t3b2_mac(struct adapter *adapter)
2068{
2069 int i;
2070
2071 if(adapter->flags & CXGB_SHUTDOWN)
2072 return;
2073
1943 for_each_port(adapter, i) {
1944 struct port_info *p = &adapter->port[i];
1945 struct ifnet *ifp = p->ifp;
1946 int status;
2074 for_each_port(adapter, i) {
2075 struct port_info *p = &adapter->port[i];
2076 struct ifnet *ifp = p->ifp;
2077 int status;
1947
2078
2079 if(adapter->flags & CXGB_SHUTDOWN)
2080 return;
2081
1948 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
1949 continue;
1950
1951 status = 0;
1952 PORT_LOCK(p);
1953 if ((ifp->if_drv_flags & IFF_DRV_RUNNING))
1954 status = t3b2_mac_watchdog_task(&p->mac);
1955 if (status == 1)

--- 13 unchanged lines hidden (view full) ---

1969 PORT_UNLOCK(p);
1970 }
1971}
1972
1973static void
1974cxgb_tick(void *arg)
1975{
1976 adapter_t *sc = (adapter_t *)arg;
2082 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
2083 continue;
2084
2085 status = 0;
2086 PORT_LOCK(p);
2087 if ((ifp->if_drv_flags & IFF_DRV_RUNNING))
2088 status = t3b2_mac_watchdog_task(&p->mac);
2089 if (status == 1)

--- 13 unchanged lines hidden (view full) ---

2103 PORT_UNLOCK(p);
2104 }
2105}
2106
2107static void
2108cxgb_tick(void *arg)
2109{
2110 adapter_t *sc = (adapter_t *)arg;
1977 int i, running = 0;
1978
1979 for_each_port(sc, i) {
1980
1981 struct port_info *p = &sc->port[i];
1982 struct ifnet *ifp = p->ifp;
1983 PORT_LOCK(p);
1984
2111
1985 if ((ifp->if_drv_flags & IFF_DRV_RUNNING))
1986 running = 1;
1987 PORT_UNLOCK(p);
1988 }
1989
1990 if (running == 0)
2112 if(sc->flags & CXGB_SHUTDOWN)
1991 return;
2113 return;
1992
2114
1993 taskqueue_enqueue(sc->tq, &sc->tick_task);
2115 taskqueue_enqueue(sc->tq, &sc->tick_task);
1994
1995 if (sc->open_device_map != 0)
1996 callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
2116 callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
1997}
1998
1999static void
2000cxgb_tick_handler(void *arg, int count)
2001{
2002 adapter_t *sc = (adapter_t *)arg;
2003 const struct adapter_params *p = &sc->params;
2004
2117}
2118
2119static void
2120cxgb_tick_handler(void *arg, int count)
2121{
2122 adapter_t *sc = (adapter_t *)arg;
2123 const struct adapter_params *p = &sc->params;
2124
2125 if(sc->flags & CXGB_SHUTDOWN)
2126 return;
2127
2005 ADAPTER_LOCK(sc);
2006 if (p->linkpoll_period)
2007 check_link_status(sc);
2008
2009 /*
2128 ADAPTER_LOCK(sc);
2129 if (p->linkpoll_period)
2130 check_link_status(sc);
2131
2132 /*
2010 * adapter lock can currently only be acquire after the
2133 * adapter lock can currently only be acquired after the
2011 * port lock
2012 */
2013 ADAPTER_UNLOCK(sc);
2014
2134 * port lock
2135 */
2136 ADAPTER_UNLOCK(sc);
2137
2015 if (p->rev == T3_REV_B2 && p->nports < 4)
2138 if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map)
2016 check_t3b2_mac(sc);
2017}
2018
2019static void
2020touch_bars(device_t dev)
2021{
2022 /*
2023 * Don't enable yet

--- 151 unchanged lines hidden (view full) ---

2175 struct ch_reg *edata = (struct ch_reg *)data;
2176 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2177 return (EFAULT);
2178 edata->val = t3_read_reg(sc, edata->addr);
2179 break;
2180 }
2181 case CHELSIO_GET_SGE_CONTEXT: {
2182 struct ch_cntxt *ecntxt = (struct ch_cntxt *)data;
2139 check_t3b2_mac(sc);
2140}
2141
2142static void
2143touch_bars(device_t dev)
2144{
2145 /*
2146 * Don't enable yet

--- 151 unchanged lines hidden (view full) ---

2298 struct ch_reg *edata = (struct ch_reg *)data;
2299 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2300 return (EFAULT);
2301 edata->val = t3_read_reg(sc, edata->addr);
2302 break;
2303 }
2304 case CHELSIO_GET_SGE_CONTEXT: {
2305 struct ch_cntxt *ecntxt = (struct ch_cntxt *)data;
2183 mtx_lock(&sc->sge.reg_lock);
2306 mtx_lock_spin(&sc->sge.reg_lock);
2184 switch (ecntxt->cntxt_type) {
2185 case CNTXT_TYPE_EGRESS:
2186 error = t3_sge_read_ecntxt(sc, ecntxt->cntxt_id,
2187 ecntxt->data);
2188 break;
2189 case CNTXT_TYPE_FL:
2190 error = t3_sge_read_fl(sc, ecntxt->cntxt_id,
2191 ecntxt->data);

--- 5 unchanged lines hidden (view full) ---

2197 case CNTXT_TYPE_CQ:
2198 error = t3_sge_read_cq(sc, ecntxt->cntxt_id,
2199 ecntxt->data);
2200 break;
2201 default:
2202 error = EINVAL;
2203 break;
2204 }
2307 switch (ecntxt->cntxt_type) {
2308 case CNTXT_TYPE_EGRESS:
2309 error = t3_sge_read_ecntxt(sc, ecntxt->cntxt_id,
2310 ecntxt->data);
2311 break;
2312 case CNTXT_TYPE_FL:
2313 error = t3_sge_read_fl(sc, ecntxt->cntxt_id,
2314 ecntxt->data);

--- 5 unchanged lines hidden (view full) ---

2320 case CNTXT_TYPE_CQ:
2321 error = t3_sge_read_cq(sc, ecntxt->cntxt_id,
2322 ecntxt->data);
2323 break;
2324 default:
2325 error = EINVAL;
2326 break;
2327 }
2205 mtx_unlock(&sc->sge.reg_lock);
2328 mtx_unlock_spin(&sc->sge.reg_lock);
2206 break;
2207 }
2208 case CHELSIO_GET_SGE_DESC: {
2209 struct ch_desc *edesc = (struct ch_desc *)data;
2210 int ret;
2211 if (edesc->queue_num >= SGE_QSETS * 6)
2212 return (EINVAL);
2213 ret = t3_get_desc(&sc->sge.qs[edesc->queue_num / 6],
2214 edesc->queue_num % 6, edesc->idx, edesc->data);
2215 if (ret < 0)
2216 return (EINVAL);
2217 edesc->size = ret;
2218 break;
2219 }
2220 case CHELSIO_SET_QSET_PARAMS: {
2221 struct qset_params *q;
2222 struct ch_qset_params *t = (struct ch_qset_params *)data;
2329 break;
2330 }
2331 case CHELSIO_GET_SGE_DESC: {
2332 struct ch_desc *edesc = (struct ch_desc *)data;
2333 int ret;
2334 if (edesc->queue_num >= SGE_QSETS * 6)
2335 return (EINVAL);
2336 ret = t3_get_desc(&sc->sge.qs[edesc->queue_num / 6],
2337 edesc->queue_num % 6, edesc->idx, edesc->data);
2338 if (ret < 0)
2339 return (EINVAL);
2340 edesc->size = ret;
2341 break;
2342 }
2343 case CHELSIO_SET_QSET_PARAMS: {
2344 struct qset_params *q;
2345 struct ch_qset_params *t = (struct ch_qset_params *)data;
2223
2346 int i;
2347
2224 if (t->qset_idx >= SGE_QSETS)
2225 return (EINVAL);
2226 if (!in_range(t->intr_lat, 0, M_NEWTIMER) ||
2227 !in_range(t->cong_thres, 0, 255) ||
2228 !in_range(t->txq_size[0], MIN_TXQ_ENTRIES,
2229 MAX_TXQ_ENTRIES) ||
2230 !in_range(t->txq_size[1], MIN_TXQ_ENTRIES,
2231 MAX_TXQ_ENTRIES) ||
2232 !in_range(t->txq_size[2], MIN_CTRL_TXQ_ENTRIES,
2233 MAX_CTRL_TXQ_ENTRIES) ||
2234 !in_range(t->fl_size[0], MIN_FL_ENTRIES, MAX_RX_BUFFERS) ||
2235 !in_range(t->fl_size[1], MIN_FL_ENTRIES,
2236 MAX_RX_JUMBO_BUFFERS) ||
2237 !in_range(t->rspq_size, MIN_RSPQ_ENTRIES, MAX_RSPQ_ENTRIES))
2238 return (EINVAL);
2348 if (t->qset_idx >= SGE_QSETS)
2349 return (EINVAL);
2350 if (!in_range(t->intr_lat, 0, M_NEWTIMER) ||
2351 !in_range(t->cong_thres, 0, 255) ||
2352 !in_range(t->txq_size[0], MIN_TXQ_ENTRIES,
2353 MAX_TXQ_ENTRIES) ||
2354 !in_range(t->txq_size[1], MIN_TXQ_ENTRIES,
2355 MAX_TXQ_ENTRIES) ||
2356 !in_range(t->txq_size[2], MIN_CTRL_TXQ_ENTRIES,
2357 MAX_CTRL_TXQ_ENTRIES) ||
2358 !in_range(t->fl_size[0], MIN_FL_ENTRIES, MAX_RX_BUFFERS) ||
2359 !in_range(t->fl_size[1], MIN_FL_ENTRIES,
2360 MAX_RX_JUMBO_BUFFERS) ||
2361 !in_range(t->rspq_size, MIN_RSPQ_ENTRIES, MAX_RSPQ_ENTRIES))
2362 return (EINVAL);
2363
2364 if ((sc->flags & FULL_INIT_DONE) && t->lro > 0)
2365 for_each_port(sc, i) {
2366 pi = adap2pinfo(sc, i);
2367 if (t->qset_idx >= pi->first_qset &&
2368 t->qset_idx < pi->first_qset + pi->nqsets
2369#if 0
2370 && !pi->rx_csum_offload
2371#endif
2372 )
2373 return -EINVAL;
2374 }
2239 if ((sc->flags & FULL_INIT_DONE) &&
2240 (t->rspq_size >= 0 || t->fl_size[0] >= 0 ||
2241 t->fl_size[1] >= 0 || t->txq_size[0] >= 0 ||
2242 t->txq_size[1] >= 0 || t->txq_size[2] >= 0 ||
2243 t->polling >= 0 || t->cong_thres >= 0))
2244 return (EBUSY);
2245
2246 q = &sc->params.sge.qset[t->qset_idx];

--- 300 unchanged lines hidden ---
2375 if ((sc->flags & FULL_INIT_DONE) &&
2376 (t->rspq_size >= 0 || t->fl_size[0] >= 0 ||
2377 t->fl_size[1] >= 0 || t->txq_size[0] >= 0 ||
2378 t->txq_size[1] >= 0 || t->txq_size[2] >= 0 ||
2379 t->polling >= 0 || t->cong_thres >= 0))
2380 return (EBUSY);
2381
2382 q = &sc->params.sge.qset[t->qset_idx];

--- 300 unchanged lines hidden ---