Deleted Added
full compact
if_jme.c (216550) if_jme.c (216551)
1/*-
2 * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/dev/jme/if_jme.c 216550 2010-12-18 23:26:38Z yongari $");
29__FBSDID("$FreeBSD: head/sys/dev/jme/if_jme.c 216551 2010-12-18 23:52:50Z yongari $");
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/bus.h>
34#include <sys/endian.h>
35#include <sys/kernel.h>
36#include <sys/malloc.h>
37#include <sys/mbuf.h>

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

92 * Devices supported by this driver.
93 */
94static struct jme_dev {
95 uint16_t jme_vendorid;
96 uint16_t jme_deviceid;
97 const char *jme_name;
98} jme_devs[] = {
99 { VENDORID_JMICRON, DEVICEID_JMC250,
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/bus.h>
34#include <sys/endian.h>
35#include <sys/kernel.h>
36#include <sys/malloc.h>
37#include <sys/mbuf.h>

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

92 * Devices supported by this driver.
93 */
94static struct jme_dev {
95 uint16_t jme_vendorid;
96 uint16_t jme_deviceid;
97 const char *jme_name;
98} jme_devs[] = {
99 { VENDORID_JMICRON, DEVICEID_JMC250,
100 "JMicron Inc, JMC250 Gigabit Ethernet" },
100 "JMicron Inc, JMC25x Gigabit Ethernet" },
101 { VENDORID_JMICRON, DEVICEID_JMC260,
101 { VENDORID_JMICRON, DEVICEID_JMC260,
102 "JMicron Inc, JMC260 Fast Ethernet" },
102 "JMicron Inc, JMC26x Fast Ethernet" },
103};
104
105static int jme_miibus_readreg(device_t, int, int);
106static int jme_miibus_writereg(device_t, int, int, int);
107static void jme_miibus_statchg(device_t);
108static void jme_mediastatus(struct ifnet *, struct ifmediareq *);
109static int jme_mediachange(struct ifnet *);
110static int jme_probe(device_t);
111static int jme_eeprom_read_byte(struct jme_softc *, uint8_t, uint8_t *);
112static int jme_eeprom_macaddr(struct jme_softc *);
103};
104
105static int jme_miibus_readreg(device_t, int, int);
106static int jme_miibus_writereg(device_t, int, int, int);
107static void jme_miibus_statchg(device_t);
108static void jme_mediastatus(struct ifnet *, struct ifmediareq *);
109static int jme_mediachange(struct ifnet *);
110static int jme_probe(device_t);
111static int jme_eeprom_read_byte(struct jme_softc *, uint8_t, uint8_t *);
112static int jme_eeprom_macaddr(struct jme_softc *);
113static int jme_efuse_macaddr(struct jme_softc *);
113static void jme_reg_macaddr(struct jme_softc *);
114static void jme_reg_macaddr(struct jme_softc *);
115static void jme_set_macaddr(struct jme_softc *, uint8_t *);
114static void jme_map_intr_vector(struct jme_softc *);
115static int jme_attach(device_t);
116static int jme_detach(device_t);
117static void jme_sysctl_node(struct jme_softc *);
118static void jme_dmamap_cb(void *, bus_dma_segment_t *, int, int);
119static int jme_dma_alloc(struct jme_softc *);
120static void jme_dma_free(struct jme_softc *);
121static int jme_shutdown(device_t);

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

147static void jme_init_tx_ring(struct jme_softc *);
148static void jme_init_ssb(struct jme_softc *);
149static int jme_newbuf(struct jme_softc *, struct jme_rxdesc *);
150static void jme_set_vlan(struct jme_softc *);
151static void jme_set_filter(struct jme_softc *);
152static void jme_stats_clear(struct jme_softc *);
153static void jme_stats_save(struct jme_softc *);
154static void jme_stats_update(struct jme_softc *);
116static void jme_map_intr_vector(struct jme_softc *);
117static int jme_attach(device_t);
118static int jme_detach(device_t);
119static void jme_sysctl_node(struct jme_softc *);
120static void jme_dmamap_cb(void *, bus_dma_segment_t *, int, int);
121static int jme_dma_alloc(struct jme_softc *);
122static void jme_dma_free(struct jme_softc *);
123static int jme_shutdown(device_t);

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

149static void jme_init_tx_ring(struct jme_softc *);
150static void jme_init_ssb(struct jme_softc *);
151static int jme_newbuf(struct jme_softc *, struct jme_rxdesc *);
152static void jme_set_vlan(struct jme_softc *);
153static void jme_set_filter(struct jme_softc *);
154static void jme_stats_clear(struct jme_softc *);
155static void jme_stats_save(struct jme_softc *);
156static void jme_stats_update(struct jme_softc *);
157static void jme_phy_down(struct jme_softc *);
158static void jme_phy_up(struct jme_softc *);
155static int sysctl_int_range(SYSCTL_HANDLER_ARGS, int, int);
156static int sysctl_hw_jme_tx_coal_to(SYSCTL_HANDLER_ARGS);
157static int sysctl_hw_jme_tx_coal_pkt(SYSCTL_HANDLER_ARGS);
158static int sysctl_hw_jme_rx_coal_to(SYSCTL_HANDLER_ARGS);
159static int sysctl_hw_jme_rx_coal_pkt(SYSCTL_HANDLER_ARGS);
160static int sysctl_hw_jme_proc_limit(SYSCTL_HANDLER_ARGS);
161
162

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

