Deleted Added
full compact
cxgb_main.c (170197) cxgb_main.c (170654)
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 170197 2007-06-02 03:02:36Z kmacy $");
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_main.c 170654 2007-06-13 05:36:00Z 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>

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

78#include <dev/cxgb/cxgb_include.h>
79#endif
80
81#ifdef PRIV_SUPPORTED
82#include <sys/priv.h>
83#endif
84
85static int cxgb_setup_msix(adapter_t *, int);
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>

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

78#include <dev/cxgb/cxgb_include.h>
79#endif
80
81#ifdef PRIV_SUPPORTED
82#include <sys/priv.h>
83#endif
84
85static int cxgb_setup_msix(adapter_t *, int);
86static void cxgb_teardown_msix(adapter_t *);
86static void cxgb_init(void *);
87static void cxgb_init_locked(struct port_info *);
88static void cxgb_stop_locked(struct port_info *);
89static void cxgb_set_rxmode(struct port_info *);
90static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t);
91static void cxgb_start(struct ifnet *);
92static void cxgb_start_proc(void *, int ncount);
93static int cxgb_media_change(struct ifnet *);

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

153
154static driver_t cxgb_port_driver = {
155 "cxgb",
156 cxgb_port_methods,
157 0
158};
159
160static d_ioctl_t cxgb_extension_ioctl;
87static void cxgb_init(void *);
88static void cxgb_init_locked(struct port_info *);
89static void cxgb_stop_locked(struct port_info *);
90static void cxgb_set_rxmode(struct port_info *);
91static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t);
92static void cxgb_start(struct ifnet *);
93static void cxgb_start_proc(void *, int ncount);
94static int cxgb_media_change(struct ifnet *);

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

154
155static driver_t cxgb_port_driver = {
156 "cxgb",
157 cxgb_port_methods,
158 0
159};
160
161static d_ioctl_t cxgb_extension_ioctl;
162static d_open_t cxgb_extension_open;
163static d_close_t cxgb_extension_close;
161
164
165static struct cdevsw cxgb_cdevsw = {
166 .d_version = D_VERSION,
167 .d_flags = 0,
168 .d_open = cxgb_extension_open,
169 .d_close = cxgb_extension_close,
170 .d_ioctl = cxgb_extension_ioctl,
171 .d_name = "cxgb",
172};
173
162static devclass_t cxgb_port_devclass;
163DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
164
165#define SGE_MSIX_COUNT (SGE_QSETS + 1)
166
167extern int collapse_mbufs;
168/*
169 * The driver uses the best interrupt scheme available on a platform in the

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

225 {PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"},
226 {PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"},
227 {PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"},
228 {PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"},
229 {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"},
230 {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
231 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
232 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
174static devclass_t cxgb_port_devclass;
175DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
176
177#define SGE_MSIX_COUNT (SGE_QSETS + 1)
178
179extern int collapse_mbufs;
180/*
181 * The driver uses the best interrupt scheme available on a platform in the

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

237 {PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"},
238 {PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"},
239 {PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"},
240 {PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"},
241 {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"},
242 {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
243 {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
244 {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
245 {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
233 {0, 0, 0, NULL}
234};
235
236static struct cxgb_ident *
237cxgb_get_ident(device_t dev)
238{
239 struct cxgb_ident *id;
240

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

262 return (ai);
263}
264
265static int
266cxgb_controller_probe(device_t dev)
267{
268 const struct adapter_info *ai;
269 char *ports, buf[80];
246 {0, 0, 0, NULL}
247};
248
249static struct cxgb_ident *
250cxgb_get_ident(device_t dev)
251{
252 struct cxgb_ident *id;
253

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

275 return (ai);
276}
277
278static int
279cxgb_controller_probe(device_t dev)
280{
281 const struct adapter_info *ai;
282 char *ports, buf[80];
270
283 int nports;
284
271 ai = cxgb_get_adapter_info(dev);
272 if (ai == NULL)
273 return (ENXIO);
274
285 ai = cxgb_get_adapter_info(dev);
286 if (ai == NULL)
287 return (ENXIO);
288
275 if (ai->nports == 1)
289 nports = ai->nports0 + ai->nports1;
290 if (nports == 1)
276 ports = "port";
277 else
278 ports = "ports";
279
291 ports = "port";
292 else
293 ports = "ports";
294
280 snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, ai->nports, ports);
295 snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, nports, ports);
281 device_set_desc_copy(dev, buf);
282 return (BUS_PROBE_DEFAULT);
283}
284
285static int
286upgrade_fw(adapter_t *sc)
287{
288 char buf[32];

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

336 }
337 if (sc->link_width != 0 && sc->link_width <= 4) {
338 device_printf(sc->dev,
339 "PCIe x%d Link, expect reduced performance\n",
340 sc->link_width);
341 }
342
343 pci_enable_busmaster(dev);
296 device_set_desc_copy(dev, buf);
297 return (BUS_PROBE_DEFAULT);
298}
299
300static int
301upgrade_fw(adapter_t *sc)
302{
303 char buf[32];

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

351 }
352 if (sc->link_width != 0 && sc->link_width <= 4) {
353 device_printf(sc->dev,
354 "PCIe x%d Link, expect reduced performance\n",
355 sc->link_width);
356 }
357
358 pci_enable_busmaster(dev);
344
345 /*
346 * Allocate the registers and make them available to the driver.
347 * The registers that we care about for NIC mode are in BAR 0
348 */
349 sc->regs_rid = PCIR_BAR(0);
350 if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
351 &sc->regs_rid, RF_ACTIVE)) == NULL) {
352 device_printf(dev, "Cannot allocate BAR\n");
353 return (ENXIO);
354 }
355
356 mtx_init(&sc->sge.reg_lock, "SGE reg lock", NULL, MTX_DEF);
357 mtx_init(&sc->lock, "cxgb controller lock", NULL, MTX_DEF);
358 mtx_init(&sc->mdio_lock, "cxgb mdio", NULL, MTX_DEF);
359 /*
360 * Allocate the registers and make them available to the driver.
361 * The registers that we care about for NIC mode are in BAR 0
362 */
363 sc->regs_rid = PCIR_BAR(0);
364 if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
365 &sc->regs_rid, RF_ACTIVE)) == NULL) {
366 device_printf(dev, "Cannot allocate BAR\n");
367 return (ENXIO);
368 }
369
370 mtx_init(&sc->sge.reg_lock, "SGE reg lock", NULL, MTX_DEF);
371 mtx_init(&sc->lock, "cxgb controller lock", NULL, MTX_DEF);
372 mtx_init(&sc->mdio_lock, "cxgb mdio", NULL, MTX_DEF);
373 mtx_init(&sc->elmer_lock, "cxgb elmer", NULL, MTX_DEF);
359
360 sc->bt = rman_get_bustag(sc->regs_res);
361 sc->bh = rman_get_bushandle(sc->regs_res);
362 sc->mmio_len = rman_get_size(sc->regs_res);
363
364 ai = cxgb_get_adapter_info(dev);
365 if (t3_prep_adapter(sc, ai, 1) < 0) {
374
375 sc->bt = rman_get_bustag(sc->regs_res);
376 sc->bh = rman_get_bushandle(sc->regs_res);
377 sc->mmio_len = rman_get_size(sc->regs_res);
378
379 ai = cxgb_get_adapter_info(dev);
380 if (t3_prep_adapter(sc, ai, 1) < 0) {
381 printf("prep adapter failed\n");
366 error = ENODEV;
367 goto out;
368 }
382 error = ENODEV;
383 goto out;
384 }
369
370 /* Allocate the BAR for doing MSI-X. If it succeeds, try to allocate
371 * enough messages for the queue sets. If that fails, try falling
372 * back to MSI. If that fails, then try falling back to the legacy
373 * interrupt pin model.
374 */
375#ifdef MSI_SUPPORTED
376
377 sc->msix_regs_rid = 0x20;

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

