VMXNET3_DEBUG(dp, 1, "stop()\n");
/*
- * Take the 2 locks related to asynchronous events.
+ * Take the 3 locks related to asynchronous events.
* These events should always check dp->devEnabled before poking dp.
*/
mutex_enter(&dp->intrLock);
mutex_enter(&dp->rxPoolLock);
+ mutex_enter(&dp->txLock);
VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 1);
dp->devEnabled = B_FALSE;
VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_QUIESCE_DEV);
+ mutex_exit(&dp->txLock);
mutex_exit(&dp->rxPoolLock);
mutex_exit(&dp->intrLock);
uint8_t sopGen, curGen;
mblk_t *mblk;
- mutex_enter(&dp->txLock);
+ ASSERT(mutex_owned(&dp->txLock));
sopIdx = eopIdx = cmdRing->next2fill;
sopGen = cmdRing->gen;
}
done:
- mutex_exit(&dp->txLock);
-
return ret;
}
mblk_t *mp;
ASSERT(mps != NULL);
+ mutex_enter(&dp->txLock);
+ if (!dp->devEnabled) {
+ goto done;
+ }
do {
vmxnet3_offload_t ol;
}
/* Notify the device */
- mutex_enter(&dp->txLock);
if (txqCtrl->txNumDeferred >= txqCtrl->txThreshold) {
txqCtrl->txNumDeferred = 0;
VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_TXPROD, cmdRing->next2fill);
}
+
+done:
mutex_exit(&dp->txLock);
return mps;