427 if (match == ETHER_ADDR_LEN) {
428 bcopy(eaddr, sc->jme_eaddr, ETHER_ADDR_LEN);
429 return (0);
430 }
431
432 return (ENOENT);
433}
434
159static int sysctl_int_range(SYSCTL_HANDLER_ARGS, int, int);
160static int sysctl_hw_jme_tx_coal_to(SYSCTL_HANDLER_ARGS);
161static int sysctl_hw_jme_tx_coal_pkt(SYSCTL_HANDLER_ARGS);
162static int sysctl_hw_jme_rx_coal_to(SYSCTL_HANDLER_ARGS);
163static int sysctl_hw_jme_rx_coal_pkt(SYSCTL_HANDLER_ARGS);
164static int sysctl_hw_jme_proc_limit(SYSCTL_HANDLER_ARGS);
165
166

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

431 if (match == ETHER_ADDR_LEN) {
432 bcopy(eaddr, sc->jme_eaddr, ETHER_ADDR_LEN);
433 return (0);
434 }
435
436 return (ENOENT);
437}
438
439static int
440jme_efuse_macaddr(struct jme_softc *sc)
441{
442 uint32_t reg;
443 int i;
444
445 reg = pci_read_config(sc->jme_dev, JME_EFUSE_CTL1, 4);
446 if ((reg & (EFUSE_CTL1_AUTOLOAD_ERR | EFUSE_CTL1_AUTOLAOD_DONE)) !=
447 EFUSE_CTL1_AUTOLAOD_DONE)
448 return (ENOENT);
449 /* Reset eFuse controller. */
450 reg = pci_read_config(sc->jme_dev, JME_EFUSE_CTL2, 4);
451 reg |= EFUSE_CTL2_RESET;
452 pci_write_config(sc->jme_dev, JME_EFUSE_CTL2, reg, 4);
453 reg = pci_read_config(sc->jme_dev, JME_EFUSE_CTL2, 4);
454 reg &= ~EFUSE_CTL2_RESET;
455 pci_write_config(sc->jme_dev, JME_EFUSE_CTL2, reg, 4);
456
457 /* Have eFuse reload station address to MAC controller. */
458 reg = pci_read_config(sc->jme_dev, JME_EFUSE_CTL1, 4);
459 reg &= ~EFUSE_CTL1_CMD_MASK;
460 reg |= EFUSE_CTL1_CMD_AUTOLOAD | EFUSE_CTL1_EXECUTE;
461 pci_write_config(sc->jme_dev, JME_EFUSE_CTL1, reg, 4);
462
463 /*
464 * Verify completion of eFuse autload command. It should be
465 * completed within 108us.
466 */
467 DELAY(110);
468 for (i = 10; i > 0; i--) {
469 reg = pci_read_config(sc->jme_dev, JME_EFUSE_CTL1, 4);
470 if ((reg & (EFUSE_CTL1_AUTOLOAD_ERR |
471 EFUSE_CTL1_AUTOLAOD_DONE)) != EFUSE_CTL1_AUTOLAOD_DONE) {
472 DELAY(20);
473 continue;
474 }
475 if ((reg & EFUSE_CTL1_EXECUTE) == 0)
476 break;
477 /* Station address loading is still in progress. */
478 DELAY(20);
479 }
480 if (i == 0) {
481 device_printf(sc->jme_dev, "eFuse autoload timed out.\n");
482 return (ETIMEDOUT);
483 }
484
485 return (0);
486}
487
435static void
436jme_reg_macaddr(struct jme_softc *sc)
437{
438 uint32_t par0, par1;
439
440 /* Read station address. */
441 par0 = CSR_READ_4(sc, JME_PAR0);
442 par1 = CSR_READ_4(sc, JME_PAR1);
443 par1 &= 0xFFFF;
444 if ((par0 == 0 && par1 == 0) ||
445 (par0 == 0xFFFFFFFF && par1 == 0xFFFF)) {
446 device_printf(sc->jme_dev,
447 "Failed to retrieve Ethernet address.\n");
448 } else {
488static void
489jme_reg_macaddr(struct jme_softc *sc)
490{
491 uint32_t par0, par1;
492
493 /* Read station address. */
494 par0 = CSR_READ_4(sc, JME_PAR0);
495 par1 = CSR_READ_4(sc, JME_PAR1);
496 par1 &= 0xFFFF;
497 if ((par0 == 0 && par1 == 0) ||
498 (par0 == 0xFFFFFFFF && par1 == 0xFFFF)) {
499 device_printf(sc->jme_dev,
500 "Failed to retrieve Ethernet address.\n");
501 } else {
502 /*
503 * For controllers that use eFuse, the station address
504 * could also be extracted from JME_PCI_PAR0 and
505 * JME_PCI_PAR1 registers in PCI configuration space.
506 * Each register holds exactly half of station address(24bits)
507 * so use JME_PAR0, JME_PAR1 registers instead.
508 */
449 sc->jme_eaddr[0] = (par0 >> 0) & 0xFF;
450 sc->jme_eaddr[1] = (par0 >> 8) & 0xFF;
451 sc->jme_eaddr[2] = (par0 >> 16) & 0xFF;
452 sc->jme_eaddr[3] = (par0 >> 24) & 0xFF;
453 sc->jme_eaddr[4] = (par1 >> 0) & 0xFF;
454 sc->jme_eaddr[5] = (par1 >> 8) & 0xFF;
455 }
456}
457
458static void
509 sc->jme_eaddr[0] = (par0 >> 0) & 0xFF;
510 sc->jme_eaddr[1] = (par0 >> 8) & 0xFF;
511 sc->jme_eaddr[2] = (par0 >> 16) & 0xFF;
512 sc->jme_eaddr[3] = (par0 >> 24) & 0xFF;
513 sc->jme_eaddr[4] = (par1 >> 0) & 0xFF;
514 sc->jme_eaddr[5] = (par1 >> 8) & 0xFF;
515 }
516}
517
518static void
519jme_set_macaddr(struct jme_softc *sc, uint8_t *eaddr)
520{
521 uint32_t val;
522 int i;
523
524 if ((sc->jme_flags & JME_FLAG_EFUSE) != 0) {
525 /*
526 * Avoid reprogramming station address if the address
527 * is the same as previous one. Note, reprogrammed
528 * station address is permanent as if it was written
529 * to EEPROM. So if station address was changed by
530 * admistrator it's possible to lose factory configured
531 * address when driver fails to restore its address.
532 * (e.g. reboot or system crash)
533 */
534 if (bcmp(eaddr, sc->jme_eaddr, ETHER_ADDR_LEN) != 0) {
535 for (i = 0; i < ETHER_ADDR_LEN; i++) {
536 val = JME_EFUSE_EEPROM_FUNC0 <<
537 JME_EFUSE_EEPROM_FUNC_SHIFT;
538 val |= JME_EFUSE_EEPROM_PAGE_BAR1 <<
539 JME_EFUSE_EEPROM_PAGE_SHIFT;
540 val |= (JME_PAR0 + i) <<
541 JME_EFUSE_EEPROM_ADDR_SHIFT;
542 val |= eaddr[i] << JME_EFUSE_EEPROM_DATA_SHIFT;
543 pci_write_config(sc->jme_dev, JME_EFUSE_EEPROM,
544 val | JME_EFUSE_EEPROM_WRITE, 4);
545 }
546 }
547 } else {
548 CSR_WRITE_4(sc, JME_PAR0,
549 eaddr[3] << 24 | eaddr[2] << 16 | eaddr[1] << 8 | eaddr[0]);
550 CSR_WRITE_4(sc, JME_PAR1, eaddr[5] << 8 | eaddr[4]);
551 }
552}
553
554static void
459jme_map_intr_vector(struct jme_softc *sc)
460{
461 uint32_t map[MSINUM_NUM_INTR_SOURCE / JME_MSI_MESSAGES];
462
463 bzero(map, sizeof(map));
464
465 /* Map Tx interrupts source to MSI/MSIX vector 2. */
466 map[MSINUM_REG_INDEX(N_INTR_TXQ0_COMP)] =

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

529jme_attach(device_t dev)
530{
531 struct jme_softc *sc;
532 struct ifnet *ifp;
533 struct mii_softc *miisc;
534 struct mii_data *mii;
535 uint32_t reg;
536 uint16_t burst;
555jme_map_intr_vector(struct jme_softc *sc)
556{
557 uint32_t map[MSINUM_NUM_INTR_SOURCE / JME_MSI_MESSAGES];
558
559 bzero(map, sizeof(map));
560
561 /* Map Tx interrupts source to MSI/MSIX vector 2. */
562 map[MSINUM_REG_INDEX(N_INTR_TXQ0_COMP)] =

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

625jme_attach(device_t dev)
626{
627 struct jme_softc *sc;
628 struct ifnet *ifp;
629 struct mii_softc *miisc;
630 struct mii_data *mii;
631 uint32_t reg;
632 uint16_t burst;
537 int error, i, msic, msixc, pmc;
633 int error, i, mii_flags, msic, msixc, pmc;
538
539 error = 0;
540 sc = device_get_softc(dev);
541 sc->jme_dev = dev;
542
543 mtx_init(&sc->jme_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
544 MTX_DEF);
545 callout_init_mtx(&sc->jme_tick_ch, &sc->jme_mtx, 0);

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

631 }
632 if (sc->jme_chip_rev == 0xFF) {
633 device_printf(dev, "Unknown chip revision : 0x%02x\n",
634 sc->jme_rev);
635 error = ENXIO;
636 goto fail;
637 }
638
634
635 error = 0;
636 sc = device_get_softc(dev);
637 sc->jme_dev = dev;
638
639 mtx_init(&sc->jme_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
640 MTX_DEF);
641 callout_init_mtx(&sc->jme_tick_ch, &sc->jme_mtx, 0);

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

727 }
728 if (sc->jme_chip_rev == 0xFF) {
729 device_printf(dev, "Unknown chip revision : 0x%02x\n",
730 sc->jme_rev);
731 error = ENXIO;
732 goto fail;
733 }
734
735 /* Identify controller features and bugs. */
639 if (CHIPMODE_REVFM(sc->jme_chip_rev) >= 2) {
640 if ((sc->jme_rev & DEVICEID_JMC2XX_MASK) == DEVICEID_JMC260 &&
641 CHIPMODE_REVFM(sc->jme_chip_rev) == 2)
642 sc->jme_flags |= JME_FLAG_DMA32BIT;
736 if (CHIPMODE_REVFM(sc->jme_chip_rev) >= 2) {
737 if ((sc->jme_rev & DEVICEID_JMC2XX_MASK) == DEVICEID_JMC260 &&
738 CHIPMODE_REVFM(sc->jme_chip_rev) == 2)
739 sc->jme_flags |= JME_FLAG_DMA32BIT;
643 sc->jme_flags |= JME_FLAG_TXCLK;
740 if (CHIPMODE_REVFM(sc->jme_chip_rev) >= 5)
741 sc->jme_flags |= JME_FLAG_EFUSE | JME_FLAG_PCCPCD;
742 sc->jme_flags |= JME_FLAG_TXCLK | JME_FLAG_RXCLK;
644 sc->jme_flags |= JME_FLAG_HWMIB;
645 }
646
647 /* Reset the ethernet controller. */
648 jme_reset(sc);
649
650 /* Get station address. */
743 sc->jme_flags |= JME_FLAG_HWMIB;
744 }
745
746 /* Reset the ethernet controller. */
747 jme_reset(sc);
748
749 /* Get station address. */
651 reg = CSR_READ_4(sc, JME_SMBCSR);
652 if ((reg & SMBCSR_EEPROM_PRESENT) != 0)
653 error = jme_eeprom_macaddr(sc);
654 if (error != 0 || (reg & SMBCSR_EEPROM_PRESENT) == 0) {
655 if (error != 0 && (bootverbose))
750 if ((sc->jme_flags & JME_FLAG_EFUSE) != 0) {
751 error = jme_efuse_macaddr(sc);
752 if (error == 0)
753 jme_reg_macaddr(sc);
754 } else {
755 error = ENOENT;
756 reg = CSR_READ_4(sc, JME_SMBCSR);
757 if ((reg & SMBCSR_EEPROM_PRESENT) != 0)
758 error = jme_eeprom_macaddr(sc);
759 if (error != 0 && bootverbose)
656 device_printf(sc->jme_dev,
657 "ethernet hardware address not found in EEPROM.\n");
760 device_printf(sc->jme_dev,
761 "ethernet hardware address not found in EEPROM.\n");
658 jme_reg_macaddr(sc);
762 if (error != 0)
763 jme_reg_macaddr(sc);
659 }
660
661 /*
662 * Save PHY address.
663 * Integrated JR0211 has fixed PHY address whereas FPGA version
664 * requires PHY probing to get correct PHY address.
665 */
666 if ((sc->jme_flags & JME_FLAG_FPGA) == 0) {

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

723 ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_TSO4;
724 ifp->if_hwassist = JME_CSUM_FEATURES | CSUM_TSO;
725 if (pci_find_extcap(dev, PCIY_PMG, &pmc) == 0) {
726 sc->jme_flags |= JME_FLAG_PMCAP;
727 ifp->if_capabilities |= IFCAP_WOL_MAGIC;
728 }
729 ifp->if_capenable = ifp->if_capabilities;
730
764 }
765
766 /*
767 * Save PHY address.
768 * Integrated JR0211 has fixed PHY address whereas FPGA version
769 * requires PHY probing to get correct PHY address.
770 */
771 if ((sc->jme_flags & JME_FLAG_FPGA) == 0) {

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

828 ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_TSO4;
829 ifp->if_hwassist = JME_CSUM_FEATURES | CSUM_TSO;
830 if (pci_find_extcap(dev, PCIY_PMG, &pmc) == 0) {
831 sc->jme_flags |= JME_FLAG_PMCAP;
832 ifp->if_capabilities |= IFCAP_WOL_MAGIC;
833 }
834 ifp->if_capenable = ifp->if_capabilities;
835
836 /* Wakeup PHY. */
837 jme_phy_up(sc);
838 mii_flags = MIIF_DOPAUSE;
839 /* Ask PHY calibration to PHY driver. */
840 if (CHIPMODE_REVFM(sc->jme_chip_rev) >= 5)
841 mii_flags |= MIIF_MACPRIV0;
731 /* Set up MII bus. */
732 error = mii_attach(dev, &sc->jme_miibus, ifp, jme_mediachange,
733 jme_mediastatus, BMSR_DEFCAPMASK,
734 sc->jme_flags & JME_FLAG_FPGA ? MII_PHY_ANY : sc->jme_phyaddr,
842 /* Set up MII bus. */
843 error = mii_attach(dev, &sc->jme_miibus, ifp, jme_mediachange,
844 jme_mediastatus, BMSR_DEFCAPMASK,
845 sc->jme_flags & JME_FLAG_FPGA ? MII_PHY_ANY : sc->jme_phyaddr,
735 MII_OFFSET_ANY, MIIF_DOPAUSE);
846 MII_OFFSET_ANY, mii_flags);
736 if (error != 0) {
737 device_printf(dev, "attaching PHYs failed\n");
738 goto fail;
739 }
740
741 /*
742 * Force PHY to FPGA mode.
743 */

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

820 JME_LOCK(sc);
821 sc->jme_flags |= JME_FLAG_DETACH;
822 jme_stop(sc);
823 JME_UNLOCK(sc);
824 callout_drain(&sc->jme_tick_ch);
825 taskqueue_drain(sc->jme_tq, &sc->jme_int_task);
826 taskqueue_drain(sc->jme_tq, &sc->jme_tx_task);
827 taskqueue_drain(taskqueue_swi, &sc->jme_link_task);
847 if (error != 0) {
848 device_printf(dev, "attaching PHYs failed\n");
849 goto fail;
850 }
851
852 /*
853 * Force PHY to FPGA mode.
854 */

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

931 JME_LOCK(sc);
932 sc->jme_flags |= JME_FLAG_DETACH;
933 jme_stop(sc);
934 JME_UNLOCK(sc);
935 callout_drain(&sc->jme_tick_ch);
936 taskqueue_drain(sc->jme_tq, &sc->jme_int_task);
937 taskqueue_drain(sc->jme_tq, &sc->jme_tx_task);
938 taskqueue_drain(taskqueue_swi, &sc->jme_link_task);
939 /* Restore possibly modified station address. */
940 if ((sc->jme_flags & JME_FLAG_EFUSE) != 0)
941 jme_set_macaddr(sc, sc->jme_eaddr);
828 ether_ifdetach(ifp);
829 }
830
831 if (sc->jme_tq != NULL) {
832 taskqueue_drain(sc->jme_tq, &sc->jme_int_task);
833 taskqueue_free(sc->jme_tq);
834 sc->jme_tq = NULL;
835 }

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

1480 JME_LOCK_ASSERT(sc);
1481
1482 if (pci_find_extcap(sc->jme_dev, PCIY_PMG, &pmc) != 0) {
1483 /* Remove Tx MAC/offload clock to save more power. */
1484 if ((sc->jme_flags & JME_FLAG_TXCLK) != 0)
1485 CSR_WRITE_4(sc, JME_GHC, CSR_READ_4(sc, JME_GHC) &
1486 ~(GHC_TX_OFFLD_CLK_100 | GHC_TX_MAC_CLK_100 |
1487 GHC_TX_OFFLD_CLK_1000 | GHC_TX_MAC_CLK_1000));
942 ether_ifdetach(ifp);
943 }
944
945 if (sc->jme_tq != NULL) {
946 taskqueue_drain(sc->jme_tq, &sc->jme_int_task);
947 taskqueue_free(sc->jme_tq);
948 sc->jme_tq = NULL;
949 }

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

1594 JME_LOCK_ASSERT(sc);
1595
1596 if (pci_find_extcap(sc->jme_dev, PCIY_PMG, &pmc) != 0) {
1597 /* Remove Tx MAC/offload clock to save more power. */
1598 if ((sc->jme_flags & JME_FLAG_TXCLK) != 0)
1599 CSR_WRITE_4(sc, JME_GHC, CSR_READ_4(sc, JME_GHC) &
1600 ~(GHC_TX_OFFLD_CLK_100 | GHC_TX_MAC_CLK_100 |
1601 GHC_TX_OFFLD_CLK_1000 | GHC_TX_MAC_CLK_1000));
1602 if ((sc->jme_flags & JME_FLAG_RXCLK) != 0)
1603 CSR_WRITE_4(sc, JME_GPREG1,
1604 CSR_READ_4(sc, JME_GPREG1) | GPREG1_RX_MAC_CLK_DIS);
1488 /* No PME capability, PHY power down. */
1605 /* No PME capability, PHY power down. */
1489 jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr,
1490 MII_BMCR, BMCR_PDOWN);
1606 jme_phy_down(sc);
1491 return;
1492 }
1493
1494 ifp = sc->jme_ifp;
1495 gpr = CSR_READ_4(sc, JME_GPREG0) & ~GPREG0_PME_ENB;
1496 pmcs = CSR_READ_4(sc, JME_PMCS);
1497 pmcs &= ~PMCS_WOL_ENB_MASK;
1498 if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0) {

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

1514 /* Request PME. */
1515 pmstat = pci_read_config(sc->jme_dev, pmc + PCIR_POWER_STATUS, 2);
1516 pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE);
1517 if ((ifp->if_capenable & IFCAP_WOL) != 0)
1518 pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
1519 pci_write_config(sc->jme_dev, pmc + PCIR_POWER_STATUS, pmstat, 2);
1520 if ((ifp->if_capenable & IFCAP_WOL) == 0) {
1521 /* No WOL, PHY power down. */
1607 return;
1608 }
1609
1610 ifp = sc->jme_ifp;
1611 gpr = CSR_READ_4(sc, JME_GPREG0) & ~GPREG0_PME_ENB;
1612 pmcs = CSR_READ_4(sc, JME_PMCS);
1613 pmcs &= ~PMCS_WOL_ENB_MASK;
1614 if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0) {

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

1630 /* Request PME. */
1631 pmstat = pci_read_config(sc->jme_dev, pmc + PCIR_POWER_STATUS, 2);
1632 pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE);
1633 if ((ifp->if_capenable & IFCAP_WOL) != 0)
1634 pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
1635 pci_write_config(sc->jme_dev, pmc + PCIR_POWER_STATUS, pmstat, 2);
1636 if ((ifp->if_capenable & IFCAP_WOL) == 0) {
1637 /* No WOL, PHY power down. */
1522 jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr,
1523 MII_BMCR, BMCR_PDOWN);
1638 jme_phy_down(sc);
1524 }
1525}
1526
1527static int
1528jme_suspend(device_t dev)
1529{
1530 struct jme_softc *sc;
1531

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

1553 if (pci_find_extcap(sc->jme_dev, PCIY_PMG, &pmc) != 0) {
1554 pmstat = pci_read_config(sc->jme_dev,
1555 pmc + PCIR_POWER_STATUS, 2);
1556 /* Disable PME clear PME status. */
1557 pmstat &= ~PCIM_PSTAT_PMEENABLE;
1558 pci_write_config(sc->jme_dev,
1559 pmc + PCIR_POWER_STATUS, pmstat, 2);
1560 }
1639 }
1640}
1641
1642static int
1643jme_suspend(device_t dev)
1644{
1645 struct jme_softc *sc;
1646

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

1668 if (pci_find_extcap(sc->jme_dev, PCIY_PMG, &pmc) != 0) {
1669 pmstat = pci_read_config(sc->jme_dev,
1670 pmc + PCIR_POWER_STATUS, 2);
1671 /* Disable PME clear PME status. */
1672 pmstat &= ~PCIM_PSTAT_PMEENABLE;
1673 pci_write_config(sc->jme_dev,
1674 pmc + PCIR_POWER_STATUS, pmstat, 2);
1675 }
1676 /* Wakeup PHY. */
1677 jme_phy_up(sc);
1561 ifp = sc->jme_ifp;
1562 if ((ifp->if_flags & IFF_UP) != 0) {
1563 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1564 jme_init_locked(sc);
1565 }
1566
1567 JME_UNLOCK(sc);
1568

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

2205 paddr = JME_RX_RING_ADDR(sc, 0);
2206 CSR_WRITE_4(sc, JME_RXDBA_HI, JME_ADDR_HI(paddr));
2207 CSR_WRITE_4(sc, JME_RXDBA_LO, JME_ADDR_LO(paddr));
2208
2209 /* Restart receiver/transmitter. */
2210 CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr | RXCSR_RX_ENB |
2211 RXCSR_RXQ_START);
2212 CSR_WRITE_4(sc, JME_TXCSR, sc->jme_txcsr | TXCSR_TX_ENB);
1678 ifp = sc->jme_ifp;
1679 if ((ifp->if_flags & IFF_UP) != 0) {
1680 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1681 jme_init_locked(sc);
1682 }
1683
1684 JME_UNLOCK(sc);
1685

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