473 goto out;
474
475 /*
476 * XXX need to poll for link status
477 */
478 sc->params.stats_update_period = 1;
479
480 /* initialize sge private state */
385 /* Allocate the BAR for doing MSI-X. If it succeeds, try to allocate
386 * enough messages for the queue sets. If that fails, try falling
387 * back to MSI. If that fails, then try falling back to the legacy
388 * interrupt pin model.
389 */
390#ifdef MSI_SUPPORTED
391
392 sc->msix_regs_rid = 0x20;

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

488 goto out;
489
490 /*
491 * XXX need to poll for link status
492 */
493 sc->params.stats_update_period = 1;
494
495 /* initialize sge private state */
481 t3_sge_init_sw(sc);
496 t3_sge_init_adapter(sc);
482
483 t3_led_ready(sc);
484
485 cxgb_offload_init();
486 if (is_offload(sc)) {
487 setbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT);
488 cxgb_adapter_ofld(sc);
489 }

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

549 }
550
551 for (i = 0; i < (sc)->params.nports; ++i) {
552 if (sc->portdev[i] != NULL)
553 device_delete_child(sc->dev, sc->portdev[i]);
554 }
555
556 bus_generic_detach(sc->dev);
497
498 t3_led_ready(sc);
499
500 cxgb_offload_init();
501 if (is_offload(sc)) {
502 setbit(&sc->registered_device_map, OFFLOAD_DEVMAP_BIT);
503 cxgb_adapter_ofld(sc);
504 }

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

564 }
565
566 for (i = 0; i < (sc)->params.nports; ++i) {
567 if (sc->portdev[i] != NULL)
568 device_delete_child(sc->dev, sc->portdev[i]);
569 }
570
571 bus_generic_detach(sc->dev);
557
572#ifdef notyet
558 if (is_offload(sc)) {
559 cxgb_adapter_unofld(sc);
560 if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT))
561 offload_close(&sc->tdev);
562 }
573 if (is_offload(sc)) {
574 cxgb_adapter_unofld(sc);
575 if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT))
576 offload_close(&sc->tdev);
577 }
578#endif
563 t3_free_sge_resources(sc);
564 t3_sge_free(sc);
565
566 if (sc->regs_res != NULL)
567 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
568 sc->regs_res);
569
570 mtx_destroy(&sc->mdio_lock);

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

611 return (err);
612 }
613 }
614 }
615
616 return (0);
617}
618
579 t3_free_sge_resources(sc);
580 t3_sge_free(sc);
581
582 if (sc->regs_res != NULL)
583 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
584 sc->regs_res);
585
586 mtx_destroy(&sc->mdio_lock);

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

