Lines Matching refs:pcnp
60 #define CSR_WRITE_4(pcnp, reg, val) \ argument
61 ddi_put32(pcnp->pcn_regshandle, (uint32_t *)(pcnp->pcn_regs + reg), val)
63 #define CSR_WRITE_2(pcnp, reg, val) \ argument
64 ddi_put16(pcnp->pcn_regshandle, (uint16_t *)(pcnp->pcn_regs + reg), val)
66 #define CSR_READ_4(pcnp, reg) \ argument
67 ddi_get32(pcnp->pcn_regshandle, (uint32_t *)(pcnp->pcn_regs + reg))
69 #define CSR_READ_2(pcnp, reg) \ argument
70 ddi_get16(pcnp->pcn_regshandle, (uint16_t *)(pcnp->pcn_regs + reg))
72 #define PCN_CSR_SETBIT(pcnp, reg, x) \ argument
73 pcn_csr_write(pcnp, reg, pcn_csr_read(pcnp, reg) | (x))
75 #define PCN_CSR_CLRBIT(pcnp, reg, x) \ argument
76 pcn_csr_write(pcnp, reg, pcn_csr_read(pcnp, reg) & ~(x))
79 pcn_bcr_write(pcnp, reg, pcn_bcr_read(pcnp, reg) | (x))
81 #define PCN_BCR_CLRBIT(pcnp, reg, x) \ argument
82 pcn_bcr_write(pcnp, reg, pcn_bcr_read(pcnp, reg) & ~(x))
279 pcn_t *pcnp; in pcn_attach() local
340 pcnp = ddi_get_soft_state(pcn_ssp, instance); in pcn_attach()
341 pcnp->pcn_dip = dip; in pcn_attach()
342 pcnp->pcn_instance = instance; in pcn_attach()
343 pcnp->pcn_extphyaddr = -1; in pcn_attach()
345 if (ddi_get_iblock_cookie(dip, 0, &pcnp->pcn_icookie) != DDI_SUCCESS) { in pcn_attach()
346 pcn_error(pcnp->pcn_dip, "ddi_get_iblock_cookie failed"); in pcn_attach()
353 mutex_init(&pcnp->pcn_xmtlock, NULL, MUTEX_DRIVER, pcnp->pcn_icookie); in pcn_attach()
354 mutex_init(&pcnp->pcn_intrlock, NULL, MUTEX_DRIVER, pcnp->pcn_icookie); in pcn_attach()
355 mutex_init(&pcnp->pcn_reglock, NULL, MUTEX_DRIVER, pcnp->pcn_icookie); in pcn_attach()
365 if (ddi_regs_map_setup(dip, 1, (caddr_t *)&pcnp->pcn_regs, 0, 0, in pcn_attach()
366 &pcn_devattr, &pcnp->pcn_regshandle)) { in pcn_attach()
371 if (pcn_set_chipid(pcnp, (uint32_t)ssid << 16 | (uint32_t)svid) != in pcn_attach()
376 if ((pcnp->pcn_mii = mii_alloc(pcnp, dip, &pcn_mii_ops)) == NULL) in pcn_attach()
380 mii_set_pauseable(pcnp->pcn_mii, B_FALSE, B_FALSE); in pcn_attach()
382 if ((pcn_allocrxring(pcnp) != DDI_SUCCESS) || in pcn_attach()
383 (pcn_alloctxring(pcnp) != DDI_SUCCESS)) { in pcn_attach()
388 pcnp->pcn_promisc = B_FALSE; in pcn_attach()
390 mutex_enter(&pcnp->pcn_intrlock); in pcn_attach()
391 mutex_enter(&pcnp->pcn_xmtlock); in pcn_attach()
392 rc = pcn_initialize(pcnp, B_TRUE); in pcn_attach()
393 mutex_exit(&pcnp->pcn_xmtlock); in pcn_attach()
394 mutex_exit(&pcnp->pcn_intrlock); in pcn_attach()
398 if (ddi_add_intr(dip, 0, NULL, NULL, pcn_intr, (caddr_t)pcnp) != in pcn_attach()
404 pcnp->pcn_flags |= PCN_INTR_ENABLED; in pcn_attach()
407 pcn_error(pcnp->pcn_dip, "mac_alloc failed"); in pcn_attach()
412 macp->m_driver = pcnp; in pcn_attach()
414 macp->m_src_addr = pcnp->pcn_addr; in pcn_attach()
420 if (mac_register(macp, &pcnp->pcn_mh) == DDI_SUCCESS) { in pcn_attach()
430 pcn_teardown(pcnp); in pcn_attach()
437 pcn_t *pcnp; in pcn_detach() local
439 pcnp = ddi_get_soft_state(pcn_ssp, ddi_get_instance(dip)); in pcn_detach()
441 if (pcnp == NULL) { in pcn_detach()
448 if (mac_unregister(pcnp->pcn_mh) != 0) in pcn_detach()
451 mutex_enter(&pcnp->pcn_intrlock); in pcn_detach()
452 mutex_enter(&pcnp->pcn_xmtlock); in pcn_detach()
453 pcnp->pcn_flags &= ~PCN_RUNNING; in pcn_detach()
454 pcn_stopall(pcnp); in pcn_detach()
455 mutex_exit(&pcnp->pcn_xmtlock); in pcn_detach()
456 mutex_exit(&pcnp->pcn_intrlock); in pcn_detach()
458 pcn_teardown(pcnp); in pcn_detach()
462 mii_suspend(pcnp->pcn_mii); in pcn_detach()
464 mutex_enter(&pcnp->pcn_intrlock); in pcn_detach()
465 mutex_enter(&pcnp->pcn_xmtlock); in pcn_detach()
466 pcnp->pcn_flags |= PCN_SUSPENDED; in pcn_detach()
467 pcn_stopall(pcnp); in pcn_detach()
468 mutex_exit(&pcnp->pcn_xmtlock); in pcn_detach()
469 mutex_exit(&pcnp->pcn_intrlock); in pcn_detach()
480 pcn_t *pcnp; in pcn_ddi_resume() local
482 if ((pcnp = ddi_get_soft_state(pcn_ssp, ddi_get_instance(dip))) == NULL) in pcn_ddi_resume()
485 mutex_enter(&pcnp->pcn_intrlock); in pcn_ddi_resume()
486 mutex_enter(&pcnp->pcn_xmtlock); in pcn_ddi_resume()
488 pcnp->pcn_flags &= ~PCN_SUSPENDED; in pcn_ddi_resume()
490 if (!pcn_initialize(pcnp, B_FALSE)) { in pcn_ddi_resume()
491 pcn_error(pcnp->pcn_dip, "unable to resume chip"); in pcn_ddi_resume()
492 pcnp->pcn_flags |= PCN_SUSPENDED; in pcn_ddi_resume()
493 mutex_exit(&pcnp->pcn_intrlock); in pcn_ddi_resume()
494 mutex_exit(&pcnp->pcn_xmtlock); in pcn_ddi_resume()
498 if (IS_RUNNING(pcnp)) in pcn_ddi_resume()
499 pcn_startall(pcnp); in pcn_ddi_resume()
501 mutex_exit(&pcnp->pcn_xmtlock); in pcn_ddi_resume()
502 mutex_exit(&pcnp->pcn_intrlock); in pcn_ddi_resume()
504 mii_resume(pcnp->pcn_mii); in pcn_ddi_resume()
512 pcn_t *pcnp; in pcn_quiesce() local
514 if ((pcnp = ddi_get_soft_state(pcn_ssp, ddi_get_instance(dip))) == NULL) in pcn_quiesce()
518 CSR_WRITE_4(pcnp, PCN_IO32_RAP, PCN_CSR_EXTCTL1); in pcn_quiesce()
519 CSR_WRITE_4(pcnp, PCN_IO32_RDP, CSR_READ_4(pcnp, PCN_IO32_RDP) & in pcn_quiesce()
522 CSR_WRITE_4(pcnp, PCN_IO32_RAP, PCN_CSR_CSR); in pcn_quiesce()
523 CSR_WRITE_4(pcnp, PCN_IO32_RDP, in pcn_quiesce()
524 (CSR_READ_4(pcnp, PCN_IO32_RDP) & ~(PCN_CSR_INTEN)) | in pcn_quiesce()
531 pcn_teardown(pcn_t *pcnp) in pcn_teardown() argument
533 ASSERT(!(pcnp->pcn_flags & PCN_RUNNING)); in pcn_teardown()
535 if (pcnp->pcn_mii != NULL) { in pcn_teardown()
536 mii_free(pcnp->pcn_mii); in pcn_teardown()
537 pcnp->pcn_mii = NULL; in pcn_teardown()
540 if (pcnp->pcn_flags & PCN_INTR_ENABLED) in pcn_teardown()
541 ddi_remove_intr(pcnp->pcn_dip, 0, pcnp->pcn_icookie); in pcn_teardown()
544 pcn_freerxring(pcnp); in pcn_teardown()
545 pcn_freetxring(pcnp); in pcn_teardown()
547 if (pcnp->pcn_regshandle != NULL) in pcn_teardown()
548 ddi_regs_map_free(&pcnp->pcn_regshandle); in pcn_teardown()
551 mutex_destroy(&pcnp->pcn_xmtlock); in pcn_teardown()
552 mutex_destroy(&pcnp->pcn_intrlock); in pcn_teardown()
553 mutex_destroy(&pcnp->pcn_reglock); in pcn_teardown()
555 ddi_soft_state_free(pcn_ssp, ddi_get_instance(pcnp->pcn_dip)); in pcn_teardown()
562 pcn_suspend(pcn_t *pcnp) in pcn_suspend() argument
567 PCN_CSR_SETBIT(pcnp, PCN_CSR_EXTCTL1, PCN_EXTCTL1_SPND); in pcn_suspend()
569 if ((val = pcn_csr_read(pcnp, PCN_CSR_EXTCTL1)) & in pcn_suspend()
575 pcn_error(pcnp->pcn_dip, "Unable to suspend, EXTCTL1 was 0x%b", val, in pcn_suspend()
580 pcn_resume(pcn_t *pcnp) in pcn_resume() argument
582 PCN_CSR_CLRBIT(pcnp, PCN_CSR_EXTCTL1, PCN_EXTCTL1_SPND); in pcn_resume()
588 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_multicast() local
603 mutex_enter(&pcnp->pcn_intrlock); in pcn_m_multicast()
604 mutex_enter(&pcnp->pcn_xmtlock); in pcn_m_multicast()
605 newval = oldval = pcnp->pcn_mctab[index]; in pcn_m_multicast()
608 pcnp->pcn_mccount[crc]++; in pcn_m_multicast()
609 if (pcnp->pcn_mccount[crc] == 1) in pcn_m_multicast()
612 pcnp->pcn_mccount[crc]--; in pcn_m_multicast()
613 if (pcnp->pcn_mccount[crc] == 0) in pcn_m_multicast()
617 pcnp->pcn_mctab[index] = newval; in pcn_m_multicast()
618 pcn_suspend(pcnp); in pcn_m_multicast()
619 pcn_csr_write(pcnp, PCN_CSR_MAR0 + index, newval); in pcn_m_multicast()
620 pcn_resume(pcnp); in pcn_m_multicast()
623 mutex_exit(&pcnp->pcn_xmtlock); in pcn_m_multicast()
624 mutex_exit(&pcnp->pcn_intrlock); in pcn_m_multicast()
632 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_promisc() local
634 mutex_enter(&pcnp->pcn_intrlock); in pcn_m_promisc()
635 mutex_enter(&pcnp->pcn_xmtlock); in pcn_m_promisc()
637 pcnp->pcn_promisc = on; in pcn_m_promisc()
639 if (IS_RUNNING(pcnp)) in pcn_m_promisc()
640 pcn_suspend(pcnp); in pcn_m_promisc()
643 if (pcnp->pcn_promisc) in pcn_m_promisc()
644 PCN_CSR_SETBIT(pcnp, PCN_CSR_MODE, PCN_MODE_PROMISC); in pcn_m_promisc()
646 PCN_CSR_CLRBIT(pcnp, PCN_CSR_MODE, PCN_MODE_PROMISC); in pcn_m_promisc()
648 if (IS_RUNNING(pcnp)) in pcn_m_promisc()
649 pcn_resume(pcnp); in pcn_m_promisc()
651 mutex_exit(&pcnp->pcn_xmtlock); in pcn_m_promisc()
652 mutex_exit(&pcnp->pcn_intrlock); in pcn_m_promisc()
660 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_unicast() local
666 mutex_enter(&pcnp->pcn_intrlock); in pcn_m_unicast()
667 mutex_enter(&pcnp->pcn_xmtlock); in pcn_m_unicast()
669 if (IS_RUNNING(pcnp)) in pcn_m_unicast()
670 pcn_suspend(pcnp); in pcn_m_unicast()
673 pcn_csr_write(pcnp, PCN_CSR_PAR0 + i, addr[i]); in pcn_m_unicast()
675 bcopy(macaddr, pcnp->pcn_addr, ETHERADDRL); in pcn_m_unicast()
677 if (IS_RUNNING(pcnp)) in pcn_m_unicast()
678 pcn_resume(pcnp); in pcn_m_unicast()
680 mutex_exit(&pcnp->pcn_xmtlock); in pcn_m_unicast()
681 mutex_exit(&pcnp->pcn_intrlock); in pcn_m_unicast()
689 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_tx() local
692 mutex_enter(&pcnp->pcn_xmtlock); in pcn_m_tx()
694 if (pcnp->pcn_flags & PCN_SUSPENDED) { in pcn_m_tx()
696 pcnp->pcn_carrier_errors++; in pcn_m_tx()
700 mutex_exit(&pcnp->pcn_xmtlock); in pcn_m_tx()
708 if (!pcn_send(pcnp, mp)) { in pcn_m_tx()
714 mutex_exit(&pcnp->pcn_xmtlock); in pcn_m_tx()
720 pcn_send(pcn_t *pcnp, mblk_t *mp) in pcn_send() argument
727 ASSERT(mutex_owned(&pcnp->pcn_xmtlock)); in pcn_send()
732 pcnp->pcn_macxmt_errors++; in pcn_send()
737 if (pcnp->pcn_txavail < PCN_TXRECLAIM) in pcn_send()
738 pcn_reclaim(pcnp); in pcn_send()
740 if (pcnp->pcn_txavail == 0) { in pcn_send()
741 pcnp->pcn_wantw = B_TRUE; in pcn_send()
744 PCN_CSR_SETBIT(pcnp, PCN_CSR_EXTCTL1, PCN_EXTCTL1_LTINTEN); in pcn_send()
748 txsend = pcnp->pcn_txsend; in pcn_send()
755 txb = pcnp->pcn_txbufs[txsend]; in pcn_send()
758 pcnp->pcn_opackets++; in pcn_send()
759 pcnp->pcn_obytes += len; in pcn_send()
762 pcnp->pcn_multixmt++; in pcn_send()
764 pcnp->pcn_brdcstxmt++; in pcn_send()
767 tmd = &pcnp->pcn_txdescp[txsend]; in pcn_send()
779 SYNCTXDESC(pcnp, txsend, DDI_DMA_SYNC_FORDEV); in pcn_send()
781 pcnp->pcn_txavail--; in pcn_send()
782 pcnp->pcn_txsend = (txsend + 1) % PCN_TXRING; in pcn_send()
783 pcnp->pcn_txstall_time = gethrtime() + (5 * 1000000000ULL); in pcn_send()
785 pcn_csr_write(pcnp, PCN_CSR_CSR, PCN_CSR_TX|PCN_CSR_INTEN); in pcn_send()
791 pcn_reclaim(pcn_t *pcnp) in pcn_reclaim() argument
795 while (pcnp->pcn_txavail != PCN_TXRING) { in pcn_reclaim()
796 int index = pcnp->pcn_txreclaim; in pcn_reclaim()
798 tmdp = &pcnp->pcn_txdescp[index]; in pcn_reclaim()
801 SYNCTXDESC(pcnp, index, DDI_DMA_SYNC_FORKERNEL); in pcn_reclaim()
807 pcnp->pcn_txavail++; in pcn_reclaim()
808 pcnp->pcn_txreclaim = (index + 1) % PCN_TXRING; in pcn_reclaim()
811 if (pcnp->pcn_txavail >= PCN_TXRESCHED) { in pcn_reclaim()
812 if (pcnp->pcn_wantw) { in pcn_reclaim()
813 pcnp->pcn_wantw = B_FALSE; in pcn_reclaim()
816 PCN_CSR_CLRBIT(pcnp, PCN_CSR_EXTCTL1, in pcn_reclaim()
819 mac_tx_update(pcnp->pcn_mh); in pcn_reclaim()
827 pcn_t *pcnp = (void *)arg1; in pcn_intr() local
832 mutex_enter(&pcnp->pcn_intrlock); in pcn_intr()
834 if (IS_SUSPENDED(pcnp)) { in pcn_intr()
835 mutex_exit(&pcnp->pcn_intrlock); in pcn_intr()
839 while ((status = pcn_csr_read(pcnp, PCN_CSR_CSR)) & PCN_CSR_INTR) { in pcn_intr()
840 pcn_csr_write(pcnp, PCN_CSR_CSR, status); in pcn_intr()
842 status2 = pcn_csr_read(pcnp, PCN_CSR_EXTCTL2); in pcn_intr()
845 mutex_enter(&pcnp->pcn_xmtlock); in pcn_intr()
846 pcn_reclaim(pcnp); in pcn_intr()
847 mutex_exit(&pcnp->pcn_xmtlock); in pcn_intr()
851 mp = pcn_receive(pcnp); in pcn_intr()
861 PCN_CSR_SETBIT(pcnp, PCN_CSR_EXTCTL2, in pcn_intr()
864 if (pcn_watchdog(pcnp) != DDI_SUCCESS) { in pcn_intr()
872 mutex_enter(&pcnp->pcn_xmtlock); in pcn_intr()
873 pcn_resetall(pcnp); in pcn_intr()
874 mutex_exit(&pcnp->pcn_xmtlock); in pcn_intr()
875 mutex_exit(&pcnp->pcn_intrlock); in pcn_intr()
877 mii_reset(pcnp->pcn_mii); in pcn_intr()
879 mutex_exit(&pcnp->pcn_intrlock); in pcn_intr()
883 mac_rx(pcnp->pcn_mh, NULL, mp); in pcn_intr()
889 pcn_receive(pcn_t *pcnp) in pcn_receive() argument
899 head = pcnp->pcn_rxhead; in pcn_receive()
902 rmd = &pcnp->pcn_rxdescp[head]; in pcn_receive()
903 rxb = pcnp->pcn_rxbufs[head]; in pcn_receive()
905 SYNCRXDESC(pcnp, head, DDI_DMA_SYNC_FORKERNEL); in pcn_receive()
912 pcnp->pcn_errrcv++; in pcn_receive()
915 pcnp->pcn_align_errors++; in pcn_receive()
917 pcnp->pcn_overflow++; in pcn_receive()
919 pcnp->pcn_fcs_errors++; in pcn_receive()
921 pcnp->pcn_errrcv++; in pcn_receive()
922 pcnp->pcn_toolong_errors++; in pcn_receive()
926 pcnp->pcn_errrcv++; in pcn_receive()
927 pcnp->pcn_norcvbuf++; in pcn_receive()
936 pcnp->pcn_ipackets++; in pcn_receive()
937 pcnp->pcn_rbytes++; in pcn_receive()
941 pcnp->pcn_brdcstrcv++; in pcn_receive()
943 pcnp->pcn_multircv++; in pcn_receive()
951 SYNCRXDESC(pcnp, head, DDI_DMA_SYNC_FORDEV); in pcn_receive()
956 pcnp->pcn_rxhead = head; in pcn_receive()
963 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_ioctl() local
965 if (mii_m_loop_ioctl(pcnp->pcn_mii, wq, mp)) in pcn_m_ioctl()
974 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_start() local
976 mutex_enter(&pcnp->pcn_intrlock); in pcn_m_start()
977 mutex_enter(&pcnp->pcn_xmtlock); in pcn_m_start()
979 pcn_startall(pcnp); in pcn_m_start()
980 pcnp->pcn_flags |= PCN_RUNNING; in pcn_m_start()
982 mutex_exit(&pcnp->pcn_xmtlock); in pcn_m_start()
983 mutex_exit(&pcnp->pcn_intrlock); in pcn_m_start()
985 mii_start(pcnp->pcn_mii); in pcn_m_start()
993 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_stop() local
995 mii_stop(pcnp->pcn_mii); in pcn_m_stop()
997 mutex_enter(&pcnp->pcn_intrlock); in pcn_m_stop()
998 mutex_enter(&pcnp->pcn_xmtlock); in pcn_m_stop()
1000 pcn_stopall(pcnp); in pcn_m_stop()
1001 pcnp->pcn_flags &= ~PCN_RUNNING; in pcn_m_stop()
1003 mutex_exit(&pcnp->pcn_xmtlock); in pcn_m_stop()
1004 mutex_exit(&pcnp->pcn_intrlock); in pcn_m_stop()
1008 pcn_initialize(pcn_t *pcnp, boolean_t getfact) in pcn_initialize() argument
1013 bcopy(pcnp->pcn_addr, addr, sizeof (addr)); in pcn_initialize()
1022 (void) CSR_READ_2(pcnp, PCN_IO16_RESET); in pcn_initialize()
1023 (void) CSR_READ_4(pcnp, PCN_IO32_RESET); in pcn_initialize()
1028 CSR_WRITE_4(pcnp, PCN_IO32_RDP, 0); in pcn_initialize()
1031 pcn_stop_timer(pcnp); in pcn_initialize()
1034 pcn_csr_write(pcnp, PCN_CSR_EXTCTL2, PCN_EXTCTL2_FASTSPNDE); in pcn_initialize()
1037 pcn_bcr_write(pcnp, PCN_BCR_SSTYLE, PCN_SWSTYLE_PCNETPCI); in pcn_initialize()
1041 pcn_getfactaddr(pcnp); in pcn_initialize()
1043 pcn_csr_write(pcnp, PCN_CSR_PAR0, addr[0]); in pcn_initialize()
1044 pcn_csr_write(pcnp, PCN_CSR_PAR1, addr[1]); in pcn_initialize()
1045 pcn_csr_write(pcnp, PCN_CSR_PAR2, addr[2]); in pcn_initialize()
1048 PCN_BCR_CLRBIT(pcnp, PCN_BCR_MISCCFG, PCN_MISC_ASEL); in pcn_initialize()
1055 pcn_csr_write(pcnp, PCN_CSR_MODE, PCN_PORT_MII); in pcn_initialize()
1058 PCN_BCR_SETBIT(pcnp, PCN_BCR_MIICTL, PCN_MIICTL_XPHYANE); in pcn_initialize()
1060 if (pcnp->pcn_promisc) in pcn_initialize()
1061 PCN_CSR_SETBIT(pcnp, PCN_CSR_MODE, PCN_MODE_PROMISC); in pcn_initialize()
1065 pcn_csr_write(pcnp, PCN_CSR_MAR0 + i, pcnp->pcn_mctab[i]); in pcn_initialize()
1067 pcn_resetrings(pcnp); in pcn_initialize()
1070 pcn_csr_write(pcnp, PCN_CSR_IAB1, 0); in pcn_initialize()
1077 PCN_BCR_SETBIT(pcnp, PCN_BCR_BUSCTL, PCN_BUSCTL_NOUFLOW | in pcn_initialize()
1081 PCN_CSR_SETBIT(pcnp, PCN_CSR_IMR, PCN_IMR_DXSUFLO); in pcn_initialize()
1084 PCN_CSR_SETBIT(pcnp, PCN_CSR_TFEAT, PCN_TFEAT_PAD_TX); in pcn_initialize()
1086 if (pcnp->pcn_type == Am79C978) in pcn_initialize()
1087 pcn_bcr_write(pcnp, PCN_BCR_PHYSEL, in pcn_initialize()
1094 pcn_resetall(pcn_t *pcnp) in pcn_resetall() argument
1096 pcn_stopall(pcnp); in pcn_resetall()
1097 pcn_startall(pcnp); in pcn_resetall()
1101 pcn_startall(pcn_t *pcnp) in pcn_startall() argument
1103 ASSERT(mutex_owned(&pcnp->pcn_intrlock)); in pcn_startall()
1104 ASSERT(mutex_owned(&pcnp->pcn_xmtlock)); in pcn_startall()
1106 (void) pcn_initialize(pcnp, B_FALSE); in pcn_startall()
1109 PCN_CSR_SETBIT(pcnp, PCN_CSR_CSR, PCN_CSR_START|PCN_CSR_INTEN); in pcn_startall()
1111 pcn_start_timer(pcnp); in pcn_startall()
1113 if (IS_RUNNING(pcnp)) in pcn_startall()
1114 mac_tx_update(pcnp->pcn_mh); in pcn_startall()
1118 pcn_stopall(pcn_t *pcnp) in pcn_stopall() argument
1120 ASSERT(mutex_owned(&pcnp->pcn_intrlock)); in pcn_stopall()
1121 ASSERT(mutex_owned(&pcnp->pcn_xmtlock)); in pcn_stopall()
1123 pcn_stop_timer(pcnp); in pcn_stopall()
1124 PCN_CSR_SETBIT(pcnp, PCN_CSR_CSR, PCN_CSR_STOP); in pcn_stopall()
1132 pcn_start_timer(pcn_t *pcnp) in pcn_start_timer() argument
1134 PCN_CSR_SETBIT(pcnp, PCN_CSR_EXTCTL1, PCN_EXTCTL1_SINTEN); in pcn_start_timer()
1141 pcn_bcr_write(pcnp, PCN_BCR_TIMER, 0xa000); in pcn_start_timer()
1146 pcn_stop_timer(pcn_t *pcnp) in pcn_stop_timer() argument
1148 PCN_CSR_CLRBIT(pcnp, PCN_CSR_EXTCTL1, PCN_EXTCTL1_SINTEN); in pcn_stop_timer()
1154 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_stat() local
1156 if (mii_m_getstat(pcnp->pcn_mii, stat, val) == 0) in pcn_m_stat()
1161 *val = pcnp->pcn_multircv; in pcn_m_stat()
1165 *val = pcnp->pcn_brdcstrcv; in pcn_m_stat()
1169 *val = pcnp->pcn_multixmt; in pcn_m_stat()
1173 *val = pcnp->pcn_brdcstxmt; in pcn_m_stat()
1177 *val = pcnp->pcn_ipackets; in pcn_m_stat()
1181 *val = pcnp->pcn_rbytes; in pcn_m_stat()
1185 *val = pcnp->pcn_opackets; in pcn_m_stat()
1189 *val = pcnp->pcn_obytes; in pcn_m_stat()
1193 *val = pcnp->pcn_norcvbuf; in pcn_m_stat()
1201 *val = pcnp->pcn_collisions; in pcn_m_stat()
1205 *val = pcnp->pcn_errrcv; in pcn_m_stat()
1209 *val = pcnp->pcn_errxmt; in pcn_m_stat()
1213 *val = pcnp->pcn_align_errors; in pcn_m_stat()
1217 *val = pcnp->pcn_fcs_errors; in pcn_m_stat()
1221 *val = pcnp->pcn_sqe_errors; in pcn_m_stat()
1225 *val = pcnp->pcn_defer_xmts; in pcn_m_stat()
1229 *val = pcnp->pcn_first_collisions; in pcn_m_stat()
1233 *val = pcnp->pcn_multi_collisions; in pcn_m_stat()
1237 *val = pcnp->pcn_tx_late_collisions; in pcn_m_stat()
1241 *val = pcnp->pcn_ex_collisions; in pcn_m_stat()
1245 *val = pcnp->pcn_macxmt_errors; in pcn_m_stat()
1249 *val = pcnp->pcn_carrier_errors; in pcn_m_stat()
1253 *val = pcnp->pcn_toolong_errors; in pcn_m_stat()
1257 *val = pcnp->pcn_macrcv_errors; in pcn_m_stat()
1261 *val = pcnp->pcn_overflow; in pcn_m_stat()
1265 *val = pcnp->pcn_underflow; in pcn_m_stat()
1269 *val = pcnp->pcn_runt; in pcn_m_stat()
1273 *val = pcnp->pcn_jabber; in pcn_m_stat()
1286 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_getprop() local
1288 return (mii_m_getprop(pcnp->pcn_mii, name, num, sz, val)); in pcn_m_getprop()
1295 pcn_t *pcnp = (pcn_t *)arg; in pcn_m_setprop() local
1297 return (mii_m_setprop(pcnp->pcn_mii, name, num, sz, val)); in pcn_m_setprop()
1304 pcn_t *pcnp = arg; in pcn_m_propinfo() local
1306 mii_m_propinfo(pcnp->pcn_mii, name, num, prh); in pcn_m_propinfo()
1310 pcn_watchdog(pcn_t *pcnp) in pcn_watchdog() argument
1312 if ((pcnp->pcn_txstall_time != 0) && in pcn_watchdog()
1313 (gethrtime() > pcnp->pcn_txstall_time) && in pcn_watchdog()
1314 (pcnp->pcn_txavail != PCN_TXRING)) { in pcn_watchdog()
1315 pcnp->pcn_txstall_time = 0; in pcn_watchdog()
1316 pcn_error(pcnp->pcn_dip, "TX stall detected!"); in pcn_watchdog()
1326 pcn_t *pcnp = (pcn_t *)arg; in pcn_mii_read() local
1346 if (((pcnp->pcn_type == Am79C971 && phy != PCN_PHYAD_10BT) || in pcn_mii_read()
1347 pcnp->pcn_type == Am79C973 || pcnp->pcn_type == Am79C975 || in pcn_mii_read()
1348 pcnp->pcn_type == Am79C978) && pcnp->pcn_extphyaddr != -1 && in pcn_mii_read()
1349 phy != pcnp->pcn_extphyaddr) { in pcn_mii_read()
1354 pcn_bcr_write(pcnp, PCN_BCR_MIIADDR, phy << 5 | reg); in pcn_mii_read()
1355 val = pcn_bcr_read(pcnp, PCN_BCR_MIIDATA) & 0xFFFF; in pcn_mii_read()
1360 if (((pcnp->pcn_type == Am79C971 && phy != PCN_PHYAD_10BT) || in pcn_mii_read()
1361 pcnp->pcn_type == Am79C973 || pcnp->pcn_type == Am79C975 || in pcn_mii_read()
1362 pcnp->pcn_type == Am79C978) && pcnp->pcn_extphyaddr == -1) in pcn_mii_read()
1363 pcnp->pcn_extphyaddr = phy; in pcn_mii_read()
1371 pcn_t *pcnp = (pcn_t *)arg; in pcn_mii_write() local
1373 pcn_bcr_write(pcnp, PCN_BCR_MIIADDR, reg | (phy << 5)); in pcn_mii_write()
1374 pcn_bcr_write(pcnp, PCN_BCR_MIIDATA, val); in pcn_mii_write()
1380 pcn_t *pcnp = (pcn_t *)arg; in pcn_mii_notify() local
1382 mac_link_update(pcnp->pcn_mh, link); in pcn_mii_notify()
1400 pcn_getfactaddr(pcn_t *pcnp) in pcn_getfactaddr() argument
1404 addr[0] = CSR_READ_4(pcnp, PCN_IO32_APROM00); in pcn_getfactaddr()
1405 addr[1] = CSR_READ_4(pcnp, PCN_IO32_APROM01); in pcn_getfactaddr()
1407 bcopy(&addr[0], &pcnp->pcn_addr[0], sizeof (pcnp->pcn_addr)); in pcn_getfactaddr()
1411 pcn_csr_read(pcn_t *pcnp, uint32_t reg) in pcn_csr_read() argument
1415 mutex_enter(&pcnp->pcn_reglock); in pcn_csr_read()
1416 CSR_WRITE_4(pcnp, PCN_IO32_RAP, reg); in pcn_csr_read()
1417 val = CSR_READ_4(pcnp, PCN_IO32_RDP); in pcn_csr_read()
1418 mutex_exit(&pcnp->pcn_reglock); in pcn_csr_read()
1423 pcn_csr_read16(pcn_t *pcnp, uint32_t reg) in pcn_csr_read16() argument
1427 mutex_enter(&pcnp->pcn_reglock); in pcn_csr_read16()
1428 CSR_WRITE_2(pcnp, PCN_IO16_RAP, reg); in pcn_csr_read16()
1429 val = CSR_READ_2(pcnp, PCN_IO16_RDP); in pcn_csr_read16()
1430 mutex_exit(&pcnp->pcn_reglock); in pcn_csr_read16()
1435 pcn_csr_write(pcn_t *pcnp, uint32_t reg, uint32_t val) in pcn_csr_write() argument
1437 mutex_enter(&pcnp->pcn_reglock); in pcn_csr_write()
1438 CSR_WRITE_4(pcnp, PCN_IO32_RAP, reg); in pcn_csr_write()
1439 CSR_WRITE_4(pcnp, PCN_IO32_RDP, val); in pcn_csr_write()
1440 mutex_exit(&pcnp->pcn_reglock); in pcn_csr_write()
1444 pcn_bcr_read(pcn_t *pcnp, uint32_t reg) in pcn_bcr_read() argument
1448 mutex_enter(&pcnp->pcn_reglock); in pcn_bcr_read()
1449 CSR_WRITE_4(pcnp, PCN_IO32_RAP, reg); in pcn_bcr_read()
1450 val = CSR_READ_4(pcnp, PCN_IO32_BDP); in pcn_bcr_read()
1451 mutex_exit(&pcnp->pcn_reglock); in pcn_bcr_read()
1456 pcn_bcr_read16(pcn_t *pcnp, uint32_t reg) in pcn_bcr_read16() argument
1460 mutex_enter(&pcnp->pcn_reglock); in pcn_bcr_read16()
1461 CSR_WRITE_2(pcnp, PCN_IO16_RAP, reg); in pcn_bcr_read16()
1462 val = CSR_READ_2(pcnp, PCN_IO16_BDP); in pcn_bcr_read16()
1463 mutex_exit(&pcnp->pcn_reglock); in pcn_bcr_read16()
1468 pcn_bcr_write(pcn_t *pcnp, uint32_t reg, uint32_t val) in pcn_bcr_write() argument
1470 mutex_enter(&pcnp->pcn_reglock); in pcn_bcr_write()
1471 CSR_WRITE_4(pcnp, PCN_IO32_RAP, reg); in pcn_bcr_write()
1472 CSR_WRITE_4(pcnp, PCN_IO32_BDP, val); in pcn_bcr_write()
1473 mutex_exit(&pcnp->pcn_reglock); in pcn_bcr_write()
1477 pcn_resetrings(pcn_t *pcnp) in pcn_resetrings() argument
1482 pcnp->pcn_rxhead = 0; in pcn_resetrings()
1483 pcnp->pcn_txreclaim = 0; in pcn_resetrings()
1484 pcnp->pcn_txsend = 0; in pcn_resetrings()
1485 pcnp->pcn_txavail = PCN_TXRING; in pcn_resetrings()
1489 pcn_rx_desc_t *rmd = &pcnp->pcn_rxdescp[i]; in pcn_resetrings()
1490 pcn_buf_t *rxb = pcnp->pcn_rxbufs[i]; in pcn_resetrings()
1497 (void) ddi_dma_sync(pcnp->pcn_rxdesc_dmah, 0, in pcn_resetrings()
1502 pcn_tx_desc_t *txd = &pcnp->pcn_txdescp[i]; in pcn_resetrings()
1503 pcn_buf_t *txb = pcnp->pcn_txbufs[i]; in pcn_resetrings()
1508 (void) ddi_dma_sync(pcnp->pcn_txdesc_dmah, 0, in pcn_resetrings()
1512 pcn_csr_write(pcnp, PCN_CSR_RXADDR0, pcnp->pcn_rxdesc_paddr & 0xFFFF); in pcn_resetrings()
1513 pcn_csr_write(pcnp, PCN_CSR_RXADDR1, in pcn_resetrings()
1514 (pcnp->pcn_rxdesc_paddr >> 16) & 0xFFFF); in pcn_resetrings()
1516 pcn_csr_write(pcnp, PCN_CSR_TXADDR0, pcnp->pcn_txdesc_paddr & 0xFFFF); in pcn_resetrings()
1517 pcn_csr_write(pcnp, PCN_CSR_TXADDR1, in pcn_resetrings()
1518 (pcnp->pcn_txdesc_paddr >> 16) & 0xFFFF); in pcn_resetrings()
1521 pcn_csr_write(pcnp, PCN_CSR_RXRINGLEN, (~PCN_RXRING) + 1); in pcn_resetrings()
1522 pcn_csr_write(pcnp, PCN_CSR_TXRINGLEN, (~PCN_TXRING) + 1); in pcn_resetrings()
1541 pcn_allocbuf(pcn_t *pcnp) in pcn_allocbuf() argument
1550 if (ddi_dma_alloc_handle(pcnp->pcn_dip, &pcn_dma_attr, DDI_DMA_SLEEP, in pcn_allocbuf()
1575 pcn_alloctxring(pcn_t *pcnp) in pcn_alloctxring() argument
1587 rval = ddi_dma_alloc_handle(pcnp->pcn_dip, &pcn_dma_attr, DDI_DMA_SLEEP, in pcn_alloctxring()
1588 NULL, &pcnp->pcn_txdesc_dmah); in pcn_alloctxring()
1590 pcn_error(pcnp->pcn_dip, "unable to allocate DMA handle for tx " in pcn_alloctxring()
1595 rval = ddi_dma_mem_alloc(pcnp->pcn_txdesc_dmah, size, &pcn_devattr, in pcn_alloctxring()
1597 &pcnp->pcn_txdesc_acch); in pcn_alloctxring()
1599 pcn_error(pcnp->pcn_dip, "unable to allocate DMA memory for tx " in pcn_alloctxring()
1604 rval = ddi_dma_addr_bind_handle(pcnp->pcn_txdesc_dmah, NULL, kaddr, in pcn_alloctxring()
1608 pcn_error(pcnp->pcn_dip, "unable to bind DMA for tx " in pcn_alloctxring()
1615 pcnp->pcn_txdesc_paddr = dmac.dmac_address; in pcn_alloctxring()
1616 pcnp->pcn_txdescp = (void *)kaddr; in pcn_alloctxring()
1618 pcnp->pcn_txbufs = kmem_zalloc(PCN_TXRING * sizeof (pcn_buf_t *), in pcn_alloctxring()
1622 pcn_buf_t *txb = pcn_allocbuf(pcnp); in pcn_alloctxring()
1625 pcnp->pcn_txbufs[i] = txb; in pcn_alloctxring()
1632 pcn_allocrxring(pcn_t *pcnp) in pcn_allocrxring() argument
1644 rval = ddi_dma_alloc_handle(pcnp->pcn_dip, &pcn_dmadesc_attr, in pcn_allocrxring()
1645 DDI_DMA_SLEEP, NULL, &pcnp->pcn_rxdesc_dmah); in pcn_allocrxring()
1647 pcn_error(pcnp->pcn_dip, "unable to allocate DMA handle for rx " in pcn_allocrxring()
1652 rval = ddi_dma_mem_alloc(pcnp->pcn_rxdesc_dmah, size, &pcn_devattr, in pcn_allocrxring()
1654 &pcnp->pcn_rxdesc_acch); in pcn_allocrxring()
1656 pcn_error(pcnp->pcn_dip, "unable to allocate DMA memory for rx " in pcn_allocrxring()
1661 rval = ddi_dma_addr_bind_handle(pcnp->pcn_rxdesc_dmah, NULL, kaddr, in pcn_allocrxring()
1665 pcn_error(pcnp->pcn_dip, "unable to bind DMA for rx " in pcn_allocrxring()
1672 pcnp->pcn_rxdesc_paddr = dmac.dmac_address; in pcn_allocrxring()
1673 pcnp->pcn_rxdescp = (void *)kaddr; in pcn_allocrxring()
1675 pcnp->pcn_rxbufs = kmem_zalloc(PCN_RXRING * sizeof (pcn_buf_t *), in pcn_allocrxring()
1679 pcn_buf_t *rxb = pcn_allocbuf(pcnp); in pcn_allocrxring()
1682 pcnp->pcn_rxbufs[i] = rxb; in pcn_allocrxring()
1689 pcn_freetxring(pcn_t *pcnp) in pcn_freetxring() argument
1693 if (pcnp->pcn_txbufs) { in pcn_freetxring()
1695 pcn_destroybuf(pcnp->pcn_txbufs[i]); in pcn_freetxring()
1697 kmem_free(pcnp->pcn_txbufs, PCN_TXRING * sizeof (pcn_buf_t *)); in pcn_freetxring()
1700 if (pcnp->pcn_txdesc_paddr) in pcn_freetxring()
1701 (void) ddi_dma_unbind_handle(pcnp->pcn_txdesc_dmah); in pcn_freetxring()
1702 if (pcnp->pcn_txdesc_acch) in pcn_freetxring()
1703 ddi_dma_mem_free(&pcnp->pcn_txdesc_acch); in pcn_freetxring()
1704 if (pcnp->pcn_txdesc_dmah) in pcn_freetxring()
1705 ddi_dma_free_handle(&pcnp->pcn_txdesc_dmah); in pcn_freetxring()
1709 pcn_freerxring(pcn_t *pcnp) in pcn_freerxring() argument
1713 if (pcnp->pcn_rxbufs) { in pcn_freerxring()
1715 pcn_destroybuf(pcnp->pcn_rxbufs[i]); in pcn_freerxring()
1717 kmem_free(pcnp->pcn_rxbufs, PCN_RXRING * sizeof (pcn_buf_t *)); in pcn_freerxring()
1720 if (pcnp->pcn_rxdesc_paddr) in pcn_freerxring()
1721 (void) ddi_dma_unbind_handle(pcnp->pcn_rxdesc_dmah); in pcn_freerxring()
1722 if (pcnp->pcn_rxdesc_acch) in pcn_freerxring()
1723 ddi_dma_mem_free(&pcnp->pcn_rxdesc_acch); in pcn_freerxring()
1724 if (pcnp->pcn_rxdesc_dmah) in pcn_freerxring()
1725 ddi_dma_free_handle(&pcnp->pcn_rxdesc_dmah); in pcn_freerxring()
1729 pcn_set_chipid(pcn_t *pcnp, uint32_t conf_id) in pcn_set_chipid() argument
1747 chipid = pcn_bcr_read16(pcnp, PCN_BCR_PCISUBSYSID); in pcn_set_chipid()
1749 chipid |= pcn_bcr_read16(pcnp, PCN_BCR_PCISUBVENID); in pcn_set_chipid()
1759 chipid = pcn_csr_read16(pcnp, PCN_CSR_CHIPID1); in pcn_set_chipid()
1761 chipid |= pcn_csr_read16(pcnp, PCN_CSR_CHIPID0); in pcn_set_chipid()
1763 chipid = pcn_csr_read(pcnp, PCN_CSR_CHIPID1); in pcn_set_chipid()
1765 chipid |= pcn_csr_read(pcnp, PCN_CSR_CHIPID0); in pcn_set_chipid()
1774 pcn_error(pcnp->pcn_dip, "Unsupported chip: %s", name); in pcn_set_chipid()
1778 pcn_error(pcnp->pcn_dip, "Unsupported chip: %s", name); in pcn_set_chipid()
1800 pcn_error(pcnp->pcn_dip, "Unknown chip id 0x%x", chipid); in pcn_set_chipid()
1803 if (ddi_prop_update_string(DDI_DEV_T_NONE, pcnp->pcn_dip, "chipid", in pcn_set_chipid()
1805 pcn_error(pcnp->pcn_dip, "Unable to set chipid property"); in pcn_set_chipid()