Lines Matching refs:ip

261 	iprb_t		*ip;  in iprb_attach()  local
266 ip = kmem_zalloc(sizeof (*ip), KM_SLEEP); in iprb_attach()
267 ddi_set_driver_private(dip, ip); in iprb_attach()
268 ip->dip = dip; in iprb_attach()
270 list_create(&ip->mcast, sizeof (struct iprb_mcast), in iprb_attach()
274 mutex_init(&ip->culock, NULL, MUTEX_DRIVER, NULL); in iprb_attach()
275 mutex_init(&ip->rulock, NULL, MUTEX_DRIVER, NULL); in iprb_attach()
277 if (pci_config_setup(dip, &ip->pcih) != DDI_SUCCESS) { in iprb_attach()
278 iprb_error(ip, "unable to map configuration space"); in iprb_attach()
279 iprb_destroy(ip); in iprb_attach()
283 if (ddi_regs_map_setup(dip, 1, &ip->regs, 0, 0, &acc_attr, in iprb_attach()
284 &ip->regsh) != DDI_SUCCESS) { in iprb_attach()
285 iprb_error(ip, "unable to map device registers"); in iprb_attach()
286 iprb_destroy(ip); in iprb_attach()
291 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_attach()
293 PUT32(ip, CSR_PORT, PORT_SW_RESET); in iprb_attach()
295 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_attach()
296 (void) GET8(ip, CSR_INTCTL); in iprb_attach()
301 ip->tx_timeout = TX_WATCHDOG; in iprb_attach()
302 ip->rx_timeout = RX_WATCHDOG; in iprb_attach()
304 iprb_identify(ip); in iprb_attach()
307 w = iprb_eeprom_read(ip, 0); in iprb_attach()
308 ip->factaddr[0] = w & 0xff; in iprb_attach()
309 ip->factaddr[1] = w >> 8; in iprb_attach()
310 w = iprb_eeprom_read(ip, 1); in iprb_attach()
311 ip->factaddr[2] = w & 0xff; in iprb_attach()
312 ip->factaddr[3] = w >> 8; in iprb_attach()
313 w = iprb_eeprom_read(ip, 2); in iprb_attach()
314 ip->factaddr[4] = w & 0xff; in iprb_attach()
315 ip->factaddr[5] = w >> 8; in iprb_attach()
316 bcopy(ip->factaddr, ip->curraddr, 6); in iprb_attach()
318 if (ip->resumebug) { in iprb_attach()
326 if ((iprb_eeprom_read(ip, 10) & 0x02) == 0) { in iprb_attach()
328 ip->resumebug = B_FALSE; in iprb_attach()
332 if ((iprb_eeprom_read(ip, 3) & 0x3) != 0x3) { in iprb_attach()
334 ip->rxhangbug = B_TRUE; in iprb_attach()
338 w = iprb_eeprom_read(ip, 6); in iprb_attach()
340 if ((ip->miih = mii_alloc(ip, dip, &iprb_mii_ops)) == NULL) { in iprb_attach()
341 iprb_error(ip, "unable to allocate MII ops vector"); in iprb_attach()
342 iprb_destroy(ip); in iprb_attach()
345 if (ip->canpause) { in iprb_attach()
346 mii_set_pauseable(ip->miih, B_TRUE, B_FALSE); in iprb_attach()
353 if (iprb_dma_alloc(ip, &ip->cmds[i], CB_SIZE) != DDI_SUCCESS) { in iprb_attach()
354 iprb_destroy(ip); in iprb_attach()
360 iprb_dma_t *cb = &ip->cmds[i]; in iprb_attach()
362 PUTCB32(cb, CB_LNK_OFFSET, (ip->cmds[(i + 1) % NUM_TX].paddr)); in iprb_attach()
367 if (iprb_dma_alloc(ip, &ip->rxb[i], RFD_SIZE) != DDI_SUCCESS) { in iprb_attach()
368 iprb_destroy(ip); in iprb_attach()
372 if (iprb_dma_alloc(ip, &ip->stats, STATS_SIZE) != DDI_SUCCESS) { in iprb_attach()
373 iprb_destroy(ip); in iprb_attach()
377 if (iprb_add_intr(ip) != DDI_SUCCESS) { in iprb_attach()
378 iprb_destroy(ip); in iprb_attach()
383 iprb_error(ip, "unable to allocate mac structure"); in iprb_attach()
384 iprb_destroy(ip); in iprb_attach()
389 macp->m_driver = ip; in iprb_attach()
391 macp->m_src_addr = ip->curraddr; in iprb_attach()
396 if (mac_register(macp, &ip->mach) != 0) { in iprb_attach()
397 iprb_error(ip, "unable to register mac with framework"); in iprb_attach()
399 iprb_destroy(ip); in iprb_attach()
410 iprb_t *ip; in iprb_detach() local
412 ip = ddi_get_driver_private(dip); in iprb_detach()
413 ASSERT(ip != NULL); in iprb_detach()
415 if (mac_disable(ip->mach) != 0) in iprb_detach()
418 (void) mac_unregister(ip->mach); in iprb_detach()
419 iprb_destroy(ip); in iprb_detach()
424 iprb_add_intr(iprb_t *ip) in iprb_add_intr() argument
428 if (ddi_intr_alloc(ip->dip, &ip->intrh, DDI_INTR_TYPE_FIXED, 0, 1, in iprb_add_intr()
430 iprb_error(ip, "failed allocating interrupt handle"); in iprb_add_intr()
434 if (ddi_intr_add_handler(ip->intrh, iprb_intr, ip, NULL) != in iprb_add_intr()
436 (void) ddi_intr_free(ip->intrh); in iprb_add_intr()
437 ip->intrh = NULL; in iprb_add_intr()
438 iprb_error(ip, "failed adding interrupt handler"); in iprb_add_intr()
441 if (ddi_intr_enable(ip->intrh) != DDI_SUCCESS) { in iprb_add_intr()
442 (void) ddi_intr_remove_handler(ip->intrh); in iprb_add_intr()
443 (void) ddi_intr_free(ip->intrh); in iprb_add_intr()
444 ip->intrh = NULL; in iprb_add_intr()
445 iprb_error(ip, "failed enabling interrupt"); in iprb_add_intr()
452 iprb_dma_alloc(iprb_t *ip, iprb_dma_t *h, size_t size) in iprb_dma_alloc() argument
458 if (ddi_dma_alloc_handle(ip->dip, &dma_attr, DDI_DMA_SLEEP, NULL, in iprb_dma_alloc()
460 iprb_error(ip, "unable to allocate dma handle"); in iprb_dma_alloc()
465 iprb_error(ip, "unable to allocate dma memory"); in iprb_dma_alloc()
472 iprb_error(ip, "unable to map command memory"); in iprb_dma_alloc()
494 iprb_destroy(iprb_t *ip) in iprb_destroy() argument
500 if (ip->intrh != NULL) { in iprb_destroy()
501 (void) ddi_intr_disable(ip->intrh); in iprb_destroy()
502 (void) ddi_intr_remove_handler(ip->intrh); in iprb_destroy()
503 (void) ddi_intr_free(ip->intrh); in iprb_destroy()
507 iprb_dma_free(&ip->cmds[i]); in iprb_destroy()
510 iprb_dma_free(&ip->rxb[i]); in iprb_destroy()
512 iprb_dma_free(&ip->stats); in iprb_destroy()
514 if (ip->miih) in iprb_destroy()
515 mii_free(ip->miih); in iprb_destroy()
518 while ((mc = list_head(&ip->mcast)) != NULL) { in iprb_destroy()
519 list_remove(&ip->mcast, mc); in iprb_destroy()
524 if (ip->pcih) in iprb_destroy()
525 pci_config_teardown(&ip->pcih); in iprb_destroy()
526 if (ip->regsh) in iprb_destroy()
527 ddi_regs_map_free(&ip->regsh); in iprb_destroy()
530 ddi_set_driver_private(ip->dip, NULL); in iprb_destroy()
532 list_destroy(&ip->mcast); in iprb_destroy()
533 mutex_destroy(&ip->culock); in iprb_destroy()
534 mutex_destroy(&ip->rulock); in iprb_destroy()
537 kmem_free(ip, sizeof (*ip)); in iprb_destroy()
541 iprb_identify(iprb_t *ip) in iprb_identify() argument
543 ip->devid = pci_config_get16(ip->pcih, PCI_CONF_DEVID); in iprb_identify()
544 ip->revid = pci_config_get8(ip->pcih, PCI_CONF_REVID); in iprb_identify()
546 switch (ip->devid) { in iprb_identify()
550 if (ip->revid >= REV_82558_A4) { in iprb_identify()
551 ip->canpause = B_TRUE; in iprb_identify()
552 ip->canmwi = B_TRUE; in iprb_identify()
554 ip->is557 = B_TRUE; in iprb_identify()
556 if (ip->revid >= REV_82559_A0) in iprb_identify()
557 ip->resumebug = B_TRUE; in iprb_identify()
561 ip->canpause = B_TRUE; in iprb_identify()
562 ip->resumebug = B_TRUE; in iprb_identify()
563 ip->canmwi = B_TRUE; in iprb_identify()
572 ip->resumebug = B_TRUE; in iprb_identify()
573 if (ip->revid >= REV_82558_A4) in iprb_identify()
574 ip->canpause = B_TRUE; in iprb_identify()
578 if (ip->revid >= REV_82558_A4) in iprb_identify()
579 ip->canpause = B_TRUE; in iprb_identify()
584 if (ddi_prop_get_int(DDI_DEV_T_ANY, ip->dip, 0, "MWIEnable", 1) == 0) { in iprb_identify()
585 ip->canmwi = B_FALSE; in iprb_identify()
590 iprb_eeprom_sendbits(iprb_t *ip, uint32_t val, uint8_t nbits) in iprb_eeprom_sendbits() argument
598 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_sendbits()
600 PUT16(ip, CSR_EECTL, x | EEPROM_EESK | EEPROM_EECS); in iprb_eeprom_sendbits()
602 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_sendbits()
609 iprb_eeprom_read(iprb_t *ip, uint16_t address) in iprb_eeprom_read() argument
617 if ((address != 0) && (ip->eeprom_bits == 0)) in iprb_eeprom_read()
618 (void) iprb_eeprom_read(ip, 0); in iprb_eeprom_read()
620 if ((bits = ip->eeprom_bits) == 0) { in iprb_eeprom_read()
625 PUT16(ip, CSR_EECTL, EEPROM_EECS); in iprb_eeprom_read()
629 iprb_eeprom_sendbits(ip, 6, 3); in iprb_eeprom_read()
633 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_read()
635 PUT16(ip, CSR_EECTL, x | EEPROM_EESK | EEPROM_EECS); in iprb_eeprom_read()
637 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_read()
642 if ((GET16(ip, CSR_EECTL) & EEPROM_EEDO) == 0) { in iprb_eeprom_read()
643 if (ip->eeprom_bits == 0) { in iprb_eeprom_read()
644 ip->eeprom_bits = n; in iprb_eeprom_read()
646 1U << ip->eeprom_bits); in iprb_eeprom_read()
651 if (n != ip->eeprom_bits) { in iprb_eeprom_read()
652 iprb_error(ip, "cannot determine EEPROM size (%d, %d)", in iprb_eeprom_read()
653 ip->eeprom_bits, n); in iprb_eeprom_read()
659 PUT16(ip, CSR_EECTL, EEPROM_EECS | EEPROM_EESK); in iprb_eeprom_read()
661 if (GET16(ip, CSR_EECTL) & EEPROM_EEDO) in iprb_eeprom_read()
664 PUT16(ip, CSR_EECTL, EEPROM_EECS); in iprb_eeprom_read()
669 PUT16(ip, CSR_EECTL, 0); in iprb_eeprom_read()
676 iprb_cmd_ready(iprb_t *ip) in iprb_cmd_ready() argument
680 if (GET8(ip, CSR_CMD) == 0) { in iprb_cmd_ready()
685 iprb_error(ip, "timeout waiting for chip to become ready"); in iprb_cmd_ready()
690 iprb_cmd_reclaim(iprb_t *ip) in iprb_cmd_reclaim() argument
692 while (ip->cmd_count) { in iprb_cmd_reclaim()
693 iprb_dma_t *cb = &ip->cmds[ip->cmd_tail]; in iprb_cmd_reclaim()
700 ip->cmd_tail++; in iprb_cmd_reclaim()
701 ip->cmd_tail %= NUM_TX; in iprb_cmd_reclaim()
702 ip->cmd_count--; in iprb_cmd_reclaim()
703 if (ip->cmd_count == 0) { in iprb_cmd_reclaim()
704 ip->tx_wdog = 0; in iprb_cmd_reclaim()
706 ip->tx_wdog = gethrtime(); in iprb_cmd_reclaim()
712 iprb_cmd_drain(iprb_t *ip) in iprb_cmd_drain() argument
715 iprb_cmd_reclaim(ip); in iprb_cmd_drain()
716 if (ip->cmd_count == 0) in iprb_cmd_drain()
720 iprb_error(ip, "time out waiting for commands to drain"); in iprb_cmd_drain()
725 iprb_cmd_submit(iprb_t *ip, uint16_t cmd) in iprb_cmd_submit() argument
727 iprb_dma_t *ncb = &ip->cmds[ip->cmd_head]; in iprb_cmd_submit()
728 iprb_dma_t *lcb = &ip->cmds[ip->cmd_last]; in iprb_cmd_submit()
731 ASSERT((ip->cmd_count) < NUM_TX); in iprb_cmd_submit()
732 if (ip->cmd_count == (NUM_TX - 1)) { in iprb_cmd_submit()
757 if (ip->resumebug) { in iprb_cmd_submit()
758 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_cmd_submit()
760 PUT8(ip, CSR_CMD, CUC_NOP); in iprb_cmd_submit()
761 (void) GET8(ip, CSR_CMD); in iprb_cmd_submit()
766 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_cmd_submit()
775 PUT8(ip, CSR_CMD, CUC_RESUME); in iprb_cmd_submit()
776 (void) GET8(ip, CSR_CMD); /* flush CSR */ in iprb_cmd_submit()
778 ip->tx_wdog = gethrtime(); in iprb_cmd_submit()
779 ip->cmd_last = ip->cmd_head; in iprb_cmd_submit()
780 ip->cmd_head++; in iprb_cmd_submit()
781 ip->cmd_head %= NUM_TX; in iprb_cmd_submit()
782 ip->cmd_count++; in iprb_cmd_submit()
788 iprb_cmd_next(iprb_t *ip) in iprb_cmd_next() argument
790 if (ip->cmd_count == NUM_TX) { in iprb_cmd_next()
793 ASSERT(ip->cmd_count < NUM_TX); in iprb_cmd_next()
794 return (&ip->cmds[ip->cmd_head]); in iprb_cmd_next()
798 iprb_set_unicast(iprb_t *ip) in iprb_set_unicast() argument
802 ASSERT(mutex_owned(&ip->culock)); in iprb_set_unicast()
804 if ((cb = iprb_cmd_next(ip)) == NULL) in iprb_set_unicast()
807 PUTCBEA(cb, CB_IAS_ADR_OFFSET, ip->curraddr); in iprb_set_unicast()
808 return (iprb_cmd_submit(ip, CB_CMD_IAS)); in iprb_set_unicast()
812 iprb_set_multicast(iprb_t *ip) in iprb_set_multicast() argument
819 ASSERT(mutex_owned(&ip->culock)); in iprb_set_multicast()
821 if ((ip->nmcast <= 0) || (ip->nmcast > CB_MCS_CNT_MAX)) { in iprb_set_multicast()
832 if ((cb = iprb_cmd_next(ip)) == NULL) { in iprb_set_multicast()
836 l = &ip->mcast; in iprb_set_multicast()
840 ASSERT(i == ip->nmcast); in iprb_set_multicast()
842 return (iprb_cmd_submit(ip, CB_CMD_MCS)); in iprb_set_multicast()
846 iprb_set_config(iprb_t *ip) in iprb_set_config() argument
850 ASSERT(mutex_owned(&ip->culock)); in iprb_set_config()
851 if ((cb = iprb_cmd_next(ip)) == NULL) { in iprb_set_config()
857 PUTCB8(cb, CB_CONFIG_OFFSET + 3, (ip->canmwi ? 1 : 0)); in iprb_set_config()
860 PUTCB8(cb, CB_CONFIG_OFFSET + 6, (ip->promisc ? 0x80 : 0) | 0x3a); in iprb_set_config()
861 PUTCB8(cb, CB_CONFIG_OFFSET + 7, (ip->promisc ? 0 : 0x1) | 2); in iprb_set_config()
862 PUTCB8(cb, CB_CONFIG_OFFSET + 8, (ip->miih ? 0x1 : 0)); in iprb_set_config()
866 PUTCB8(cb, CB_CONFIG_OFFSET + 12, (ip->is557 ? 0 : 1) | 0x60); in iprb_set_config()
870 (ip->miih ? 0x80 : 0) | (ip->promisc ? 0x1 : 0) | 0x48); in iprb_set_config()
872 PUTCB8(cb, CB_CONFIG_OFFSET + 17, (ip->canpause ? 0x40 : 0)); in iprb_set_config()
873 PUTCB8(cb, CB_CONFIG_OFFSET + 18, (ip->is557 ? 0 : 0x8) | 0xf2); in iprb_set_config()
875 ((ip->revid < REV_82558_B0) ? 0 : 0x80) | in iprb_set_config()
876 (ip->canpause ? 0x18 : 0)); in iprb_set_config()
879 ((ip->nmcast >= CB_MCS_CNT_MAX) ? 0x8 : 0) | 0x5); in iprb_set_config()
881 return (iprb_cmd_submit(ip, CB_CMD_CONFIG)); in iprb_set_config()
885 iprb_set_ucode(iprb_t *ip) in iprb_set_ucode() argument
892 if (iprb_ucode[i].rev == ip->revid) { in iprb_set_ucode()
902 ASSERT(mutex_owned(&ip->culock)); in iprb_set_ucode()
903 if ((cb = iprb_cmd_next(ip)) == NULL) { in iprb_set_ucode()
909 return (iprb_cmd_submit(ip, CB_CMD_UCODE)); in iprb_set_ucode()
913 iprb_configure(iprb_t *ip) in iprb_configure() argument
915 ASSERT(mutex_owned(&ip->culock)); in iprb_configure()
917 if (iprb_cmd_drain(ip) != DDI_SUCCESS) in iprb_configure()
920 if (iprb_set_config(ip) != DDI_SUCCESS) in iprb_configure()
922 if (iprb_set_unicast(ip) != DDI_SUCCESS) in iprb_configure()
924 if (iprb_set_multicast(ip) != DDI_SUCCESS) in iprb_configure()
931 iprb_stop(iprb_t *ip) in iprb_stop() argument
934 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_stop()
935 (void) GET32(ip, CSR_PORT); in iprb_stop()
939 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_stop()
943 iprb_start(iprb_t *ip) in iprb_start() argument
947 ASSERT(mutex_owned(&ip->rulock)); in iprb_start()
948 ASSERT(mutex_owned(&ip->culock)); in iprb_start()
951 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_start()
952 (void) GET32(ip, CSR_PORT); in iprb_start()
955 PUT32(ip, CSR_PORT, PORT_SW_RESET); in iprb_start()
956 (void) GET32(ip, CSR_PORT); in iprb_start()
958 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_start()
961 ip->cmd_head = ip->cmd_tail = 0; in iprb_start()
962 ip->cmd_last = NUM_TX - 1; in iprb_start()
964 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_start()
966 PUT32(ip, CSR_GEN_PTR, 0); in iprb_start()
967 PUT8(ip, CSR_CMD, CUC_CUBASE); in iprb_start()
968 (void) GET8(ip, CSR_CMD); in iprb_start()
970 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_start()
972 PUT32(ip, CSR_GEN_PTR, 0); in iprb_start()
973 PUT8(ip, CSR_CMD, RUC_RUBASE); in iprb_start()
974 (void) GET8(ip, CSR_CMD); in iprb_start()
977 cb = iprb_cmd_next(ip); in iprb_start()
979 if (iprb_cmd_submit(ip, CB_CMD_NOP) != DDI_SUCCESS) in iprb_start()
983 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_start()
985 PUT32(ip, CSR_GEN_PTR, cb->paddr); in iprb_start()
986 PUT8(ip, CSR_CMD, CUC_START); in iprb_start()
987 (void) GET8(ip, CSR_CMD); in iprb_start()
990 if (iprb_set_ucode(ip) != DDI_SUCCESS) in iprb_start()
994 iprb_rx_init(ip); in iprb_start()
996 PUT32(ip, CSR_GEN_PTR, ip->rxb[0].paddr); in iprb_start()
998 (void) iprb_cmd_ready(ip); in iprb_start()
999 PUT8(ip, CSR_CMD, RUC_START); in iprb_start()
1000 (void) GET8(ip, CSR_CMD); /* flush CSR */ in iprb_start()
1003 PUT8(ip, CSR_INTCTL, 0); in iprb_start()
1004 (void) GET8(ip, CSR_INTCTL); in iprb_start()
1010 iprb_update_stats(iprb_t *ip) in iprb_update_stats() argument
1012 iprb_dma_t *sp = &ip->stats; in iprb_update_stats()
1016 ASSERT(mutex_owned(&ip->culock)); in iprb_update_stats()
1020 if (tstamp / NANOSEC == ip->stats_time / NANOSEC) in iprb_update_stats()
1026 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_update_stats()
1028 PUT32(ip, CSR_GEN_PTR, sp->paddr); in iprb_update_stats()
1029 PUT8(ip, CSR_CMD, CUC_STATSBASE); in iprb_update_stats()
1030 (void) GET8(ip, CSR_CMD); in iprb_update_stats()
1032 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_update_stats()
1034 PUT8(ip, CSR_CMD, CUC_STATS_RST); in iprb_update_stats()
1035 (void) GET8(ip, CSR_CMD); /* flush wb */ in iprb_update_stats()
1046 iprb_error(ip, "time out acquiring hardware statistics"); in iprb_update_stats()
1050 ip->ex_coll += GETSTAT(sp, STATS_TX_MAXCOL_OFFSET); in iprb_update_stats()
1051 ip->late_coll += GETSTAT(sp, STATS_TX_LATECOL_OFFSET); in iprb_update_stats()
1052 ip->uflo += GETSTAT(sp, STATS_TX_UFLO_OFFSET); in iprb_update_stats()
1053 ip->defer_xmt += GETSTAT(sp, STATS_TX_DEFER_OFFSET); in iprb_update_stats()
1054 ip->one_coll += GETSTAT(sp, STATS_TX_ONECOL_OFFSET); in iprb_update_stats()
1055 ip->multi_coll += GETSTAT(sp, STATS_TX_MULTCOL_OFFSET); in iprb_update_stats()
1056 ip->collisions += GETSTAT(sp, STATS_TX_TOTCOL_OFFSET); in iprb_update_stats()
1057 ip->fcs_errs += GETSTAT(sp, STATS_RX_FCS_OFFSET); in iprb_update_stats()
1058 ip->align_errs += GETSTAT(sp, STATS_RX_ALIGN_OFFSET); in iprb_update_stats()
1059 ip->norcvbuf += GETSTAT(sp, STATS_RX_NOBUF_OFFSET); in iprb_update_stats()
1060 ip->oflo += GETSTAT(sp, STATS_RX_OFLO_OFFSET); in iprb_update_stats()
1061 ip->runt += GETSTAT(sp, STATS_RX_SHORT_OFFSET); in iprb_update_stats()
1063 ip->stats_time = tstamp; in iprb_update_stats()
1067 iprb_send(iprb_t *ip, mblk_t *mp) in iprb_send() argument
1072 ASSERT(mutex_owned(&ip->culock)); in iprb_send()
1075 iprb_cmd_reclaim(ip); in iprb_send()
1077 cb = iprb_cmd_next(ip); in iprb_send()
1081 ip->wantw = B_TRUE; in iprb_send()
1087 ip->macxmt_errs++; in iprb_send()
1092 ip->opackets++; in iprb_send()
1093 ip->obytes += sz; in iprb_send()
1102 ip->multixmt++; in iprb_send()
1104 ip->brdcstxmt++; in iprb_send()
1109 if (iprb_cmd_submit(ip, CB_CMD_TX) != DDI_SUCCESS) { in iprb_send()
1110 ip->macxmt_errs++; in iprb_send()
1117 iprb_rx_add(iprb_t *ip) in iprb_rx_add() argument
1122 ASSERT(mutex_owned(&ip->rulock)); in iprb_rx_add()
1124 curr = ip->rx_index; in iprb_rx_add()
1125 last = ip->rx_last; in iprb_rx_add()
1128 ip->rx_last = curr; in iprb_rx_add()
1129 ip->rx_index = next; in iprb_rx_add()
1131 lfd = &ip->rxb[last]; in iprb_rx_add()
1132 rfd = &ip->rxb[curr]; in iprb_rx_add()
1133 nfd = &ip->rxb[next]; in iprb_rx_add()
1146 iprb_rx_init(iprb_t *ip) in iprb_rx_init() argument
1148 ip->rx_index = 0; in iprb_rx_init()
1149 ip->rx_last = NUM_RX - 1; in iprb_rx_init()
1151 iprb_rx_add(ip); in iprb_rx_init()
1152 ip->rx_index = 0; in iprb_rx_init()
1153 ip->rx_last = NUM_RX - 1; in iprb_rx_init()
1157 iprb_rx(iprb_t *ip) in iprb_rx() argument
1171 rfd = &ip->rxb[ip->rx_index]; in iprb_rx()
1177 ip->rx_wdog = gethrtime(); in iprb_rx()
1185 ip->toolong++; in iprb_rx()
1186 iprb_rx_add(ip); in iprb_rx()
1190 iprb_rx_add(ip); in iprb_rx()
1194 ip->norcvbuf++; in iprb_rx()
1195 iprb_rx_add(ip); in iprb_rx()
1201 iprb_rx_add(ip); in iprb_rx()
1204 ip->ipackets++; in iprb_rx()
1205 ip->rbytes += cnt; in iprb_rx()
1208 ip->multircv++; in iprb_rx()
1210 ip->brdcstrcv++; in iprb_rx()
1222 iprb_t *ip = arg; in iprb_m_promisc() local
1224 mutex_enter(&ip->culock); in iprb_m_promisc()
1225 ip->promisc = on; in iprb_m_promisc()
1226 if (ip->running && !ip->suspended) in iprb_m_promisc()
1227 (void) iprb_configure(ip); in iprb_m_promisc()
1228 mutex_exit(&ip->culock); in iprb_m_promisc()
1235 iprb_t *ip = arg; in iprb_m_unicst() local
1237 mutex_enter(&ip->culock); in iprb_m_unicst()
1238 bcopy(macaddr, ip->curraddr, 6); in iprb_m_unicst()
1239 if (ip->running && !ip->suspended) in iprb_m_unicst()
1240 (void) iprb_configure(ip); in iprb_m_unicst()
1241 mutex_exit(&ip->culock); in iprb_m_unicst()
1248 iprb_t *ip = arg; in iprb_m_multicst() local
1249 list_t *l = &ip->mcast; in iprb_m_multicst()
1258 mutex_enter(&ip->culock); in iprb_m_multicst()
1260 ip->nmcast++; in iprb_m_multicst()
1261 if (ip->running && !ip->suspended) in iprb_m_multicst()
1262 (void) iprb_configure(ip); in iprb_m_multicst()
1263 mutex_exit(&ip->culock); in iprb_m_multicst()
1265 mutex_enter(&ip->culock); in iprb_m_multicst()
1268 list_remove(&ip->mcast, mc); in iprb_m_multicst()
1269 ip->nmcast--; in iprb_m_multicst()
1270 if (ip->running && !ip->suspended) in iprb_m_multicst()
1271 (void) iprb_configure(ip); in iprb_m_multicst()
1275 mutex_exit(&ip->culock); in iprb_m_multicst()
1286 iprb_t *ip = arg; in iprb_m_start() local
1288 mutex_enter(&ip->rulock); in iprb_m_start()
1289 mutex_enter(&ip->culock); in iprb_m_start()
1290 rv = ip->suspended ? 0 : iprb_start(ip); in iprb_m_start()
1292 ip->running = B_TRUE; in iprb_m_start()
1293 ip->perh = ddi_periodic_add(iprb_periodic, ip, 5000000000, 0); in iprb_m_start()
1294 mutex_exit(&ip->culock); in iprb_m_start()
1295 mutex_exit(&ip->rulock); in iprb_m_start()
1297 if (ip->miih) in iprb_m_start()
1298 mii_start(ip->miih); in iprb_m_start()
1301 mac_link_update(ip->mach, LINK_STATE_UP); in iprb_m_start()
1309 iprb_t *ip = arg; in iprb_m_stop() local
1311 if (ip->miih) { in iprb_m_stop()
1312 mii_stop(ip->miih); in iprb_m_stop()
1314 mac_link_update(ip->mach, LINK_STATE_DOWN); in iprb_m_stop()
1317 ddi_periodic_delete(ip->perh); in iprb_m_stop()
1318 ip->perh = 0; in iprb_m_stop()
1320 mutex_enter(&ip->rulock); in iprb_m_stop()
1321 mutex_enter(&ip->culock); in iprb_m_stop()
1323 if (!ip->suspended) { in iprb_m_stop()
1324 iprb_update_stats(ip); in iprb_m_stop()
1325 iprb_stop(ip); in iprb_m_stop()
1327 ip->running = B_FALSE; in iprb_m_stop()
1328 mutex_exit(&ip->culock); in iprb_m_stop()
1329 mutex_exit(&ip->rulock); in iprb_m_stop()
1335 iprb_t *ip = arg; in iprb_m_stat() local
1337 if (ip->miih && (mii_m_getstat(ip->miih, stat, val) == 0)) { in iprb_m_stat()
1341 mutex_enter(&ip->culock); in iprb_m_stat()
1342 if ((!ip->suspended) && (ip->running)) { in iprb_m_stat()
1343 iprb_update_stats(ip); in iprb_m_stat()
1345 mutex_exit(&ip->culock); in iprb_m_stat()
1349 if (ip->miih == NULL) { in iprb_m_stat()
1354 if (ip->miih == NULL) { in iprb_m_stat()
1359 *val = ip->multircv; in iprb_m_stat()
1362 *val = ip->brdcstrcv; in iprb_m_stat()
1365 *val = ip->multixmt; in iprb_m_stat()
1368 *val = ip->brdcstxmt; in iprb_m_stat()
1371 * val = ip->ipackets; in iprb_m_stat()
1374 *val = ip->rbytes; in iprb_m_stat()
1377 *val = ip->opackets; in iprb_m_stat()
1380 *val = ip->obytes; in iprb_m_stat()
1383 *val = ip->norcvbuf; in iprb_m_stat()
1386 *val = ip->collisions; in iprb_m_stat()
1389 *val = ip->align_errs + in iprb_m_stat()
1390 ip->fcs_errs + in iprb_m_stat()
1391 ip->norcvbuf + in iprb_m_stat()
1392 ip->runt + in iprb_m_stat()
1393 ip->toolong + in iprb_m_stat()
1394 ip->macrcv_errs; in iprb_m_stat()
1397 *val = ip->ex_coll + in iprb_m_stat()
1398 ip->late_coll + in iprb_m_stat()
1399 ip->uflo + in iprb_m_stat()
1400 ip->macxmt_errs + in iprb_m_stat()
1401 ip->nocarrier; in iprb_m_stat()
1404 *val = ip->align_errs; in iprb_m_stat()
1407 *val = ip->fcs_errs; in iprb_m_stat()
1410 *val = ip->defer_xmt; in iprb_m_stat()
1413 *val = ip->one_coll + ip->multi_coll + ip->ex_coll; in iprb_m_stat()
1416 *val = ip->multi_coll; in iprb_m_stat()
1419 *val = ip->late_coll; in iprb_m_stat()
1422 *val = ip->ex_coll; in iprb_m_stat()
1425 *val = ip->oflo; in iprb_m_stat()
1428 *val = ip->uflo; in iprb_m_stat()
1431 *val = ip->runt; in iprb_m_stat()
1434 *val = ip->toolong; in iprb_m_stat()
1437 *val = ip->nocarrier; /* reported only for "suspend" */ in iprb_m_stat()
1440 *val = ip->macxmt_errs; in iprb_m_stat()
1443 *val = ip->macrcv_errs; in iprb_m_stat()
1455 iprb_t *ip = arg; in iprb_m_propinfo() local
1457 if (ip->miih != NULL) { in iprb_m_propinfo()
1458 mii_m_propinfo(ip->miih, name, id, pih); in iprb_m_propinfo()
1473 iprb_t *ip = arg; in iprb_m_getprop() local
1476 if (ip->miih != NULL) { in iprb_m_getprop()
1477 return (mii_m_getprop(ip->miih, name, id, sz, val)); in iprb_m_getprop()
1498 iprb_t *ip = arg; in iprb_m_setprop() local
1500 if (ip->miih != NULL) { in iprb_m_setprop()
1501 return (mii_m_setprop(ip->miih, name, id, sz, val)); in iprb_m_setprop()
1509 iprb_t *ip = arg; in iprb_m_tx() local
1512 mutex_enter(&ip->culock); in iprb_m_tx()
1517 if (ip->suspended) { in iprb_m_tx()
1519 ip->nocarrier++; in iprb_m_tx()
1523 if ((mp = iprb_send(ip, mp)) != NULL) { in iprb_m_tx()
1529 mutex_exit(&ip->culock); in iprb_m_tx()
1536 iprb_t *ip = arg; in iprb_m_ioctl() local
1538 if ((ip->miih != NULL) && (mii_m_loop_ioctl(ip->miih, wq, mp))) in iprb_m_ioctl()
1547 iprb_t *ip = arg; in iprb_mii_read() local
1559 PUT32(ip, CSR_MDICTL, mdi); in iprb_mii_read()
1561 mdi = GET32(ip, CSR_MDICTL); in iprb_mii_read()
1573 iprb_t *ip = arg; in iprb_mii_write() local
1581 PUT32(ip, CSR_MDICTL, mdi); in iprb_mii_write()
1583 if (GET32(ip, CSR_MDICTL) & MDI_R) in iprb_mii_write()
1591 iprb_t *ip = arg; in iprb_mii_notify() local
1593 mac_link_update(ip->mach, link); in iprb_mii_notify()
1599 iprb_t *ip = (void *)arg1; in iprb_intr() local
1605 mutex_enter(&ip->rulock); in iprb_intr()
1606 if (ip->suspended) { in iprb_intr()
1607 mutex_exit(&ip->rulock); in iprb_intr()
1610 sts = GET8(ip, CSR_STS); in iprb_intr()
1613 mutex_exit(&ip->rulock); in iprb_intr()
1617 PUT8(ip, CSR_STS, sts); in iprb_intr()
1620 mp = iprb_rx(ip); in iprb_intr()
1623 ((GET8(ip, CSR_STATE) & STATE_RUS) == STATE_RUS_NORES)) { in iprb_intr()
1624 iprb_rx_init(ip); in iprb_intr()
1626 mutex_enter(&ip->culock); in iprb_intr()
1627 PUT32(ip, CSR_GEN_PTR, ip->rxb[0].paddr); in iprb_intr()
1629 (void) iprb_cmd_ready(ip); in iprb_intr()
1630 PUT8(ip, CSR_CMD, RUC_START); in iprb_intr()
1631 (void) GET8(ip, CSR_CMD); /* flush CSR */ in iprb_intr()
1632 mutex_exit(&ip->culock); in iprb_intr()
1635 mutex_exit(&ip->rulock); in iprb_intr()
1638 mac_rx(ip->mach, NULL, mp); in iprb_intr()
1640 if ((sts & (STS_CNA | STS_CX)) && ip->wantw) { in iprb_intr()
1641 ip->wantw = B_FALSE; in iprb_intr()
1642 mac_tx_update(ip->mach); in iprb_intr()
1650 iprb_t *ip = arg; in iprb_periodic() local
1653 mutex_enter(&ip->rulock); in iprb_periodic()
1654 if (ip->suspended || !ip->running) { in iprb_periodic()
1655 mutex_exit(&ip->rulock); in iprb_periodic()
1664 if (ip->rxhangbug && in iprb_periodic()
1665 ((ip->miih == NULL) || (mii_get_speed(ip->miih) == 10000000)) && in iprb_periodic()
1666 ((gethrtime() - ip->rx_wdog) > ip->rx_timeout)) { in iprb_periodic()
1672 mutex_enter(&ip->culock); in iprb_periodic()
1674 if (ip->tx_wdog && ((gethrtime() - ip->tx_wdog) > ip->tx_timeout)) { in iprb_periodic()
1682 iprb_stop(ip); in iprb_periodic()
1683 if (iprb_start(ip) != DDI_SUCCESS) { in iprb_periodic()
1684 iprb_error(ip, "unable to restart chip"); in iprb_periodic()
1688 iprb_update_stats(ip); in iprb_periodic()
1690 mutex_exit(&ip->culock); in iprb_periodic()
1691 mutex_exit(&ip->rulock); in iprb_periodic()
1697 iprb_t *ip = ddi_get_driver_private(dip); in iprb_quiesce() local
1700 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_quiesce()
1702 PUT32(ip, CSR_PORT, PORT_SW_RESET); in iprb_quiesce()
1704 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_quiesce()
1712 iprb_t *ip = ddi_get_driver_private(dip); in iprb_suspend() local
1714 if (ip->miih) in iprb_suspend()
1715 mii_suspend(ip->miih); in iprb_suspend()
1717 mutex_enter(&ip->rulock); in iprb_suspend()
1718 mutex_enter(&ip->culock); in iprb_suspend()
1719 if (!ip->suspended) { in iprb_suspend()
1720 ip->suspended = B_TRUE; in iprb_suspend()
1721 if (ip->running) { in iprb_suspend()
1722 iprb_update_stats(ip); in iprb_suspend()
1723 iprb_stop(ip); in iprb_suspend()
1726 mutex_exit(&ip->culock); in iprb_suspend()
1727 mutex_exit(&ip->rulock); in iprb_suspend()
1734 iprb_t *ip = ddi_get_driver_private(dip); in iprb_resume() local
1736 mutex_enter(&ip->rulock); in iprb_resume()
1737 mutex_enter(&ip->culock); in iprb_resume()
1739 ip->suspended = B_FALSE; in iprb_resume()
1740 if (ip->running) { in iprb_resume()
1741 if (iprb_start(ip) != DDI_SUCCESS) { in iprb_resume()
1742 iprb_error(ip, "unable to restart chip!"); in iprb_resume()
1743 ip->suspended = B_TRUE; in iprb_resume()
1744 mutex_exit(&ip->culock); in iprb_resume()
1745 mutex_exit(&ip->rulock); in iprb_resume()
1750 mutex_exit(&ip->culock); in iprb_resume()
1751 mutex_exit(&ip->rulock); in iprb_resume()
1752 if (ip->miih) in iprb_resume()
1753 mii_resume(ip->miih); in iprb_resume()
1788 iprb_error(iprb_t *ip, const char *fmt, ...) in iprb_error() argument
1798 ddi_driver_name(ip->dip), ddi_get_instance(ip->dip), buf); in iprb_error()