627 return (err);
628 }
629 }
630 }
631
632 return (0);
633}
634
635static void
636cxgb_teardown_msix(adapter_t *sc)
637{
638 int i, nqsets;
639
640 for (nqsets = i = 0; i < (sc)->params.nports; i++)
641 nqsets += sc->port[i].nqsets;
642
643 for (i = 0; i < nqsets; i++) {
644 if (sc->msix_intr_tag[i] != NULL) {
645 bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
646 sc->msix_intr_tag[i]);
647 sc->msix_intr_tag[i] = NULL;
648 }
649 if (sc->msix_irq_res[i] != NULL) {
650 bus_release_resource(sc->dev, SYS_RES_IRQ,
651 sc->msix_irq_rid[i], sc->msix_irq_res[i]);
652 sc->msix_irq_res[i] = NULL;
653 }
654 }
655}
656
619static int
620cxgb_setup_msix(adapter_t *sc, int msix_count)
621{
622 int i, j, k, nqsets, rid;
623
624 /* The first message indicates link changes and error conditions */
625 sc->irq_rid = 1;
626 if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ,

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

632 if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET,
633#ifdef INTR_FILTERS
634 NULL,
635#endif
636 cxgb_async_intr, sc, &sc->intr_tag)) {
637 device_printf(sc->dev, "Cannot set up interrupt\n");
638 return (EINVAL);
639 }
657static int
658cxgb_setup_msix(adapter_t *sc, int msix_count)
659{
660 int i, j, k, nqsets, rid;
661
662 /* The first message indicates link changes and error conditions */
663 sc->irq_rid = 1;
664 if ((sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ,

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

670 if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET,
671#ifdef INTR_FILTERS
672 NULL,
673#endif
674 cxgb_async_intr, sc, &sc->intr_tag)) {
675 device_printf(sc->dev, "Cannot set up interrupt\n");
676 return (EINVAL);
677 }
640 for (i = 0, k = 0; i < (sc)->params.nports; ++i) {
678 for (i = k = 0; i < (sc)->params.nports; i++) {
641 nqsets = sc->port[i].nqsets;
679 nqsets = sc->port[i].nqsets;
642 for (j = 0; j < nqsets; ++j, k++) {
680 for (j = 0; j < nqsets; j++, k++) {
643 struct sge_qset *qs = &sc->sge.qs[k];
644
645 rid = k + 2;
646 if (cxgb_debug)
647 printf("rid=%d ", rid);
648 if ((sc->msix_irq_res[k] = bus_alloc_resource_any(
649 sc->dev, SYS_RES_IRQ, &rid,
650 RF_SHAREABLE | RF_ACTIVE)) == NULL) {
651 device_printf(sc->dev, "Cannot allocate "
652 "interrupt for message %d\n", rid);
653 return (EINVAL);
654 }
655 sc->msix_irq_rid[k] = rid;
681 struct sge_qset *qs = &sc->sge.qs[k];
682
683 rid = k + 2;
684 if (cxgb_debug)
685 printf("rid=%d ", rid);
686 if ((sc->msix_irq_res[k] = bus_alloc_resource_any(
687 sc->dev, SYS_RES_IRQ, &rid,
688 RF_SHAREABLE | RF_ACTIVE)) == NULL) {
689 device_printf(sc->dev, "Cannot allocate "
690 "interrupt for message %d\n", rid);
691 return (EINVAL);
692 }
693 sc->msix_irq_rid[k] = rid;
656 if (bus_setup_intr(sc->dev, sc->msix_irq_res[j],
694 if (bus_setup_intr(sc->dev, sc->msix_irq_res[k],
657 INTR_MPSAFE|INTR_TYPE_NET,
658#ifdef INTR_FILTERS
659 NULL,
660#endif
661 t3_intr_msix, qs, &sc->msix_intr_tag[k])) {
662 device_printf(sc->dev, "Cannot set up "
663 "interrupt for message %d\n", rid);
664 return (EINVAL);

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

682 device_set_desc_copy(dev, buf);
683 return (0);
684}
685
686
687static int
688cxgb_makedev(struct port_info *pi)
689{
695 INTR_MPSAFE|INTR_TYPE_NET,
696#ifdef INTR_FILTERS
697 NULL,
698#endif
699 t3_intr_msix, qs, &sc->msix_intr_tag[k])) {
700 device_printf(sc->dev, "Cannot set up "
701 "interrupt for message %d\n", rid);
702 return (EINVAL);

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

720 device_set_desc_copy(dev, buf);
721 return (0);
722}
723
724
725static int
726cxgb_makedev(struct port_info *pi)
727{
690 struct cdevsw *cxgb_cdevsw;
691
692 if ((cxgb_cdevsw = malloc(sizeof(struct cdevsw), M_DEVBUF, M_NOWAIT|M_ZERO)) == NULL)
693 return (ENOMEM);
694
728
695 cxgb_cdevsw->d_version = D_VERSION;
696 cxgb_cdevsw->d_name = strdup(pi->ifp->if_xname, M_DEVBUF);
697 cxgb_cdevsw->d_ioctl = cxgb_extension_ioctl;
729 pi->port_cdev = make_dev(&cxgb_cdevsw, pi->ifp->if_dunit,
730 UID_ROOT, GID_WHEEL, 0600, if_name(pi->ifp));
698
731
699 pi->port_cdev = make_dev(cxgb_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
700 pi->ifp->if_xname);
701
702 if (pi->port_cdev == NULL)
703 return (ENOMEM);
704
705 pi->port_cdev->si_drv1 = (void *)pi;
706
707 return (0);
708}
709

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

721#endif
722
723
724static int
725cxgb_port_attach(device_t dev)
726{
727 struct port_info *p;
728 struct ifnet *ifp;
732 if (pi->port_cdev == NULL)
733 return (ENOMEM);
734
735 pi->port_cdev->si_drv1 = (void *)pi;
736
737 return (0);
738}
739

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

751#endif
752
753
754static int
755cxgb_port_attach(device_t dev)
756{
757 struct port_info *p;
758 struct ifnet *ifp;
729 int media_flags;
730 int err;
759 int err, media_flags;
731 char buf[64];
732
733 p = device_get_softc(dev);
734
735 snprintf(buf, sizeof(buf), "cxgb port %d", p->port);
736 mtx_init(&p->lock, buf, 0, MTX_DEF);
737
738 /* Allocate an ifnet object and set it up */

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

757 ifp->if_snd.ifq_drv_maxlen = TX_ETH_Q_SIZE;
758 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
759 IFQ_SET_READY(&ifp->if_snd);
760
761 ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0;
762 ifp->if_capabilities |= CXGB_CAP;
763 ifp->if_capenable |= CXGB_CAP_ENABLE;
764 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO);
760 char buf[64];
761
762 p = device_get_softc(dev);
763
764 snprintf(buf, sizeof(buf), "cxgb port %d", p->port);
765 mtx_init(&p->lock, buf, 0, MTX_DEF);
766
767 /* Allocate an ifnet object and set it up */

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

786 ifp->if_snd.ifq_drv_maxlen = TX_ETH_Q_SIZE;
787 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
788 IFQ_SET_READY(&ifp->if_snd);
789
790 ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0;
791 ifp->if_capabilities |= CXGB_CAP;
792 ifp->if_capenable |= CXGB_CAP_ENABLE;
793 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO);
765 ifp->if_baudrate = 100000000;
766
767 ether_ifattach(ifp, p->hw_addr);
768#ifdef DEFAULT_JUMBO
769 ifp->if_mtu = 9000;
770#endif
771 if ((err = cxgb_makedev(p)) != 0) {
772 printf("makedev failed %d\n", err);
773 return (err);
774 }
775 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
776 cxgb_media_status);
794
795 ether_ifattach(ifp, p->hw_addr);
796#ifdef DEFAULT_JUMBO
797 ifp->if_mtu = 9000;
798#endif
799 if ((err = cxgb_makedev(p)) != 0) {
800 printf("makedev failed %d\n", err);
801 return (err);
802 }
803 ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
804 cxgb_media_status);
777
778 if (!strcmp(p->port_type->desc, "10GBASE-CX4"))
779 media_flags = IFM_ETHER | IFM_10G_CX4;
780 else if (!strcmp(p->port_type->desc, "10GBASE-SR"))
781 media_flags = IFM_ETHER | IFM_10G_SR;
782 else if (!strcmp(p->port_type->desc, "10GBASE-XR"))
783 media_flags = IFM_ETHER | IFM_10G_LR;
784 else {
805
806 if (!strcmp(p->port_type->desc, "10GBASE-CX4")) {
807 media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX;
808 } else if (!strcmp(p->port_type->desc, "10GBASE-SR")) {
809 media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX;
810 } else if (!strcmp(p->port_type->desc, "10GBASE-XR")) {
811 media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX;
812 } else if (!strcmp(p->port_type->desc, "10/100/1000BASE-T")) {
813 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL);
814 ifmedia_add(&p->media, IFM_ETHER | IFM_10_T | IFM_FDX,
815 0, NULL);
816 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX,
817 0, NULL);
818 ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
819 0, NULL);
820 ifmedia_add(&p->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
821 0, NULL);
822 media_flags = 0;
823 } else {
785 printf("unsupported media type %s\n", p->port_type->desc);
786 return (ENXIO);
787 }
824 printf("unsupported media type %s\n", p->port_type->desc);
825 return (ENXIO);
826 }
788
789 ifmedia_add(&p->media, media_flags, 0, NULL);
790 ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
791 ifmedia_set(&p->media, media_flags);
827 if (media_flags) {
828 ifmedia_add(&p->media, media_flags, 0, NULL);
829 ifmedia_set(&p->media, media_flags);
830 } else {
831 ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
832 ifmedia_set(&p->media, IFM_ETHER | IFM_AUTO);
833 }
792
834
835
793 snprintf(buf, sizeof(buf), "cxgb_port_taskq%d", p->port);
794#ifdef TASKQUEUE_CURRENT
795 /* Create a port for handling TX without starvation */
796 p->tq = taskqueue_create(buf, M_NOWAIT,
797 taskqueue_thread_enqueue, &p->tq);
798#else
799 /* Create a port for handling TX without starvation */
800 p->tq = taskqueue_create_fast(buf, M_NOWAIT,
801 taskqueue_thread_enqueue, &p->tq);
802#endif
836 snprintf(buf, sizeof(buf), "cxgb_port_taskq%d", p->port);
837#ifdef TASKQUEUE_CURRENT
838 /* Create a port for handling TX without starvation */
839 p->tq = taskqueue_create(buf, M_NOWAIT,
840 taskqueue_thread_enqueue, &p->tq);
841#else
842 /* Create a port for handling TX without starvation */
843 p->tq = taskqueue_create_fast(buf, M_NOWAIT,
844 taskqueue_thread_enqueue, &p->tq);
845#endif
803
804
846
805 if (p->tq == NULL) {
806 device_printf(dev, "failed to allocate port task queue\n");
807 return (ENOMEM);
808 }
809 taskqueue_start_threads(&p->tq, 1, PI_NET, "%s taskq",
810 device_get_nameunit(dev));
811 TASK_INIT(&p->start_task, 0, cxgb_start_proc, ifp);
812
847 if (p->tq == NULL) {
848 device_printf(dev, "failed to allocate port task queue\n");
849 return (ENOMEM);
850 }
851 taskqueue_start_threads(&p->tq, 1, PI_NET, "%s taskq",
852 device_get_nameunit(dev));
853 TASK_INIT(&p->start_task, 0, cxgb_start_proc, ifp);
854
813
855 t3_sge_init_port(p);
856
814 return (0);
815}
816
817static int
818cxgb_port_detach(device_t dev)
819{
820 struct port_info *p;
821
822 p = device_get_softc(dev);
823
824 PORT_LOCK(p);
857 return (0);
858}
859
860static int
861cxgb_port_detach(device_t dev)
862{
863 struct port_info *p;
864
865 p = device_get_softc(dev);
866
867 PORT_LOCK(p);
825 cxgb_stop_locked(p);
868 if (p->ifp->if_drv_flags & IFF_DRV_RUNNING)
869 cxgb_stop_locked(p);
826 PORT_UNLOCK(p);
827
828 mtx_destroy(&p->lock);
829 if (p->tq != NULL) {
830 taskqueue_drain(p->tq, &p->start_task);
831 taskqueue_free(p->tq);
832 p->tq = NULL;
833 }
834
835 ether_ifdetach(p->ifp);
836 if_free(p->ifp);
837
870 PORT_UNLOCK(p);
871
872 mtx_destroy(&p->lock);
873 if (p->tq != NULL) {
874 taskqueue_drain(p->tq, &p->start_task);
875 taskqueue_free(p->tq);
876 p->tq = NULL;
877 }
878
879 ether_ifdetach(p->ifp);
880 if_free(p->ifp);
881
838 destroy_dev(p->port_cdev);
839
840
882 if (p->port_cdev != NULL)
883 destroy_dev(p->port_cdev);
884
841 return (0);
842}
843
844void
845t3_fatal_err(struct adapter *sc)
846{
847 u_int fw_status[4];
848

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

1002 struct ifnet *ifp;
1003 struct t3_rx_mode rm;
1004 struct cmac *mac = &p->mac;
1005
1006 ifp = p->ifp;
1007
1008 t3_init_rx_mode(&rm, p);
1009 t3_mac_reset(mac);
885 return (0);
886}
887
888void
889t3_fatal_err(struct adapter *sc)
890{
891 u_int fw_status[4];
892

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

1046 struct ifnet *ifp;
1047 struct t3_rx_mode rm;
1048 struct cmac *mac = &p->mac;
1049
1050 ifp = p->ifp;
1051
1052 t3_init_rx_mode(&rm, p);
1053 t3_mac_reset(mac);
1010 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN);
1054 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
1011 t3_mac_set_address(mac, 0, p->hw_addr);
1012 t3_mac_set_rx_mode(mac, &rm);
1013 t3_link_start(&p->phy, mac, &p->link_config);
1014 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1015}
1016
1017/**
1018 * setup_rss - configure Receive Side Steering (per-queue connection demux)

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

1055static inline int
1056offload_tx(struct toedev *tdev, struct mbuf *m)
1057{
1058 int ret;
1059
1060 critical_enter();
1061 ret = t3_offload_tx(tdev, m);
1062 critical_exit();
1055 t3_mac_set_address(mac, 0, p->hw_addr);
1056 t3_mac_set_rx_mode(mac, &rm);
1057 t3_link_start(&p->phy, mac, &p->link_config);
1058 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1059}
1060
1061/**
1062 * setup_rss - configure Receive Side Steering (per-queue connection demux)

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

1099static inline int
1100offload_tx(struct toedev *tdev, struct mbuf *m)
1101{
1102 int ret;
1103
1104 critical_enter();
1105 ret = t3_offload_tx(tdev, m);
1106 critical_exit();
1063 return ret;
1107 return (ret);
1064}
1065
1066static int
1067write_smt_entry(struct adapter *adapter, int idx)
1068{
1069 struct port_info *pi = &adapter->port[idx];
1070 struct cpl_smt_write_req *req;
1071 struct mbuf *m;

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

1130 }
1131}
1132
1133static void
1134bind_qsets(adapter_t *sc)
1135{
1136 int i, j;
1137
1108}
1109
1110static int
1111write_smt_entry(struct adapter *adapter, int idx)
1112{
1113 struct port_info *pi = &adapter->port[idx];
1114 struct cpl_smt_write_req *req;
1115 struct mbuf *m;

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

1174 }
1175}
1176
1177static void
1178bind_qsets(adapter_t *sc)
1179{
1180 int i, j;
1181
1138 if (singleq)
1139 return;
1140
1141 for (i = 0; i < (sc)->params.nports; ++i) {
1142 const struct port_info *pi = adap2pinfo(sc, i);
1143
1144 for (j = 0; j < pi->nqsets; ++j)
1145 send_pktsched_cmd(sc, 1, pi->first_qset + j, -1,
1146 -1, i);
1147 }
1148}

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

1224
1225/*
1226 * Release resources when all the ports and offloading have been stopped.
1227 */
1228static void
1229cxgb_down(struct adapter *sc)
1230{
1231 int i;
1182 for (i = 0; i < (sc)->params.nports; ++i) {
1183 const struct port_info *pi = adap2pinfo(sc, i);
1184
1185 for (j = 0; j < pi->nqsets; ++j)
1186 send_pktsched_cmd(sc, 1, pi->first_qset + j, -1,
1187 -1, i);
1188 }
1189}

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

