Index: sys/dev/mpi3mr/mpi3mr.h =================================================================== --- sys/dev/mpi3mr/mpi3mr.h +++ sys/dev/mpi3mr/mpi3mr.h @@ -240,6 +240,17 @@ #define MPI3MR_TSUPDATE_INTERVAL 900 +#define min_t(type, x, y) ({ \ + type __min1 = (x); \ + type __min2 = (y); \ + __min1 < __min2 ? __min1 : __min2; }) + +#define max_t(type, x, y) ({ \ + type __max1 = (x); \ + type __max2 = (y); \ + __max1 > __max2 ? __max1 : __max2; }) + + struct completion { unsigned int done; struct mtx lock; Index: sys/dev/mpi3mr/mpi3mr.c =================================================================== --- sys/dev/mpi3mr/mpi3mr.c +++ sys/dev/mpi3mr/mpi3mr.c @@ -3609,6 +3609,12 @@ tgtdev->dev_spec.vol_inf.state = vdinf->VdState; if (vdinf->VdState == MPI3_DEVICE0_VD_STATE_OFFLINE) tgtdev->is_hidden = 1; + tgtdev->dev_spec.vol_inf.reset_to = + max_t(U8, vdinf->VdResetTO, + MPI3MR_INTADMCMD_TIMEOUT); + tgtdev->dev_spec.vol_inf.abort_to = + max_t(U8, vdinf->VdAbortTO, + MPI3MR_INTADMCMD_TIMEOUT); tgtdev->dev_spec.vol_inf.tg_id = vdinf->IOThrottleGroup; tgtdev->dev_spec.vol_inf.tg_high = vdinf->IOThrottleGroupHigh * 2048; Index: sys/dev/mpi3mr/mpi3mr_cam.h =================================================================== --- sys/dev/mpi3mr/mpi3mr_cam.h +++ sys/dev/mpi3mr/mpi3mr_cam.h @@ -73,6 +73,8 @@ U16 tg_id; U32 tg_high; U32 tg_low; + U8 abort_to; + U8 reset_to; struct mpi3mr_throttle_group_info *tg; }; Index: sys/dev/mpi3mr/mpi3mr_cam.c =================================================================== --- sys/dev/mpi3mr/mpi3mr_cam.c +++ sys/dev/mpi3mr/mpi3mr_cam.c @@ -583,13 +583,15 @@ if (tgtdev) mpi3mr_atomic_inc(&tgtdev->block_io); - if (tgtdev && (tgtdev->dev_type == MPI3_DEVICE_DEVFORM_PCIE)) { - if ((tm_type == MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK) - && tgtdev->dev_spec.pcie_inf.abort_to) - timeout = tgtdev->dev_spec.pcie_inf.abort_to; - else if ((tm_type == MPI3_SCSITASKMGMT_TASKTYPE_TARGET_RESET) - && tgtdev->dev_spec.pcie_inf.reset_to) - timeout = tgtdev->dev_spec.pcie_inf.reset_to; + bool is_abort = (tm_type == MPI3_SCSITASKMGMT_TASKTYPE_ABORT_TASK); + + if (tgtdev->dev_type == MPI3_DEVICE_DEVFORM_PCIE) { + timeout = is_abort ? tgtdev->dev_spec.pcie_inf.abort_to + : tgtdev->dev_spec.pcie_inf.reset_to; + + } else if (tgtdev->dev_type == MPI3_DEVICE_DEVFORM_VD) { + timeout = is_abort ? tgtdev->dev_spec.vol_inf.abort_to + : tgtdev->dev_spec.vol_inf.reset_to; } sc->tm_chan = (void *)&drv_cmd;