2322 paddr = JME_RX_RING_ADDR(sc, 0);
2323 CSR_WRITE_4(sc, JME_RXDBA_HI, JME_ADDR_HI(paddr));
2324 CSR_WRITE_4(sc, JME_RXDBA_LO, JME_ADDR_LO(paddr));
2325
2326 /* Restart receiver/transmitter. */
2327 CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr | RXCSR_RX_ENB |
2328 RXCSR_RXQ_START);
2329 CSR_WRITE_4(sc, JME_TXCSR, sc->jme_txcsr | TXCSR_TX_ENB);
2330 /* Lastly enable TX/RX clock. */
2331 if ((sc->jme_flags & JME_FLAG_TXCLK) != 0)
2332 CSR_WRITE_4(sc, JME_GHC,
2333 CSR_READ_4(sc, JME_GHC) & ~GHC_TX_MAC_CLK_DIS);
2334 if ((sc->jme_flags & JME_FLAG_RXCLK) != 0)
2335 CSR_WRITE_4(sc, JME_GPREG1,
2336 CSR_READ_4(sc, JME_GPREG1) & ~GPREG1_RX_MAC_CLK_DIS);
2213 }
2214
2215 ifp->if_drv_flags |= IFF_DRV_RUNNING;
2216 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2217 callout_reset(&sc->jme_tick_ch, hz, jme_tick, sc);
2218 /* Unblock execution of task. */
2219 taskqueue_unblock(sc->jme_tq);
2220 /* Reenable interrupts. */

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

