Lines Matching refs:ip

263 	iprb_t		*ip;  in iprb_attach()  local
268 ip = kmem_zalloc(sizeof (*ip), KM_SLEEP); in iprb_attach()
269 ddi_set_driver_private(dip, ip); in iprb_attach()
270 ip->dip = dip; in iprb_attach()
272 list_create(&ip->mcast, sizeof (struct iprb_mcast), in iprb_attach()
276 mutex_init(&ip->culock, NULL, MUTEX_DRIVER, NULL); in iprb_attach()
277 mutex_init(&ip->rulock, NULL, MUTEX_DRIVER, NULL); in iprb_attach()
279 if (pci_config_setup(dip, &ip->pcih) != DDI_SUCCESS) { in iprb_attach()
280 iprb_error(ip, "unable to map configuration space"); in iprb_attach()
281 iprb_destroy(ip); in iprb_attach()
285 if (ddi_regs_map_setup(dip, 1, &ip->regs, 0, 0, &acc_attr, in iprb_attach()
286 &ip->regsh) != DDI_SUCCESS) { in iprb_attach()
287 iprb_error(ip, "unable to map device registers"); in iprb_attach()
288 iprb_destroy(ip); in iprb_attach()
293 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_attach()
295 PUT32(ip, CSR_PORT, PORT_SW_RESET); in iprb_attach()
297 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_attach()
298 (void) GET8(ip, CSR_INTCTL); in iprb_attach()
303 ip->tx_timeout = TX_WATCHDOG; in iprb_attach()
304 ip->rx_timeout = RX_WATCHDOG; in iprb_attach()
306 iprb_identify(ip); in iprb_attach()
309 w = iprb_eeprom_read(ip, 0); in iprb_attach()
310 ip->factaddr[0] = w & 0xff; in iprb_attach()
311 ip->factaddr[1] = w >> 8; in iprb_attach()
312 w = iprb_eeprom_read(ip, 1); in iprb_attach()
313 ip->factaddr[2] = w & 0xff; in iprb_attach()
314 ip->factaddr[3] = w >> 8; in iprb_attach()
315 w = iprb_eeprom_read(ip, 2); in iprb_attach()
316 ip->factaddr[4] = w & 0xff; in iprb_attach()
317 ip->factaddr[5] = w >> 8; in iprb_attach()
318 bcopy(ip->factaddr, ip->curraddr, 6); in iprb_attach()
320 if (ip->resumebug) { in iprb_attach()
328 if ((iprb_eeprom_read(ip, 10) & 0x02) == 0) { in iprb_attach()
330 ip->resumebug = B_FALSE; in iprb_attach()
334 if ((iprb_eeprom_read(ip, 3) & 0x3) != 0x3) { in iprb_attach()
336 ip->rxhangbug = B_TRUE; in iprb_attach()
340 w = iprb_eeprom_read(ip, 6); in iprb_attach()
342 if ((ip->miih = mii_alloc(ip, dip, &iprb_mii_ops)) == NULL) { in iprb_attach()
343 iprb_error(ip, "unable to allocate MII ops vector"); in iprb_attach()
344 iprb_destroy(ip); in iprb_attach()
347 if (ip->canpause) { in iprb_attach()
348 mii_set_pauseable(ip->miih, B_TRUE, B_FALSE); in iprb_attach()
355 if (iprb_dma_alloc(ip, &ip->cmds[i], CB_SIZE) != DDI_SUCCESS) { in iprb_attach()
356 iprb_destroy(ip); in iprb_attach()
362 iprb_dma_t *cb = &ip->cmds[i]; in iprb_attach()
364 PUTCB32(cb, CB_LNK_OFFSET, (ip->cmds[(i + 1) % NUM_TX].paddr)); in iprb_attach()
369 if (iprb_dma_alloc(ip, &ip->rxb[i], RFD_SIZE) != DDI_SUCCESS) { in iprb_attach()
370 iprb_destroy(ip); in iprb_attach()
374 if (iprb_dma_alloc(ip, &ip->stats, STATS_SIZE) != DDI_SUCCESS) { in iprb_attach()
375 iprb_destroy(ip); in iprb_attach()
379 if (iprb_add_intr(ip) != DDI_SUCCESS) { in iprb_attach()
380 iprb_destroy(ip); in iprb_attach()
385 iprb_error(ip, "unable to allocate mac structure"); in iprb_attach()
386 iprb_destroy(ip); in iprb_attach()
391 macp->m_driver = ip; in iprb_attach()
393 macp->m_src_addr = ip->curraddr; in iprb_attach()
398 if (mac_register(macp, &ip->mach) != 0) { in iprb_attach()
399 iprb_error(ip, "unable to register mac with framework"); in iprb_attach()
401 iprb_destroy(ip); in iprb_attach()
412 iprb_t *ip; in iprb_detach() local
414 ip = ddi_get_driver_private(dip); in iprb_detach()
415 ASSERT(ip != NULL); in iprb_detach()
417 if (mac_disable(ip->mach) != 0) in iprb_detach()
420 (void) mac_unregister(ip->mach); in iprb_detach()
421 iprb_destroy(ip); in iprb_detach()
426 iprb_add_intr(iprb_t *ip) in iprb_add_intr() argument
430 if (ddi_intr_alloc(ip->dip, &ip->intrh, DDI_INTR_TYPE_FIXED, 0, 1, in iprb_add_intr()
432 iprb_error(ip, "failed allocating interrupt handle"); in iprb_add_intr()
436 if (ddi_intr_add_handler(ip->intrh, iprb_intr, ip, NULL) != in iprb_add_intr()
438 (void) ddi_intr_free(ip->intrh); in iprb_add_intr()
439 ip->intrh = NULL; in iprb_add_intr()
440 iprb_error(ip, "failed adding interrupt handler"); in iprb_add_intr()
443 if (ddi_intr_enable(ip->intrh) != DDI_SUCCESS) { in iprb_add_intr()
444 (void) ddi_intr_remove_handler(ip->intrh); in iprb_add_intr()
445 (void) ddi_intr_free(ip->intrh); in iprb_add_intr()
446 ip->intrh = NULL; in iprb_add_intr()
447 iprb_error(ip, "failed enabling interrupt"); in iprb_add_intr()
454 iprb_dma_alloc(iprb_t *ip, iprb_dma_t *h, size_t size) in iprb_dma_alloc() argument
460 if (ddi_dma_alloc_handle(ip->dip, &dma_attr, DDI_DMA_SLEEP, NULL, in iprb_dma_alloc()
462 iprb_error(ip, "unable to allocate dma handle"); in iprb_dma_alloc()
467 iprb_error(ip, "unable to allocate dma memory"); in iprb_dma_alloc()
474 iprb_error(ip, "unable to map command memory"); in iprb_dma_alloc()
496 iprb_destroy(iprb_t *ip) in iprb_destroy() argument
502 if (ip->intrh != NULL) { in iprb_destroy()
503 (void) ddi_intr_disable(ip->intrh); in iprb_destroy()
504 (void) ddi_intr_remove_handler(ip->intrh); in iprb_destroy()
505 (void) ddi_intr_free(ip->intrh); in iprb_destroy()
509 iprb_dma_free(&ip->cmds[i]); in iprb_destroy()
512 iprb_dma_free(&ip->rxb[i]); in iprb_destroy()
514 iprb_dma_free(&ip->stats); in iprb_destroy()
516 if (ip->miih) in iprb_destroy()
517 mii_free(ip->miih); in iprb_destroy()
520 while ((mc = list_head(&ip->mcast)) != NULL) { in iprb_destroy()
521 list_remove(&ip->mcast, mc); in iprb_destroy()
526 if (ip->pcih) in iprb_destroy()
527 pci_config_teardown(&ip->pcih); in iprb_destroy()
528 if (ip->regsh) in iprb_destroy()
529 ddi_regs_map_free(&ip->regsh); in iprb_destroy()
532 ddi_set_driver_private(ip->dip, NULL); in iprb_destroy()
534 list_destroy(&ip->mcast); in iprb_destroy()
535 mutex_destroy(&ip->culock); in iprb_destroy()
536 mutex_destroy(&ip->rulock); in iprb_destroy()
539 kmem_free(ip, sizeof (*ip)); in iprb_destroy()
543 iprb_identify(iprb_t *ip) in iprb_identify() argument
545 ip->devid = pci_config_get16(ip->pcih, PCI_CONF_DEVID); in iprb_identify()
546 ip->revid = pci_config_get8(ip->pcih, PCI_CONF_REVID); in iprb_identify()
548 switch (ip->devid) { in iprb_identify()
552 if (ip->revid >= REV_82558_A4) { in iprb_identify()
553 ip->canpause = B_TRUE; in iprb_identify()
554 ip->canmwi = B_TRUE; in iprb_identify()
556 ip->is557 = B_TRUE; in iprb_identify()
558 if (ip->revid >= REV_82559_A0) in iprb_identify()
559 ip->resumebug = B_TRUE; in iprb_identify()
563 ip->canpause = B_TRUE; in iprb_identify()
564 ip->resumebug = B_TRUE; in iprb_identify()
565 ip->canmwi = B_TRUE; in iprb_identify()
574 ip->resumebug = B_TRUE; in iprb_identify()
575 if (ip->revid >= REV_82558_A4) in iprb_identify()
576 ip->canpause = B_TRUE; in iprb_identify()
580 if (ip->revid >= REV_82558_A4) in iprb_identify()
581 ip->canpause = B_TRUE; in iprb_identify()
586 if (ddi_prop_get_int(DDI_DEV_T_ANY, ip->dip, 0, "MWIEnable", 1) == 0) { in iprb_identify()
587 ip->canmwi = B_FALSE; in iprb_identify()
592 iprb_eeprom_sendbits(iprb_t *ip, uint32_t val, uint8_t nbits) in iprb_eeprom_sendbits() argument
600 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_sendbits()
602 PUT16(ip, CSR_EECTL, x | EEPROM_EESK | EEPROM_EECS); in iprb_eeprom_sendbits()
604 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_sendbits()
611 iprb_eeprom_read(iprb_t *ip, uint16_t address) in iprb_eeprom_read() argument
619 if ((address != 0) && (ip->eeprom_bits == 0)) in iprb_eeprom_read()
620 (void) iprb_eeprom_read(ip, 0); in iprb_eeprom_read()
622 if ((bits = ip->eeprom_bits) == 0) { in iprb_eeprom_read()
627 PUT16(ip, CSR_EECTL, EEPROM_EECS); in iprb_eeprom_read()
631 iprb_eeprom_sendbits(ip, 6, 3); in iprb_eeprom_read()
635 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_read()
637 PUT16(ip, CSR_EECTL, x | EEPROM_EESK | EEPROM_EECS); in iprb_eeprom_read()
639 PUT16(ip, CSR_EECTL, x | EEPROM_EECS); in iprb_eeprom_read()
644 if ((GET16(ip, CSR_EECTL) & EEPROM_EEDO) == 0) { in iprb_eeprom_read()
645 if (ip->eeprom_bits == 0) { in iprb_eeprom_read()
646 ip->eeprom_bits = n; in iprb_eeprom_read()
648 1U << ip->eeprom_bits); in iprb_eeprom_read()
653 if (n != ip->eeprom_bits) { in iprb_eeprom_read()
654 iprb_error(ip, "cannot determine EEPROM size (%d, %d)", in iprb_eeprom_read()
655 ip->eeprom_bits, n); in iprb_eeprom_read()
661 PUT16(ip, CSR_EECTL, EEPROM_EECS | EEPROM_EESK); in iprb_eeprom_read()
663 if (GET16(ip, CSR_EECTL) & EEPROM_EEDO) in iprb_eeprom_read()
666 PUT16(ip, CSR_EECTL, EEPROM_EECS); in iprb_eeprom_read()
671 PUT16(ip, CSR_EECTL, 0); in iprb_eeprom_read()
678 iprb_cmd_ready(iprb_t *ip) in iprb_cmd_ready() argument
682 if (GET8(ip, CSR_CMD) == 0) { in iprb_cmd_ready()
687 iprb_error(ip, "timeout waiting for chip to become ready"); in iprb_cmd_ready()
692 iprb_cmd_reclaim(iprb_t *ip) in iprb_cmd_reclaim() argument
694 while (ip->cmd_count) { in iprb_cmd_reclaim()
695 iprb_dma_t *cb = &ip->cmds[ip->cmd_tail]; in iprb_cmd_reclaim()
702 ip->cmd_tail++; in iprb_cmd_reclaim()
703 ip->cmd_tail %= NUM_TX; in iprb_cmd_reclaim()
704 ip->cmd_count--; in iprb_cmd_reclaim()
705 if (ip->cmd_count == 0) { in iprb_cmd_reclaim()
706 ip->tx_wdog = 0; in iprb_cmd_reclaim()
708 ip->tx_wdog = gethrtime(); in iprb_cmd_reclaim()
714 iprb_cmd_drain(iprb_t *ip) in iprb_cmd_drain() argument
717 iprb_cmd_reclaim(ip); in iprb_cmd_drain()
718 if (ip->cmd_count == 0) in iprb_cmd_drain()
722 iprb_error(ip, "time out waiting for commands to drain"); in iprb_cmd_drain()
727 iprb_cmd_submit(iprb_t *ip, uint16_t cmd) in iprb_cmd_submit() argument
729 iprb_dma_t *ncb = &ip->cmds[ip->cmd_head]; in iprb_cmd_submit()
730 iprb_dma_t *lcb = &ip->cmds[ip->cmd_last]; in iprb_cmd_submit()
733 ASSERT((ip->cmd_count) < NUM_TX); in iprb_cmd_submit()
734 if (ip->cmd_count == (NUM_TX - 1)) { in iprb_cmd_submit()
759 if (ip->resumebug) { in iprb_cmd_submit()
760 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_cmd_submit()
762 PUT8(ip, CSR_CMD, CUC_NOP); in iprb_cmd_submit()
763 (void) GET8(ip, CSR_CMD); in iprb_cmd_submit()
768 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_cmd_submit()
777 PUT8(ip, CSR_CMD, CUC_RESUME); in iprb_cmd_submit()
778 (void) GET8(ip, CSR_CMD); /* flush CSR */ in iprb_cmd_submit()
780 ip->tx_wdog = gethrtime(); in iprb_cmd_submit()
781 ip->cmd_last = ip->cmd_head; in iprb_cmd_submit()
782 ip->cmd_head++; in iprb_cmd_submit()
783 ip->cmd_head %= NUM_TX; in iprb_cmd_submit()
784 ip->cmd_count++; in iprb_cmd_submit()
790 iprb_cmd_next(iprb_t *ip) in iprb_cmd_next() argument
792 if (ip->cmd_count >= NUM_TX) { in iprb_cmd_next()
795 return (&ip->cmds[ip->cmd_head]); in iprb_cmd_next()
799 iprb_set_unicast(iprb_t *ip) in iprb_set_unicast() argument
803 ASSERT(mutex_owned(&ip->culock)); in iprb_set_unicast()
805 if ((cb = iprb_cmd_next(ip)) == NULL) in iprb_set_unicast()
808 PUTCBEA(cb, CB_IAS_ADR_OFFSET, ip->curraddr); in iprb_set_unicast()
809 return (iprb_cmd_submit(ip, CB_CMD_IAS)); in iprb_set_unicast()
813 iprb_set_multicast(iprb_t *ip) in iprb_set_multicast() argument
820 ASSERT(mutex_owned(&ip->culock)); in iprb_set_multicast()
822 if ((ip->nmcast <= 0) || (ip->nmcast > CB_MCS_CNT_MAX)) { in iprb_set_multicast()
833 if ((cb = iprb_cmd_next(ip)) == NULL) { in iprb_set_multicast()
837 l = &ip->mcast; in iprb_set_multicast()
841 ASSERT(i == ip->nmcast); in iprb_set_multicast()
843 return (iprb_cmd_submit(ip, CB_CMD_MCS)); in iprb_set_multicast()
847 iprb_set_config(iprb_t *ip) in iprb_set_config() argument
851 ASSERT(mutex_owned(&ip->culock)); in iprb_set_config()
852 if ((cb = iprb_cmd_next(ip)) == NULL) { in iprb_set_config()
858 PUTCB8(cb, CB_CONFIG_OFFSET + 3, (ip->canmwi ? 1 : 0)); in iprb_set_config()
861 PUTCB8(cb, CB_CONFIG_OFFSET + 6, (ip->promisc ? 0x80 : 0) | 0x3a); in iprb_set_config()
862 PUTCB8(cb, CB_CONFIG_OFFSET + 7, (ip->promisc ? 0 : 0x1) | 2); in iprb_set_config()
863 PUTCB8(cb, CB_CONFIG_OFFSET + 8, (ip->miih ? 0x1 : 0)); in iprb_set_config()
867 PUTCB8(cb, CB_CONFIG_OFFSET + 12, (ip->is557 ? 0 : 1) | 0x60); in iprb_set_config()
871 (ip->miih ? 0x80 : 0) | (ip->promisc ? 0x1 : 0) | 0x48); in iprb_set_config()
873 PUTCB8(cb, CB_CONFIG_OFFSET + 17, (ip->canpause ? 0x40 : 0)); in iprb_set_config()
874 PUTCB8(cb, CB_CONFIG_OFFSET + 18, (ip->is557 ? 0 : 0x8) | 0xf2); in iprb_set_config()
876 ((ip->revid < REV_82558_B0) ? 0 : 0x80) | in iprb_set_config()
877 (ip->canpause ? 0x18 : 0)); in iprb_set_config()
880 ((ip->nmcast >= CB_MCS_CNT_MAX) ? 0x8 : 0) | 0x5); in iprb_set_config()
882 return (iprb_cmd_submit(ip, CB_CMD_CONFIG)); in iprb_set_config()
886 iprb_set_ucode(iprb_t *ip) in iprb_set_ucode() argument
893 if (iprb_ucode[i].rev == ip->revid) { in iprb_set_ucode()
903 ASSERT(mutex_owned(&ip->culock)); in iprb_set_ucode()
904 if ((cb = iprb_cmd_next(ip)) == NULL) { in iprb_set_ucode()
910 return (iprb_cmd_submit(ip, CB_CMD_UCODE)); in iprb_set_ucode()
914 iprb_configure(iprb_t *ip) in iprb_configure() argument
916 ASSERT(mutex_owned(&ip->culock)); in iprb_configure()
918 if (iprb_cmd_drain(ip) != DDI_SUCCESS) in iprb_configure()
921 if (iprb_set_config(ip) != DDI_SUCCESS) in iprb_configure()
923 if (iprb_set_unicast(ip) != DDI_SUCCESS) in iprb_configure()
925 if (iprb_set_multicast(ip) != DDI_SUCCESS) in iprb_configure()
932 iprb_stop(iprb_t *ip) in iprb_stop() argument
935 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_stop()
936 (void) GET32(ip, CSR_PORT); in iprb_stop()
940 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_stop()
944 iprb_start(iprb_t *ip) in iprb_start() argument
948 ASSERT(mutex_owned(&ip->rulock)); in iprb_start()
949 ASSERT(mutex_owned(&ip->culock)); in iprb_start()
952 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_start()
953 (void) GET32(ip, CSR_PORT); in iprb_start()
956 PUT32(ip, CSR_PORT, PORT_SW_RESET); in iprb_start()
957 (void) GET32(ip, CSR_PORT); in iprb_start()
959 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_start()
962 ip->cmd_head = ip->cmd_tail = 0; in iprb_start()
963 ip->cmd_last = NUM_TX - 1; in iprb_start()
964 ip->cmd_count = 0; in iprb_start()
966 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_start()
968 PUT32(ip, CSR_GEN_PTR, 0); in iprb_start()
969 PUT8(ip, CSR_CMD, CUC_CUBASE); in iprb_start()
970 (void) GET8(ip, CSR_CMD); in iprb_start()
972 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_start()
974 PUT32(ip, CSR_GEN_PTR, 0); in iprb_start()
975 PUT8(ip, CSR_CMD, RUC_RUBASE); in iprb_start()
976 (void) GET8(ip, CSR_CMD); in iprb_start()
979 cb = iprb_cmd_next(ip); in iprb_start()
981 if (iprb_cmd_submit(ip, CB_CMD_NOP) != DDI_SUCCESS) in iprb_start()
985 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_start()
987 PUT32(ip, CSR_GEN_PTR, cb->paddr); in iprb_start()
988 PUT8(ip, CSR_CMD, CUC_START); in iprb_start()
989 (void) GET8(ip, CSR_CMD); in iprb_start()
992 if (iprb_set_ucode(ip) != DDI_SUCCESS) in iprb_start()
996 iprb_rx_init(ip); in iprb_start()
998 PUT32(ip, CSR_GEN_PTR, ip->rxb[0].paddr); in iprb_start()
1000 (void) iprb_cmd_ready(ip); in iprb_start()
1001 PUT8(ip, CSR_CMD, RUC_START); in iprb_start()
1002 (void) GET8(ip, CSR_CMD); /* flush CSR */ in iprb_start()
1005 PUT8(ip, CSR_INTCTL, 0); in iprb_start()
1006 (void) GET8(ip, CSR_INTCTL); in iprb_start()
1012 iprb_update_stats(iprb_t *ip) in iprb_update_stats() argument
1014 iprb_dma_t *sp = &ip->stats; in iprb_update_stats()
1018 ASSERT(mutex_owned(&ip->culock)); in iprb_update_stats()
1022 if (tstamp / NANOSEC == ip->stats_time / NANOSEC) in iprb_update_stats()
1028 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_update_stats()
1030 PUT32(ip, CSR_GEN_PTR, sp->paddr); in iprb_update_stats()
1031 PUT8(ip, CSR_CMD, CUC_STATSBASE); in iprb_update_stats()
1032 (void) GET8(ip, CSR_CMD); in iprb_update_stats()
1034 if (iprb_cmd_ready(ip) != DDI_SUCCESS) in iprb_update_stats()
1036 PUT8(ip, CSR_CMD, CUC_STATS_RST); in iprb_update_stats()
1037 (void) GET8(ip, CSR_CMD); /* flush wb */ in iprb_update_stats()
1048 iprb_error(ip, "time out acquiring hardware statistics"); in iprb_update_stats()
1052 ip->ex_coll += GETSTAT(sp, STATS_TX_MAXCOL_OFFSET); in iprb_update_stats()
1053 ip->late_coll += GETSTAT(sp, STATS_TX_LATECOL_OFFSET); in iprb_update_stats()
1054 ip->uflo += GETSTAT(sp, STATS_TX_UFLO_OFFSET); in iprb_update_stats()
1055 ip->defer_xmt += GETSTAT(sp, STATS_TX_DEFER_OFFSET); in iprb_update_stats()
1056 ip->one_coll += GETSTAT(sp, STATS_TX_ONECOL_OFFSET); in iprb_update_stats()
1057 ip->multi_coll += GETSTAT(sp, STATS_TX_MULTCOL_OFFSET); in iprb_update_stats()
1058 ip->collisions += GETSTAT(sp, STATS_TX_TOTCOL_OFFSET); in iprb_update_stats()
1059 ip->fcs_errs += GETSTAT(sp, STATS_RX_FCS_OFFSET); in iprb_update_stats()
1060 ip->align_errs += GETSTAT(sp, STATS_RX_ALIGN_OFFSET); in iprb_update_stats()
1061 ip->norcvbuf += GETSTAT(sp, STATS_RX_NOBUF_OFFSET); in iprb_update_stats()
1062 ip->oflo += GETSTAT(sp, STATS_RX_OFLO_OFFSET); in iprb_update_stats()
1063 ip->runt += GETSTAT(sp, STATS_RX_SHORT_OFFSET); in iprb_update_stats()
1065 ip->stats_time = tstamp; in iprb_update_stats()
1069 iprb_send(iprb_t *ip, mblk_t *mp) in iprb_send() argument
1074 ASSERT(mutex_owned(&ip->culock)); in iprb_send()
1077 iprb_cmd_reclaim(ip); in iprb_send()
1079 cb = iprb_cmd_next(ip); in iprb_send()
1083 ip->wantw = B_TRUE; in iprb_send()
1089 ip->macxmt_errs++; in iprb_send()
1094 ip->opackets++; in iprb_send()
1095 ip->obytes += sz; in iprb_send()
1104 ip->multixmt++; in iprb_send()
1106 ip->brdcstxmt++; in iprb_send()
1111 if (iprb_cmd_submit(ip, CB_CMD_TX) != DDI_SUCCESS) { in iprb_send()
1112 ip->macxmt_errs++; in iprb_send()
1119 iprb_rx_add(iprb_t *ip) in iprb_rx_add() argument
1124 ASSERT(mutex_owned(&ip->rulock)); in iprb_rx_add()
1126 curr = ip->rx_index; in iprb_rx_add()
1127 last = ip->rx_last; in iprb_rx_add()
1130 ip->rx_last = curr; in iprb_rx_add()
1131 ip->rx_index = next; in iprb_rx_add()
1133 lfd = &ip->rxb[last]; in iprb_rx_add()
1134 rfd = &ip->rxb[curr]; in iprb_rx_add()
1135 nfd = &ip->rxb[next]; in iprb_rx_add()
1148 iprb_rx_init(iprb_t *ip) in iprb_rx_init() argument
1150 ip->rx_index = 0; in iprb_rx_init()
1151 ip->rx_last = NUM_RX - 1; in iprb_rx_init()
1153 iprb_rx_add(ip); in iprb_rx_init()
1154 ip->rx_index = 0; in iprb_rx_init()
1155 ip->rx_last = NUM_RX - 1; in iprb_rx_init()
1159 iprb_rx(iprb_t *ip) in iprb_rx() argument
1173 rfd = &ip->rxb[ip->rx_index]; in iprb_rx()
1179 ip->rx_wdog = gethrtime(); in iprb_rx()
1187 ip->toolong++; in iprb_rx()
1188 iprb_rx_add(ip); in iprb_rx()
1192 iprb_rx_add(ip); in iprb_rx()
1196 ip->norcvbuf++; in iprb_rx()
1197 iprb_rx_add(ip); in iprb_rx()
1203 iprb_rx_add(ip); in iprb_rx()
1206 ip->ipackets++; in iprb_rx()
1207 ip->rbytes += cnt; in iprb_rx()
1210 ip->multircv++; in iprb_rx()
1212 ip->brdcstrcv++; in iprb_rx()
1224 iprb_t *ip = arg; in iprb_m_promisc() local
1226 mutex_enter(&ip->culock); in iprb_m_promisc()
1227 ip->promisc = on; in iprb_m_promisc()
1228 if (ip->running && !ip->suspended) in iprb_m_promisc()
1229 (void) iprb_configure(ip); in iprb_m_promisc()
1230 mutex_exit(&ip->culock); in iprb_m_promisc()
1237 iprb_t *ip = arg; in iprb_m_unicst() local
1239 mutex_enter(&ip->culock); in iprb_m_unicst()
1240 bcopy(macaddr, ip->curraddr, 6); in iprb_m_unicst()
1241 if (ip->running && !ip->suspended) in iprb_m_unicst()
1242 (void) iprb_configure(ip); in iprb_m_unicst()
1243 mutex_exit(&ip->culock); in iprb_m_unicst()
1250 iprb_t *ip = arg; in iprb_m_multicst() local
1251 list_t *l = &ip->mcast; in iprb_m_multicst()
1260 mutex_enter(&ip->culock); in iprb_m_multicst()
1262 ip->nmcast++; in iprb_m_multicst()
1263 if (ip->running && !ip->suspended) in iprb_m_multicst()
1264 (void) iprb_configure(ip); in iprb_m_multicst()
1265 mutex_exit(&ip->culock); in iprb_m_multicst()
1267 mutex_enter(&ip->culock); in iprb_m_multicst()
1270 list_remove(&ip->mcast, mc); in iprb_m_multicst()
1271 ip->nmcast--; in iprb_m_multicst()
1272 if (ip->running && !ip->suspended) in iprb_m_multicst()
1273 (void) iprb_configure(ip); in iprb_m_multicst()
1277 mutex_exit(&ip->culock); in iprb_m_multicst()
1288 iprb_t *ip = arg; in iprb_m_start() local
1290 mutex_enter(&ip->rulock); in iprb_m_start()
1291 mutex_enter(&ip->culock); in iprb_m_start()
1292 rv = ip->suspended ? 0 : iprb_start(ip); in iprb_m_start()
1294 ip->running = B_TRUE; in iprb_m_start()
1295 ip->perh = ddi_periodic_add(iprb_periodic, ip, 5000000000, 0); in iprb_m_start()
1296 mutex_exit(&ip->culock); in iprb_m_start()
1297 mutex_exit(&ip->rulock); in iprb_m_start()
1299 if (ip->miih) in iprb_m_start()
1300 mii_start(ip->miih); in iprb_m_start()
1303 mac_link_update(ip->mach, LINK_STATE_UP); in iprb_m_start()
1311 iprb_t *ip = arg; in iprb_m_stop() local
1313 if (ip->miih) { in iprb_m_stop()
1314 mii_stop(ip->miih); in iprb_m_stop()
1316 mac_link_update(ip->mach, LINK_STATE_DOWN); in iprb_m_stop()
1319 ddi_periodic_delete(ip->perh); in iprb_m_stop()
1320 ip->perh = 0; in iprb_m_stop()
1322 mutex_enter(&ip->rulock); in iprb_m_stop()
1323 mutex_enter(&ip->culock); in iprb_m_stop()
1325 if (!ip->suspended) { in iprb_m_stop()
1326 iprb_update_stats(ip); in iprb_m_stop()
1327 iprb_stop(ip); in iprb_m_stop()
1329 ip->running = B_FALSE; in iprb_m_stop()
1330 mutex_exit(&ip->culock); in iprb_m_stop()
1331 mutex_exit(&ip->rulock); in iprb_m_stop()
1337 iprb_t *ip = arg; in iprb_m_stat() local
1339 if (ip->miih && (mii_m_getstat(ip->miih, stat, val) == 0)) { in iprb_m_stat()
1343 mutex_enter(&ip->culock); in iprb_m_stat()
1344 if ((!ip->suspended) && (ip->running)) { in iprb_m_stat()
1345 iprb_update_stats(ip); in iprb_m_stat()
1347 mutex_exit(&ip->culock); in iprb_m_stat()
1351 if (ip->miih == NULL) { in iprb_m_stat()
1356 if (ip->miih == NULL) { in iprb_m_stat()
1361 *val = ip->multircv; in iprb_m_stat()
1364 *val = ip->brdcstrcv; in iprb_m_stat()
1367 *val = ip->multixmt; in iprb_m_stat()
1370 *val = ip->brdcstxmt; in iprb_m_stat()
1373 * val = ip->ipackets; in iprb_m_stat()
1376 *val = ip->rbytes; in iprb_m_stat()
1379 *val = ip->opackets; in iprb_m_stat()
1382 *val = ip->obytes; in iprb_m_stat()
1385 *val = ip->norcvbuf; in iprb_m_stat()
1388 *val = ip->collisions; in iprb_m_stat()
1391 *val = ip->align_errs + in iprb_m_stat()
1392 ip->fcs_errs + in iprb_m_stat()
1393 ip->norcvbuf + in iprb_m_stat()
1394 ip->runt + in iprb_m_stat()
1395 ip->toolong + in iprb_m_stat()
1396 ip->macrcv_errs; in iprb_m_stat()
1399 *val = ip->ex_coll + in iprb_m_stat()
1400 ip->late_coll + in iprb_m_stat()
1401 ip->uflo + in iprb_m_stat()
1402 ip->macxmt_errs + in iprb_m_stat()
1403 ip->nocarrier; in iprb_m_stat()
1406 *val = ip->align_errs; in iprb_m_stat()
1409 *val = ip->fcs_errs; in iprb_m_stat()
1412 *val = ip->defer_xmt; in iprb_m_stat()
1415 *val = ip->one_coll + ip->multi_coll + ip->ex_coll; in iprb_m_stat()
1418 *val = ip->multi_coll; in iprb_m_stat()
1421 *val = ip->late_coll; in iprb_m_stat()
1424 *val = ip->ex_coll; in iprb_m_stat()
1427 *val = ip->oflo; in iprb_m_stat()
1430 *val = ip->uflo; in iprb_m_stat()
1433 *val = ip->runt; in iprb_m_stat()
1436 *val = ip->toolong; in iprb_m_stat()
1439 *val = ip->nocarrier; /* reported only for "suspend" */ in iprb_m_stat()
1442 *val = ip->macxmt_errs; in iprb_m_stat()
1445 *val = ip->macrcv_errs; in iprb_m_stat()
1457 iprb_t *ip = arg; in iprb_m_propinfo() local
1459 if (ip->miih != NULL) { in iprb_m_propinfo()
1460 mii_m_propinfo(ip->miih, name, id, pih); in iprb_m_propinfo()
1475 iprb_t *ip = arg; in iprb_m_getprop() local
1478 if (ip->miih != NULL) { in iprb_m_getprop()
1479 return (mii_m_getprop(ip->miih, name, id, sz, val)); in iprb_m_getprop()
1500 iprb_t *ip = arg; in iprb_m_setprop() local
1502 if (ip->miih != NULL) { in iprb_m_setprop()
1503 return (mii_m_setprop(ip->miih, name, id, sz, val)); in iprb_m_setprop()
1511 iprb_t *ip = arg; in iprb_m_tx() local
1514 mutex_enter(&ip->culock); in iprb_m_tx()
1519 if (ip->suspended) { in iprb_m_tx()
1521 ip->nocarrier++; in iprb_m_tx()
1525 if ((mp = iprb_send(ip, mp)) != NULL) { in iprb_m_tx()
1531 mutex_exit(&ip->culock); in iprb_m_tx()
1538 iprb_t *ip = arg; in iprb_m_ioctl() local
1540 if ((ip->miih != NULL) && (mii_m_loop_ioctl(ip->miih, wq, mp))) in iprb_m_ioctl()
1549 iprb_t *ip = arg; in iprb_mii_read() local
1561 PUT32(ip, CSR_MDICTL, mdi); in iprb_mii_read()
1563 mdi = GET32(ip, CSR_MDICTL); in iprb_mii_read()
1575 iprb_t *ip = arg; in iprb_mii_write() local
1583 PUT32(ip, CSR_MDICTL, mdi); in iprb_mii_write()
1585 if (GET32(ip, CSR_MDICTL) & MDI_R) in iprb_mii_write()
1593 iprb_t *ip = arg; in iprb_mii_notify() local
1595 mac_link_update(ip->mach, link); in iprb_mii_notify()
1601 iprb_t *ip = (void *)arg1; in iprb_intr() local
1607 mutex_enter(&ip->rulock); in iprb_intr()
1608 if (ip->suspended) { in iprb_intr()
1609 mutex_exit(&ip->rulock); in iprb_intr()
1612 sts = GET8(ip, CSR_STS); in iprb_intr()
1615 mutex_exit(&ip->rulock); in iprb_intr()
1619 PUT8(ip, CSR_STS, sts); in iprb_intr()
1622 mp = iprb_rx(ip); in iprb_intr()
1625 ((GET8(ip, CSR_STATE) & STATE_RUS) == STATE_RUS_NORES)) { in iprb_intr()
1626 iprb_rx_init(ip); in iprb_intr()
1628 mutex_enter(&ip->culock); in iprb_intr()
1629 PUT32(ip, CSR_GEN_PTR, ip->rxb[0].paddr); in iprb_intr()
1631 (void) iprb_cmd_ready(ip); in iprb_intr()
1632 PUT8(ip, CSR_CMD, RUC_START); in iprb_intr()
1633 (void) GET8(ip, CSR_CMD); /* flush CSR */ in iprb_intr()
1634 mutex_exit(&ip->culock); in iprb_intr()
1637 mutex_exit(&ip->rulock); in iprb_intr()
1640 mac_rx(ip->mach, NULL, mp); in iprb_intr()
1642 if ((sts & (STS_CNA | STS_CX)) && ip->wantw) { in iprb_intr()
1643 ip->wantw = B_FALSE; in iprb_intr()
1644 mac_tx_update(ip->mach); in iprb_intr()
1652 iprb_t *ip = arg; in iprb_periodic() local
1655 mutex_enter(&ip->rulock); in iprb_periodic()
1656 if (ip->suspended || !ip->running) { in iprb_periodic()
1657 mutex_exit(&ip->rulock); in iprb_periodic()
1666 if (ip->rxhangbug && in iprb_periodic()
1667 ((ip->miih == NULL) || (mii_get_speed(ip->miih) == 10000000)) && in iprb_periodic()
1668 ((gethrtime() - ip->rx_wdog) > ip->rx_timeout)) { in iprb_periodic()
1674 mutex_enter(&ip->culock); in iprb_periodic()
1682 iprb_cmd_reclaim(ip); in iprb_periodic()
1683 if (ip->tx_wdog && ((gethrtime() - ip->tx_wdog) > ip->tx_timeout)) { in iprb_periodic()
1691 iprb_stop(ip); in iprb_periodic()
1692 if (iprb_start(ip) != DDI_SUCCESS) { in iprb_periodic()
1693 iprb_error(ip, "unable to restart chip"); in iprb_periodic()
1697 iprb_update_stats(ip); in iprb_periodic()
1699 mutex_exit(&ip->culock); in iprb_periodic()
1700 mutex_exit(&ip->rulock); in iprb_periodic()
1706 iprb_t *ip = ddi_get_driver_private(dip); in iprb_quiesce() local
1709 PUT32(ip, CSR_PORT, PORT_SEL_RESET); in iprb_quiesce()
1711 PUT32(ip, CSR_PORT, PORT_SW_RESET); in iprb_quiesce()
1713 PUT8(ip, CSR_INTCTL, INTCTL_MASK); in iprb_quiesce()
1721 iprb_t *ip = ddi_get_driver_private(dip); in iprb_suspend() local
1723 if (ip->miih) in iprb_suspend()
1724 mii_suspend(ip->miih); in iprb_suspend()
1726 mutex_enter(&ip->rulock); in iprb_suspend()
1727 mutex_enter(&ip->culock); in iprb_suspend()
1728 if (!ip->suspended) { in iprb_suspend()
1729 ip->suspended = B_TRUE; in iprb_suspend()
1730 if (ip->running) { in iprb_suspend()
1731 iprb_update_stats(ip); in iprb_suspend()
1732 iprb_stop(ip); in iprb_suspend()
1735 mutex_exit(&ip->culock); in iprb_suspend()
1736 mutex_exit(&ip->rulock); in iprb_suspend()
1743 iprb_t *ip = ddi_get_driver_private(dip); in iprb_resume() local
1745 mutex_enter(&ip->rulock); in iprb_resume()
1746 mutex_enter(&ip->culock); in iprb_resume()
1748 ip->suspended = B_FALSE; in iprb_resume()
1749 if (ip->running) { in iprb_resume()
1750 if (iprb_start(ip) != DDI_SUCCESS) { in iprb_resume()
1751 iprb_error(ip, "unable to restart chip!"); in iprb_resume()
1752 ip->suspended = B_TRUE; in iprb_resume()
1753 mutex_exit(&ip->culock); in iprb_resume()
1754 mutex_exit(&ip->rulock); in iprb_resume()
1759 mutex_exit(&ip->culock); in iprb_resume()
1760 mutex_exit(&ip->rulock); in iprb_resume()
1761 if (ip->miih) in iprb_resume()
1762 mii_resume(ip->miih); in iprb_resume()
1797 iprb_error(iprb_t *ip, const char *fmt, ...) in iprb_error() argument
1807 ddi_driver_name(ip->dip), ddi_get_instance(ip->dip), buf); in iprb_error()