1265
1266/*
1267 * Release resources when all the ports and offloading have been stopped.
1268 */
1269static void
1270cxgb_down(struct adapter *sc)
1271{
1272 int i;
1232
1273
1233 t3_sge_stop(sc);
1274 t3_sge_stop(sc);
1275 ADAPTER_LOCK(sc);
1234 t3_intr_disable(sc);
1276 t3_intr_disable(sc);
1277 ADAPTER_UNLOCK(sc);
1235
1278
1236 for (i = 0; i < SGE_QSETS; i++) {
1237 if (sc->msix_intr_tag[i] != NULL) {
1238 bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
1239 sc->msix_intr_tag[i]);
1240 sc->msix_intr_tag[i] = NULL;
1241 }
1242 if (sc->msix_irq_res[i] != NULL) {
1243 bus_release_resource(sc->dev, SYS_RES_IRQ,
1244 sc->msix_irq_rid[i], sc->msix_irq_res[i]);
1245 sc->msix_irq_res[i] = NULL;
1246 }
1247 }
1248
1279
1249 if (sc->intr_tag != NULL) {
1250 bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
1251 sc->intr_tag = NULL;
1252 }
1253 if (sc->irq_res != NULL) {
1254 device_printf(sc->dev, "de-allocating interrupt irq_rid=%d irq_res=%p\n",
1255 sc->irq_rid, sc->irq_res);
1256 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
1257 sc->irq_res);
1258 sc->irq_res = NULL;
1259 }
1280 if (sc->intr_tag != NULL) {
1281 bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
1282 sc->intr_tag = NULL;
1283 }
1284 if (sc->irq_res != NULL) {
1285 device_printf(sc->dev, "de-allocating interrupt irq_rid=%d irq_res=%p\n",
1286 sc->irq_rid, sc->irq_res);
1287 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
1288 sc->irq_res);
1289 sc->irq_res = NULL;
1290 }
1291
1292 if (sc->flags & USING_MSIX)
1293 cxgb_teardown_msix(sc);
1260
1261 callout_drain(&sc->sge_timer_ch);
1294
1295 callout_drain(&sc->sge_timer_ch);
1262 taskqueue_drain(sc->tq, &sc->slow_intr_task);
1263 taskqueue_drain(sc->tq, &sc->timer_reclaim_task);
1296 if (sc->tq != NULL)
1297 taskqueue_drain(sc->tq, &sc->slow_intr_task);
1298 for (i = 0; i < sc->params.nports; i++)
1299 if (sc->port[i].tq != NULL)
1300 taskqueue_drain(sc->port[i].tq, &sc->port[i].timer_reclaim_task);
1301
1264}
1265
1266static int
1267offload_open(struct port_info *pi)
1268{
1269 struct adapter *adapter = pi->adapter;
1270 struct toedev *tdev = TOEDEV(pi->ifp);
1271 int adap_up = adapter->open_device_map & PORT_MASK;

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

1310}
1311
1312static int
1313offload_close(struct toedev *tdev)
1314{
1315 struct adapter *adapter = tdev2adap(tdev);
1316
1317 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1302}
1303
1304static int
1305offload_open(struct port_info *pi)
1306{
1307 struct adapter *adapter = pi->adapter;
1308 struct toedev *tdev = TOEDEV(pi->ifp);
1309 int adap_up = adapter->open_device_map & PORT_MASK;

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

1348}
1349
1350static int
1351offload_close(struct toedev *tdev)
1352{
1353 struct adapter *adapter = tdev2adap(tdev);
1354
1355 if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
1318 return 0;
1356 return (0);
1319
1320 /* Call back all registered clients */
1321 cxgb_remove_clients(tdev);
1322 tdev->lldev = NULL;
1323 cxgb_set_dummy_ops(tdev);
1324 t3_tp_set_offload_mode(adapter, 0);
1325 clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
1326
1327 ADAPTER_LOCK(adapter);
1328 if (!adapter->open_device_map)
1329 cxgb_down(adapter);
1330 ADAPTER_UNLOCK(adapter);
1331
1332 cxgb_offload_deactivate(adapter);
1357
1358 /* Call back all registered clients */
1359 cxgb_remove_clients(tdev);
1360 tdev->lldev = NULL;
1361 cxgb_set_dummy_ops(tdev);
1362 t3_tp_set_offload_mode(adapter, 0);
1363 clrbit(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
1364
1365 ADAPTER_LOCK(adapter);
1366 if (!adapter->open_device_map)
1367 cxgb_down(adapter);
1368 ADAPTER_UNLOCK(adapter);
1369
1370 cxgb_offload_deactivate(adapter);
1333 return 0;
1371 return (0);
1334}
1335
1336static void
1337cxgb_init(void *arg)
1338{
1339 struct port_info *p = arg;
1340
1341 PORT_LOCK(p);

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

1358 ADAPTER_UNLOCK(p->adapter);
1359 cxgb_stop_locked(p);
1360 return;
1361 }
1362 if (p->adapter->open_device_map == 0)
1363 t3_intr_clear(sc);
1364
1365 setbit(&p->adapter->open_device_map, p->port);
1372}
1373
1374static void
1375cxgb_init(void *arg)
1376{
1377 struct port_info *p = arg;
1378
1379 PORT_LOCK(p);

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

1396 ADAPTER_UNLOCK(p->adapter);
1397 cxgb_stop_locked(p);
1398 return;
1399 }
1400 if (p->adapter->open_device_map == 0)
1401 t3_intr_clear(sc);
1402
1403 setbit(&p->adapter->open_device_map, p->port);
1366
1367 ADAPTER_UNLOCK(p->adapter);
1404 ADAPTER_UNLOCK(p->adapter);
1405
1368 if (is_offload(sc) && !ofld_disable) {
1369 err = offload_open(p);
1370 if (err)
1371 log(LOG_WARNING,
1372 "Could not initialize offload capabilities\n");
1373 }
1374 cxgb_link_start(p);
1406 if (is_offload(sc) && !ofld_disable) {
1407 err = offload_open(p);
1408 if (err)
1409 log(LOG_WARNING,
1410 "Could not initialize offload capabilities\n");
1411 }
1412 cxgb_link_start(p);
1413 t3_link_changed(sc, p->port);
1414 ifp->if_baudrate = p->link_config.speed * 1000000;
1415
1375 t3_port_intr_enable(sc, p->port);
1376
1377 callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
1378 cxgb_tick, sc);
1379
1380 ifp->if_drv_flags |= IFF_DRV_RUNNING;
1381 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1382}
1383
1384static void
1385cxgb_set_rxmode(struct port_info *p)
1386{
1387 struct t3_rx_mode rm;
1388 struct cmac *mac = &p->mac;
1389
1390 mtx_assert(&p->lock, MA_OWNED);
1416 t3_port_intr_enable(sc, p->port);
1417
1418 callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
1419 cxgb_tick, sc);
1420
1421 ifp->if_drv_flags |= IFF_DRV_RUNNING;
1422 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1423}
1424
1425static void
1426cxgb_set_rxmode(struct port_info *p)
1427{
1428 struct t3_rx_mode rm;
1429 struct cmac *mac = &p->mac;
1430
1431 mtx_assert(&p->lock, MA_OWNED);
1391
1432
1392 t3_init_rx_mode(&rm, p);
1393 t3_mac_set_rx_mode(mac, &rm);
1394}
1395
1396static void
1397cxgb_stop_locked(struct port_info *p)
1398{
1399 struct ifnet *ifp;
1400
1401 mtx_assert(&p->lock, MA_OWNED);
1402 mtx_assert(&p->adapter->lock, MA_NOTOWNED);
1433 t3_init_rx_mode(&rm, p);
1434 t3_mac_set_rx_mode(mac, &rm);
1435}
1436
1437static void
1438cxgb_stop_locked(struct port_info *p)
1439{
1440 struct ifnet *ifp;
1441
1442 mtx_assert(&p->lock, MA_OWNED);
1443 mtx_assert(&p->adapter->lock, MA_NOTOWNED);
1403
1444
1404 ifp = p->ifp;
1405
1406 t3_port_intr_disable(p->adapter, p->port);
1445 ifp = p->ifp;
1446
1447 t3_port_intr_disable(p->adapter, p->port);
1407 PORT_LOCK(p);
1408 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1448 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1409 PORT_UNLOCK(p);
1410 p->phy.ops->power_down(&p->phy, 1);
1411 t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
1412
1413 ADAPTER_LOCK(p->adapter);
1414 clrbit(&p->adapter->open_device_map, p->port);
1415 /*
1416 * XXX cancel check_task
1417 */
1418 if (p->adapter->open_device_map == 0)
1419 cxgb_down(p->adapter);
1420 ADAPTER_UNLOCK(p->adapter);
1421}
1422
1423static int
1449 p->phy.ops->power_down(&p->phy, 1);
1450 t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
1451
1452 ADAPTER_LOCK(p->adapter);
1453 clrbit(&p->adapter->open_device_map, p->port);
1454 /*
1455 * XXX cancel check_task
1456 */
1457 if (p->adapter->open_device_map == 0)
1458 cxgb_down(p->adapter);
1459 ADAPTER_UNLOCK(p->adapter);
1460}
1461
1462static int
1463cxgb_set_mtu(struct port_info *p, int mtu)
1464{
1465 struct ifnet *ifp = p->ifp;
1466 int error = 0;
1467
1468 if ((mtu < ETHERMIN) || (mtu > ETHER_MAX_LEN_JUMBO))
1469 error = EINVAL;
1470 else if (ifp->if_mtu != mtu) {
1471 PORT_LOCK(p);
1472 ifp->if_mtu = mtu;
1473 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1474 callout_stop(&p->adapter->cxgb_tick_ch);
1475 cxgb_stop_locked(p);
1476 cxgb_init_locked(p);
1477 }
1478 PORT_UNLOCK(p);
1479 }
1480 return (error);
1481}
1482
1483static int
1424cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
1425{
1426 struct port_info *p = ifp->if_softc;
1427 struct ifaddr *ifa = (struct ifaddr *)data;
1428 struct ifreq *ifr = (struct ifreq *)data;
1429 int flags, error = 0;
1430 uint32_t mask;
1431
1432 /*
1433 * XXX need to check that we aren't in the middle of an unload
1434 */
1435 switch (command) {
1436 case SIOCSIFMTU:
1484cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
1485{
1486 struct port_info *p = ifp->if_softc;
1487 struct ifaddr *ifa = (struct ifaddr *)data;
1488 struct ifreq *ifr = (struct ifreq *)data;
1489 int flags, error = 0;
1490 uint32_t mask;
1491
1492 /*
1493 * XXX need to check that we aren't in the middle of an unload
1494 */
1495 switch (command) {
1496 case SIOCSIFMTU:
1437 if ((ifr->ifr_mtu < ETHERMIN) ||
1438 (ifr->ifr_mtu > ETHER_MAX_LEN_JUMBO))
1439 error = EINVAL;
1440 else if (ifp->if_mtu != ifr->ifr_mtu) {
1441 PORT_LOCK(p);
1442 ifp->if_mtu = ifr->ifr_mtu;
1443 t3_mac_set_mtu(&p->mac, ifp->if_mtu + ETHER_HDR_LEN);
1444 PORT_UNLOCK(p);
1445 }
1497 error = cxgb_set_mtu(p, ifr->ifr_mtu);
1446 break;
1447 case SIOCSIFADDR:
1448 case SIOCGIFADDR:
1498 break;
1499 case SIOCSIFADDR:
1500 case SIOCGIFADDR:
1501 PORT_LOCK(p);
1449 if (ifa->ifa_addr->sa_family == AF_INET) {
1450 ifp->if_flags |= IFF_UP;
1502 if (ifa->ifa_addr->sa_family == AF_INET) {
1503 ifp->if_flags |= IFF_UP;
1451 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1452 cxgb_init(p);
1453 }
1504 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
1505 cxgb_init_locked(p);
1454 arp_ifinit(ifp, ifa);
1455 } else
1456 error = ether_ioctl(ifp, command, data);
1506 arp_ifinit(ifp, ifa);
1507 } else
1508 error = ether_ioctl(ifp, command, data);
1509 PORT_UNLOCK(p);
1457 break;
1458 case SIOCSIFFLAGS:
1510 break;
1511 case SIOCSIFFLAGS:
1512 PORT_LOCK(p);
1459 if (ifp->if_flags & IFF_UP) {
1513 if (ifp->if_flags & IFF_UP) {
1460 PORT_LOCK(p);
1461 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1462 flags = p->if_flags;
1463 if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
1464 ((ifp->if_flags ^ flags) & IFF_ALLMULTI))
1465 cxgb_set_rxmode(p);
1466
1467 } else
1468 cxgb_init_locked(p);
1469 p->if_flags = ifp->if_flags;
1514 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1515 flags = p->if_flags;
1516 if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
1517 ((ifp->if_flags ^ flags) & IFF_ALLMULTI))
1518 cxgb_set_rxmode(p);
1519
1520 } else
1521 cxgb_init_locked(p);
1522 p->if_flags = ifp->if_flags;
1470 PORT_UNLOCK(p);
1471 } else {
1523 } else {
1472 callout_drain(&p->adapter->cxgb_tick_ch);
1473 PORT_LOCK(p);
1524 callout_stop(&p->adapter->cxgb_tick_ch);
1474 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1475 cxgb_stop_locked(p);
1476 } else {
1477 adapter_t *sc = p->adapter;
1478 callout_reset(&sc->cxgb_tick_ch,
1479 sc->params.stats_update_period * hz,
1480 cxgb_tick, sc);
1481 }
1525 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1526 cxgb_stop_locked(p);
1527 } else {
1528 adapter_t *sc = p->adapter;
1529 callout_reset(&sc->cxgb_tick_ch,
1530 sc->params.stats_update_period * hz,
1531 cxgb_tick, sc);
1532 }
1482 PORT_UNLOCK(p);
1483 }
1533 }
1484
1485
1534 PORT_UNLOCK(p);
1486 break;
1487 case SIOCSIFMEDIA:
1488 case SIOCGIFMEDIA:
1489 error = ifmedia_ioctl(ifp, ifr, &p->media, command);
1490 break;
1491 case SIOCSIFCAP:
1492 PORT_LOCK(p);
1493 mask = ifr->ifr_reqcap ^ ifp->if_capenable;

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