2583 jme_stats_update(sc);
2584 jme_watchdog(sc);
2585 callout_reset(&sc->jme_tick_ch, hz, jme_tick, sc);
2586}
2587
2588static void
2589jme_reset(struct jme_softc *sc)
2590{
2337 }
2338
2339 ifp->if_drv_flags |= IFF_DRV_RUNNING;
2340 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2341 callout_reset(&sc->jme_tick_ch, hz, jme_tick, sc);
2342 /* Unblock execution of task. */
2343 taskqueue_unblock(sc->jme_tq);
2344 /* Reenable interrupts. */

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

2707 jme_stats_update(sc);
2708 jme_watchdog(sc);
2709 callout_reset(&sc->jme_tick_ch, hz, jme_tick, sc);
2710}
2711
2712static void
2713jme_reset(struct jme_softc *sc)
2714{
2715 uint32_t ghc, gpreg;
2591
2592 /* Stop receiver, transmitter. */
2593 jme_stop_rx(sc);
2594 jme_stop_tx(sc);
2716
2717 /* Stop receiver, transmitter. */
2718 jme_stop_rx(sc);
2719 jme_stop_tx(sc);
2720
2721 /* Reset controller. */
2595 CSR_WRITE_4(sc, JME_GHC, GHC_RESET);
2722 CSR_WRITE_4(sc, JME_GHC, GHC_RESET);
2723 CSR_READ_4(sc, JME_GHC);
2596 DELAY(10);
2724 DELAY(10);
2597 CSR_WRITE_4(sc, JME_GHC, 0);
2725 /*
2726 * Workaround Rx FIFO overruns seen under certain conditions.
2727 * Explicitly synchorize TX/RX clock. TX/RX clock should be
2728 * enabled only after enabling TX/RX MACs.
2729 */
2730 if ((sc->jme_flags & (JME_FLAG_TXCLK | JME_FLAG_RXCLK)) != 0) {
2731 /* Disable TX clock. */
2732 CSR_WRITE_4(sc, JME_GHC, GHC_RESET | GHC_TX_MAC_CLK_DIS);
2733 /* Disable RX clock. */
2734 gpreg = CSR_READ_4(sc, JME_GPREG1);
2735 CSR_WRITE_4(sc, JME_GPREG1, gpreg | GPREG1_RX_MAC_CLK_DIS);
2736 gpreg = CSR_READ_4(sc, JME_GPREG1);
2737 /* De-assert RESET but still disable TX clock. */
2738 CSR_WRITE_4(sc, JME_GHC, GHC_TX_MAC_CLK_DIS);
2739 ghc = CSR_READ_4(sc, JME_GHC);
2740
2741 /* Enable TX clock. */
2742 CSR_WRITE_4(sc, JME_GHC, ghc & ~GHC_TX_MAC_CLK_DIS);
2743 /* Enable RX clock. */
2744 CSR_WRITE_4(sc, JME_GPREG1, gpreg & ~GPREG1_RX_MAC_CLK_DIS);
2745 CSR_READ_4(sc, JME_GPREG1);
2746
2747 /* Disable TX/RX clock again. */
2748 CSR_WRITE_4(sc, JME_GHC, GHC_TX_MAC_CLK_DIS);
2749 CSR_WRITE_4(sc, JME_GPREG1, gpreg | GPREG1_RX_MAC_CLK_DIS);
2750 } else
2751 CSR_WRITE_4(sc, JME_GHC, 0);
2752 CSR_READ_4(sc, JME_GHC);
2753 DELAY(10);
2598}
2599
2600static void
2601jme_init(void *xsc)
2602{
2603 struct jme_softc *sc;
2604
2605 sc = (struct jme_softc *)xsc;
2606 JME_LOCK(sc);
2607 jme_init_locked(sc);
2608 JME_UNLOCK(sc);
2609}
2610
2611static void
2612jme_init_locked(struct jme_softc *sc)
2613{
2614 struct ifnet *ifp;
2615 struct mii_data *mii;
2754}
2755
2756static void
2757jme_init(void *xsc)
2758{
2759 struct jme_softc *sc;
2760
2761 sc = (struct jme_softc *)xsc;
2762 JME_LOCK(sc);
2763 jme_init_locked(sc);
2764 JME_UNLOCK(sc);
2765}
2766
2767static void
2768jme_init_locked(struct jme_softc *sc)
2769{
2770 struct ifnet *ifp;
2771 struct mii_data *mii;
2616 uint8_t eaddr[ETHER_ADDR_LEN];
2617 bus_addr_t paddr;
2618 uint32_t reg;
2619 int error;
2620
2621 JME_LOCK_ASSERT(sc);
2622
2623 ifp = sc->jme_ifp;
2624 mii = device_get_softc(sc->jme_miibus);

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

2644 jme_stop(sc);
2645 return;
2646 }
2647 jme_init_tx_ring(sc);
2648 /* Initialize shadow status block. */
2649 jme_init_ssb(sc);
2650
2651 /* Reprogram the station address. */
2772 bus_addr_t paddr;
2773 uint32_t reg;
2774 int error;
2775
2776 JME_LOCK_ASSERT(sc);
2777
2778 ifp = sc->jme_ifp;
2779 mii = device_get_softc(sc->jme_miibus);

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

