Lines Matching refs:dp

33 #define	VMXNET3_ALLOC_OK(dp)	((dp)->cur_mtu <= PAGESIZE)  argument
103 vmxnet3_softc_t *dp = data; in vmxnet3_getstat() local
107 VMXNET3_DEBUG(dp, 3, "getstat(%u)\n", stat); in vmxnet3_getstat()
109 if (!dp->devEnabled) { in vmxnet3_getstat()
113 txStats = &VMXNET3_TQDESC(dp)->stats; in vmxnet3_getstat()
114 rxStats = &VMXNET3_RQDESC(dp)->stats; in vmxnet3_getstat()
132 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); in vmxnet3_getstat()
148 *val = dp->linkSpeed; in vmxnet3_getstat()
163 *val = rxStats->pktsRxOutOfBuf + dp->rx_alloc_failed; in vmxnet3_getstat()
169 *val = txStats->pktsTxDiscard + dp->tx_pullup_failed; in vmxnet3_getstat()
172 *val = txStats->pktsTxError + dp->tx_error; in vmxnet3_getstat()
210 vmxnet3_prepare_drivershared(vmxnet3_softc_t *dp) in vmxnet3_prepare_drivershared() argument
216 if ((err = vmxnet3_alloc_dma_mem_1(dp, &dp->sharedData, allocSize, in vmxnet3_prepare_drivershared()
220 ds = VMXNET3_DS(dp); in vmxnet3_prepare_drivershared()
224 if ((err = vmxnet3_alloc_dma_mem_128(dp, &dp->queueDescs, allocSize, in vmxnet3_prepare_drivershared()
226 vmxnet3_free_dma_mem(&dp->sharedData); in vmxnet3_prepare_drivershared()
229 (void) memset(dp->queueDescs.buf, 0, allocSize); in vmxnet3_prepare_drivershared()
246 ds->devRead.misc.mtu = dp->cur_mtu; in vmxnet3_prepare_drivershared()
251 ds->devRead.misc.queueDescPA = dp->queueDescs.bufPA; in vmxnet3_prepare_drivershared()
255 ds->devRead.intrConf.autoMask = (dp->intrMaskMode == VMXNET3_IMM_AUTO); in vmxnet3_prepare_drivershared()
260 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAL, in vmxnet3_prepare_drivershared()
261 VMXNET3_ADDR_LO(dp->sharedData.bufPA)); in vmxnet3_prepare_drivershared()
262 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAH, in vmxnet3_prepare_drivershared()
263 VMXNET3_ADDR_HI(dp->sharedData.bufPA)); in vmxnet3_prepare_drivershared()
272 vmxnet3_destroy_drivershared(vmxnet3_softc_t *dp) in vmxnet3_destroy_drivershared() argument
274 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAL, 0); in vmxnet3_destroy_drivershared()
275 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAH, 0); in vmxnet3_destroy_drivershared()
277 vmxnet3_free_dma_mem(&dp->queueDescs); in vmxnet3_destroy_drivershared()
278 vmxnet3_free_dma_mem(&dp->sharedData); in vmxnet3_destroy_drivershared()
288 vmxnet3_alloc_cmdring(vmxnet3_softc_t *dp, vmxnet3_cmdring_t *cmdRing) in vmxnet3_alloc_cmdring() argument
293 if ((err = vmxnet3_alloc_dma_mem_512(dp, &cmdRing->dma, ringSize, in vmxnet3_alloc_cmdring()
312 vmxnet3_alloc_compring(vmxnet3_softc_t *dp, vmxnet3_compring_t *compRing) in vmxnet3_alloc_compring() argument
316 if (vmxnet3_alloc_dma_mem_512(dp, &compRing->dma, ringSize, in vmxnet3_alloc_compring()
334 vmxnet3_prepare_txqueue(vmxnet3_softc_t *dp) in vmxnet3_prepare_txqueue() argument
336 Vmxnet3_TxQueueDesc *tqdesc = VMXNET3_TQDESC(dp); in vmxnet3_prepare_txqueue()
337 vmxnet3_txqueue_t *txq = &dp->txQueue; in vmxnet3_prepare_txqueue()
344 if ((err = vmxnet3_alloc_cmdring(dp, &txq->cmdRing)) != 0) { in vmxnet3_prepare_txqueue()
352 if ((err = vmxnet3_alloc_compring(dp, &txq->compRing)) != 0) { in vmxnet3_prepare_txqueue()
362 if ((err = vmxnet3_txqueue_init(dp, txq)) != 0) { in vmxnet3_prepare_txqueue()
384 vmxnet3_prepare_rxqueue(vmxnet3_softc_t *dp) in vmxnet3_prepare_rxqueue() argument
386 Vmxnet3_RxQueueDesc *rqdesc = VMXNET3_RQDESC(dp); in vmxnet3_prepare_rxqueue()
387 vmxnet3_rxqueue_t *rxq = &dp->rxQueue; in vmxnet3_prepare_rxqueue()
394 if ((err = vmxnet3_alloc_cmdring(dp, &rxq->cmdRing)) != 0) { in vmxnet3_prepare_rxqueue()
402 if ((err = vmxnet3_alloc_compring(dp, &rxq->compRing)) != 0) { in vmxnet3_prepare_rxqueue()
412 if ((err = vmxnet3_rxqueue_init(dp, rxq)) != 0) { in vmxnet3_prepare_rxqueue()
431 vmxnet3_destroy_txqueue(vmxnet3_softc_t *dp) in vmxnet3_destroy_txqueue() argument
433 vmxnet3_txqueue_t *txq = &dp->txQueue; in vmxnet3_destroy_txqueue()
438 vmxnet3_txqueue_fini(dp, txq); in vmxnet3_destroy_txqueue()
450 vmxnet3_destroy_rxqueue(vmxnet3_softc_t *dp) in vmxnet3_destroy_rxqueue() argument
452 vmxnet3_rxqueue_t *rxq = &dp->rxQueue; in vmxnet3_destroy_rxqueue()
457 vmxnet3_rxqueue_fini(dp, rxq); in vmxnet3_destroy_rxqueue()
469 vmxnet3_refresh_rxfilter(vmxnet3_softc_t *dp) in vmxnet3_refresh_rxfilter() argument
471 Vmxnet3_DriverShared *ds = VMXNET3_DS(dp); in vmxnet3_refresh_rxfilter()
473 ds->devRead.rxFilterConf.rxMode = dp->rxMode; in vmxnet3_refresh_rxfilter()
474 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_UPDATE_RX_MODE); in vmxnet3_refresh_rxfilter()
481 vmxnet3_refresh_linkstate(vmxnet3_softc_t *dp) in vmxnet3_refresh_linkstate() argument
485 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK); in vmxnet3_refresh_linkstate()
486 ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_CMD); in vmxnet3_refresh_linkstate()
488 dp->linkState = LINK_STATE_UP; in vmxnet3_refresh_linkstate()
489 dp->linkSpeed = (ret32 >> 16) * 1000000ULL; in vmxnet3_refresh_linkstate()
491 dp->linkState = LINK_STATE_DOWN; in vmxnet3_refresh_linkstate()
492 dp->linkSpeed = 0; in vmxnet3_refresh_linkstate()
506 vmxnet3_softc_t *dp = data; in vmxnet3_start() local
513 VMXNET3_DEBUG(dp, 1, "start()\n"); in vmxnet3_start()
518 if ((err = vmxnet3_prepare_drivershared(dp)) != 0) { in vmxnet3_start()
519 VMXNET3_WARN(dp, "vmxnet3_prepare_drivershared() failed: %d", in vmxnet3_start()
523 tqdesc = VMXNET3_TQDESC(dp); in vmxnet3_start()
524 rqdesc = VMXNET3_RQDESC(dp); in vmxnet3_start()
529 txQueueSize = vmxnet3_getprop(dp, "TxRingSize", 32, 4096, in vmxnet3_start()
532 dp->txQueue.cmdRing.size = txQueueSize; in vmxnet3_start()
533 dp->txQueue.compRing.size = txQueueSize; in vmxnet3_start()
534 dp->txQueue.sharedCtrl = &tqdesc->ctrl; in vmxnet3_start()
535 if ((err = vmxnet3_prepare_txqueue(dp)) != 0) { in vmxnet3_start()
536 VMXNET3_WARN(dp, "vmxnet3_prepare_txqueue() failed: %d", in vmxnet3_start()
541 VMXNET3_WARN(dp, "invalid tx ring size (%d)\n", txQueueSize); in vmxnet3_start()
549 rxQueueSize = vmxnet3_getprop(dp, "RxRingSize", 32, 4096, in vmxnet3_start()
552 dp->rxQueue.cmdRing.size = rxQueueSize; in vmxnet3_start()
553 dp->rxQueue.compRing.size = rxQueueSize; in vmxnet3_start()
554 dp->rxQueue.sharedCtrl = &rqdesc->ctrl; in vmxnet3_start()
555 if ((err = vmxnet3_prepare_rxqueue(dp)) != 0) { in vmxnet3_start()
556 VMXNET3_WARN(dp, "vmxnet3_prepare_rxqueue() failed: %d", in vmxnet3_start()
561 VMXNET3_WARN(dp, "invalid rx ring size (%d)\n", rxQueueSize); in vmxnet3_start()
569 if ((dmaerr = ddi_dma_alloc_handle(dp->dip, &vmxnet3_dma_attrs_tx, in vmxnet3_start()
570 DDI_DMA_SLEEP, NULL, &dp->txDmaHandle)) != DDI_SUCCESS) { in vmxnet3_start()
571 VMXNET3_WARN(dp, "ddi_dma_alloc_handle() failed: %d", dmaerr); in vmxnet3_start()
579 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_ACTIVATE_DEV); in vmxnet3_start()
580 ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_CMD); in vmxnet3_start()
582 VMXNET3_WARN(dp, "ACTIVATE_DEV failed: 0x%x\n", ret32); in vmxnet3_start()
586 dp->devEnabled = B_TRUE; in vmxnet3_start()
588 VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_RXPROD, in vmxnet3_start()
589 dp->txQueue.cmdRing.size - 1); in vmxnet3_start()
594 dp->rxMode = VMXNET3_RXM_UCAST | VMXNET3_RXM_BCAST; in vmxnet3_start()
595 vmxnet3_refresh_rxfilter(dp); in vmxnet3_start()
600 vmxnet3_refresh_linkstate(dp); in vmxnet3_start()
601 mac_link_update(dp->mac, dp->linkState); in vmxnet3_start()
606 VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 0); in vmxnet3_start()
611 ddi_dma_free_handle(&dp->txDmaHandle); in vmxnet3_start()
613 vmxnet3_destroy_rxqueue(dp); in vmxnet3_start()
615 vmxnet3_destroy_txqueue(dp); in vmxnet3_start()
617 vmxnet3_destroy_drivershared(dp); in vmxnet3_start()
629 vmxnet3_softc_t *dp = data; in vmxnet3_stop() local
631 VMXNET3_DEBUG(dp, 1, "stop()\n"); in vmxnet3_stop()
637 mutex_enter(&dp->intrLock); in vmxnet3_stop()
638 mutex_enter(&dp->rxPoolLock); in vmxnet3_stop()
639 VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 1); in vmxnet3_stop()
640 dp->devEnabled = B_FALSE; in vmxnet3_stop()
641 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_QUIESCE_DEV); in vmxnet3_stop()
642 mutex_exit(&dp->rxPoolLock); in vmxnet3_stop()
643 mutex_exit(&dp->intrLock); in vmxnet3_stop()
645 ddi_dma_free_handle(&dp->txDmaHandle); in vmxnet3_stop()
647 vmxnet3_destroy_rxqueue(dp); in vmxnet3_stop()
648 vmxnet3_destroy_txqueue(dp); in vmxnet3_stop()
650 vmxnet3_destroy_drivershared(dp); in vmxnet3_stop()
659 vmxnet3_softc_t *dp = data; in vmxnet3_setpromisc() local
661 VMXNET3_DEBUG(dp, 2, "setpromisc(%s)\n", promisc ? "TRUE" : "FALSE"); in vmxnet3_setpromisc()
664 dp->rxMode |= VMXNET3_RXM_PROMISC; in vmxnet3_setpromisc()
666 dp->rxMode &= ~VMXNET3_RXM_PROMISC; in vmxnet3_setpromisc()
669 vmxnet3_refresh_rxfilter(dp); in vmxnet3_setpromisc()
683 vmxnet3_softc_t *dp = data; in vmxnet3_multicst() local
689 VMXNET3_DEBUG(dp, 2, "multicst(%s, "MACADDR_FMT")\n", in vmxnet3_multicst()
696 for (macIdx = 0; macIdx < dp->mfTable.bufLen; macIdx += 6) { in vmxnet3_multicst()
697 if (memcmp(&dp->mfTable.buf[macIdx], macaddr, 6) == 0) { in vmxnet3_multicst()
706 if (add && macIdx < dp->mfTable.bufLen) { in vmxnet3_multicst()
707 VMXNET3_WARN(dp, MACADDR_FMT " already in MC filter list " in vmxnet3_multicst()
712 if (!add && macIdx == dp->mfTable.bufLen) { in vmxnet3_multicst()
713 VMXNET3_WARN(dp, MACADDR_FMT " not in MC filter list @ %u\n", in vmxnet3_multicst()
722 allocSize = dp->mfTable.bufLen + (add ? 6 : -6); in vmxnet3_multicst()
724 ret = vmxnet3_alloc_dma_mem_1(dp, &newMfTable, allocSize, in vmxnet3_multicst()
728 (void) memcpy(newMfTable.buf, dp->mfTable.buf, in vmxnet3_multicst()
729 dp->mfTable.bufLen); in vmxnet3_multicst()
730 (void) memcpy(newMfTable.buf + dp->mfTable.bufLen, in vmxnet3_multicst()
733 (void) memcpy(newMfTable.buf, dp->mfTable.buf, in vmxnet3_multicst()
736 dp->mfTable.buf + macIdx + 6, in vmxnet3_multicst()
737 dp->mfTable.bufLen - macIdx - 6); in vmxnet3_multicst()
750 ASSERT(!(dp->rxMode & VMXNET3_RXM_MCAST)); in vmxnet3_multicst()
751 dp->rxMode |= VMXNET3_RXM_MCAST; in vmxnet3_multicst()
752 vmxnet3_refresh_rxfilter(dp); in vmxnet3_multicst()
754 if (!add && dp->mfTable.bufLen == 6) { in vmxnet3_multicst()
756 ASSERT(dp->rxMode & VMXNET3_RXM_MCAST); in vmxnet3_multicst()
757 dp->rxMode &= ~VMXNET3_RXM_MCAST; in vmxnet3_multicst()
758 vmxnet3_refresh_rxfilter(dp); in vmxnet3_multicst()
764 if (dp->mfTable.buf) { in vmxnet3_multicst()
765 vmxnet3_free_dma_mem(&dp->mfTable); in vmxnet3_multicst()
767 dp->mfTable = newMfTable; in vmxnet3_multicst()
768 VMXNET3_DS(dp)->devRead.rxFilterConf.mfTablePA = newMfTable.bufPA; in vmxnet3_multicst()
769 VMXNET3_DS(dp)->devRead.rxFilterConf.mfTableLen = newMfTable.bufLen; in vmxnet3_multicst()
773 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_UPDATE_MAC_FILTERS); in vmxnet3_multicst()
787 vmxnet3_softc_t *dp = data; in vmxnet3_unicst() local
790 VMXNET3_DEBUG(dp, 2, "unicst("MACADDR_FMT")\n", in vmxnet3_unicst()
794 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_MACL, val32); in vmxnet3_unicst()
796 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_MACH, val32); in vmxnet3_unicst()
798 (void) memcpy(dp->macaddr, macaddr, 6); in vmxnet3_unicst()
813 vmxnet3_change_mtu(vmxnet3_softc_t *dp, uint32_t new_mtu) in vmxnet3_change_mtu() argument
817 if (dp->devEnabled) in vmxnet3_change_mtu()
820 if (new_mtu == dp->cur_mtu) { in vmxnet3_change_mtu()
821 VMXNET3_WARN(dp, "New MTU is same as old mtu : %d.\n", new_mtu); in vmxnet3_change_mtu()
826 VMXNET3_WARN(dp, "New MTU not in valid range [%d, %d].\n", in vmxnet3_change_mtu()
829 } else if (new_mtu > ETHERMTU && !dp->allow_jumbo) { in vmxnet3_change_mtu()
830 VMXNET3_WARN(dp, "MTU cannot be greater than %d because " in vmxnet3_change_mtu()
835 dp->cur_mtu = new_mtu; in vmxnet3_change_mtu()
836 dp->alloc_ok = VMXNET3_ALLOC_OK(dp); in vmxnet3_change_mtu()
838 if ((ret = mac_maxsdu_update(dp->mac, new_mtu)) != 0) in vmxnet3_change_mtu()
839 VMXNET3_WARN(dp, "Unable to update mac with %d mtu: %d", in vmxnet3_change_mtu()
850 vmxnet3_softc_t *dp = data; in vmxnet3_get_prop() local
856 bcopy(&dp->cur_mtu, prop_val, sizeof (uint32_t)); in vmxnet3_get_prop()
870 vmxnet3_softc_t *dp = data; in vmxnet3_set_prop() local
878 ret = vmxnet3_change_mtu(dp, new_mtu); in vmxnet3_set_prop()
917 vmxnet3_softc_t *dp = arg; in vmxnet3_ioctl() local
935 VMXNET3_WARN(dp, "Error locating parameter name.\n"); in vmxnet3_ioctl()
956 VMXNET3_DEBUG(dp, 3, "ND Set ioctl for %s\n", param); in vmxnet3_ioctl()
970 VMXNET3_WARN(dp, in vmxnet3_ioctl()
982 VMXNET3_DEBUG(dp, 2, in vmxnet3_ioctl()
984 dp->allow_jumbo = B_TRUE; in vmxnet3_ioctl()
985 ret = vmxnet3_change_mtu(dp, VMXNET3_MAX_MTU); in vmxnet3_ioctl()
987 VMXNET3_DEBUG(dp, 2, in vmxnet3_ioctl()
989 dp->allow_jumbo = B_FALSE; in vmxnet3_ioctl()
990 ret = vmxnet3_change_mtu(dp, ETHERMTU); in vmxnet3_ioctl()
992 VMXNET3_WARN(dp, "Invalid data value to be set," in vmxnet3_ioctl()
1025 vmxnet3_softc_t *dp = data; in vmxnet3_getcapab() local
1039 ret = vmxnet3_getprop(dp, "EnableLSO", 0, 1, 1); in vmxnet3_getcapab()
1046 VMXNET3_DEBUG(dp, 2, "getcapab(0x%x) -> %s\n", capab, in vmxnet3_getcapab()
1063 vmxnet3_softc_t *dp = data; in vmxnet3_reset() local
1065 VMXNET3_DEBUG(dp, 1, "vmxnet3_reset()\n"); in vmxnet3_reset()
1067 atomic_inc_32(&dp->reset_count); in vmxnet3_reset()
1068 vmxnet3_stop(dp); in vmxnet3_reset()
1069 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); in vmxnet3_reset()
1070 if ((ret = vmxnet3_start(dp)) != 0) in vmxnet3_reset()
1071 VMXNET3_WARN(dp, "failed to reset the device: %d", ret); in vmxnet3_reset()
1081 vmxnet3_intr_events(vmxnet3_softc_t *dp) in vmxnet3_intr_events() argument
1083 Vmxnet3_DriverShared *ds = VMXNET3_DS(dp); in vmxnet3_intr_events()
1088 VMXNET3_DEBUG(dp, 2, "events(0x%x)\n", events); in vmxnet3_intr_events()
1090 Vmxnet3_TxQueueDesc *tqdesc = VMXNET3_TQDESC(dp); in vmxnet3_intr_events()
1091 Vmxnet3_RxQueueDesc *rqdesc = VMXNET3_RQDESC(dp); in vmxnet3_intr_events()
1093 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, in vmxnet3_intr_events()
1096 VMXNET3_WARN(dp, "tq error 0x%x\n", in vmxnet3_intr_events()
1100 VMXNET3_WARN(dp, "rq error 0x%x\n", in vmxnet3_intr_events()
1104 if (ddi_taskq_dispatch(dp->resetTask, vmxnet3_reset, in vmxnet3_intr_events()
1105 dp, DDI_NOSLEEP) == DDI_SUCCESS) { in vmxnet3_intr_events()
1106 VMXNET3_WARN(dp, "reset scheduled\n"); in vmxnet3_intr_events()
1108 VMXNET3_WARN(dp, in vmxnet3_intr_events()
1113 vmxnet3_refresh_linkstate(dp); in vmxnet3_intr_events()
1117 VMXNET3_DEBUG(dp, 1, "device implementation change\n"); in vmxnet3_intr_events()
1119 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_ECR, events); in vmxnet3_intr_events()
1135 vmxnet3_softc_t *dp = (void *) data1; in vmxnet3_intr() local
1137 VMXNET3_DEBUG(dp, 3, "intr()\n"); in vmxnet3_intr()
1139 mutex_enter(&dp->intrLock); in vmxnet3_intr()
1141 if (dp->devEnabled) { in vmxnet3_intr()
1146 if (dp->intrType == DDI_INTR_TYPE_FIXED && in vmxnet3_intr()
1147 !VMXNET3_BAR1_GET32(dp, VMXNET3_REG_ICR)) { in vmxnet3_intr()
1151 if (dp->intrMaskMode == VMXNET3_IMM_ACTIVE) { in vmxnet3_intr()
1152 VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 1); in vmxnet3_intr()
1155 linkStateChanged = vmxnet3_intr_events(dp); in vmxnet3_intr()
1156 mustUpdateTx = vmxnet3_tx_complete(dp, &dp->txQueue); in vmxnet3_intr()
1157 mps = vmxnet3_rx_intr(dp, &dp->rxQueue); in vmxnet3_intr()
1159 mutex_exit(&dp->intrLock); in vmxnet3_intr()
1160 VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 0); in vmxnet3_intr()
1163 mac_link_update(dp->mac, dp->linkState); in vmxnet3_intr()
1166 mac_tx_update(dp->mac); in vmxnet3_intr()
1169 mac_rx(dp->mac, NULL, mps); in vmxnet3_intr()
1176 mutex_exit(&dp->intrLock); in vmxnet3_intr()
1183 vmxnet3_softc_t *dp = ksp->ks_private; in vmxnet3_kstat_update() local
1189 statp->reset_count.value.ul = dp->reset_count; in vmxnet3_kstat_update()
1190 statp->tx_pullup_needed.value.ul = dp->tx_pullup_needed; in vmxnet3_kstat_update()
1191 statp->tx_ring_full.value.ul = dp->tx_ring_full; in vmxnet3_kstat_update()
1192 statp->rx_alloc_buf.value.ul = dp->rx_alloc_buf; in vmxnet3_kstat_update()
1193 statp->rx_pool_empty.value.ul = dp->rx_pool_empty; in vmxnet3_kstat_update()
1194 statp->rx_num_bufs.value.ul = dp->rx_num_bufs; in vmxnet3_kstat_update()
1200 vmxnet3_kstat_init(vmxnet3_softc_t *dp) in vmxnet3_kstat_init() argument
1204 dp->devKstats = kstat_create(VMXNET3_MODNAME, dp->instance, in vmxnet3_kstat_init()
1207 if (dp->devKstats == NULL) in vmxnet3_kstat_init()
1210 dp->devKstats->ks_update = vmxnet3_kstat_update; in vmxnet3_kstat_init()
1211 dp->devKstats->ks_private = dp; in vmxnet3_kstat_init()
1213 statp = dp->devKstats->ks_data; in vmxnet3_kstat_init()
1227 kstat_install(dp->devKstats); in vmxnet3_kstat_init()
1241 vmxnet3_softc_t *dp; in vmxnet3_attach() local
1255 dp = kmem_zalloc(sizeof (vmxnet3_softc_t), KM_SLEEP); in vmxnet3_attach()
1256 ASSERT(dp); in vmxnet3_attach()
1258 dp->dip = dip; in vmxnet3_attach()
1259 dp->instance = ddi_get_instance(dip); in vmxnet3_attach()
1260 dp->cur_mtu = ETHERMTU; in vmxnet3_attach()
1261 dp->allow_jumbo = B_TRUE; in vmxnet3_attach()
1262 dp->alloc_ok = VMXNET3_ALLOC_OK(dp); in vmxnet3_attach()
1264 VMXNET3_DEBUG(dp, 1, "attach()\n"); in vmxnet3_attach()
1266 ddi_set_driver_private(dip, dp); in vmxnet3_attach()
1271 if (pci_config_setup(dip, &dp->pciHandle) != DDI_SUCCESS) { in vmxnet3_attach()
1272 VMXNET3_WARN(dp, "pci_config_setup() failed\n"); in vmxnet3_attach()
1279 vendorId = pci_config_get16(dp->pciHandle, PCI_CONF_VENID); in vmxnet3_attach()
1280 devId = pci_config_get16(dp->pciHandle, PCI_CONF_DEVID); in vmxnet3_attach()
1283 VMXNET3_WARN(dp, "wrong PCI venid/devid (0x%x, 0x%x)\n", in vmxnet3_attach()
1291 ret16 = pci_config_get16(dp->pciHandle, PCI_CONF_COMM); in vmxnet3_attach()
1293 pci_config_put16(dp->pciHandle, PCI_CONF_COMM, ret16); in vmxnet3_attach()
1298 if (ddi_regs_map_setup(dip, 1, &dp->bar0, 0, 0, &vmxnet3_dev_attr, in vmxnet3_attach()
1299 &dp->bar0Handle) != DDI_SUCCESS) { in vmxnet3_attach()
1300 VMXNET3_WARN(dp, "ddi_regs_map_setup() for BAR0 failed\n"); in vmxnet3_attach()
1304 if (ddi_regs_map_setup(dip, 2, &dp->bar1, 0, 0, &vmxnet3_dev_attr, in vmxnet3_attach()
1305 &dp->bar1Handle) != DDI_SUCCESS) { in vmxnet3_attach()
1306 VMXNET3_WARN(dp, "ddi_regs_map_setup() for BAR1 failed\n"); in vmxnet3_attach()
1313 if (VMXNET3_BAR1_GET32(dp, VMXNET3_REG_VRRS) & 1) { in vmxnet3_attach()
1314 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_VRRS, 1); in vmxnet3_attach()
1316 VMXNET3_WARN(dp, "incompatible h/w version\n"); in vmxnet3_attach()
1320 if (VMXNET3_BAR1_GET32(dp, VMXNET3_REG_UVRS) & 1) { in vmxnet3_attach()
1321 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_UVRS, 1); in vmxnet3_attach()
1323 VMXNET3_WARN(dp, "incompatible upt version\n"); in vmxnet3_attach()
1327 if (vmxnet3_kstat_init(dp) != DDI_SUCCESS) { in vmxnet3_attach()
1328 VMXNET3_WARN(dp, "unable to initialize kstats"); in vmxnet3_attach()
1335 ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_MACL); in vmxnet3_attach()
1336 *((uint32_t *)(dp->macaddr + 0)) = ret32; in vmxnet3_attach()
1337 ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_MACH); in vmxnet3_attach()
1338 *((uint16_t *)(dp->macaddr + 4)) = ret32; in vmxnet3_attach()
1344 VMXNET3_WARN(dp, "mac_alloc() failed\n"); in vmxnet3_attach()
1349 macr->m_driver = dp; in vmxnet3_attach()
1352 macr->m_src_addr = dp->macaddr; in vmxnet3_attach()
1361 ret = mac_register(macr, &dp->mac); in vmxnet3_attach()
1364 VMXNET3_WARN(dp, "mac_register() failed\n"); in vmxnet3_attach()
1372 VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_GET_CONF_INTR); in vmxnet3_attach()
1373 ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_CMD); in vmxnet3_attach()
1377 dp->intrType = DDI_INTR_TYPE_MSIX; in vmxnet3_attach()
1378 err = ddi_intr_alloc(dip, &dp->intrHandle, dp->intrType, 0, 1, in vmxnet3_attach()
1382 VMXNET3_DEBUG(dp, 2, "DDI_INTR_TYPE_MSIX failed, err:%d\n", in vmxnet3_attach()
1386 dp->intrType = DDI_INTR_TYPE_MSI; in vmxnet3_attach()
1387 if (ddi_intr_alloc(dip, &dp->intrHandle, dp->intrType, 0, 1, in vmxnet3_attach()
1390 VMXNET3_DEBUG(dp, 2, "DDI_INTR_TYPE_MSI failed\n"); in vmxnet3_attach()
1393 dp->intrType = DDI_INTR_TYPE_FIXED; in vmxnet3_attach()
1394 if (ddi_intr_alloc(dip, &dp->intrHandle, dp->intrType, 0, 1, in vmxnet3_attach()
1398 VMXNET3_DEBUG(dp, 2, "DDI_INTR_TYPE_INTX failed\n"); in vmxnet3_attach()
1401 VMXNET3_WARN(dp, "ddi_intr_alloc() failed\n"); in vmxnet3_attach()
1404 dp->intrMaskMode = (ret32 >> 2) & 0x3; in vmxnet3_attach()
1405 if (dp->intrMaskMode == VMXNET3_IMM_LAZY) { in vmxnet3_attach()
1406 VMXNET3_WARN(dp, "Lazy masking is not supported\n"); in vmxnet3_attach()
1410 if (ddi_intr_get_pri(dp->intrHandle, &uret) != DDI_SUCCESS) { in vmxnet3_attach()
1411 VMXNET3_WARN(dp, "ddi_intr_get_pri() failed\n"); in vmxnet3_attach()
1415 VMXNET3_DEBUG(dp, 2, "intrType=0x%x, intrMaskMode=0x%x, intrPrio=%u\n", in vmxnet3_attach()
1416 dp->intrType, dp->intrMaskMode, uret); in vmxnet3_attach()
1421 dp->resetTask = ddi_taskq_create(dip, "vmxnet3_reset_task", 1, in vmxnet3_attach()
1423 if (!dp->resetTask) { in vmxnet3_attach()
1424 VMXNET3_WARN(dp, "ddi_taskq_create() failed()\n"); in vmxnet3_attach()
1432 mutex_init(&dp->intrLock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(uret)); in vmxnet3_attach()
1433 mutex_init(&dp->txLock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(uret)); in vmxnet3_attach()
1434 mutex_init(&dp->rxPoolLock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(uret)); in vmxnet3_attach()
1436 if (ddi_intr_add_handler(dp->intrHandle, vmxnet3_intr, in vmxnet3_attach()
1437 dp, NULL) != DDI_SUCCESS) { in vmxnet3_attach()
1438 VMXNET3_WARN(dp, "ddi_intr_add_handler() failed\n"); in vmxnet3_attach()
1442 err = ddi_intr_get_cap(dp->intrHandle, &dp->intrCap); in vmxnet3_attach()
1444 VMXNET3_WARN(dp, "ddi_intr_get_cap() failed %d", err); in vmxnet3_attach()
1448 if (dp->intrCap & DDI_INTR_FLAG_BLOCK) { in vmxnet3_attach()
1449 err = ddi_intr_block_enable(&dp->intrHandle, 1); in vmxnet3_attach()
1451 VMXNET3_WARN(dp, "ddi_intr_block_enable() failed, " in vmxnet3_attach()
1456 err = ddi_intr_enable(dp->intrHandle); in vmxnet3_attach()
1458 VMXNET3_WARN(dp, "ddi_intr_enable() failed, err:%d\n", in vmxnet3_attach()
1467 (void) ddi_intr_remove_handler(dp->intrHandle); in vmxnet3_attach()
1469 mutex_destroy(&dp->rxPoolLock); in vmxnet3_attach()
1470 mutex_destroy(&dp->txLock); in vmxnet3_attach()
1471 mutex_destroy(&dp->intrLock); in vmxnet3_attach()
1472 ddi_taskq_destroy(dp->resetTask); in vmxnet3_attach()
1474 (void) ddi_intr_free(dp->intrHandle); in vmxnet3_attach()
1476 (void) mac_unregister(dp->mac); in vmxnet3_attach()
1478 kstat_delete(dp->devKstats); in vmxnet3_attach()
1480 ddi_regs_map_free(&dp->bar1Handle); in vmxnet3_attach()
1482 ddi_regs_map_free(&dp->bar0Handle); in vmxnet3_attach()
1484 pci_config_teardown(&dp->pciHandle); in vmxnet3_attach()
1486 kmem_free(dp, sizeof (vmxnet3_softc_t)); in vmxnet3_attach()
1500 vmxnet3_softc_t *dp = ddi_get_driver_private(dip); in vmxnet3_detach() local
1504 VMXNET3_DEBUG(dp, 1, "detach()\n"); in vmxnet3_detach()
1510 while (dp->rx_num_bufs > 0) { in vmxnet3_detach()
1512 VMXNET3_WARN(dp, "rx pending (%u), waiting 1 second\n", in vmxnet3_detach()
1513 dp->rx_num_bufs); in vmxnet3_detach()
1516 VMXNET3_WARN(dp, "giving up\n"); in vmxnet3_detach()
1521 if (dp->intrCap & DDI_INTR_FLAG_BLOCK) { in vmxnet3_detach()
1522 ret = ddi_intr_block_disable(&dp->intrHandle, 1); in vmxnet3_detach()
1524 ret = ddi_intr_disable(dp->intrHandle); in vmxnet3_detach()
1527 VMXNET3_WARN(dp, "unable to disable interrupts"); in vmxnet3_detach()
1530 if (ddi_intr_remove_handler(dp->intrHandle) != DDI_SUCCESS) { in vmxnet3_detach()
1531 VMXNET3_WARN(dp, "unable to remove interrupt handler"); in vmxnet3_detach()
1534 (void) ddi_intr_free(dp->intrHandle); in vmxnet3_detach()
1536 VERIFY(mac_unregister(dp->mac) == 0); in vmxnet3_detach()
1538 kstat_delete(dp->devKstats); in vmxnet3_detach()
1540 if (dp->mfTable.buf) { in vmxnet3_detach()
1541 vmxnet3_free_dma_mem(&dp->mfTable); in vmxnet3_detach()
1544 mutex_destroy(&dp->rxPoolLock); in vmxnet3_detach()
1545 mutex_destroy(&dp->txLock); in vmxnet3_detach()
1546 mutex_destroy(&dp->intrLock); in vmxnet3_detach()
1547 ddi_taskq_destroy(dp->resetTask); in vmxnet3_detach()
1549 ddi_regs_map_free(&dp->bar1Handle); in vmxnet3_detach()
1550 ddi_regs_map_free(&dp->bar0Handle); in vmxnet3_detach()
1551 pci_config_teardown(&dp->pciHandle); in vmxnet3_detach()
1553 kmem_free(dp, sizeof (vmxnet3_softc_t)); in vmxnet3_detach()