1522 }
1523 }
1524 PORT_UNLOCK(p);
1525 break;
1526 default:
1527 error = ether_ioctl(ifp, command, data);
1528 break;
1529 }
1535 break;
1536 case SIOCSIFMEDIA:
1537 case SIOCGIFMEDIA:
1538 error = ifmedia_ioctl(ifp, ifr, &p->media, command);
1539 break;
1540 case SIOCSIFCAP:
1541 PORT_LOCK(p);
1542 mask = ifr->ifr_reqcap ^ ifp->if_capenable;

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

1571 }
1572 }
1573 PORT_UNLOCK(p);
1574 break;
1575 default:
1576 error = ether_ioctl(ifp, command, data);
1577 break;
1578 }
1530
1531 return (error);
1532}
1533
1534static int
1535cxgb_start_tx(struct ifnet *ifp, uint32_t txmax)
1536{
1537 struct sge_qset *qs;
1538 struct sge_txq *txq;
1539 struct port_info *p = ifp->if_softc;
1540 struct mbuf *m0, *m = NULL;
1541 int err, in_use_init;
1579 return (error);
1580}
1581
1582static int
1583cxgb_start_tx(struct ifnet *ifp, uint32_t txmax)
1584{
1585 struct sge_qset *qs;
1586 struct sge_txq *txq;
1587 struct port_info *p = ifp->if_softc;
1588 struct mbuf *m0, *m = NULL;
1589 int err, in_use_init;
1542
1590
1543 if (!p->link_config.link_ok)
1544 return (ENXIO);
1545
1546 if (IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1547 return (ENOBUFS);
1548
1549 qs = &p->adapter->sge.qs[p->first_qset];
1550 txq = &qs->txq[TXQ_ETH];

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

1593 if (__predict_false(err)) {
1594 if (err == ENOMEM) {
1595 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1596 IFQ_LOCK(&ifp->if_snd);
1597 IFQ_DRV_PREPEND(&ifp->if_snd, m);
1598 IFQ_UNLOCK(&ifp->if_snd);
1599 }
1600 }
1591 if (!p->link_config.link_ok)
1592 return (ENXIO);
1593
1594 if (IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1595 return (ENOBUFS);
1596
1597 qs = &p->adapter->sge.qs[p->first_qset];
1598 txq = &qs->txq[TXQ_ETH];

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

1641 if (__predict_false(err)) {
1642 if (err == ENOMEM) {
1643 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1644 IFQ_LOCK(&ifp->if_snd);
1645 IFQ_DRV_PREPEND(&ifp->if_snd, m);
1646 IFQ_UNLOCK(&ifp->if_snd);
1647 }
1648 }
1601 if (err == 0 && m == NULL) {
1602 return (ENOBUFS);
1603 }
1604 if ((err == 0) && (txq->size <= txq->in_use + TX_MAX_DESC) &&
1649 if (err == 0 && m == NULL)
1650 err = ENOBUFS;
1651 else if ((err == 0) && (txq->size <= txq->in_use + TX_MAX_DESC) &&
1605 (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
1606 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1652 (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
1653 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1607 return (ENOSPC);
1654 err = ENOSPC;
1608 }
1609 return (err);
1610}
1611
1612static void
1613cxgb_start_proc(void *arg, int ncount)
1614{
1615 struct ifnet *ifp = arg;
1616 struct port_info *pi = ifp->if_softc;
1617 struct sge_qset *qs;
1618 struct sge_txq *txq;
1655 }
1656 return (err);
1657}
1658
1659static void
1660cxgb_start_proc(void *arg, int ncount)
1661{
1662 struct ifnet *ifp = arg;
1663 struct port_info *pi = ifp->if_softc;
1664 struct sge_qset *qs;
1665 struct sge_txq *txq;
1619 int error = 0;
1666 int error;
1620
1621 qs = &pi->adapter->sge.qs[pi->first_qset];
1622 txq = &qs->txq[TXQ_ETH];
1623
1667
1668 qs = &pi->adapter->sge.qs[pi->first_qset];
1669 txq = &qs->txq[TXQ_ETH];
1670
1624 while (error == 0) {
1671 do {
1625 if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC)
1626 taskqueue_enqueue(pi->adapter->tq,
1672 if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC)
1673 taskqueue_enqueue(pi->adapter->tq,
1627 &pi->adapter->timer_reclaim_task);
1674 &pi->timer_reclaim_task);
1628
1629 error = cxgb_start_tx(ifp, TX_START_MAX_DESC);
1675
1676 error = cxgb_start_tx(ifp, TX_START_MAX_DESC);
1630 }
1677 } while (error == 0);
1631}
1632
1633static void
1634cxgb_start(struct ifnet *ifp)
1635{
1636 struct port_info *pi = ifp->if_softc;
1637 struct sge_qset *qs;
1638 struct sge_txq *txq;
1639 int err;
1640
1641 qs = &pi->adapter->sge.qs[pi->first_qset];
1642 txq = &qs->txq[TXQ_ETH];
1643
1644 if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC)
1645 taskqueue_enqueue(pi->adapter->tq,
1678}
1679
1680static void
1681cxgb_start(struct ifnet *ifp)
1682{
1683 struct port_info *pi = ifp->if_softc;
1684 struct sge_qset *qs;
1685 struct sge_txq *txq;
1686 int err;
1687
1688 qs = &pi->adapter->sge.qs[pi->first_qset];
1689 txq = &qs->txq[TXQ_ETH];
1690
1691 if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC)
1692 taskqueue_enqueue(pi->adapter->tq,
1646 &pi->adapter->timer_reclaim_task);
1693 &pi->timer_reclaim_task);
1647
1648 err = cxgb_start_tx(ifp, TX_START_MAX_DESC);
1649
1650 if (err == 0)
1651 taskqueue_enqueue(pi->tq, &pi->start_task);
1652}
1653
1654

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