2799 jme_stop(sc);
2800 return;
2801 }
2802 jme_init_tx_ring(sc);
2803 /* Initialize shadow status block. */
2804 jme_init_ssb(sc);
2805
2806 /* Reprogram the station address. */
2652 bcopy(IF_LLADDR(ifp), eaddr, ETHER_ADDR_LEN);
2653 CSR_WRITE_4(sc, JME_PAR0,
2654 eaddr[3] << 24 | eaddr[2] << 16 | eaddr[1] << 8 | eaddr[0]);
2655 CSR_WRITE_4(sc, JME_PAR1, eaddr[5] << 8 | eaddr[4]);
2807 jme_set_macaddr(sc, IF_LLADDR(sc->jme_ifp));
2656
2657 /*
2658 * Configure Tx queue.
2659 * Tx priority queue weight value : 0
2660 * Tx FIFO threshold for processing next packet : 16QW
2661 * Maximum Tx DMA length : 512
2662 * Allow Tx DMA burst.
2663 */

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

2785
2786 /* Configure Rx queue 0 packet completion coalescing. */
2787 reg = (sc->jme_rx_coal_to << PCCRX_COAL_TO_SHIFT) &
2788 PCCRX_COAL_TO_MASK;
2789 reg |= (sc->jme_rx_coal_pkt << PCCRX_COAL_PKT_SHIFT) &
2790 PCCRX_COAL_PKT_MASK;
2791 CSR_WRITE_4(sc, JME_PCCRX0, reg);
2792
2808
2809 /*
2810 * Configure Tx queue.
2811 * Tx priority queue weight value : 0
2812 * Tx FIFO threshold for processing next packet : 16QW
2813 * Maximum Tx DMA length : 512
2814 * Allow Tx DMA burst.
2815 */

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

