Lines Matching refs:bfe

244 #define	ASSERT_ALL_LOCKS(bfe) {	\  argument
245 ASSERT(mutex_owned(&bfe->bfe_tx_ring.r_lock)); \
246 ASSERT(rw_write_held(&bfe->bfe_rwlock)); \
274 bfe_grab_locks(bfe_t *bfe) in bfe_grab_locks() argument
276 bfe_ring_t *tx = &bfe->bfe_tx_ring; in bfe_grab_locks()
283 rw_enter(&bfe->bfe_rwlock, RW_WRITER); in bfe_grab_locks()
295 bfe_release_locks(bfe_t *bfe) in bfe_release_locks() argument
297 bfe_ring_t *tx = &bfe->bfe_tx_ring; in bfe_release_locks()
303 rw_exit(&bfe->bfe_rwlock); in bfe_release_locks()
311 bfe_wait_bit(bfe_t *bfe, uint32_t reg, uint32_t bit, in bfe_wait_bit() argument
318 v = INL(bfe, reg); in bfe_wait_bit()
340 bfe_read_phy(bfe_t *bfe, uint32_t reg) in bfe_read_phy() argument
342 OUTL(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII); in bfe_read_phy()
343 OUTL(bfe, BFE_MDIO_DATA, (BFE_MDIO_SB_START | in bfe_read_phy()
345 (bfe->bfe_phy_addr << BFE_MDIO_PMD_SHIFT) | in bfe_read_phy()
349 (void) bfe_wait_bit(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII, 10, 0); in bfe_read_phy()
351 return ((INL(bfe, BFE_MDIO_DATA) & BFE_MDIO_DATA_DATA)); in bfe_read_phy()
355 bfe_write_phy(bfe_t *bfe, uint32_t reg, uint32_t val) in bfe_write_phy() argument
357 OUTL(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII); in bfe_write_phy()
358 OUTL(bfe, BFE_MDIO_DATA, (BFE_MDIO_SB_START | in bfe_write_phy()
360 (bfe->bfe_phy_addr << BFE_MDIO_PMD_SHIFT) | in bfe_write_phy()
365 (void) bfe_wait_bit(bfe, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII, 10, 0); in bfe_write_phy()
372 bfe_reset_phy(bfe_t *bfe) in bfe_reset_phy() argument
376 bfe_write_phy(bfe, MII_CONTROL, MII_CONTROL_RESET); in bfe_reset_phy()
379 if (bfe_read_phy(bfe, MII_CONTROL) & in bfe_reset_phy()
389 bfe_error(bfe->bfe_dip, "Timeout waiting for PHY to reset"); in bfe_reset_phy()
390 bfe->bfe_phy_state = BFE_PHY_RESET_TIMEOUT; in bfe_reset_phy()
394 bfe->bfe_phy_state = BFE_PHY_RESET_DONE; in bfe_reset_phy()
404 bfe_stop_timer(bfe_t *bfe) in bfe_stop_timer() argument
406 if (bfe->bfe_periodic_id) { in bfe_stop_timer()
407 ddi_periodic_delete(bfe->bfe_periodic_id); in bfe_stop_timer()
408 bfe->bfe_periodic_id = NULL; in bfe_stop_timer()
416 bfe_stop_phy(bfe_t *bfe) in bfe_stop_phy() argument
418 bfe_write_phy(bfe, MII_CONTROL, MII_CONTROL_PWRDN | in bfe_stop_phy()
421 bfe->bfe_chip.link = LINK_STATE_UNKNOWN; in bfe_stop_phy()
422 bfe->bfe_chip.speed = 0; in bfe_stop_phy()
423 bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN; in bfe_stop_phy()
425 bfe->bfe_phy_state = BFE_PHY_STOPPED; in bfe_stop_phy()
430 if (bfe->bfe_machdl != NULL) in bfe_stop_phy()
431 (void) bfe_report_link(bfe); in bfe_stop_phy()
435 bfe_probe_phy(bfe_t *bfe) in bfe_probe_phy() argument
440 if (bfe->bfe_phy_addr) { in bfe_probe_phy()
441 status = bfe_read_phy(bfe, MII_STATUS); in bfe_probe_phy()
443 bfe_write_phy(bfe, MII_CONTROL, 0); in bfe_probe_phy()
449 bfe->bfe_phy_addr = phy; in bfe_probe_phy()
450 status = bfe_read_phy(bfe, MII_STATUS); in bfe_probe_phy()
452 bfe_write_phy(bfe, MII_CONTROL, 0); in bfe_probe_phy()
467 bfe_t *bfe = (bfe_t *)arg; in bfe_timeout() local
474 if (bfe->bfe_chip_action & BFE_ACTION_RESTART) { in bfe_timeout()
478 bfe_grab_locks(bfe); in bfe_timeout()
479 bfe_chip_restart(bfe); in bfe_timeout()
480 bfe->bfe_chip_action &= ~BFE_ACTION_RESTART; in bfe_timeout()
481 bfe->bfe_chip_action &= ~BFE_ACTION_RESTART_FAULT; in bfe_timeout()
482 bfe->bfe_chip_action &= ~BFE_ACTION_RESTART_PKT; in bfe_timeout()
483 bfe_release_locks(bfe); in bfe_timeout()
484 mac_tx_update(bfe->bfe_machdl); in bfe_timeout()
489 rw_enter(&bfe->bfe_rwlock, RW_READER); in bfe_timeout()
491 if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) { in bfe_timeout()
495 if (bfe->bfe_tx_stall_time != 0 && in bfe_timeout()
496 hr > bfe->bfe_tx_stall_time) { in bfe_timeout()
497 DTRACE_PROBE2(chip__restart, int, bfe->bfe_unit, in bfe_timeout()
499 bfe->bfe_chip_action |= in bfe_timeout()
501 bfe->bfe_tx_stall_time = 0; in bfe_timeout()
505 if (bfe->bfe_phy_state == BFE_PHY_STARTED) { in bfe_timeout()
509 if (bfe_check_link(bfe)) { in bfe_timeout()
510 bfe_report_link(bfe); in bfe_timeout()
511 if (bfe->bfe_chip.link == LINK_STATE_UP) { in bfe_timeout()
514 val = INL(bfe, BFE_TX_CTRL); in bfe_timeout()
516 if (bfe->bfe_chip.duplex == LINK_DUPLEX_FULL) { in bfe_timeout()
518 flow = INL(bfe, BFE_RXCONF); in bfe_timeout()
520 OUTL(bfe, BFE_RXCONF, flow); in bfe_timeout()
522 flow = INL(bfe, BFE_MAC_FLOW); in bfe_timeout()
524 OUTL(bfe, BFE_MAC_FLOW, flow); in bfe_timeout()
529 OUTL(bfe, BFE_TX_CTRL, val); in bfe_timeout()
531 int, bfe->bfe_unit); in bfe_timeout()
536 rw_exit(&bfe->bfe_rwlock); in bfe_timeout()
539 mac_tx_update(bfe->bfe_machdl); in bfe_timeout()
546 bfe_startup_phy(bfe_t *bfe) in bfe_startup_phy() argument
552 if (bfe_probe_phy(bfe) == BFE_FAILURE) { in bfe_startup_phy()
553 bfe->bfe_phy_state = BFE_PHY_NOTFOUND; in bfe_startup_phy()
557 (void) bfe_reset_phy(bfe); in bfe_startup_phy()
559 phyid1 = bfe_read_phy(bfe, MII_PHYIDH); in bfe_startup_phy()
560 phyid2 = bfe_read_phy(bfe, MII_PHYIDL); in bfe_startup_phy()
561 bfe->bfe_phy_id = (phyid1 << 16) | phyid2; in bfe_startup_phy()
563 bmsr = bfe_read_phy(bfe, MII_STATUS); in bfe_startup_phy()
564 anar = bfe_read_phy(bfe, MII_AN_ADVERT); in bfe_startup_phy()
574 bfe->bfe_chip.bmsr = bmsr; in bfe_startup_phy()
579 bfe->bfe_cap_aneg = bfe->bfe_cap_100T4 = in bfe_startup_phy()
580 bfe->bfe_cap_100fdx = bfe->bfe_cap_100hdx = in bfe_startup_phy()
581 bfe->bfe_cap_10fdx = bfe->bfe_cap_10hdx = 0; in bfe_startup_phy()
587 if (!(bfe->bfe_chip_action & BFE_ACTION_RESTART_SETPROP)) { in bfe_startup_phy()
598 bfe->bfe_cap_100fdx = 1; in bfe_startup_phy()
601 bfe->bfe_adv_100fdx = 1; in bfe_startup_phy()
603 } else if (bfe->bfe_adv_100fdx) { in bfe_startup_phy()
610 bfe->bfe_cap_100T4 = 1; in bfe_startup_phy()
613 bfe->bfe_adv_100T4 = 1; in bfe_startup_phy()
615 } else if (bfe->bfe_adv_100T4) { in bfe_startup_phy()
622 bfe->bfe_cap_100hdx = 1; in bfe_startup_phy()
625 bfe->bfe_adv_100hdx = 1; in bfe_startup_phy()
627 } else if (bfe->bfe_adv_100hdx) { in bfe_startup_phy()
634 bfe->bfe_cap_10fdx = 1; in bfe_startup_phy()
637 bfe->bfe_adv_10fdx = 1; in bfe_startup_phy()
639 } else if (bfe->bfe_adv_10fdx) { in bfe_startup_phy()
646 bfe->bfe_cap_10hdx = 1; in bfe_startup_phy()
649 bfe->bfe_adv_10hdx = 1; in bfe_startup_phy()
651 } else if (bfe->bfe_adv_10hdx) { in bfe_startup_phy()
658 bfe->bfe_cap_aneg = 1; in bfe_startup_phy()
660 bfe->bfe_adv_aneg = 1; in bfe_startup_phy()
666 bfe_error(bfe->bfe_dip, in bfe_startup_phy()
668 bfe_stop_phy(bfe); in bfe_startup_phy()
669 bfe_report_link(bfe); in bfe_startup_phy()
677 bfe->bfe_chip_action &= ~BFE_ACTION_RESTART_SETPROP; in bfe_startup_phy()
681 if (bfe->bfe_adv_aneg && (bmsr & MII_STATUS_CANAUTONEG)) { in bfe_startup_phy()
684 if (bfe->bfe_adv_100fdx) in bfe_startup_phy()
686 else if (bfe->bfe_adv_100hdx) in bfe_startup_phy()
688 else if (bfe->bfe_adv_10fdx) in bfe_startup_phy()
695 bfe_write_phy(bfe, MII_AN_ADVERT, anar); in bfe_startup_phy()
698 bfe_write_phy(bfe, MII_CONTROL, bmcr); in bfe_startup_phy()
700 bfe->bfe_mii_anar = anar; in bfe_startup_phy()
701 bfe->bfe_mii_bmcr = bmcr; in bfe_startup_phy()
702 bfe->bfe_phy_state = BFE_PHY_STARTED; in bfe_startup_phy()
704 if (bfe->bfe_periodic_id == NULL) { in bfe_startup_phy()
705 bfe->bfe_periodic_id = ddi_periodic_add(bfe_timeout, in bfe_startup_phy()
706 (void *)bfe, BFE_TIMEOUT_INTERVAL, DDI_IPL_0); in bfe_startup_phy()
708 DTRACE_PROBE1(first__timeout, int, bfe->bfe_unit); in bfe_startup_phy()
711 DTRACE_PROBE4(phy_started, int, bfe->bfe_unit, in bfe_startup_phy()
721 bfe_report_link(bfe_t *bfe) in bfe_report_link() argument
723 mac_link_update(bfe->bfe_machdl, bfe->bfe_chip.link); in bfe_report_link()
730 bfe_check_link(bfe_t *bfe) in bfe_check_link() argument
735 speed = bfe->bfe_chip.speed; in bfe_check_link()
736 duplex = bfe->bfe_chip.duplex; in bfe_check_link()
737 link = bfe->bfe_chip.link; in bfe_check_link()
739 bmsr = bfe_read_phy(bfe, MII_STATUS); in bfe_check_link()
740 bfe->bfe_mii_bmsr = bmsr; in bfe_check_link()
742 bmcr = bfe_read_phy(bfe, MII_CONTROL); in bfe_check_link()
744 anar = bfe_read_phy(bfe, MII_AN_ADVERT); in bfe_check_link()
745 bfe->bfe_mii_anar = anar; in bfe_check_link()
747 anlpar = bfe_read_phy(bfe, MII_AN_LPABLE); in bfe_check_link()
748 bfe->bfe_mii_anlpar = anlpar; in bfe_check_link()
750 bfe->bfe_mii_exp = bfe_read_phy(bfe, MII_AN_EXPANSION); in bfe_check_link()
755 if (bfe->bfe_mii_exp == 0xffff) { in bfe_check_link()
756 bfe->bfe_mii_exp = 0; in bfe_check_link()
760 bfe->bfe_chip.link = LINK_STATE_DOWN; in bfe_check_link()
761 bfe->bfe_chip.speed = 0; in bfe_check_link()
762 bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN; in bfe_check_link()
766 bfe->bfe_chip.link = LINK_STATE_UP; in bfe_check_link()
771 bfe->bfe_chip.speed = 100000000; in bfe_check_link()
773 bfe->bfe_chip.speed = 10000000; in bfe_check_link()
776 bfe->bfe_chip.duplex = LINK_DUPLEX_FULL; in bfe_check_link()
778 bfe->bfe_chip.duplex = LINK_DUPLEX_HALF; in bfe_check_link()
782 bfe->bfe_chip.speed = 0; in bfe_check_link()
783 bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN; in bfe_check_link()
785 bfe->bfe_chip.speed = 100000000; in bfe_check_link()
786 bfe->bfe_chip.duplex = LINK_DUPLEX_FULL; in bfe_check_link()
788 bfe->bfe_chip.speed = 100000000; in bfe_check_link()
789 bfe->bfe_chip.duplex = LINK_DUPLEX_HALF; in bfe_check_link()
791 bfe->bfe_chip.speed = 100000000; in bfe_check_link()
792 bfe->bfe_chip.duplex = LINK_DUPLEX_HALF; in bfe_check_link()
794 bfe->bfe_chip.speed = 10000000; in bfe_check_link()
795 bfe->bfe_chip.duplex = LINK_DUPLEX_FULL; in bfe_check_link()
797 bfe->bfe_chip.speed = 10000000; in bfe_check_link()
798 bfe->bfe_chip.duplex = LINK_DUPLEX_HALF; in bfe_check_link()
800 bfe->bfe_chip.speed = 0; in bfe_check_link()
801 bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN; in bfe_check_link()
809 if (speed != bfe->bfe_chip.speed || in bfe_check_link()
810 duplex != bfe->bfe_chip.duplex || in bfe_check_link()
811 link != bfe->bfe_chip.link) { in bfe_check_link()
819 bfe_cam_write(bfe_t *bfe, uchar_t *d, int index) in bfe_cam_write() argument
828 OUTL(bfe, BFE_CAM_DATA_LO, v); in bfe_cam_write()
833 OUTL(bfe, BFE_CAM_DATA_HI, v); in bfe_cam_write()
834 OUTL(bfe, BFE_CAM_CTRL, (BFE_CAM_WRITE | in bfe_cam_write()
836 (void) bfe_wait_bit(bfe, BFE_CAM_CTRL, BFE_CAM_BUSY, 10, 1); in bfe_cam_write()
843 bfe_chip_halt(bfe_t *bfe) in bfe_chip_halt() argument
848 OUTL(bfe, BFE_INTR_MASK, 0); in bfe_chip_halt()
849 FLUSH(bfe, BFE_INTR_MASK); in bfe_chip_halt()
851 OUTL(bfe, BFE_ENET_CTRL, BFE_ENET_DISABLE); in bfe_chip_halt()
856 (void) bfe_wait_bit(bfe, BFE_ENET_CTRL, BFE_ENET_DISABLE, 20, 1); in bfe_chip_halt()
861 OUTL(bfe, BFE_DMARX_CTRL, 0); in bfe_chip_halt()
862 OUTL(bfe, BFE_DMATX_CTRL, 0); in bfe_chip_halt()
866 bfe->bfe_chip_state = BFE_CHIP_HALT; in bfe_chip_halt()
870 bfe_chip_restart(bfe_t *bfe) in bfe_chip_restart() argument
872 DTRACE_PROBE2(chip__restart, int, bfe->bfe_unit, in bfe_chip_restart()
873 int, bfe->bfe_chip_action); in bfe_chip_restart()
878 bfe_chip_halt(bfe); in bfe_chip_restart()
879 bfe_stop_phy(bfe); in bfe_chip_restart()
880 bfe->bfe_chip_state = BFE_CHIP_STOPPED; in bfe_chip_restart()
885 bfe_init_vars(bfe); in bfe_chip_restart()
890 bfe_chip_reset(bfe); in bfe_chip_restart()
895 bfe_tx_desc_init(&bfe->bfe_tx_ring); in bfe_chip_restart()
896 bfe_rx_desc_init(&bfe->bfe_rx_ring); in bfe_chip_restart()
898 bfe->bfe_chip_state = BFE_CHIP_ACTIVE; in bfe_chip_restart()
899 bfe_set_rx_mode(bfe); in bfe_chip_restart()
900 bfe_enable_chip_intrs(bfe); in bfe_chip_restart()
907 bfe_core_disable(bfe_t *bfe) in bfe_core_disable() argument
909 if ((INL(bfe, BFE_SBTMSLOW) & BFE_RESET)) in bfe_core_disable()
912 OUTL(bfe, BFE_SBTMSLOW, (BFE_REJECT | BFE_CLOCK)); in bfe_core_disable()
913 (void) bfe_wait_bit(bfe, BFE_SBTMSLOW, BFE_REJECT, 100, 0); in bfe_core_disable()
914 (void) bfe_wait_bit(bfe, BFE_SBTMSHIGH, BFE_BUSY, 100, 1); in bfe_core_disable()
915 OUTL(bfe, BFE_SBTMSLOW, (BFE_FGC | BFE_CLOCK | BFE_REJECT | BFE_RESET)); in bfe_core_disable()
916 FLUSH(bfe, BFE_SBTMSLOW); in bfe_core_disable()
918 OUTL(bfe, BFE_SBTMSLOW, (BFE_REJECT | BFE_RESET)); in bfe_core_disable()
926 bfe_core_reset(bfe_t *bfe) in bfe_core_reset() argument
933 bfe_core_disable(bfe); in bfe_core_reset()
935 OUTL(bfe, BFE_SBTMSLOW, (BFE_RESET | BFE_CLOCK | BFE_FGC)); in bfe_core_reset()
936 FLUSH(bfe, BFE_SBTMSLOW); in bfe_core_reset()
939 if (INL(bfe, BFE_SBTMSHIGH) & BFE_SERR) in bfe_core_reset()
940 OUTL(bfe, BFE_SBTMSHIGH, 0); in bfe_core_reset()
942 val = INL(bfe, BFE_SBIMSTATE); in bfe_core_reset()
944 OUTL(bfe, BFE_SBIMSTATE, val & ~(BFE_IBE | BFE_TO)); in bfe_core_reset()
946 OUTL(bfe, BFE_SBTMSLOW, (BFE_CLOCK | BFE_FGC)); in bfe_core_reset()
947 FLUSH(bfe, BFE_SBTMSLOW); in bfe_core_reset()
950 OUTL(bfe, BFE_SBTMSLOW, BFE_CLOCK); in bfe_core_reset()
951 FLUSH(bfe, BFE_SBTMSLOW); in bfe_core_reset()
956 bfe_setup_config(bfe_t *bfe, uint32_t cores) in bfe_setup_config() argument
963 bar_orig = pci_config_get32(bfe->bfe_conf_handle, BFE_BAR0_WIN); in bfe_setup_config()
964 pci_config_put32(bfe->bfe_conf_handle, BFE_BAR0_WIN, BFE_REG_PCI); in bfe_setup_config()
967 val = INL(bfe, BFE_SBIDHIGH) & BFE_IDH_CORE; in bfe_setup_config()
969 val = INL(bfe, BFE_SBINTVEC); in bfe_setup_config()
971 OUTL(bfe, BFE_SBINTVEC, val); in bfe_setup_config()
973 val = INL(bfe, BFE_SSB_PCI_TRANS_2); in bfe_setup_config()
975 OUTL(bfe, BFE_SSB_PCI_TRANS_2, val); in bfe_setup_config()
980 pci_config_put32(bfe->bfe_conf_handle, BFE_BAR0_WIN, bar_orig); in bfe_setup_config()
987 bfe_chip_reset(bfe_t *bfe) in bfe_chip_reset() argument
992 bfe_setup_config(bfe, BFE_INTVEC_ENET0); in bfe_chip_reset()
995 val = INL(bfe, BFE_SBTMSLOW) & in bfe_chip_reset()
999 OUTL(bfe, BFE_RCV_LAZY, 0); in bfe_chip_reset()
1000 OUTL(bfe, BFE_ENET_CTRL, BFE_ENET_DISABLE); in bfe_chip_reset()
1001 (void) bfe_wait_bit(bfe, BFE_ENET_CTRL, in bfe_chip_reset()
1003 OUTL(bfe, BFE_DMATX_CTRL, 0); in bfe_chip_reset()
1004 FLUSH(bfe, BFE_DMARX_STAT); in bfe_chip_reset()
1006 if (INL(bfe, BFE_DMARX_STAT) & BFE_STAT_EMASK) { in bfe_chip_reset()
1007 (void) bfe_wait_bit(bfe, BFE_DMARX_STAT, BFE_STAT_SIDLE, in bfe_chip_reset()
1010 OUTL(bfe, BFE_DMARX_CTRL, 0); in bfe_chip_reset()
1013 bfe_core_reset(bfe); in bfe_chip_reset()
1014 bfe_clear_stats(bfe); in bfe_chip_reset()
1016 OUTL(bfe, BFE_MDIO_CTRL, 0x8d); in bfe_chip_reset()
1017 val = INL(bfe, BFE_DEVCTRL); in bfe_chip_reset()
1019 OUTL(bfe, BFE_ENET_CTRL, BFE_ENET_EPSEL); in bfe_chip_reset()
1020 else if (INL(bfe, BFE_DEVCTRL & BFE_EPR)) { in bfe_chip_reset()
1021 OUTL_AND(bfe, BFE_DEVCTRL, ~BFE_EPR); in bfe_chip_reset()
1025 OUTL_OR(bfe, BFE_MAC_CTRL, BFE_CTRL_CRC32_ENAB | BFE_CTRL_LED); in bfe_chip_reset()
1027 OUTL_AND(bfe, BFE_MAC_CTRL, ~BFE_CTRL_PDOWN); in bfe_chip_reset()
1029 OUTL(bfe, BFE_RCV_LAZY, ((1 << BFE_LAZY_FC_SHIFT) & in bfe_chip_reset()
1032 OUTL_OR(bfe, BFE_RCV_LAZY, 0); in bfe_chip_reset()
1034 OUTL(bfe, BFE_RXMAXLEN, bfe->bfe_rx_ring.r_buf_len); in bfe_chip_reset()
1035 OUTL(bfe, BFE_TXMAXLEN, bfe->bfe_tx_ring.r_buf_len); in bfe_chip_reset()
1037 OUTL(bfe, BFE_TX_WMARK, 56); in bfe_chip_reset()
1040 OUTL(bfe, BFE_DMATX_CTRL, BFE_TX_CTRL_ENABLE); in bfe_chip_reset()
1045 OUTL(bfe, BFE_DMATX_ADDR, in bfe_chip_reset()
1046 bfe->bfe_tx_ring.r_desc_cookie.dmac_laddress + BFE_PCI_DMA); in bfe_chip_reset()
1048 OUTL(bfe, BFE_DMARX_CTRL, (BFE_RX_OFFSET << BFE_RX_CTRL_ROSHIFT) in bfe_chip_reset()
1051 OUTL(bfe, BFE_DMARX_ADDR, in bfe_chip_reset()
1052 bfe->bfe_rx_ring.r_desc_cookie.dmac_laddress + BFE_PCI_DMA); in bfe_chip_reset()
1054 (void) bfe_startup_phy(bfe); in bfe_chip_reset()
1056 bfe->bfe_chip_state = BFE_CHIP_INITIALIZED; in bfe_chip_reset()
1063 bfe_enable_chip_intrs(bfe_t *bfe) in bfe_enable_chip_intrs() argument
1066 OUTL(bfe, BFE_ENET_CTRL, BFE_ENET_ENABLE); in bfe_enable_chip_intrs()
1069 OUTL(bfe, BFE_INTR_MASK, BFE_IMASK_DEF); in bfe_enable_chip_intrs()
1076 bfe_set_rx_mode(bfe_t *bfe) in bfe_set_rx_mode() argument
1086 if (bfe->bfe_chip_state == BFE_CHIP_SUSPENDED) in bfe_set_rx_mode()
1089 val = INL(bfe, BFE_RXCONF); in bfe_set_rx_mode()
1094 if ((bfe->bfe_chip_mode & BFE_RX_MODE_ENABLE) == 0) { in bfe_set_rx_mode()
1095 OUTL(bfe, BFE_CAM_CTRL, 0); in bfe_set_rx_mode()
1096 FLUSH(bfe, BFE_CAM_CTRL); in bfe_set_rx_mode()
1097 } else if (bfe->bfe_chip_mode & BFE_RX_MODE_PROMISC) { in bfe_set_rx_mode()
1101 if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) { in bfe_set_rx_mode()
1103 OUTL(bfe, BFE_RXCONF, val | in bfe_set_rx_mode()
1105 FLUSH(bfe, BFE_RXCONF); in bfe_set_rx_mode()
1109 OUTL(bfe, BFE_CAM_CTRL, 0); in bfe_set_rx_mode()
1110 FLUSH(bfe, BFE_CAM_CTRL); in bfe_set_rx_mode()
1118 bfe_cam_write(bfe, (uchar_t *)mac, i); in bfe_set_rx_mode()
1121 bfe_cam_write(bfe, bfe->bfe_ether_addr, i); in bfe_set_rx_mode()
1124 OUTL_OR(bfe, BFE_CAM_CTRL, BFE_CAM_ENABLE); in bfe_set_rx_mode()
1125 FLUSH(bfe, BFE_CAM_CTRL); in bfe_set_rx_mode()
1128 DTRACE_PROBE2(rx__mode__filter, int, bfe->bfe_unit, in bfe_set_rx_mode()
1131 OUTL(bfe, BFE_RXCONF, val); in bfe_set_rx_mode()
1132 FLUSH(bfe, BFE_RXCONF); in bfe_set_rx_mode()
1139 bfe_init_vars(bfe_t *bfe) in bfe_init_vars() argument
1141 bfe->bfe_chip_mode = BFE_RX_MODE_ENABLE; in bfe_init_vars()
1144 bfe->bfe_chip.link = LINK_STATE_UNKNOWN; in bfe_init_vars()
1145 bfe->bfe_chip.speed = 0; in bfe_init_vars()
1146 bfe->bfe_chip.duplex = LINK_DUPLEX_UNKNOWN; in bfe_init_vars()
1148 bfe->bfe_periodic_id = NULL; in bfe_init_vars()
1149 bfe->bfe_chip_state = BFE_CHIP_UNINITIALIZED; in bfe_init_vars()
1151 bfe->bfe_tx_stall_time = 0; in bfe_init_vars()
1224 bfe_chip_start(bfe_t *bfe) in bfe_chip_start() argument
1226 ASSERT_ALL_LOCKS(bfe); in bfe_chip_start()
1231 bfe_chip_halt(bfe); in bfe_chip_start()
1232 bfe_stop_phy(bfe); in bfe_chip_start()
1237 bfe_chip_reset(bfe); in bfe_chip_start()
1242 bfe_tx_desc_init(&bfe->bfe_tx_ring); in bfe_chip_start()
1243 bfe_rx_desc_init(&bfe->bfe_rx_ring); in bfe_chip_start()
1245 bfe->bfe_chip_state = BFE_CHIP_ACTIVE; in bfe_chip_start()
1246 bfe->bfe_chip_mode |= BFE_RX_MODE_ENABLE; in bfe_chip_start()
1247 bfe_set_rx_mode(bfe); in bfe_chip_start()
1248 bfe_enable_chip_intrs(bfe); in bfe_chip_start()
1251 (void) bfe_check_link(bfe); in bfe_chip_start()
1261 bfe_clear_stats(bfe_t *bfe) in bfe_clear_stats() argument
1265 OUTL(bfe, BFE_MIB_CTRL, BFE_MIB_CLR_ON_READ); in bfe_clear_stats()
1271 (void) INL(bfe, r); in bfe_clear_stats()
1274 (void) INL(bfe, r); in bfe_clear_stats()
1281 bfe_gather_stats(bfe_t *bfe) in bfe_gather_stats() argument
1287 v = &bfe->bfe_hw_stats.tx_good_octets; in bfe_gather_stats()
1289 *v += INL(bfe, r); in bfe_gather_stats()
1293 v = &bfe->bfe_hw_stats.rx_good_octets; in bfe_gather_stats()
1295 *v += INL(bfe, r); in bfe_gather_stats()
1323 bfe->bfe_stats.ether_stat_carrier_errors = in bfe_gather_stats()
1324 bfe->bfe_hw_stats.tx_carrier_lost; in bfe_gather_stats()
1328 bfe->bfe_stats.ether_stat_ex_collisions = in bfe_gather_stats()
1329 bfe->bfe_hw_stats.tx_excessive_cols; in bfe_gather_stats()
1330 txerr += bfe->bfe_hw_stats.tx_excessive_cols; in bfe_gather_stats()
1331 coll += bfe->bfe_hw_stats.tx_excessive_cols; in bfe_gather_stats()
1333 bfe->bfe_stats.ether_stat_fcs_errors = in bfe_gather_stats()
1334 bfe->bfe_hw_stats.rx_crc_errs; in bfe_gather_stats()
1335 rxerr += bfe->bfe_hw_stats.rx_crc_errs; in bfe_gather_stats()
1337 bfe->bfe_stats.ether_stat_first_collisions = in bfe_gather_stats()
1338 bfe->bfe_hw_stats.tx_single_cols; in bfe_gather_stats()
1339 coll += bfe->bfe_hw_stats.tx_single_cols; in bfe_gather_stats()
1340 bfe->bfe_stats.ether_stat_multi_collisions = in bfe_gather_stats()
1341 bfe->bfe_hw_stats.tx_multiple_cols; in bfe_gather_stats()
1342 coll += bfe->bfe_hw_stats.tx_multiple_cols; in bfe_gather_stats()
1344 bfe->bfe_stats.ether_stat_toolong_errors = in bfe_gather_stats()
1345 bfe->bfe_hw_stats.rx_oversize_pkts; in bfe_gather_stats()
1346 rxerr += bfe->bfe_hw_stats.rx_oversize_pkts; in bfe_gather_stats()
1348 bfe->bfe_stats.ether_stat_tooshort_errors = in bfe_gather_stats()
1349 bfe->bfe_hw_stats.rx_undersize; in bfe_gather_stats()
1350 rxerr += bfe->bfe_hw_stats.rx_undersize; in bfe_gather_stats()
1352 bfe->bfe_stats.ether_stat_tx_late_collisions += in bfe_gather_stats()
1353 bfe->bfe_hw_stats.tx_late_cols; in bfe_gather_stats()
1355 bfe->bfe_stats.ether_stat_defer_xmts += in bfe_gather_stats()
1356 bfe->bfe_hw_stats.tx_defered; in bfe_gather_stats()
1358 bfe->bfe_stats.ether_stat_macrcv_errors += rxerr; in bfe_gather_stats()
1359 bfe->bfe_stats.ether_stat_macxmt_errors += txerr; in bfe_gather_stats()
1361 bfe->bfe_stats.collisions += coll; in bfe_gather_stats()
1370 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_getstat() local
1374 rw_enter(&bfe->bfe_rwlock, RW_READER); in bfe_mac_getstat()
1387 if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) { in bfe_mac_getstat()
1391 bfe_gather_stats(bfe); in bfe_mac_getstat()
1393 v = bfe->bfe_chip.speed; in bfe_mac_getstat()
1397 v = bfe->bfe_adv_100T4; in bfe_mac_getstat()
1401 v = (bfe->bfe_mii_anar & MII_ABILITY_100BASE_TX_FD) != 0; in bfe_mac_getstat()
1405 v = (bfe->bfe_mii_anar & MII_ABILITY_100BASE_TX) != 0; in bfe_mac_getstat()
1409 v = (bfe->bfe_mii_anar & MII_ABILITY_10BASE_T_FD) != 0; in bfe_mac_getstat()
1413 v = (bfe->bfe_mii_anar & MII_ABILITY_10BASE_T) != 0; in bfe_mac_getstat()
1421 v = bfe->bfe_adv_aneg; in bfe_mac_getstat()
1425 v = (bfe->bfe_mii_anar & MII_ABILITY_PAUSE) != 0; in bfe_mac_getstat()
1429 v = (bfe->bfe_mii_anar & MII_AN_ADVERT_REMFAULT) != 0; in bfe_mac_getstat()
1434 v = bfe->bfe_stats.ether_stat_align_errors; in bfe_mac_getstat()
1438 v = (bfe->bfe_mii_bmsr & MII_STATUS_100_BASE_T4) != 0; in bfe_mac_getstat()
1442 v = (bfe->bfe_mii_bmsr & MII_STATUS_100_BASEX_FD) != 0; in bfe_mac_getstat()
1446 v = (bfe->bfe_mii_bmsr & MII_STATUS_100_BASEX) != 0; in bfe_mac_getstat()
1450 v = (bfe->bfe_mii_bmsr & MII_STATUS_10_FD) != 0; in bfe_mac_getstat()
1454 v = (bfe->bfe_mii_bmsr & MII_STATUS_10) != 0; in bfe_mac_getstat()
1462 v = ((bfe->bfe_mii_bmsr & MII_STATUS_CANAUTONEG) != 0); in bfe_mac_getstat()
1470 v = (bfe->bfe_mii_bmsr & MII_STATUS_REMFAULT) != 0; in bfe_mac_getstat()
1474 v = bfe->bfe_stats.ether_stat_carrier_errors; in bfe_mac_getstat()
1482 v = bfe->bfe_stats.ether_stat_defer_xmts; in bfe_mac_getstat()
1487 v = bfe->bfe_stats.ether_stat_ex_collisions; in bfe_mac_getstat()
1492 v = bfe->bfe_stats.ether_stat_fcs_errors; in bfe_mac_getstat()
1497 v = bfe->bfe_stats.ether_stat_first_collisions; in bfe_mac_getstat()
1505 v = (bfe->bfe_mii_bmcr & MII_CONTROL_ANE) != 0 && in bfe_mac_getstat()
1506 (bfe->bfe_mii_bmsr & MII_STATUS_ANDONE) != 0; in bfe_mac_getstat()
1510 v = bfe->bfe_chip.duplex; in bfe_mac_getstat()
1514 v = (bfe->bfe_mii_anlpar & MII_ABILITY_100BASE_T4) != 0; in bfe_mac_getstat()
1518 v = (bfe->bfe_mii_anlpar & MII_ABILITY_100BASE_TX_FD) != 0; in bfe_mac_getstat()
1522 v = (bfe->bfe_mii_anlpar & MII_ABILITY_100BASE_TX) != 0; in bfe_mac_getstat()
1526 v = (bfe->bfe_mii_anlpar & MII_ABILITY_10BASE_T_FD) != 0; in bfe_mac_getstat()
1530 v = (bfe->bfe_mii_anlpar & MII_ABILITY_10BASE_T) != 0; in bfe_mac_getstat()
1538 v = (bfe->bfe_mii_exp & MII_AN_EXP_LPCANAN) != 0; in bfe_mac_getstat()
1542 v = (bfe->bfe_mii_anlpar & MII_ABILITY_PAUSE) != 0; in bfe_mac_getstat()
1546 v = (bfe->bfe_mii_anlpar & MII_STATUS_REMFAULT) != 0; in bfe_mac_getstat()
1550 v = bfe->bfe_stats.ether_stat_macrcv_errors; in bfe_mac_getstat()
1554 v = bfe->bfe_stats.ether_stat_macxmt_errors; in bfe_mac_getstat()
1558 v = bfe->bfe_stats.ether_stat_multi_collisions; in bfe_mac_getstat()
1566 v = bfe->bfe_stats.ether_stat_toolong_errors; in bfe_mac_getstat()
1570 v = bfe->bfe_stats.ether_stat_tooshort_errors; in bfe_mac_getstat()
1574 v = bfe->bfe_stats.ether_stat_tx_late_collisions; in bfe_mac_getstat()
1578 v = bfe->bfe_phy_addr; in bfe_mac_getstat()
1582 v = bfe->bfe_phy_id; in bfe_mac_getstat()
1586 v = bfe->bfe_stats.brdcstrcv; in bfe_mac_getstat()
1590 v = bfe->bfe_stats.brdcstxmt; in bfe_mac_getstat()
1594 v = bfe->bfe_stats.multixmt; in bfe_mac_getstat()
1598 v = bfe->bfe_stats.collisions; in bfe_mac_getstat()
1602 v = bfe->bfe_stats.ierrors; in bfe_mac_getstat()
1606 v = bfe->bfe_stats.ipackets; in bfe_mac_getstat()
1610 v = bfe->bfe_stats.multircv; in bfe_mac_getstat()
1614 v = bfe->bfe_stats.norcvbuf; in bfe_mac_getstat()
1618 v = bfe->bfe_stats.noxmtbuf; in bfe_mac_getstat()
1622 v = bfe->bfe_stats.obytes; in bfe_mac_getstat()
1627 v = bfe->bfe_stats.ether_stat_macxmt_errors; in bfe_mac_getstat()
1631 v = bfe->bfe_stats.opackets; in bfe_mac_getstat()
1635 v = bfe->bfe_stats.rbytes; in bfe_mac_getstat()
1639 v = bfe->bfe_stats.underflows; in bfe_mac_getstat()
1643 v = bfe->bfe_stats.overflows; in bfe_mac_getstat()
1647 rw_exit(&bfe->bfe_rwlock); in bfe_mac_getstat()
1657 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_getprop() local
1663 bcopy(&bfe->bfe_chip.duplex, val, sizeof (link_duplex_t)); in bfe_mac_getprop()
1668 bcopy(&bfe->bfe_chip.speed, val, sizeof (uint64_t)); in bfe_mac_getprop()
1672 *(uint8_t *)val = bfe->bfe_adv_aneg; in bfe_mac_getprop()
1676 *(uint8_t *)val = bfe->bfe_adv_100fdx; in bfe_mac_getprop()
1680 *(uint8_t *)val = bfe->bfe_adv_100fdx; in bfe_mac_getprop()
1684 *(uint8_t *)val = bfe->bfe_adv_100hdx; in bfe_mac_getprop()
1688 *(uint8_t *)val = bfe->bfe_adv_100hdx; in bfe_mac_getprop()
1692 *(uint8_t *)val = bfe->bfe_adv_10fdx; in bfe_mac_getprop()
1696 *(uint8_t *)val = bfe->bfe_adv_10fdx; in bfe_mac_getprop()
1700 *(uint8_t *)val = bfe->bfe_adv_10hdx; in bfe_mac_getprop()
1704 *(uint8_t *)val = bfe->bfe_adv_10hdx; in bfe_mac_getprop()
1708 *(uint8_t *)val = bfe->bfe_adv_100T4; in bfe_mac_getprop()
1712 *(uint8_t *)val = bfe->bfe_adv_100T4; in bfe_mac_getprop()
1727 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_propinfo() local
1742 mac_prop_info_set_default_uint8(prh, bfe->bfe_cap_aneg); in bfe_mac_propinfo()
1746 mac_prop_info_set_default_uint8(prh, bfe->bfe_cap_100fdx); in bfe_mac_propinfo()
1750 mac_prop_info_set_default_uint8(prh, bfe->bfe_cap_100hdx); in bfe_mac_propinfo()
1754 mac_prop_info_set_default_uint8(prh, bfe->bfe_cap_10fdx); in bfe_mac_propinfo()
1758 mac_prop_info_set_default_uint8(prh, bfe->bfe_cap_10hdx); in bfe_mac_propinfo()
1769 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_setprop() local
1776 advp = &bfe->bfe_adv_100fdx; in bfe_mac_setprop()
1777 capp = &bfe->bfe_cap_100fdx; in bfe_mac_setprop()
1781 advp = &bfe->bfe_adv_100hdx; in bfe_mac_setprop()
1782 capp = &bfe->bfe_cap_100hdx; in bfe_mac_setprop()
1786 advp = &bfe->bfe_adv_10fdx; in bfe_mac_setprop()
1787 capp = &bfe->bfe_cap_10fdx; in bfe_mac_setprop()
1791 advp = &bfe->bfe_adv_10hdx; in bfe_mac_setprop()
1792 capp = &bfe->bfe_cap_10hdx; in bfe_mac_setprop()
1796 advp = &bfe->bfe_adv_aneg; in bfe_mac_setprop()
1797 capp = &bfe->bfe_cap_aneg; in bfe_mac_setprop()
1807 bfe_grab_locks(bfe); in bfe_mac_setprop()
1812 bfe->bfe_chip_action = BFE_ACTION_RESTART_SETPROP; in bfe_mac_setprop()
1813 if (bfe->bfe_chip_state == BFE_CHIP_ACTIVE) { in bfe_mac_setprop()
1818 bfe_stop_timer(bfe); in bfe_mac_setprop()
1820 bfe->bfe_chip_action |= BFE_ACTION_RESTART; in bfe_mac_setprop()
1822 bfe_chip_restart(bfe); in bfe_mac_setprop()
1828 bfe->bfe_chip_action &= ~(BFE_ACTION_RESTART); in bfe_mac_setprop()
1833 bfe_release_locks(bfe); in bfe_mac_setprop()
1837 mac_tx_update(bfe->bfe_machdl); in bfe_mac_setprop()
1846 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_set_ether_addr() local
1848 bfe_grab_locks(bfe); in bfe_mac_set_ether_addr()
1849 bcopy(ea, bfe->bfe_ether_addr, ETHERADDRL); in bfe_mac_set_ether_addr()
1850 bfe_set_rx_mode(bfe); in bfe_mac_set_ether_addr()
1851 bfe_release_locks(bfe); in bfe_mac_set_ether_addr()
1858 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_start() local
1860 bfe_grab_locks(bfe); in bfe_mac_start()
1861 if (bfe_chip_start(bfe) == DDI_FAILURE) { in bfe_mac_start()
1862 bfe_release_locks(bfe); in bfe_mac_start()
1866 bfe_release_locks(bfe); in bfe_mac_start()
1868 mac_tx_update(bfe->bfe_machdl); in bfe_mac_start()
1876 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_stop() local
1882 bfe_stop_timer(bfe); in bfe_mac_stop()
1884 bfe_grab_locks(bfe); in bfe_mac_stop()
1889 bfe_chip_halt(bfe); in bfe_mac_stop()
1890 bfe_stop_phy(bfe); in bfe_mac_stop()
1892 bfe->bfe_chip_state = BFE_CHIP_STOPPED; in bfe_mac_stop()
1897 bfe_chip_reset(bfe); in bfe_mac_stop()
1902 bfe->bfe_chip_mode &= ~BFE_RX_MODE_ENABLE; in bfe_mac_stop()
1903 bfe_set_rx_mode(bfe); in bfe_mac_stop()
1905 bfe_release_locks(bfe); in bfe_mac_stop()
1912 bfe_send_a_packet(bfe_t *bfe, mblk_t *mp) in bfe_send_a_packet() argument
1914 bfe_ring_t *r = &bfe->bfe_tx_ring; in bfe_send_a_packet()
1938 bfe->bfe_stats.noxmtbuf++; in bfe_send_a_packet()
1939 bfe->bfe_tx_resched = 1; in bfe_send_a_packet()
1955 bfe->bfe_stats.multixmt++; in bfe_send_a_packet()
1957 bfe->bfe_stats.brdcstxmt++; in bfe_send_a_packet()
1959 bfe->bfe_stats.opackets++; in bfe_send_a_packet()
1960 bfe->bfe_stats.obytes += pktlen; in bfe_send_a_packet()
1997 OUTL(bfe, BFE_DMATX_PTR, next * sizeof (bfe_desc_t)); in bfe_send_a_packet()
1998 FLUSH(bfe, BFE_DMATX_PTR); in bfe_send_a_packet()
2006 bfe->bfe_tx_stall_time = gethrtime() + (5 * 1000000000ULL); in bfe_send_a_packet()
2014 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_transmit_packet() local
2015 bfe_ring_t *r = &bfe->bfe_tx_ring; in bfe_mac_transmit_packet()
2020 if (bfe->bfe_chip_state != BFE_CHIP_ACTIVE) { in bfe_mac_transmit_packet()
2021 DTRACE_PROBE1(tx__chip__not__active, int, bfe->bfe_unit); in bfe_mac_transmit_packet()
2033 if (bfe_send_a_packet(bfe, mp) == BFE_FAILURE) { in bfe_mac_transmit_packet()
2048 bfe_t *bfe = (bfe_t *)arg; in bfe_mac_set_promisc() local
2050 bfe_grab_locks(bfe); in bfe_mac_set_promisc()
2051 if (bfe->bfe_chip_state != BFE_CHIP_ACTIVE) { in bfe_mac_set_promisc()
2052 bfe_release_locks(bfe); in bfe_mac_set_promisc()
2058 bfe->bfe_chip_mode |= BFE_RX_MODE_PROMISC; in bfe_mac_set_promisc()
2060 bfe->bfe_chip_mode &= ~BFE_RX_MODE_PROMISC; in bfe_mac_set_promisc()
2063 bfe_set_rx_mode(bfe); in bfe_mac_set_promisc()
2064 bfe_release_locks(bfe); in bfe_mac_set_promisc()
2099 bfe_error_handler(bfe_t *bfe, int intr_mask) in bfe_error_handler() argument
2104 bfe->bfe_stats.overflows++; in bfe_error_handler()
2105 bfe->bfe_chip_action |= in bfe_error_handler()
2111 bfe->bfe_stats.underflows++; in bfe_error_handler()
2117 bfe_error(bfe->bfe_dip, in bfe_error_handler()
2119 bfe->bfe_chip_action |= in bfe_error_handler()
2126 bfe_error(bfe->bfe_dip, "Descriptor Error. Restarting Chip"); in bfe_error_handler()
2132 bfe_error(bfe->bfe_dip, in bfe_error_handler()
2134 bfe->bfe_stats.ether_stat_macrcv_errors++; in bfe_error_handler()
2135 bfe->bfe_chip_action |= in bfe_error_handler()
2140 v = INL(bfe, BFE_DMATX_STAT); in bfe_error_handler()
2144 bfe->bfe_stats.ether_stat_macxmt_errors++; in bfe_error_handler()
2145 bfe_error(bfe->bfe_dip, in bfe_error_handler()
2150 v = INL(bfe, BFE_DMARX_STAT); in bfe_error_handler()
2152 bfe->bfe_stats.ierrors++; in bfe_error_handler()
2153 bfe_error(bfe->bfe_dip, in bfe_error_handler()
2158 bfe->bfe_chip_action |= in bfe_error_handler()
2162 bfe_chip_halt(bfe); in bfe_error_handler()
2169 bfe_rx_desc_buf_reinit(bfe_t *bfe, uint_t slot) in bfe_rx_desc_buf_reinit() argument
2171 bfe_ring_t *r = &bfe->bfe_rx_ring; in bfe_rx_desc_buf_reinit()
2197 bfe_receive(bfe_t *bfe, int intr_mask) in bfe_receive() argument
2204 bfe_ring_t *r = &bfe->bfe_rx_ring; in bfe_receive()
2207 rxstat = INL(bfe, BFE_DMARX_STAT); in bfe_receive()
2213 DTRACE_PROBE3(receive, int, bfe->bfe_unit, in bfe_receive()
2247 bfe_rx_desc_buf_reinit(bfe, i); in bfe_receive()
2269 bfe->bfe_stats.ipackets++; in bfe_receive()
2272 bfe->bfe_stats.rbytes += len; in bfe_receive()
2275 bfe->bfe_stats.brdcstrcv++; in bfe_receive()
2277 bfe->bfe_stats.multircv++; in bfe_receive()
2279 bfe->bfe_stats.norcvbuf++; in bfe_receive()
2281 bfe_rx_desc_buf_reinit(bfe, i); in bfe_receive()
2289 bfe_rx_desc_buf_reinit(bfe, i); in bfe_receive()
2345 bfe_tx_done(bfe_t *bfe, int intr_mask) in bfe_tx_done() argument
2347 bfe_ring_t *r = &bfe->bfe_tx_ring; in bfe_tx_done()
2353 if (bfe->bfe_tx_resched) { in bfe_tx_done()
2355 bfe->bfe_tx_resched = 0; in bfe_tx_done()
2368 bfe_t *bfe = (void *)arg1; in bfe_interrupt() local
2377 rw_enter(&bfe->bfe_rwlock, RW_READER); in bfe_interrupt()
2383 intr_stat = INL(bfe, BFE_INTR_STAT); in bfe_interrupt()
2385 OUTL(bfe, BFE_INTR_STAT, intr_stat); in bfe_interrupt()
2386 (void) INL(bfe, BFE_INTR_STAT); in bfe_interrupt()
2389 rw_exit(&bfe->bfe_rwlock); in bfe_interrupt()
2393 DTRACE_PROBE2(bfe__interrupt, int, bfe->bfe_unit, in bfe_interrupt()
2396 if (bfe->bfe_chip_state != BFE_CHIP_ACTIVE) { in bfe_interrupt()
2400 if (bfe->bfe_chip_state == BFE_CHIP_SUSPENDED) { in bfe_interrupt()
2401 rw_exit(&bfe->bfe_rwlock); in bfe_interrupt()
2403 bfe->bfe_unit); in bfe_interrupt()
2410 bfe_chip_halt(bfe); in bfe_interrupt()
2411 rw_exit(&bfe->bfe_rwlock); in bfe_interrupt()
2413 bfe->bfe_unit); in bfe_interrupt()
2419 rx_head = bfe_receive(bfe, intr_stat); in bfe_interrupt()
2424 resched = bfe_tx_done(bfe, intr_stat); in bfe_interrupt()
2429 bfe_error_handler(bfe, intr_stat); in bfe_interrupt()
2432 rw_exit(&bfe->bfe_rwlock); in bfe_interrupt()
2438 mac_rx(bfe->bfe_machdl, 0, rx_head); in bfe_interrupt()
2445 mac_tx_update(bfe->bfe_machdl); in bfe_interrupt()
2454 bfe_remove_intr(bfe_t *bfe) in bfe_remove_intr() argument
2456 (void) ddi_intr_remove_handler(bfe->bfe_intrhdl); in bfe_remove_intr()
2457 (void) ddi_intr_free(bfe->bfe_intrhdl); in bfe_remove_intr()
2464 bfe_add_intr(bfe_t *bfe) in bfe_add_intr() argument
2469 ret = ddi_intr_alloc(bfe->bfe_dip, &bfe->bfe_intrhdl, in bfe_add_intr()
2477 bfe_error(bfe->bfe_dip, "ddi_intr_alloc() failed" in bfe_add_intr()
2482 ret = ddi_intr_add_handler(bfe->bfe_intrhdl, bfe_interrupt, bfe, NULL); in bfe_add_intr()
2484 bfe_error(bfe->bfe_dip, "ddi_intr_add_handler() failed"); in bfe_add_intr()
2485 (void) ddi_intr_free(bfe->bfe_intrhdl); in bfe_add_intr()
2489 ret = ddi_intr_get_pri(bfe->bfe_intrhdl, &bfe->bfe_intrpri); in bfe_add_intr()
2491 bfe_error(bfe->bfe_dip, "ddi_intr_get_pri() failed"); in bfe_add_intr()
2492 bfe_remove_intr(bfe); in bfe_add_intr()
2504 bfe_identify_hardware(bfe_t *bfe) in bfe_identify_hardware() argument
2509 vid = pci_config_get16(bfe->bfe_conf_handle, PCI_CONF_VENID); in bfe_identify_hardware()
2510 did = pci_config_get16(bfe->bfe_conf_handle, PCI_CONF_DEVID); in bfe_identify_hardware()
2519 bfe_error(bfe->bfe_dip, "bfe driver is attaching to unknown pci%d,%d" in bfe_identify_hardware()
2529 bfe_regs_map(bfe_t *bfe) in bfe_regs_map() argument
2531 dev_info_t *dip = bfe->bfe_dip; in bfe_regs_map()
2534 ret = ddi_regs_map_setup(dip, 1, &bfe->bfe_mem_regset.addr, 0, 0, in bfe_regs_map()
2535 &bfe_dev_attr, &bfe->bfe_mem_regset.hdl); in bfe_regs_map()
2538 bfe_error(bfe->bfe_dip, "ddi_regs_map_setup failed"); in bfe_regs_map()
2546 bfe_unmap_regs(bfe_t *bfe) in bfe_unmap_regs() argument
2548 ddi_regs_map_free(&bfe->bfe_mem_regset.hdl); in bfe_unmap_regs()
2552 bfe_get_chip_config(bfe_t *bfe) in bfe_get_chip_config() argument
2561 prom[i] = INL(bfe, BFE_EEPROM_BASE + i * sizeof (uint32_t)); in bfe_get_chip_config()
2564 bfe->bfe_dev_addr[0] = bfe->bfe_ether_addr[0] = in bfe_get_chip_config()
2565 INB(bfe, BFE_EEPROM_BASE + 79); in bfe_get_chip_config()
2567 bfe->bfe_dev_addr[1] = bfe->bfe_ether_addr[1] = in bfe_get_chip_config()
2568 INB(bfe, BFE_EEPROM_BASE + 78); in bfe_get_chip_config()
2570 bfe->bfe_dev_addr[2] = bfe->bfe_ether_addr[2] = in bfe_get_chip_config()
2571 INB(bfe, BFE_EEPROM_BASE + 81); in bfe_get_chip_config()
2573 bfe->bfe_dev_addr[3] = bfe->bfe_ether_addr[3] = in bfe_get_chip_config()
2574 INB(bfe, BFE_EEPROM_BASE + 80); in bfe_get_chip_config()
2576 bfe->bfe_dev_addr[4] = bfe->bfe_ether_addr[4] = in bfe_get_chip_config()
2577 INB(bfe, BFE_EEPROM_BASE + 83); in bfe_get_chip_config()
2579 bfe->bfe_dev_addr[5] = bfe->bfe_ether_addr[5] = in bfe_get_chip_config()
2580 INB(bfe, BFE_EEPROM_BASE + 82); in bfe_get_chip_config()
2582 bfe->bfe_phy_addr = -1; in bfe_get_chip_config()
2591 bfe_ring_buf_alloc(bfe_t *bfe, bfe_ring_t *r, int slot, int d) in bfe_ring_buf_alloc() argument
2596 err = ddi_dma_alloc_handle(bfe->bfe_dip, in bfe_ring_buf_alloc()
2601 bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :" in bfe_ring_buf_alloc()
2613 bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :" in bfe_ring_buf_alloc()
2627 bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :" in bfe_ring_buf_alloc()
2633 bfe_error(bfe->bfe_dip, " bfe_ring_buf_alloc() :" in bfe_ring_buf_alloc()
2683 bfe_ring_desc_alloc(bfe_t *bfe, bfe_ring_t *r, int d) in bfe_ring_desc_alloc() argument
2691 ASSERT(bfe != NULL); in bfe_ring_desc_alloc()
2698 err = ddi_dma_alloc_handle(bfe->bfe_dip, &bfe_dma_attr_desc, in bfe_ring_desc_alloc()
2702 bfe_error(bfe->bfe_dip, "bfe_ring_desc_alloc() failed on" in bfe_ring_desc_alloc()
2715 bfe_error(bfe->bfe_dip, "bfe_ring_desc_alloc() failed on" in bfe_ring_desc_alloc()
2729 bfe_error(bfe->bfe_dip, "bfe_ring_desc_alloc() failed on" in bfe_ring_desc_alloc()
2755 if (bfe_ring_buf_alloc(bfe, r, i, d) != DDI_SUCCESS) { in bfe_ring_desc_alloc()
2776 bfe_rings_alloc(bfe_t *bfe) in bfe_rings_alloc() argument
2779 mutex_init(&bfe->bfe_tx_ring.r_lock, NULL, MUTEX_DRIVER, NULL); in bfe_rings_alloc()
2780 bfe->bfe_tx_ring.r_lockp = &bfe->bfe_tx_ring.r_lock; in bfe_rings_alloc()
2781 bfe->bfe_tx_ring.r_buf_len = BFE_MTU + sizeof (struct ether_header) + in bfe_rings_alloc()
2783 bfe->bfe_tx_ring.r_ndesc = TX_NUM_DESC; in bfe_rings_alloc()
2784 bfe->bfe_tx_ring.r_bfe = bfe; in bfe_rings_alloc()
2785 bfe->bfe_tx_ring.r_avail_desc = TX_NUM_DESC; in bfe_rings_alloc()
2788 mutex_init(&bfe->bfe_rx_ring.r_lock, NULL, MUTEX_DRIVER, NULL); in bfe_rings_alloc()
2789 bfe->bfe_rx_ring.r_lockp = &bfe->bfe_rx_ring.r_lock; in bfe_rings_alloc()
2790 bfe->bfe_rx_ring.r_buf_len = BFE_MTU + sizeof (struct ether_header) + in bfe_rings_alloc()
2792 bfe->bfe_rx_ring.r_ndesc = RX_NUM_DESC; in bfe_rings_alloc()
2793 bfe->bfe_rx_ring.r_bfe = bfe; in bfe_rings_alloc()
2794 bfe->bfe_rx_ring.r_avail_desc = RX_NUM_DESC; in bfe_rings_alloc()
2797 if (bfe_ring_desc_alloc(bfe, &bfe->bfe_tx_ring, in bfe_rings_alloc()
2802 if (bfe_ring_desc_alloc(bfe, &bfe->bfe_rx_ring, in bfe_rings_alloc()
2805 bfe_ring_desc_free(&bfe->bfe_tx_ring); in bfe_rings_alloc()
2809 bfe->bfe_tx_ring.r_flags = BFE_RING_ALLOCATED; in bfe_rings_alloc()
2810 bfe->bfe_rx_ring.r_flags = BFE_RING_ALLOCATED; in bfe_rings_alloc()
2818 bfe_t *bfe; in bfe_resume() local
2821 if ((bfe = ddi_get_driver_private(dip)) == NULL) { in bfe_resume()
2830 bfe_grab_locks(bfe); in bfe_resume()
2831 bfe->bfe_chip_state = BFE_CHIP_RESUME; in bfe_resume()
2833 bfe_init_vars(bfe); in bfe_resume()
2835 bfe_chip_reset(bfe); in bfe_resume()
2836 if (bfe_chip_start(bfe) == DDI_FAILURE) { in bfe_resume()
2841 bfe_release_locks(bfe); in bfe_resume()
2844 mac_tx_update(bfe->bfe_machdl); in bfe_resume()
2853 bfe_t *bfe; in bfe_attach() local
2871 bfe = kmem_zalloc(sizeof (bfe_t), KM_SLEEP); in bfe_attach()
2872 bfe->bfe_dip = dip; in bfe_attach()
2873 bfe->bfe_unit = unit; in bfe_attach()
2875 if (pci_config_setup(dip, &bfe->bfe_conf_handle) != DDI_SUCCESS) { in bfe_attach()
2883 ret = pci_config_get16(bfe->bfe_conf_handle, PCI_CONF_COMM); in bfe_attach()
2884 pci_config_put16(bfe->bfe_conf_handle, PCI_CONF_COMM, in bfe_attach()
2887 ddi_set_driver_private(dip, bfe); in bfe_attach()
2890 if (bfe_identify_hardware(bfe) == BFE_FAILURE) { in bfe_attach()
2895 if (bfe_regs_map(bfe) != DDI_SUCCESS) { in bfe_attach()
2900 (void) bfe_get_chip_config(bfe); in bfe_attach()
2911 macreg->m_driver = bfe; in bfe_attach()
2914 macreg->m_src_addr = bfe->bfe_ether_addr; in bfe_attach()
2920 if ((ret = mac_register(macreg, &bfe->bfe_machdl)) != 0) { in bfe_attach()
2928 rw_init(&bfe->bfe_rwlock, NULL, RW_DRIVER, in bfe_attach()
2929 DDI_INTR_PRI(bfe->bfe_intrpri)); in bfe_attach()
2931 if (bfe_add_intr(bfe) != DDI_SUCCESS) { in bfe_attach()
2936 if (bfe_rings_alloc(bfe) != DDI_SUCCESS) { in bfe_attach()
2942 bfe->bfe_chip_action = 0; in bfe_attach()
2943 bfe_init_vars(bfe); in bfe_attach()
2946 bfe_chip_reset(bfe); in bfe_attach()
2952 if (ddi_intr_enable(bfe->bfe_intrhdl) != DDI_SUCCESS) { in bfe_attach()
2960 bfe_remove_intr(bfe); in bfe_attach()
2962 (void) mac_unregister(bfe->bfe_machdl); in bfe_attach()
2964 bfe_unmap_regs(bfe); in bfe_attach()
2966 pci_config_teardown(&bfe->bfe_conf_handle); in bfe_attach()
2968 kmem_free(bfe, sizeof (bfe_t)); in bfe_attach()
2975 bfe_t *bfe; in bfe_detach() local
2977 bfe = ddi_get_driver_private(devinfo); in bfe_detach()
2985 bfe_stop_timer(bfe); in bfe_detach()
2991 if (mac_unregister(bfe->bfe_machdl) != DDI_SUCCESS) in bfe_detach()
2994 bfe->bfe_machdl = NULL; in bfe_detach()
2999 bfe_grab_locks(bfe); in bfe_detach()
3000 bfe_chip_halt(bfe); in bfe_detach()
3001 bfe_stop_phy(bfe); in bfe_detach()
3002 bfe_release_locks(bfe); in bfe_detach()
3004 (void) ddi_intr_disable(bfe->bfe_intrhdl); in bfe_detach()
3007 bfe_stop_timer(bfe); in bfe_detach()
3012 if (bfe->bfe_tx_ring.r_flags == BFE_RING_ALLOCATED) { in bfe_detach()
3014 bfe_buffer_free(&bfe->bfe_tx_ring); in bfe_detach()
3015 bfe_ring_desc_free(&bfe->bfe_tx_ring); in bfe_detach()
3018 if (bfe->bfe_rx_ring.r_flags == BFE_RING_ALLOCATED) { in bfe_detach()
3020 bfe_buffer_free(&bfe->bfe_rx_ring); in bfe_detach()
3021 bfe_ring_desc_free(&bfe->bfe_rx_ring); in bfe_detach()
3024 bfe_remove_intr(bfe); in bfe_detach()
3025 bfe_unmap_regs(bfe); in bfe_detach()
3026 pci_config_teardown(&bfe->bfe_conf_handle); in bfe_detach()
3028 mutex_destroy(&bfe->bfe_tx_ring.r_lock); in bfe_detach()
3029 mutex_destroy(&bfe->bfe_rx_ring.r_lock); in bfe_detach()
3030 rw_destroy(&bfe->bfe_rwlock); in bfe_detach()
3032 kmem_free(bfe, sizeof (bfe_t)); in bfe_detach()
3042 bfe_stop_timer(bfe); in bfe_detach()
3047 bfe_grab_locks(bfe); in bfe_detach()
3048 bfe_chip_halt(bfe); in bfe_detach()
3049 bfe_stop_phy(bfe); in bfe_detach()
3050 bfe->bfe_chip_state = BFE_CHIP_SUSPENDED; in bfe_detach()
3051 bfe_release_locks(bfe); in bfe_detach()
3066 bfe_t *bfe; in bfe_quiesce() local
3068 bfe = ddi_get_driver_private(dev_info); in bfe_quiesce()
3070 bfe_chip_halt(bfe); in bfe_quiesce()
3071 bfe_stop_phy(bfe); in bfe_quiesce()
3072 bfe->bfe_chip_state = BFE_CHIP_QUIESCED; in bfe_quiesce()