Lines Matching refs:dnetp
123 static void write_gpr(struct dnetinstance *dnetp, uint32_t val);
176 static void dnet_parse_srom(struct dnetinstance *dnetp, SROM_FORMAT *sr,
178 static void parse_controller_leaf(struct dnetinstance *dnetp, LEAF_FORMAT *leaf,
180 static uchar_t *parse_media_block(struct dnetinstance *dnetp,
201 uint32_t dnet_usecelapsed(struct dnetinstance *dnetp);
508 struct dnetinstance *dnetp; /* Our private device info */ in dnet_attach() local
524 dnetp = ddi_get_driver_private(devinfo); in dnet_attach()
526 mutex_enter(&dnetp->intrlock); in dnet_attach()
527 mutex_enter(&dnetp->txlock); in dnet_attach()
528 dnet_reset_board(dnetp); in dnet_attach()
529 dnet_init_board(dnetp); in dnet_attach()
530 dnetp->suspended = B_FALSE; in dnet_attach()
532 if (dnetp->running) { in dnet_attach()
533 dnetp->need_tx_update = B_FALSE; in dnet_attach()
534 mutex_exit(&dnetp->txlock); in dnet_attach()
535 (void) dnet_start(dnetp); in dnet_attach()
536 mutex_exit(&dnetp->intrlock); in dnet_attach()
537 mac_tx_update(dnetp->mac_handle); in dnet_attach()
539 mutex_exit(&dnetp->txlock); in dnet_attach()
540 mutex_exit(&dnetp->intrlock); in dnet_attach()
576 dnetp = kmem_zalloc(sizeof (struct dnetinstance), KM_SLEEP); in dnet_attach()
577 ddi_set_driver_private(devinfo, dnetp); in dnet_attach()
580 if (ddi_regs_map_setup(devinfo, DNET_PCI_RNUMBER, &dnetp->io_reg, in dnet_attach()
581 0, 0, &accattr, &dnetp->io_handle) != DDI_SUCCESS) { in dnet_attach()
582 kmem_free(dnetp, sizeof (struct dnetinstance)); in dnet_attach()
586 dnetp->devinfo = devinfo; in dnet_attach()
587 dnetp->board_type = deviceid; in dnet_attach()
592 if (ddi_get_iblock_cookie(devinfo, 0, &dnetp->icookie) in dnet_attach()
604 mutex_init(&dnetp->txlock, NULL, MUTEX_DRIVER, dnetp->icookie); in dnet_attach()
605 mutex_init(&dnetp->intrlock, NULL, MUTEX_DRIVER, dnetp->icookie); in dnet_attach()
610 dnetp->bnc_indicator = in dnet_attach()
619 dnetp->speed = in dnet_attach()
622 dnetp->full_duplex = in dnet_attach()
626 if (dnetp->speed == 100) { in dnet_attach()
627 dnetp->disallowed_media |= (1UL<<MEDIA_TP) | (1UL<<MEDIA_TP_FD); in dnet_attach()
628 } else if (dnetp->speed == 10) { in dnet_attach()
629 dnetp->disallowed_media |= in dnet_attach()
633 if (dnetp->full_duplex == 1) { in dnet_attach()
634 dnetp->disallowed_media |= in dnet_attach()
636 } else if (dnetp->full_duplex == 0) { in dnet_attach()
637 dnetp->disallowed_media |= in dnet_attach()
641 if (dnetp->bnc_indicator == 0) /* Disable BNC and AUI media */ in dnet_attach()
642 dnetp->disallowed_media |= (1UL<<MEDIA_BNC) | (1UL<<MEDIA_AUI); in dnet_attach()
643 else if (dnetp->bnc_indicator == 1) /* Force BNC only */ in dnet_attach()
644 dnetp->disallowed_media = (uint32_t)~(1U<<MEDIA_BNC); in dnet_attach()
645 else if (dnetp->bnc_indicator == 2) /* Force AUI only */ in dnet_attach()
646 dnetp->disallowed_media = (uint32_t)~(1U<<MEDIA_AUI); in dnet_attach()
648 dnet_reset_board(dnetp); in dnet_attach()
650 secondary = dnet_read_srom(devinfo, dnetp->board_type, dnetp->io_handle, in dnet_attach()
651 dnetp->io_reg, vendor_info, sizeof (vendor_info)); in dnet_attach()
656 dnet_parse_srom(dnetp, &dnetp->sr, vendor_info); in dnet_attach()
660 dnet_print_srom(&dnetp->sr); in dnet_attach()
662 dnetp->sr.netaddr[ETHERADDRL-1] += secondary; /* unique ether addr */ in dnet_attach()
664 BCOPY((caddr_t)dnetp->sr.netaddr, in dnet_attach()
665 (caddr_t)dnetp->vendor_addr, ETHERADDRL); in dnet_attach()
667 BCOPY((caddr_t)dnetp->sr.netaddr, in dnet_attach()
668 (caddr_t)dnetp->curr_macaddr, ETHERADDRL); in dnet_attach()
674 dnetp->overrun_workaround = in dnet_attach()
675 ((dnetp->board_type == DEVICE_ID_21140 && revid >= 0x20) || in dnet_attach()
676 (dnetp->board_type == DEVICE_ID_21143 && revid <= 0x30)) ? 1 : 0; in dnet_attach()
678 dnetp->overrun_workaround = in dnet_attach()
680 ofloprob_propname, dnetp->overrun_workaround); in dnet_attach()
686 if (!dnet_hack_interrupts(dnetp, secondary)) { in dnet_attach()
688 NULL, dnet_intr, (caddr_t)dnetp); in dnet_attach()
691 dnetp->max_tx_desc = max_tx_desc; in dnet_attach()
692 dnetp->max_rx_desc = max_rx_desc_21040; in dnet_attach()
693 if (dnetp->board_type != DEVICE_ID_21040 && in dnet_attach()
694 dnetp->board_type != DEVICE_ID_21041 && in dnet_attach()
695 dnetp->speed != 10) in dnet_attach()
696 dnetp->max_rx_desc = max_rx_desc_21140; in dnet_attach()
699 if (dnet_alloc_bufs(dnetp) == FAILURE) { in dnet_attach()
711 macp->m_driver = dnetp; in dnet_attach()
713 macp->m_src_addr = dnetp->curr_macaddr; in dnet_attach()
719 if (mac_register(macp, &dnetp->mac_handle) == 0) { in dnet_attach()
722 mutex_enter(&dnetp->intrlock); in dnet_attach()
724 dnetp->phyaddr = -1; in dnet_attach()
725 if (dnetp->board_type == DEVICE_ID_21140 || in dnet_attach()
726 dnetp->board_type == DEVICE_ID_21143) in dnet_attach()
727 do_phy(dnetp); /* Initialize the PHY, if any */ in dnet_attach()
728 find_active_media(dnetp); in dnet_attach()
731 if (dnetp->selected_media_block->media_code != MEDIA_MII && in dnet_attach()
732 dnetp->mii != NULL) { in dnet_attach()
733 mii_destroy(dnetp->mii); in dnet_attach()
734 dnetp->mii = NULL; in dnet_attach()
735 dnetp->phyaddr = -1; in dnet_attach()
741 media_str[dnetp->selected_media_block->media_code]); in dnet_attach()
743 bzero(dnetp->setup_buf_vaddr, SETUPBUF_SIZE); in dnet_attach()
745 dnet_reset_board(dnetp); in dnet_attach()
746 dnet_init_board(dnetp); in dnet_attach()
748 mutex_exit(&dnetp->intrlock); in dnet_attach()
750 (void) dnet_m_unicst(dnetp, dnetp->curr_macaddr); in dnet_attach()
751 (void) dnet_m_multicst(dnetp, B_TRUE, dnet_broadcastaddr); in dnet_attach()
764 dnet_free_bufs(dnetp); in dnet_attach()
766 mutex_destroy(&dnetp->txlock); in dnet_attach()
767 mutex_destroy(&dnetp->intrlock); in dnet_attach()
769 ddi_regs_map_free(&dnetp->io_handle); in dnet_attach()
770 kmem_free(dnetp, sizeof (struct dnetinstance)); in dnet_attach()
781 struct dnetinstance *dnetp; /* Our private device info */ in dnet_detach() local
785 dnetp = ddi_get_driver_private(devinfo); in dnet_detach()
797 mutex_enter(&dnetp->intrlock); in dnet_detach()
798 mutex_enter(&dnetp->txlock); in dnet_detach()
799 dnetp->suspended = B_TRUE; in dnet_detach()
800 dnet_reset_board(dnetp); in dnet_detach()
801 mutex_exit(&dnetp->txlock); in dnet_detach()
802 mutex_exit(&dnetp->intrlock); in dnet_detach()
812 if (mac_unregister(dnetp->mac_handle) != 0) in dnet_detach()
816 dnet_reset_board(dnetp); in dnet_detach()
821 if (dnetp->mii != NULL) in dnet_detach()
822 mii_destroy(dnetp->mii); in dnet_detach()
825 set_leaf(&dnetp->sr, NULL); in dnet_detach()
827 ddi_regs_map_free(&dnetp->io_handle); in dnet_detach()
828 dnet_free_bufs(dnetp); in dnet_detach()
829 mutex_destroy(&dnetp->txlock); in dnet_detach()
830 mutex_destroy(&dnetp->intrlock); in dnet_detach()
831 kmem_free(dnetp, sizeof (struct dnetinstance)); in dnet_detach()
860 struct dnetinstance *dnetp = ddi_get_driver_private(dip); in dnet_quiesce() local
865 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, INT_MASK_REG), 0); in dnet_quiesce()
866 ddi_put32(dnetp->io_handle, in dnet_quiesce()
867 REG32(dnetp->io_reg, BUS_MODE_REG), SW_RESET); in dnet_quiesce()
873 dnet_reset_board(struct dnetinstance *dnetp) in dnet_reset_board() argument
880 val = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_reset_board()
881 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_reset_board()
887 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, INT_MASK_REG), 0); in dnet_reset_board()
888 ddi_put32(dnetp->io_handle, in dnet_reset_board()
889 REG32(dnetp->io_reg, BUS_MODE_REG), SW_RESET); in dnet_reset_board()
899 dnet_init_board(struct dnetinstance *dnetp) in dnet_init_board() argument
901 set_opr(dnetp); in dnet_init_board()
902 set_gpr(dnetp); in dnet_init_board()
903 set_sia(dnetp); in dnet_init_board()
904 dnet_chip_init(dnetp); in dnet_init_board()
909 dnet_chip_init(struct dnetinstance *dnetp) in dnet_chip_init() argument
911 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, BUS_MODE_REG), in dnet_chip_init()
917 dnet_init_txrx_bufs(dnetp); in dnet_chip_init()
922 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, RX_BASE_ADDR_REG), in dnet_chip_init()
923 dnetp->rx_desc_paddr); in dnet_chip_init()
928 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, TX_BASE_ADDR_REG), in dnet_chip_init()
929 dnetp->tx_desc_paddr); in dnet_chip_init()
931 dnetp->tx_current_desc = dnetp->rx_current_desc = 0; in dnet_chip_init()
932 dnetp->transmitted_desc = 0; in dnet_chip_init()
933 dnetp->free_desc = dnetp->max_tx_desc; in dnet_chip_init()
934 enable_interrupts(dnetp); in dnet_chip_init()
942 dnet_start(struct dnetinstance *dnetp) in dnet_start() argument
946 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in dnet_start()
950 val = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_start()
951 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_start()
953 (void) dnet_set_addr(dnetp); in dnet_start()
954 val = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_start()
955 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_start()
957 enable_interrupts(dnetp); in dnet_start()
964 struct dnetinstance *dnetp = arg; in dnet_m_start() local
966 mutex_enter(&dnetp->intrlock); in dnet_m_start()
967 dnetp->running = B_TRUE; in dnet_m_start()
971 if (!dnetp->suspended) in dnet_m_start()
972 (void) dnet_start(dnetp); in dnet_m_start()
973 mutex_exit(&dnetp->intrlock); in dnet_m_start()
980 struct dnetinstance *dnetp = arg; in dnet_m_stop() local
986 mutex_enter(&dnetp->intrlock); in dnet_m_stop()
987 if (!dnetp->suspended) { in dnet_m_stop()
988 val = ddi_get32(dnetp->io_handle, in dnet_m_stop()
989 REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_m_stop()
990 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_m_stop()
993 mac_link_update(dnetp->mac_handle, LINK_STATE_UNKNOWN); in dnet_m_stop()
994 dnetp->running = B_FALSE; in dnet_m_stop()
995 mutex_exit(&dnetp->intrlock); in dnet_m_stop()
1003 dnet_set_addr(struct dnetinstance *dnetp) in dnet_set_addr() argument
1009 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in dnet_set_addr()
1011 val = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_set_addr()
1015 current_desc = dnetp->tx_current_desc; in dnet_set_addr()
1016 desc = &dnetp->tx_desc[current_desc]; in dnet_set_addr()
1018 mutex_enter(&dnetp->txlock); in dnet_set_addr()
1019 dnetp->need_saddr = 0; in dnet_set_addr()
1020 mutex_exit(&dnetp->txlock); in dnet_set_addr()
1022 if ((alloc_descriptor(dnetp)) == FAILURE) { in dnet_set_addr()
1023 mutex_enter(&dnetp->txlock); in dnet_set_addr()
1024 dnetp->need_saddr = 1; in dnet_set_addr()
1025 mutex_exit(&dnetp->txlock); in dnet_set_addr()
1033 desc->buffer1 = dnetp->setup_buf_paddr; in dnet_set_addr()
1045 ddi_put8(dnetp->io_handle, REG8(dnetp->io_reg, TX_POLL_REG), in dnet_set_addr()
1053 struct dnetinstance *dnetp = arg; in dnet_m_unicst() local
1057 mutex_enter(&dnetp->intrlock); in dnet_m_unicst()
1059 bcopy(macaddr, dnetp->curr_macaddr, ETHERADDRL); in dnet_m_unicst()
1078 hashp = (uint32_t *)dnetp->setup_buf_vaddr; in dnet_m_unicst()
1082 index = hashindex((uint8_t *)dnetp->curr_macaddr); in dnet_m_unicst()
1085 if (!dnetp->suspended) in dnet_m_unicst()
1086 (void) dnet_set_addr(dnetp); in dnet_m_unicst()
1087 mutex_exit(&dnetp->intrlock); in dnet_m_unicst()
1094 struct dnetinstance *dnetp = arg; in dnet_m_multicst() local
1099 mutex_enter(&dnetp->intrlock); in dnet_m_multicst()
1101 hashp = (uint32_t *)dnetp->setup_buf_vaddr; in dnet_m_multicst()
1103 if (dnetp->multicast_cnt[index]++) { in dnet_m_multicst()
1104 mutex_exit(&dnetp->intrlock); in dnet_m_multicst()
1109 if (--dnetp->multicast_cnt[index]) { in dnet_m_multicst()
1110 mutex_exit(&dnetp->intrlock); in dnet_m_multicst()
1115 if (!dnetp->suspended) in dnet_m_multicst()
1116 retval = dnet_set_addr(dnetp); in dnet_m_multicst()
1119 mutex_exit(&dnetp->intrlock); in dnet_m_multicst()
1161 struct dnetinstance *dnetp = arg; in dnet_m_setpromisc() local
1164 mutex_enter(&dnetp->intrlock); in dnet_m_setpromisc()
1165 if (dnetp->promisc == on) { in dnet_m_setpromisc()
1166 mutex_exit(&dnetp->intrlock); in dnet_m_setpromisc()
1169 dnetp->promisc = on; in dnet_m_setpromisc()
1171 if (!dnetp->suspended) { in dnet_m_setpromisc()
1172 val = ddi_get32(dnetp->io_handle, in dnet_m_setpromisc()
1173 REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_m_setpromisc()
1175 ddi_put32(dnetp->io_handle, in dnet_m_setpromisc()
1176 REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_m_setpromisc()
1179 ddi_put32(dnetp->io_handle, in dnet_m_setpromisc()
1180 REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_m_setpromisc()
1183 mutex_exit(&dnetp->intrlock); in dnet_m_setpromisc()
1190 struct dnetinstance *dnetp = arg; in dnet_m_getstat() local
1194 if (!dnetp->running) { in dnet_m_getstat()
1197 *val = (dnetp->mii_up ? in dnet_m_getstat()
1198 dnetp->mii_speed : dnetp->speed) * 1000000; in dnet_m_getstat()
1203 *val = dnetp->stat_norcvbuf; in dnet_m_getstat()
1207 *val = dnetp->stat_errrcv; in dnet_m_getstat()
1211 *val = dnetp->stat_errxmt; in dnet_m_getstat()
1215 *val = dnetp->stat_collisions; in dnet_m_getstat()
1219 *val = dnetp->stat_defer; in dnet_m_getstat()
1223 *val = dnetp->stat_nocarrier; in dnet_m_getstat()
1227 *val = dnetp->stat_short; in dnet_m_getstat()
1231 if (!dnetp->running) { in dnet_m_getstat()
1234 } else if (dnetp->mii_up) { in dnet_m_getstat()
1235 *val = dnetp->mii_duplex ? in dnet_m_getstat()
1238 *val = dnetp->full_duplex ? in dnet_m_getstat()
1244 *val = dnetp->stat_xmtlatecoll; in dnet_m_getstat()
1248 *val = dnetp->stat_excoll; in dnet_m_getstat()
1252 *val = dnetp->stat_overflow; in dnet_m_getstat()
1256 *val = dnetp->stat_underflow; in dnet_m_getstat()
1266 #define NextTXIndex(index) (((index)+1) % dnetp->max_tx_desc)
1267 #define PrevTXIndex(index) (((index)-1) < 0 ? dnetp->max_tx_desc - 1: (index)-1)
1272 struct dnetinstance *dnetp = arg; in dnet_m_tx() local
1274 mutex_enter(&dnetp->txlock); in dnet_m_tx()
1277 if (dnetp->suspended) { in dnet_m_tx()
1278 mutex_exit(&dnetp->txlock); in dnet_m_tx()
1283 if (dnetp->need_saddr) { in dnet_m_tx()
1285 mutex_exit(&dnetp->txlock); in dnet_m_tx()
1286 mutex_enter(&dnetp->intrlock); in dnet_m_tx()
1287 (void) dnet_set_addr(dnetp); in dnet_m_tx()
1288 mutex_exit(&dnetp->intrlock); in dnet_m_tx()
1289 mutex_enter(&dnetp->txlock); in dnet_m_tx()
1293 if (!dnet_send(dnetp, mp)) { in dnet_m_tx()
1294 mutex_exit(&dnetp->txlock); in dnet_m_tx()
1300 mutex_exit(&dnetp->txlock); in dnet_m_tx()
1306 mutex_enter(&dnetp->intrlock); in dnet_m_tx()
1308 enable_interrupts(dnetp); in dnet_m_tx()
1313 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, TX_POLL_REG), in dnet_m_tx()
1316 mutex_exit(&dnetp->intrlock); in dnet_m_tx()
1322 dnet_send(struct dnetinstance *dnetp, mblk_t *mp) in dnet_send() argument
1324 struct tx_desc_type *ring = dnetp->tx_desc; in dnet_send()
1333 ASSERT(MUTEX_HELD(&dnetp->txlock)); in dnet_send()
1336 dnet_reclaim_Tx_desc(dnetp); in dnet_send()
1346 index = start_index = dnetp->tx_current_desc; in dnet_send()
1347 avail = dnetp->free_desc; in dnet_send()
1359 retval = ddi_dma_addr_bind_handle(dnetp->dma_handle_tx, NULL, in dnet_send()
1384 if (((ncookies + 1) >> 1) > dnetp->free_desc) { in dnet_send()
1385 (void) ddi_dma_unbind_handle(dnetp->dma_handle_tx); in dnet_send()
1410 dnetp->free_desc--; in dnet_send()
1411 ASSERT(dnetp->free_desc >= 0); in dnet_send()
1416 ddi_dma_nextcookie(dnetp->dma_handle_tx, in dnet_send()
1419 (void) ddi_dma_unbind_handle(dnetp->dma_handle_tx); in dnet_send()
1424 dnetp->stat_defer++; in dnet_send()
1425 dnetp->free_desc = avail; in dnet_send()
1426 dnetp->need_tx_update = B_TRUE; in dnet_send()
1429 dnetp->free_desc = avail; in dnet_send()
1436 dnetp->free_desc = avail; in dnet_send()
1445 dnetp->tx_msgbufp[end_index] = mp; in dnet_send()
1460 dnetp->tx_current_desc = NextTXIndex(end_index); in dnet_send()
1465 ASSERT(ring[dnetp->max_tx_desc-1].desc1.end_of_ring != 0); in dnet_send()
1477 struct dnetinstance *dnetp = (struct dnetinstance *)arg; in dnet_intr() local
1480 mutex_enter(&dnetp->intrlock); in dnet_intr()
1482 if (dnetp->suspended) { in dnet_intr()
1483 mutex_exit(&dnetp->intrlock); in dnet_intr()
1487 int_status = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, in dnet_intr()
1494 mutex_exit(&dnetp->intrlock); in dnet_intr()
1498 dnetp->stat_intr++; in dnet_intr()
1501 ddi_put32(dnetp->io_handle, in dnet_intr()
1502 REG32(dnetp->io_reg, STATUS_REG), GPTIMER_INTR); in dnet_intr()
1503 if (dnetp->timer.cb) in dnet_intr()
1504 dnetp->timer.cb(dnetp); in dnet_intr()
1510 ddi_put32(dnetp->io_handle, in dnet_intr()
1511 REG32(dnetp->io_reg, STATUS_REG), TX_INTR); in dnet_intr()
1512 mutex_enter(&dnetp->txlock); in dnet_intr()
1513 if (dnetp->need_tx_update) { in dnet_intr()
1514 mutex_exit(&dnetp->txlock); in dnet_intr()
1515 mutex_exit(&dnetp->intrlock); in dnet_intr()
1516 mac_tx_update(dnetp->mac_handle); in dnet_intr()
1517 mutex_enter(&dnetp->intrlock); in dnet_intr()
1518 mutex_enter(&dnetp->txlock); in dnet_intr()
1519 dnetp->need_tx_update = B_FALSE; in dnet_intr()
1522 dnet_reclaim_Tx_desc(dnetp); in dnet_intr()
1523 mutex_exit(&dnetp->txlock); in dnet_intr()
1530 ddi_put32(dnetp->io_handle, in dnet_intr()
1531 REG32(dnetp->io_reg, STATUS_REG), in dnet_intr()
1533 dnet_getp(dnetp); in dnet_intr()
1565 dnet_reset_board(dnetp); in dnet_intr()
1566 dnet_init_board(dnetp); in dnet_intr()
1568 (void) dnet_start(dnetp); in dnet_intr()
1576 enable_interrupts(dnetp); in dnet_intr()
1577 mutex_exit(&dnetp->intrlock); in dnet_intr()
1582 dnet_getp(struct dnetinstance *dnetp) in dnet_getp() argument
1587 struct rx_desc_type *desc = dnetp->rx_desc; in dnet_getp()
1588 int marker = dnetp->rx_current_desc; in dnet_getp()
1591 if (!dnetp->overrun_workaround) { in dnet_getp()
1596 misses = ddi_get32(dnetp->io_handle, in dnet_getp()
1597 REG32(dnetp->io_reg, MISSED_FRAME_REG)); in dnet_getp()
1598 dnetp->stat_missed += (misses & MISSED_FRAME_MASK); in dnet_getp()
1602 while (!(desc[dnetp->rx_current_desc].desc0.own)) { in dnet_getp()
1607 index = dnetp->rx_current_desc; in dnet_getp()
1614 if (dnetp->overrun_workaround && in dnet_getp()
1615 marker == dnetp->rx_current_desc) { in dnet_getp()
1618 marker = (marker+1) % dnetp->max_rx_desc; in dnet_getp()
1619 } while (!(dnetp->rx_desc[marker].desc0.own) && in dnet_getp()
1622 misses = ddi_get32(dnetp->io_handle, in dnet_getp()
1623 REG32(dnetp->io_reg, MISSED_FRAME_REG)); in dnet_getp()
1624 dnetp->stat_missed += in dnet_getp()
1631 opn = ddi_get32(dnetp->io_handle, in dnet_getp()
1632 REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_getp()
1633 ddi_put32(dnetp->io_handle, in dnet_getp()
1634 REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_getp()
1639 } while ((ddi_get32(dnetp->io_handle, in dnet_getp()
1640 REG32(dnetp->io_reg, STATUS_REG)) & in dnet_getp()
1647 while (!(dnetp->rx_desc[index].desc0.own)) { in dnet_getp()
1648 dnetp->rx_desc[index].desc0.own = 1; in dnet_getp()
1649 index = (index+1) % dnetp->max_rx_desc; in dnet_getp()
1650 dnetp->stat_missed++; in dnet_getp()
1654 opn = ddi_get32(dnetp->io_handle, in dnet_getp()
1655 REG32(dnetp->io_reg, OPN_MODE_REG)); in dnet_getp()
1656 ddi_put32(dnetp->io_handle, in dnet_getp()
1657 REG32(dnetp->io_reg, OPN_MODE_REG), in dnet_getp()
1659 marker = dnetp->rx_current_desc = index; in dnet_getp()
1673 index = (index + 1) % dnetp->max_rx_desc; in dnet_getp()
1677 while (dnetp->rx_current_desc != index) { in dnet_getp()
1678 desc[dnetp->rx_current_desc].desc0.own = 1; in dnet_getp()
1679 dnetp->rx_current_desc = in dnet_getp()
1680 (dnetp->rx_current_desc + 1) % dnetp->max_rx_desc; in dnet_getp()
1698 dnetp->rx_buf_vaddr[index]; in dnet_getp()
1722 rp = dnet_rbuf_alloc(dnetp->devinfo, 0); in dnet_getp()
1754 update_rx_stats(dnetp, index); in dnet_getp()
1756 dnetp->stat_norcvbuf++; in dnet_getp()
1762 dnetp->rx_current_desc = in dnet_getp()
1763 (dnetp->rx_current_desc+1) % dnetp->max_rx_desc; in dnet_getp()
1766 ddi_put32(dnetp->io_handle, in dnet_getp()
1767 REG32(dnetp->io_reg, RX_POLL_REG), RX_POLL_DEMAND); in dnet_getp()
1775 dnetp->rx_buf_vaddr[index] = newbuf; in dnet_getp()
1776 dnetp->rx_buf_paddr[index] = rp->rbuf_paddr; in dnet_getp()
1781 if ((desc[index].buffer1 & ~dnetp->pgmask) != in dnet_getp()
1782 (end_paddr & ~dnetp->pgmask)) { in dnet_getp()
1784 desc[index].buffer2 = end_paddr&~dnetp->pgmask; in dnet_getp()
1786 (end_paddr & dnetp->pgmask) + 1; in dnet_getp()
1798 desc[dnetp->rx_current_desc].desc0.own = 1; in dnet_getp()
1804 dnetp->rx_current_desc = in dnet_getp()
1805 (dnetp->rx_current_desc+1) % dnetp->max_rx_desc; in dnet_getp()
1808 ddi_put32(dnetp->io_handle, in dnet_getp()
1809 REG32(dnetp->io_reg, RX_POLL_REG), RX_POLL_DEMAND); in dnet_getp()
1812 mutex_exit(&dnetp->intrlock); in dnet_getp()
1813 mac_rx(dnetp->mac_handle, NULL, mp); in dnet_getp()
1814 mutex_enter(&dnetp->intrlock); in dnet_getp()
1821 update_rx_stats(struct dnetinstance *dnetp, int index) in update_rx_stats() argument
1823 struct rx_desc_type *descp = &(dnetp->rx_desc[index]); in update_rx_stats()
1828 dnetp->stat_errrcv++; in update_rx_stats()
1832 dnetp->stat_overflow++; in update_rx_stats()
1843 dnetp->stat_crc++; in update_rx_stats()
1848 dnetp->stat_short++; in update_rx_stats()
1858 dnetp->stat_frame++; in update_rx_stats()
1866 update_tx_stats(struct dnetinstance *dnetp, int index) in update_tx_stats() argument
1868 struct tx_desc_type *descp = &(dnetp->tx_desc[index]); in update_tx_stats()
1870 media_block_t *block = dnetp->selected_media_block; in update_tx_stats()
1874 dnetp->stat_errxmt++; in update_tx_stats()
1877 if (dnetp->mii_up) { in update_tx_stats()
1878 fd = dnetp->mii_duplex; in update_tx_stats()
1886 dnetp->stat_collisions += descp->desc0.collision_count; in update_tx_stats()
1890 dnetp->stat_xmtlatecoll++; in update_tx_stats()
1894 dnetp->stat_excoll++; in update_tx_stats()
1898 dnetp->stat_underflow++; in update_tx_stats()
1908 dnetp->stat_nocarrier++; in update_tx_stats()
1912 dnetp->stat_nocarrier++; in update_tx_stats()
1922 write_gpr(struct dnetinstance *dnetp, uint32_t val) in write_gpr() argument
1928 switch (dnetp->board_type) { in write_gpr()
1934 dnetp->gprsia = (dnetp->gprsia & 0xffff) | (val << 16); in write_gpr()
1935 ddi_put32(dnetp->io_handle, in write_gpr()
1936 REG32(dnetp->io_reg, SIA_GENERAL_REG), dnetp->gprsia); in write_gpr()
1942 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, GP_REG), val); in write_gpr()
1948 read_gpr(struct dnetinstance *dnetp) in read_gpr() argument
1950 switch (dnetp->board_type) { in read_gpr()
1953 return (ddi_get32(dnetp->io_handle, in read_gpr()
1954 REG32(dnetp->io_reg, SIA_GENERAL_REG)) >> 16); in read_gpr()
1956 return (ddi_get32(dnetp->io_handle, in read_gpr()
1957 REG32(dnetp->io_reg, GP_REG))); in read_gpr()
1962 set_gpr(struct dnetinstance *dnetp) in set_gpr() argument
1966 LEAF_FORMAT *leaf = &dnetp->sr.leaf[dnetp->leaf]; in set_gpr()
1967 media_block_t *block = dnetp->selected_media_block; in set_gpr()
1970 if (ddi_getlongprop(DDI_DEV_T_ANY, dnetp->devinfo, in set_gpr()
1974 write_gpr(dnetp, sequence[i]); in set_gpr()
1983 write_gpr(dnetp, block->rstseq[i]); in set_gpr()
1991 write_gpr(dnetp, leaf->gpr | GPR_CONTROL_WRITE); in set_gpr()
1995 write_gpr(dnetp, block->gprseq[i]); in set_gpr()
1999 if (dnetp->phyaddr != -1) in set_gpr()
2001 (void) mii_sync(dnetp->mii, dnetp->phyaddr); in set_gpr()
2008 set_opr(struct dnetinstance *dnetp) in set_opr() argument
2014 media_block_t *block = dnetp->selected_media_block; in set_opr()
2020 if (ddi_prop_op(DDI_DEV_T_ANY, dnetp->devinfo, in set_opr()
2026 if (dnetp->board_type != DEVICE_ID_21040 && in set_opr()
2027 dnetp->board_type != DEVICE_ID_21041) { in set_opr()
2036 ddi_put32(dnetp->io_handle, in set_opr()
2037 REG32(dnetp->io_reg, OPN_MODE_REG), val); in set_opr()
2038 dnet_reset_board(dnetp); in set_opr()
2039 ddi_put32(dnetp->io_handle, in set_opr()
2040 REG32(dnetp->io_reg, OPN_MODE_REG), val); in set_opr()
2052 val |= dnetp->promisc ? PROM_MODE : 0; in set_opr()
2055 val |= ((block->command & CMD_SCR) && !dnetp->disable_scrambler) ? in set_opr()
2059 if (dnetp->mii_up) { in set_opr()
2060 fd = dnetp->mii_duplex; in set_opr()
2078 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), val); in set_opr()
2079 dnet_reset_board(dnetp); in set_opr()
2080 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, OPN_MODE_REG), val); in set_opr()
2084 set_sia(struct dnetinstance *dnetp) in set_sia() argument
2086 media_block_t *block = dnetp->selected_media_block; in set_sia()
2088 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in set_sia()
2099 sia_delay = ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in set_sia()
2102 ddi_put32(dnetp->io_handle, in set_sia()
2103 REG32(dnetp->io_reg, SIA_CONNECT_REG), 0); in set_sia()
2105 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, SIA_TXRX_REG), in set_sia()
2112 dnetp->gprsia = (dnetp->gprsia&0xffff0000)|block->un.sia.csr15; in set_sia()
2113 ddi_put32(dnetp->io_handle, in set_sia()
2114 REG32(dnetp->io_reg, SIA_GENERAL_REG), in set_sia()
2115 dnetp->gprsia); in set_sia()
2117 ddi_put32(dnetp->io_handle, in set_sia()
2118 REG32(dnetp->io_reg, SIA_CONNECT_REG), in set_sia()
2123 } else if (dnetp->board_type != DEVICE_ID_21140) { in set_sia()
2124 ddi_put32(dnetp->io_handle, in set_sia()
2125 REG32(dnetp->io_reg, SIA_CONNECT_REG), 0); in set_sia()
2126 ddi_put32(dnetp->io_handle, in set_sia()
2127 REG32(dnetp->io_reg, SIA_TXRX_REG), 0); in set_sia()
2138 dnet_alloc_bufs(struct dnetinstance *dnetp) in dnet_alloc_bufs() argument
2152 if ((dnetp->tx_desc != NULL) && in dnet_alloc_bufs()
2153 (dnetp->nxmit_desc != dnetp->max_tx_desc)) in dnet_alloc_bufs()
2156 if ((dnetp->rx_desc != NULL) && in dnet_alloc_bufs()
2157 (dnetp->nrecv_desc != dnetp->max_rx_desc)) in dnet_alloc_bufs()
2162 nrecv_desc_old = dnetp->nrecv_desc; in dnet_alloc_bufs()
2163 dnet_free_bufs(dnetp); /* free the old buffers */ in dnet_alloc_bufs()
2166 if (dnetp->dma_handle == NULL) in dnet_alloc_bufs()
2167 if (ddi_dma_alloc_handle(dnetp->devinfo, &dma_attr, in dnet_alloc_bufs()
2168 DDI_DMA_SLEEP, 0, &dnetp->dma_handle) != DDI_SUCCESS) in dnet_alloc_bufs()
2171 if (dnetp->dma_handle_tx == NULL) in dnet_alloc_bufs()
2172 if (ddi_dma_alloc_handle(dnetp->devinfo, &dma_attr_tx, in dnet_alloc_bufs()
2173 DDI_DMA_SLEEP, 0, &dnetp->dma_handle_tx) != DDI_SUCCESS) in dnet_alloc_bufs()
2176 if (dnetp->dma_handle_txdesc == NULL) in dnet_alloc_bufs()
2177 if (ddi_dma_alloc_handle(dnetp->devinfo, &dma_attr, in dnet_alloc_bufs()
2178 DDI_DMA_SLEEP, 0, &dnetp->dma_handle_txdesc) != DDI_SUCCESS) in dnet_alloc_bufs()
2181 if (dnetp->dma_handle_setbuf == NULL) in dnet_alloc_bufs()
2182 if (ddi_dma_alloc_handle(dnetp->devinfo, &dma_attr, in dnet_alloc_bufs()
2183 DDI_DMA_SLEEP, 0, &dnetp->dma_handle_setbuf) != DDI_SUCCESS) in dnet_alloc_bufs()
2186 page_size = ddi_ptob(dnetp->devinfo, 1); in dnet_alloc_bufs()
2188 dnetp->pgmask = page_size - 1; in dnet_alloc_bufs()
2191 if (dnetp->setup_buf_vaddr == NULL) { in dnet_alloc_bufs()
2192 if (ddi_dma_mem_alloc(dnetp->dma_handle_setbuf, in dnet_alloc_bufs()
2194 DDI_DMA_DONTWAIT, 0, (caddr_t *)&dnetp->setup_buf_vaddr, in dnet_alloc_bufs()
2195 &len, &dnetp->setup_buf_acchdl) != DDI_SUCCESS) in dnet_alloc_bufs()
2198 if (ddi_dma_addr_bind_handle(dnetp->dma_handle_setbuf, in dnet_alloc_bufs()
2199 NULL, dnetp->setup_buf_vaddr, SETUPBUF_SIZE, in dnet_alloc_bufs()
2204 dnetp->setup_buf_paddr = cookie.dmac_address; in dnet_alloc_bufs()
2205 bzero(dnetp->setup_buf_vaddr, len); in dnet_alloc_bufs()
2209 if (dnetp->tx_desc == NULL) { in dnet_alloc_bufs()
2210 if (ddi_dma_mem_alloc(dnetp->dma_handle_txdesc, in dnet_alloc_bufs()
2211 sizeof (struct tx_desc_type) * dnetp->max_tx_desc, in dnet_alloc_bufs()
2213 (caddr_t *)&dnetp->tx_desc, &len, in dnet_alloc_bufs()
2214 &dnetp->tx_desc_acchdl) != DDI_SUCCESS) in dnet_alloc_bufs()
2217 if (ddi_dma_addr_bind_handle(dnetp->dma_handle_txdesc, in dnet_alloc_bufs()
2218 NULL, (caddr_t)dnetp->tx_desc, in dnet_alloc_bufs()
2219 sizeof (struct tx_desc_type) * dnetp->max_tx_desc, in dnet_alloc_bufs()
2223 dnetp->tx_desc_paddr = cookie.dmac_address; in dnet_alloc_bufs()
2224 bzero(dnetp->tx_desc, len); in dnet_alloc_bufs()
2225 dnetp->nxmit_desc = dnetp->max_tx_desc; in dnet_alloc_bufs()
2227 dnetp->tx_msgbufp = in dnet_alloc_bufs()
2228 kmem_zalloc(dnetp->max_tx_desc * sizeof (mblk_t **), in dnet_alloc_bufs()
2233 if (dnetp->rx_desc == NULL) { in dnet_alloc_bufs()
2236 if (ddi_dma_mem_alloc(dnetp->dma_handle, in dnet_alloc_bufs()
2237 sizeof (struct rx_desc_type) * dnetp->max_rx_desc, in dnet_alloc_bufs()
2239 (caddr_t *)&dnetp->rx_desc, &len, in dnet_alloc_bufs()
2240 &dnetp->rx_desc_acchdl) != DDI_SUCCESS) in dnet_alloc_bufs()
2243 if (ddi_dma_addr_bind_handle(dnetp->dma_handle, in dnet_alloc_bufs()
2244 NULL, (caddr_t)dnetp->rx_desc, in dnet_alloc_bufs()
2245 sizeof (struct rx_desc_type) * dnetp->max_rx_desc, in dnet_alloc_bufs()
2250 dnetp->rx_desc_paddr = cookie.dmac_address; in dnet_alloc_bufs()
2251 bzero(dnetp->rx_desc, len); in dnet_alloc_bufs()
2252 dnetp->nrecv_desc = dnetp->max_rx_desc; in dnet_alloc_bufs()
2254 dnetp->rx_buf_vaddr = in dnet_alloc_bufs()
2255 kmem_zalloc(dnetp->max_rx_desc * sizeof (caddr_t), in dnet_alloc_bufs()
2257 dnetp->rx_buf_paddr = in dnet_alloc_bufs()
2258 kmem_zalloc(dnetp->max_rx_desc * sizeof (uint32_t), in dnet_alloc_bufs()
2280 ndesc = dnetp->max_rx_desc - nrecv_desc_old; in dnet_alloc_bufs()
2282 (dnet_rbuf_init(dnetp->devinfo, ndesc * 2) != 0)) in dnet_alloc_bufs()
2285 for (i = 0; i < dnetp->max_rx_desc; i++) { in dnet_alloc_bufs()
2288 rp = dnet_rbuf_alloc(dnetp->devinfo, 1); in dnet_alloc_bufs()
2291 dnetp->rx_buf_vaddr[i] = rp->rbuf_vaddr; in dnet_alloc_bufs()
2292 dnetp->rx_buf_paddr[i] = rp->rbuf_paddr; in dnet_alloc_bufs()
2303 dnet_free_bufs(struct dnetinstance *dnetp) in dnet_free_bufs() argument
2307 if (dnetp->tx_desc != NULL) { in dnet_free_bufs()
2308 ddi_dma_mem_free(&dnetp->tx_desc_acchdl); in dnet_free_bufs()
2309 dnetp->tx_desc = NULL; in dnet_free_bufs()
2311 if (dnetp->tx_msgbufp != NULL) { in dnet_free_bufs()
2313 for (i = 0; i < dnetp->nxmit_desc; i++) { in dnet_free_bufs()
2314 if (dnetp->tx_msgbufp[i] != NULL) { in dnet_free_bufs()
2315 freemsg(dnetp->tx_msgbufp[i]); in dnet_free_bufs()
2318 kmem_free(dnetp->tx_msgbufp, in dnet_free_bufs()
2319 dnetp->nxmit_desc * sizeof (mblk_t **)); in dnet_free_bufs()
2320 dnetp->tx_msgbufp = NULL; in dnet_free_bufs()
2322 dnetp->nxmit_desc = 0; in dnet_free_bufs()
2326 if (dnetp->rx_desc != NULL) { in dnet_free_bufs()
2327 ddi_dma_mem_free(&dnetp->rx_desc_acchdl); in dnet_free_bufs()
2328 dnetp->rx_desc = NULL; in dnet_free_bufs()
2329 if (dnetp->rx_buf_vaddr != NULL) { in dnet_free_bufs()
2331 for (i = 0; i < dnetp->nrecv_desc; i++) { in dnet_free_bufs()
2332 if (dnetp->rx_buf_vaddr[i]) in dnet_free_bufs()
2334 (caddr_t)dnetp->rx_buf_vaddr[i]); in dnet_free_bufs()
2336 kmem_free(dnetp->rx_buf_vaddr, in dnet_free_bufs()
2337 dnetp->nrecv_desc * sizeof (caddr_t)); in dnet_free_bufs()
2338 kmem_free(dnetp->rx_buf_paddr, in dnet_free_bufs()
2339 dnetp->nrecv_desc * sizeof (uint32_t)); in dnet_free_bufs()
2340 dnetp->rx_buf_vaddr = NULL; in dnet_free_bufs()
2341 dnetp->rx_buf_paddr = NULL; in dnet_free_bufs()
2343 dnetp->nrecv_desc = 0; in dnet_free_bufs()
2346 if (dnetp->setup_buf_vaddr != NULL) { in dnet_free_bufs()
2347 ddi_dma_mem_free(&dnetp->setup_buf_acchdl); in dnet_free_bufs()
2348 dnetp->setup_buf_vaddr = NULL; in dnet_free_bufs()
2351 if (dnetp->dma_handle != NULL) { in dnet_free_bufs()
2352 (void) ddi_dma_unbind_handle(dnetp->dma_handle); in dnet_free_bufs()
2353 ddi_dma_free_handle(&dnetp->dma_handle); in dnet_free_bufs()
2354 dnetp->dma_handle = NULL; in dnet_free_bufs()
2357 if (dnetp->dma_handle_tx != NULL) { in dnet_free_bufs()
2358 (void) ddi_dma_unbind_handle(dnetp->dma_handle_tx); in dnet_free_bufs()
2359 ddi_dma_free_handle(&dnetp->dma_handle_tx); in dnet_free_bufs()
2360 dnetp->dma_handle_tx = NULL; in dnet_free_bufs()
2363 if (dnetp->dma_handle_txdesc != NULL) { in dnet_free_bufs()
2364 (void) ddi_dma_unbind_handle(dnetp->dma_handle_txdesc); in dnet_free_bufs()
2365 ddi_dma_free_handle(&dnetp->dma_handle_txdesc); in dnet_free_bufs()
2366 dnetp->dma_handle_txdesc = NULL; in dnet_free_bufs()
2369 if (dnetp->dma_handle_setbuf != NULL) { in dnet_free_bufs()
2370 (void) ddi_dma_unbind_handle(dnetp->dma_handle_setbuf); in dnet_free_bufs()
2371 ddi_dma_free_handle(&dnetp->dma_handle_setbuf); in dnet_free_bufs()
2372 dnetp->dma_handle_setbuf = NULL; in dnet_free_bufs()
2381 dnet_init_txrx_bufs(struct dnetinstance *dnetp) in dnet_init_txrx_bufs() argument
2388 for (i = 0; i < dnetp->nxmit_desc; i++) { in dnet_init_txrx_bufs()
2393 if (dnetp->tx_msgbufp[i] != NULL) { in dnet_init_txrx_bufs()
2394 freemsg(dnetp->tx_msgbufp[i]); in dnet_init_txrx_bufs()
2395 dnetp->tx_msgbufp[i] = NULL; in dnet_init_txrx_bufs()
2397 *(uint32_t *)&dnetp->tx_desc[i].desc0 = 0; in dnet_init_txrx_bufs()
2398 *(uint32_t *)&dnetp->tx_desc[i].desc1 = 0; in dnet_init_txrx_bufs()
2399 dnetp->tx_desc[i].buffer1 = 0; in dnet_init_txrx_bufs()
2400 dnetp->tx_desc[i].buffer2 = 0; in dnet_init_txrx_bufs()
2402 dnetp->tx_desc[i - 1].desc1.end_of_ring = 1; in dnet_init_txrx_bufs()
2407 for (i = 0; i < dnetp->nrecv_desc; i++) { in dnet_init_txrx_bufs()
2409 *(uint32_t *)&dnetp->rx_desc[i].desc0 = 0; in dnet_init_txrx_bufs()
2410 *(uint32_t *)&dnetp->rx_desc[i].desc1 = 0; in dnet_init_txrx_bufs()
2411 dnetp->rx_desc[i].desc0.own = 1; in dnet_init_txrx_bufs()
2412 dnetp->rx_desc[i].desc1.buffer_size1 = rx_buf_size; in dnet_init_txrx_bufs()
2413 dnetp->rx_desc[i].buffer1 = dnetp->rx_buf_paddr[i]; in dnet_init_txrx_bufs()
2414 dnetp->rx_desc[i].buffer2 = 0; in dnet_init_txrx_bufs()
2415 end_paddr = dnetp->rx_buf_paddr[i]+rx_buf_size-1; in dnet_init_txrx_bufs()
2417 if ((dnetp->rx_desc[i].buffer1 & ~dnetp->pgmask) != in dnet_init_txrx_bufs()
2418 (end_paddr & ~dnetp->pgmask)) { in dnet_init_txrx_bufs()
2420 dnetp->rx_desc[i].buffer2 = end_paddr&~dnetp->pgmask; in dnet_init_txrx_bufs()
2421 dnetp->rx_desc[i].desc1.buffer_size2 = in dnet_init_txrx_bufs()
2422 (end_paddr & dnetp->pgmask) + 1; in dnet_init_txrx_bufs()
2423 dnetp->rx_desc[i].desc1.buffer_size1 = in dnet_init_txrx_bufs()
2424 rx_buf_size-dnetp->rx_desc[i].desc1.buffer_size2; in dnet_init_txrx_bufs()
2427 dnetp->rx_desc[i - 1].desc1.end_of_ring = 1; in dnet_init_txrx_bufs()
2431 alloc_descriptor(struct dnetinstance *dnetp) in alloc_descriptor() argument
2434 struct tx_desc_type *ring = dnetp->tx_desc; in alloc_descriptor()
2436 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in alloc_descriptor()
2438 mutex_enter(&dnetp->txlock); in alloc_descriptor()
2439 index = dnetp->tx_current_desc; in alloc_descriptor()
2441 dnet_reclaim_Tx_desc(dnetp); in alloc_descriptor()
2444 if (dnetp->free_desc <= 0) { in alloc_descriptor()
2449 mutex_exit(&dnetp->txlock); in alloc_descriptor()
2460 mutex_exit(&dnetp->txlock); in alloc_descriptor()
2463 if (dnetp->need_saddr) { in alloc_descriptor()
2464 mutex_exit(&dnetp->txlock); in alloc_descriptor()
2466 if (!dnetp->suspended) in alloc_descriptor()
2467 (void) dnet_set_addr(dnetp); in alloc_descriptor()
2475 dnetp->free_desc--; in alloc_descriptor()
2478 dnetp->tx_current_desc = NextTXIndex(index); in alloc_descriptor()
2482 dnetp->free_desc, dnetp->transmitted_desc, dnetp->tx_current_desc); in alloc_descriptor()
2484 mutex_exit(&dnetp->txlock); in alloc_descriptor()
2492 dnet_reclaim_Tx_desc(struct dnetinstance *dnetp) in dnet_reclaim_Tx_desc() argument
2494 struct tx_desc_type *desc = dnetp->tx_desc; in dnet_reclaim_Tx_desc()
2497 ASSERT(MUTEX_HELD(&dnetp->txlock)); in dnet_reclaim_Tx_desc()
2499 index = dnetp->transmitted_desc; in dnet_reclaim_Tx_desc()
2500 while (((dnetp->free_desc == 0) || (index != dnetp->tx_current_desc)) && in dnet_reclaim_Tx_desc()
2509 update_tx_stats(dnetp, index); in dnet_reclaim_Tx_desc()
2515 if (dnetp->tx_msgbufp[index] != NULL) { in dnet_reclaim_Tx_desc()
2516 freemsg(dnetp->tx_msgbufp[index]); in dnet_reclaim_Tx_desc()
2517 dnetp->tx_msgbufp[index] = NULL; in dnet_reclaim_Tx_desc()
2519 dnetp->free_desc++; in dnet_reclaim_Tx_desc()
2520 index = (index+1) % dnetp->max_tx_desc; in dnet_reclaim_Tx_desc()
2523 dnetp->transmitted_desc = index; in dnet_reclaim_Tx_desc()
3148 find_active_media(struct dnetinstance *dnetp) in find_active_media() argument
3155 LEAF_FORMAT *leaf = &dnetp->sr.leaf[dnetp->leaf]; in find_active_media()
3158 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in find_active_media()
3160 dnetp->selected_media_block = leaf->default_block; in find_active_media()
3162 if (dnetp->phyaddr != -1) { in find_active_media()
3163 dnetp->selected_media_block = leaf->mii_block; in find_active_media()
3164 setup_block(dnetp); in find_active_media()
3166 if (ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in find_active_media()
3169 (void) mii_start_portmon(dnetp->mii, dnet_mii_link_cb, in find_active_media()
3170 &dnetp->intrlock); in find_active_media()
3176 if (dnetp->mii_up) { in find_active_media()
3201 if (dnetp->disallowed_media & (1UL<<media)) in find_active_media()
3213 dnetp->selected_media_block = block; in find_active_media()
3217 setup_block(dnetp); in find_active_media()
3218 if (send_test_packet(dnetp)) { in find_active_media()
3232 send_test_packet(dnetp)) || in find_active_media()
3233 dnet_link_sense(dnetp)) in find_active_media()
3244 dnetp->selected_media_block == in find_active_media()
3259 setup_block(dnetp); in find_active_media()
3287 setup_block(dnetp); in find_active_media()
3289 if (mii_linkup(dnetp->mii, dnetp->phyaddr)) { in find_active_media()
3291 (void) mii_getspeed(dnetp->mii, in find_active_media()
3292 dnetp->phyaddr, in find_active_media()
3293 &dnetp->mii_speed, in find_active_media()
3294 &dnetp->mii_duplex); in find_active_media()
3295 dnetp->mii_up = 1; in find_active_media()
3303 dnetp->mii_up = 0; in find_active_media()
3308 dnetp->selected_media_block = hd_found; in find_active_media()
3310 dnetp->selected_media_block = fd_found; in find_active_media()
3314 dnetp->selected_media_block = best_allowed; in find_active_media()
3317 setup_block(dnetp); in find_active_media()
3325 setup_block(struct dnetinstance *dnetp) in setup_block() argument
3327 dnet_reset_board(dnetp); in setup_block()
3328 dnet_init_board(dnetp); in setup_block()
3330 (void) dnet_start(dnetp); in setup_block()
3335 dnet_link_sense(struct dnetinstance *dnetp) in dnet_link_sense() argument
3343 media_block_t *block = dnetp->selected_media_block; in dnet_link_sense()
3349 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in dnet_link_sense()
3354 dnetp->sr.leaf[dnetp->leaf].default_block = block; in dnet_link_sense()
3358 delay_100 = ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in dnet_link_sense()
3361 delay_10 = ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in dnet_link_sense()
3368 dnetp->disable_scrambler = 1; in dnet_link_sense()
3369 setup_block(dnetp); in dnet_link_sense()
3370 dnetp->disable_scrambler = 0; in dnet_link_sense()
3385 status = read_gpr(dnetp); in dnet_link_sense()
3405 send_test_packet(struct dnetinstance *dnetp) in send_test_packet() argument
3410 int media_code = dnetp->selected_media_block->media_code; in send_test_packet()
3413 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in send_test_packet()
3425 packet_delay = ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in send_test_packet()
3428 packet_delay = ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in send_test_packet()
3433 desc = dnetp->tx_desc; in send_test_packet()
3435 bufindex = dnetp->tx_current_desc; in send_test_packet()
3436 if (alloc_descriptor(dnetp) == FAILURE) { in send_test_packet()
3447 ASSERT(dnetp->setup_buf_vaddr != NULL); in send_test_packet()
3449 BCOPY((caddr_t)dnetp->curr_macaddr, in send_test_packet()
3450 (caddr_t)dnetp->setup_buf_vaddr, ETHERADDRL); in send_test_packet()
3451 BCOPY((caddr_t)dnetp->curr_macaddr, in send_test_packet()
3452 (caddr_t)dnetp->setup_buf_vaddr+ETHERADDRL, ETHERADDRL); in send_test_packet()
3454 desc[bufindex].buffer1 = dnetp->setup_buf_paddr; in send_test_packet()
3462 ddi_put8(dnetp->io_handle, REG8(dnetp->io_reg, TX_POLL_REG), in send_test_packet()
3498 enable_interrupts(struct dnetinstance *dnetp) in enable_interrupts() argument
3500 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in enable_interrupts()
3502 if (dnetp->interrupts_disabled) in enable_interrupts()
3504 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, INT_MASK_REG), in enable_interrupts()
3506 (dnetp->timer.cb ? GPTIMER_INTR : 0) | in enable_interrupts()
3532 dnet_hack_interrupts(struct dnetinstance *dnetp, int secondary) in dnet_hack_interrupts() argument
3536 dev_info_t *devinfo = dnetp->devinfo; in dnet_hack_interrupts()
3544 oui = (oui << 8) | dnetp->vendor_addr[i]; in dnet_hack_interrupts()
3551 if (dnetp->board_type != DEVICE_ID_21040) in dnet_hack_interrupts()
3589 dnetp->hackintr_inf = hackintr_inf = in dnet_hack_interrupts()
3594 hackintr_inf->dnetps[0] = dnetp; in dnet_hack_interrupts()
3604 (uchar_t *)&dnetp->hackintr_inf, in dnet_hack_interrupts()
3610 if (ddi_add_intr(devinfo, 0, &dnetp->icookie, NULL, in dnet_hack_interrupts()
3625 dnetp->icookie); in dnet_hack_interrupts()
3649 hackintr_inf->dnetps[i] = dnetp; in dnet_hack_interrupts()
3702 struct dnetinstance *altdnetp, *dnetp = in dnet_detach_hacked_interrupt() local
3715 ddi_remove_intr(devinfo, 0, dnetp->icookie); in dnet_detach_hacked_interrupt()
3722 if (hackintr_inf->dnetps[i] == dnetp) { in dnet_detach_hacked_interrupt()
3748 ddi_remove_intr(devinfo, 0, dnetp->icookie); in dnet_detach_hacked_interrupt()
3759 do_phy(struct dnetinstance *dnetp) in do_phy() argument
3762 LEAF_FORMAT *leaf = dnetp->sr.leaf + dnetp->leaf; in do_phy()
3766 dip = dnetp->devinfo; in do_phy()
3787 dnetp->selected_media_block = leaf->mii_block ? in do_phy()
3790 setup_block(dnetp); in do_phy()
3792 (void) mii_create(dip, dnet_mii_write, dnet_mii_read, &dnetp->mii); in do_phy()
3798 if (mii_probe_phy(dnetp->mii, phy % 32) == MII_SUCCESS && in do_phy()
3799 mii_init_phy(dnetp->mii, phy % 32) == MII_SUCCESS) { in do_phy()
3805 dnetp->phyaddr = phy % 32; in do_phy()
3808 set_leaf(&dnetp->sr, &leaf_phylegacy); in do_phy()
3821 struct dnetinstance *dnetp; in dnet_mii_read() local
3830 dnetp = ddi_get_driver_private(dip); in dnet_mii_read()
3832 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in dnet_mii_read()
3834 write_mii(dnetp, MII_PRE, 2*bits_in_ushort); in dnet_mii_read()
3841 write_mii(dnetp, command_word, bits_in_ushort-2); in dnet_mii_read()
3843 mii_tristate(dnetp); in dnet_mii_read()
3846 tmp = ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, ETHER_ROM_REG)); in dnet_mii_read()
3852 ddi_put32(dnetp->io_handle, in dnet_mii_read()
3853 REG32(dnetp->io_reg, ETHER_ROM_REG), MII_READ); in dnet_mii_read()
3855 ddi_put32(dnetp->io_handle, in dnet_mii_read()
3856 REG32(dnetp->io_reg, ETHER_ROM_REG), MII_READ | MII_CLOCK); in dnet_mii_read()
3858 tmp = ddi_get32(dnetp->io_handle, in dnet_mii_read()
3859 REG32(dnetp->io_reg, ETHER_ROM_REG)); in dnet_mii_read()
3864 mii_tristate(dnetp); in dnet_mii_read()
3871 struct dnetinstance *dnetp; in dnet_mii_write() local
3875 dnetp = ddi_get_driver_private(dip); in dnet_mii_write()
3877 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in dnet_mii_write()
3878 write_mii(dnetp, MII_PRE, 2*bits_in_ushort); in dnet_mii_write()
3885 write_mii(dnetp, command_word, 2*bits_in_ushort); in dnet_mii_write()
3886 mii_tristate(dnetp); in dnet_mii_write()
3893 write_mii(struct dnetinstance *dnetp, uint32_t mii_data, int data_size) in write_mii() argument
3898 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in write_mii()
3902 ddi_put32(dnetp->io_handle, in write_mii()
3903 REG32(dnetp->io_reg, ETHER_ROM_REG), in write_mii()
3906 ddi_put32(dnetp->io_handle, in write_mii()
3907 REG32(dnetp->io_reg, ETHER_ROM_REG), in write_mii()
3919 mii_tristate(struct dnetinstance *dnetp) in mii_tristate() argument
3921 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in mii_tristate()
3922 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, ETHER_ROM_REG), in mii_tristate()
3925 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, ETHER_ROM_REG), in mii_tristate()
3948 struct dnetinstance *dnetp = ddi_get_driver_private(dip); in dnet_mii_link_cb() local
3951 ASSERT(MUTEX_HELD(&dnetp->intrlock)); in dnet_mii_link_cb()
3953 leaf = dnetp->sr.leaf + dnetp->leaf; in dnet_mii_link_cb()
3955 dnetp->mii_up = 1; in dnet_mii_link_cb()
3957 (void) mii_getspeed(dnetp->mii, dnetp->phyaddr, in dnet_mii_link_cb()
3958 &dnetp->mii_speed, &dnetp->mii_duplex); in dnet_mii_link_cb()
3960 dnetp->selected_media_block = leaf->mii_block; in dnet_mii_link_cb()
3961 setup_block(dnetp); in dnet_mii_link_cb()
3964 dnetp->mii_up = 0; in dnet_mii_link_cb()
3967 dnetp->selected_media_block = leaf->default_block; in dnet_mii_link_cb()
3968 setup_block(dnetp); in dnet_mii_link_cb()
3971 if (dnetp->running) { in dnet_mii_link_cb()
3972 mac_link_update(dnetp->mac_handle, in dnet_mii_link_cb()
3973 (dnetp->mii_up ? LINK_STATE_UP : LINK_STATE_DOWN)); in dnet_mii_link_cb()
3987 dnet_parse_srom(struct dnetinstance *dnetp, SROM_FORMAT *sr, uchar_t *vi) in dnet_parse_srom() argument
3993 if (!ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in dnet_parse_srom()
3995 dnetp->sr.init_from_srom = check_srom_valid(vi); in dnet_parse_srom()
3997 if (dnetp->sr.init_from_srom && dnetp->board_type != DEVICE_ID_21040) { in dnet_parse_srom()
4013 parse_controller_leaf(dnetp, sr->leaf+i, vi+offset); in dnet_parse_srom()
4038 DDI_DEV_T_NONE, dnetp->devinfo, in dnet_parse_srom()
4050 uchar_t *mac = vi + ddi_getprop(DDI_DEV_T_ANY, dnetp->devinfo, in dnet_parse_srom()
4056 if (dnetp->board_type == DEVICE_ID_21140) { in dnet_parse_srom()
4062 dnetp->vendor_21140 = ASANTE_TYPE; in dnet_parse_srom()
4063 dnetp->vendor_revision = 0; in dnet_parse_srom()
4070 dnetp->vendor_21140 = COGENT_EM_TYPE; in dnet_parse_srom()
4071 dnetp->vendor_revision = in dnet_parse_srom()
4078 dnetp->vendor_21140 = DEFAULT_TYPE; in dnet_parse_srom()
4079 dnetp->vendor_revision = 0; in dnet_parse_srom()
4084 } else if (dnetp->board_type == DEVICE_ID_21041) { in dnet_parse_srom()
4086 } else if (dnetp->board_type == DEVICE_ID_21040) { in dnet_parse_srom()
4094 parse_controller_leaf(struct dnetinstance *dnetp, LEAF_FORMAT *leaf, in parse_controller_leaf() argument
4102 if (dnetp->board_type == DEVICE_ID_21140) /* Sect. 4.3 */ in parse_controller_leaf()
4112 vi = parse_media_block(dnetp, leaf->block + i, vi); in parse_controller_leaf()
4123 parse_media_block(struct dnetinstance *dnetp, media_block_t *block, uchar_t *vi) in parse_media_block() argument
4134 if (dnetp->board_type == DEVICE_ID_21041) { in parse_media_block()
4594 dnet_usectimeout(struct dnetinstance *dnetp, uint32_t usecs, int contin, in dnet_usectimeout() argument
4597 mutex_enter(&dnetp->intrlock); in dnet_usectimeout()
4598 dnetp->timer.start_ticks = (usecs * 100) / 8192; in dnet_usectimeout()
4599 dnetp->timer.cb = cback; in dnet_usectimeout()
4600 ddi_put32(dnetp->io_handle, REG32(dnetp->io_reg, GP_TIMER_REG), in dnet_usectimeout()
4601 dnetp->timer.start_ticks | (contin ? GPTIMER_CONT : 0)); in dnet_usectimeout()
4602 if (dnetp->timer.cb) in dnet_usectimeout()
4603 enable_interrupts(dnetp); in dnet_usectimeout()
4604 mutex_exit(&dnetp->intrlock); in dnet_usectimeout()
4608 dnet_usecelapsed(struct dnetinstance *dnetp) in dnet_usecelapsed() argument
4610 uint32_t ticks = dnetp->timer.start_ticks - in dnet_usecelapsed()
4611 (ddi_get32(dnetp->io_handle, REG32(dnetp->io_reg, GP_TIMER_REG)) & in dnet_usecelapsed()
4618 dnet_timestamp(struct dnetinstance *dnetp, char *buf) in dnet_timestamp() argument
4620 uint32_t elapsed = dnet_usecelapsed(dnetp); in dnet_timestamp()
4648 dnet_usectimeout(dnetp, 1000000, 0, 0); in dnet_timestamp()