|
@@ -1901,6 +1901,15 @@ static int nvme_user_cmd(struct nvme_dev *dev, struct nvme_ns *ns,
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+static int nvme_subsys_reset(struct nvme_dev *dev)
|
|
|
+{
|
|
|
+ if (!dev->subsystem)
|
|
|
+ return -ENOTTY;
|
|
|
+
|
|
|
+ writel(0x4E564D65, &dev->bar->nssr); /* "NVMe" */
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int nvme_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
|
|
|
unsigned long arg)
|
|
|
{
|
|
@@ -2932,6 +2941,8 @@ static long nvme_dev_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
|
|
|
case NVME_IOCTL_RESET:
|
|
|
dev_warn(dev->dev, "resetting controller\n");
|
|
|
return nvme_reset(dev);
|
|
|
+ case NVME_IOCTL_SUBSYS_RESET:
|
|
|
+ return nvme_subsys_reset(dev);
|
|
|
default:
|
|
|
return -ENOTTY;
|
|
|
}
|