1667 ifmr->ifm_status = IFM_AVALID;
1668 ifmr->ifm_active = IFM_ETHER;
1669
1670 if (!p->link_config.link_ok)
1671 return;
1672
1673 ifmr->ifm_status |= IFM_ACTIVE;
1674
1694
1695 err = cxgb_start_tx(ifp, TX_START_MAX_DESC);
1696
1697 if (err == 0)
1698 taskqueue_enqueue(pi->tq, &pi->start_task);
1699}
1700
1701

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

1714 ifmr->ifm_status = IFM_AVALID;
1715 ifmr->ifm_active = IFM_ETHER;
1716
1717 if (!p->link_config.link_ok)
1718 return;
1719
1720 ifmr->ifm_status |= IFM_ACTIVE;
1721
1722 switch (p->link_config.speed) {
1723 case 10:
1724 ifmr->ifm_active |= IFM_10_T;
1725 break;
1726 case 100:
1727 ifmr->ifm_active |= IFM_100_TX;
1728 break;
1729 case 1000:
1730 ifmr->ifm_active |= IFM_1000_T;
1731 break;
1732 }
1733
1675 if (p->link_config.duplex)
1676 ifmr->ifm_active |= IFM_FDX;
1677 else
1678 ifmr->ifm_active |= IFM_HDX;
1679}
1680
1681static void
1682cxgb_async_intr(void *data)

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