2937
2938 /* Configure Rx queue 0 packet completion coalescing. */
2939 reg = (sc->jme_rx_coal_to << PCCRX_COAL_TO_SHIFT) &
2940 PCCRX_COAL_TO_MASK;
2941 reg |= (sc->jme_rx_coal_pkt << PCCRX_COAL_PKT_SHIFT) &
2942 PCCRX_COAL_PKT_MASK;
2943 CSR_WRITE_4(sc, JME_PCCRX0, reg);
2944
2945 /*
2946 * Configure PCD(Packet Completion Deferring). It seems PCD
2947 * generates an interrupt when the time interval between two
2948 * back-to-back incoming/outgoing packet is long enough for
2949 * it to reach its timer value 0. The arrival of new packets
2950 * after timer has started causes the PCD timer to restart.
2951 * Unfortunately, it's not clear how PCD is useful at this
2952 * moment, so just use the same of PCC parameters.
2953 */
2954 if ((sc->jme_flags & JME_FLAG_PCCPCD) != 0) {
2955 sc->jme_rx_pcd_to = sc->jme_rx_coal_to;
2956 if (sc->jme_rx_coal_to > PCDRX_TO_MAX)
2957 sc->jme_rx_pcd_to = PCDRX_TO_MAX;
2958 sc->jme_tx_pcd_to = sc->jme_tx_coal_to;
2959 if (sc->jme_tx_coal_to > PCDTX_TO_MAX)
2960 sc->jme_tx_pcd_to = PCDTX_TO_MAX;
2961 reg = sc->jme_rx_pcd_to << PCDRX0_TO_THROTTLE_SHIFT;
2962 reg |= sc->jme_rx_pcd_to << PCDRX0_TO_SHIFT;
2963 CSR_WRITE_4(sc, PCDRX_REG(0), reg);
2964 reg = sc->jme_tx_pcd_to << PCDTX_TO_THROTTLE_SHIFT;
2965 reg |= sc->jme_tx_pcd_to << PCDTX_TO_SHIFT;
2966 CSR_WRITE_4(sc, JME_PCDTX, reg);
2967 }
2968
2793 /* Configure shadow status block but don't enable posting. */
2794 paddr = sc->jme_rdata.jme_ssb_block_paddr;
2795 CSR_WRITE_4(sc, JME_SHBASE_ADDR_HI, JME_ADDR_HI(paddr));
2796 CSR_WRITE_4(sc, JME_SHBASE_ADDR_LO, JME_ADDR_LO(paddr));
2797
2798 /* Disable Timer 1 and Timer 2. */
2799 CSR_WRITE_4(sc, JME_TIMER1, 0);
2800 CSR_WRITE_4(sc, JME_TIMER2, 0);

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

