aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/nvmf/host/nvmf.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/nvmf/host/nvmf.c')
-rw-r--r--sys/dev/nvmf/host/nvmf.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/nvmf/host/nvmf.c b/sys/dev/nvmf/host/nvmf.c
index 1ac0d142443b..8ed801524089 100644
--- a/sys/dev/nvmf/host/nvmf.c
+++ b/sys/dev/nvmf/host/nvmf.c
@@ -498,7 +498,7 @@ nvmf_attach(device_t dev)
nvlist_t *nvl = device_get_ivars(dev);
const nvlist_t * const *io;
struct sysctl_oid *oid;
- uint64_t val;
+ uint64_t mpsmin, val;
u_int i;
int error;
@@ -545,13 +545,20 @@ nvmf_attach(device_t dev)
sc->vs = val;
/* Honor MDTS if it is set. */
+ mpsmin = (uint64_t)1 << (NVME_MPS_SHIFT +
+ NVME_CAP_HI_MPSMIN(sc->cap >> 32));
sc->max_xfer_size = maxphys;
if (sc->cdata->mdts != 0) {
sc->max_xfer_size = ulmin(sc->max_xfer_size,
- 1 << (sc->cdata->mdts + NVME_MPS_SHIFT +
- NVME_CAP_HI_MPSMIN(sc->cap >> 32)));
+ mpsmin << sc->cdata->mdts);
}
+ /* Honor any transfer size restriction imposed by the transport. */
+ val = nvmf_max_xfer_size_qp(sc->io[0]);
+ if (val >= mpsmin)
+ sc->max_xfer_size = ulmin(sc->max_xfer_size,
+ rounddown2(val, mpsmin));
+
io = nvlist_get_nvlist_array(nvl, "io", NULL);
sc->max_pending_io = nvlist_get_number(io[0], "qsize") *
sc->num_io_queues;
@@ -1230,6 +1237,9 @@ nvmf_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int flag,
case NVME_GET_CONTROLLER_DATA:
memcpy(arg, sc->cdata, sizeof(*sc->cdata));
return (0);
+ case DIOCGIDENT:
+ nvme_cdata_get_disk_ident(sc->cdata, (uint8_t *)arg);
+ return (0);
case NVMF_RECONNECT_PARAMS:
nv = (struct nvmf_ioc_nv *)arg;
return (nvmf_reconnect_params(sc, nv));