1713static void
1714check_link_status(adapter_t *sc)
1715{
1716 int i;
1717
1718 for (i = 0; i < (sc)->params.nports; ++i) {
1719 struct port_info *p = &sc->port[i];
1720
1734 if (p->link_config.duplex)
1735 ifmr->ifm_active |= IFM_FDX;
1736 else
1737 ifmr->ifm_active |= IFM_HDX;
1738}
1739
1740static void
1741cxgb_async_intr(void *data)

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

1772static void
1773check_link_status(adapter_t *sc)
1774{
1775 int i;
1776
1777 for (i = 0; i < (sc)->params.nports; ++i) {
1778 struct port_info *p = &sc->port[i];
1779
1721 if (!(p->port_type->caps & SUPPORTED_IRQ))
1780 if (!(p->port_type->caps & SUPPORTED_IRQ))
1722 t3_link_changed(sc, i);
1781 t3_link_changed(sc, i);
1782 p->ifp->if_baudrate = p->link_config.speed * 1000000;
1723 }
1724}
1725
1726static void
1727check_t3b2_mac(struct adapter *adapter)
1728{
1729 int i;
1730

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

1740 PORT_LOCK(p);
1741 if ((ifp->if_drv_flags & IFF_DRV_RUNNING))
1742 status = t3b2_mac_watchdog_task(&p->mac);
1743 if (status == 1)
1744 p->mac.stats.num_toggled++;
1745 else if (status == 2) {
1746 struct cmac *mac = &p->mac;
1747
1783 }
1784}
1785
1786static void
1787check_t3b2_mac(struct adapter *adapter)
1788{
1789 int i;
1790

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

1800 PORT_LOCK(p);
1801 if ((ifp->if_drv_flags & IFF_DRV_RUNNING))
1802 status = t3b2_mac_watchdog_task(&p->mac);
1803 if (status == 1)
1804 p->mac.stats.num_toggled++;
1805 else if (status == 2) {
1806 struct cmac *mac = &p->mac;
1807
1748 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN);
1808 t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN
1809 + ETHER_VLAN_ENCAP_LEN);
1749 t3_mac_set_address(mac, 0, p->hw_addr);
1750 cxgb_set_rxmode(p);
1751 t3_link_start(&p->phy, mac, &p->link_config);
1752 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1753 t3_port_intr_enable(adapter, p->port);
1754 p->mac.stats.num_resets++;
1755 }
1756 PORT_UNLOCK(p);

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