3190 stat->rx_mii_errs += ostat->rx_mii_errs;
3191 stat->rx_fifo_oflows += ostat->rx_fifo_oflows;
3192 stat->rx_desc_empty += ostat->rx_desc_empty;
3193 stat->rx_bad_frames += ostat->rx_bad_frames;
3194 stat->tx_good_frames += ostat->tx_good_frames;
3195 stat->tx_bad_frames += ostat->tx_bad_frames;
3196}
3197
2969 /* Configure shadow status block but don't enable posting. */
2970 paddr = sc->jme_rdata.jme_ssb_block_paddr;
2971 CSR_WRITE_4(sc, JME_SHBASE_ADDR_HI, JME_ADDR_HI(paddr));
2972 CSR_WRITE_4(sc, JME_SHBASE_ADDR_LO, JME_ADDR_LO(paddr));
2973
2974 /* Disable Timer 1 and Timer 2. */
2975 CSR_WRITE_4(sc, JME_TIMER1, 0);
2976 CSR_WRITE_4(sc, JME_TIMER2, 0);

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

3366 stat->rx_mii_errs += ostat->rx_mii_errs;
3367 stat->rx_fifo_oflows += ostat->rx_fifo_oflows;
3368 stat->rx_desc_empty += ostat->rx_desc_empty;
3369 stat->rx_bad_frames += ostat->rx_bad_frames;
3370 stat->tx_good_frames += ostat->tx_good_frames;
3371 stat->tx_bad_frames += ostat->tx_bad_frames;
3372}
3373
3374static void
3375jme_phy_down(struct jme_softc *sc)
3376{
3377 uint32_t reg;
3378
3379 jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr, MII_BMCR, BMCR_PDOWN);
3380 if (CHIPMODE_REVFM(sc->jme_chip_rev) >= 5) {
3381 reg = CSR_READ_4(sc, JME_PHYPOWDN);
3382 reg |= 0x0000000F;
3383 CSR_WRITE_4(sc, JME_PHYPOWDN, reg);
3384 reg = pci_read_config(sc->jme_dev, JME_PCI_PE1, 4);
3385 reg &= ~PE1_GIGA_PDOWN_MASK;
3386 reg |= PE1_GIGA_PDOWN_D3;
3387 pci_write_config(sc->jme_dev, JME_PCI_PE1, reg, 4);
3388 }
3389}
3390
3391static void
3392jme_phy_up(struct jme_softc *sc)
3393{
3394 uint32_t reg;
3395 uint16_t bmcr;
3396
3397 bmcr = jme_miibus_readreg(sc->jme_dev, sc->jme_phyaddr, MII_BMCR);
3398 bmcr &= ~BMCR_PDOWN;
3399 jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr, MII_BMCR, bmcr);
3400 if (CHIPMODE_REVFM(sc->jme_chip_rev) >= 5) {
3401 reg = CSR_READ_4(sc, JME_PHYPOWDN);
3402 reg &= ~0x0000000F;
3403 CSR_WRITE_4(sc, JME_PHYPOWDN, reg);
3404 reg = pci_read_config(sc->jme_dev, JME_PCI_PE1, 4);
3405 reg &= ~PE1_GIGA_PDOWN_MASK;
3406 reg |= PE1_GIGA_PDOWN_DIS;
3407 pci_write_config(sc->jme_dev, JME_PCI_PE1, reg, 4);
3408 }
3409}
3410
3198static int
3199sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high)
3200{
3201 int error, value;
3202
3203 if (arg1 == NULL)
3204 return (EINVAL);
3205 value = *(int *)arg1;

--- 44 unchanged lines hidden ---
3411static int
3412sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high)
3413{
3414 int error, value;
3415
3416 if (arg1 == NULL)
3417 return (EINVAL);
3418 value = *(int *)arg1;

--- 44 unchanged lines hidden ---