1768 callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
1769 cxgb_tick, sc);
1770
1771 /*
1772 * adapter lock can currently only be acquire after the
1773 * port lock
1774 */
1775 ADAPTER_UNLOCK(sc);
1810 t3_mac_set_address(mac, 0, p->hw_addr);
1811 cxgb_set_rxmode(p);
1812 t3_link_start(&p->phy, mac, &p->link_config);
1813 t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1814 t3_port_intr_enable(adapter, p->port);
1815 p->mac.stats.num_resets++;
1816 }
1817 PORT_UNLOCK(p);

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

1829 callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
1830 cxgb_tick, sc);
1831
1832 /*
1833 * adapter lock can currently only be acquire after the
1834 * port lock
1835 */
1836 ADAPTER_UNLOCK(sc);
1837
1776 if (p->rev == T3_REV_B2)
1777 check_t3b2_mac(sc);
1838 if (p->rev == T3_REV_B2)
1839 check_t3b2_mac(sc);
1778
1779}
1780
1781static int
1782in_range(int val, int lo, int hi)
1783{
1784 return val < 0 || (val <= hi && val >= lo);
1785}
1786
1787static int
1840}
1841
1842static int
1843in_range(int val, int lo, int hi)
1844{
1845 return val < 0 || (val <= hi && val >= lo);
1846}
1847
1848static int
1849cxgb_extension_open(struct cdev *dev, int flags, int fmp, d_thread_t *td)
1850{
1851 return (0);
1852}
1853
1854static int
1855cxgb_extension_close(struct cdev *dev, int flags, int fmt, d_thread_t *td)
1856{
1857 return (0);
1858}
1859
1860static int
1788cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
1789 int fflag, struct thread *td)
1790{
1791 int mmd, error = 0;
1792 struct port_info *pi = dev->si_drv1;
1793 adapter_t *sc = pi->adapter;
1794
1795#ifdef PRIV_SUPPORTED

--- 436 unchanged lines hidden ---
1861cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
1862 int fflag, struct thread *td)
1863{
1864 int mmd, error = 0;
1865 struct port_info *pi = dev->si_drv1;
1866 adapter_t *sc = pi->adapter;
1867
1868#ifdef PRIV_SUPPORTED

--- 436 unchanged lines hidden ---