NVMe: Add nvme subsystem reset IOCTL
authorJon Derrick <jonathan.derrick@intel.com>
Mon, 10 Aug 2015 21:20:41 +0000 (15:20 -0600)
committerJens Axboe <axboe@fb.com>
Tue, 18 Aug 2015 17:56:13 +0000 (11:56 -0600)
Controllers can perform optional subsystem resets as introduced in NVMe
1.1. This patch adds an IOCTL to trigger the subsystem reset by writing
"NVMe" to the NSSR register.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Acked-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/nvme-core.c
include/linux/nvme.h
include/uapi/linux/nvme.h

index e318a992e2e68cc25c6ee68073c6adbbdc010bbd..3a35c5807bb7cdaa38da806ee7ae2a083c92ba32 100644 (file)
@@ -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;
        }
index d6b5600cfa47d68dbad490090e3453e8516aa31e..b5812c395351a54d4eff5bacb3ed94528b9d25e1 100644 (file)
@@ -28,7 +28,7 @@ struct nvme_bar {
        __u32                   cc;     /* Controller Configuration */
        __u32                   rsvd1;  /* Reserved */
        __u32                   csts;   /* Controller Status */
-       __u32                   rsvd2;  /* Reserved */
+       __u32                   nssr;   /* Subsystem Reset */
        __u32                   aqa;    /* Admin Queue Attributes */
        __u64                   asq;    /* Admin SQ Base Address */
        __u64                   acq;    /* Admin CQ Base Address */
index 732b32e92b02efb257414a4bd24e552c078cdade..8864194a41512f9cec49bde23b30b873b485e9b1 100644 (file)
@@ -584,5 +584,6 @@ struct nvme_passthru_cmd {
 #define NVME_IOCTL_SUBMIT_IO   _IOW('N', 0x42, struct nvme_user_io)
 #define NVME_IOCTL_IO_CMD      _IOWR('N', 0x43, struct nvme_passthru_cmd)
 #define NVME_IOCTL_RESET       _IO('N', 0x44)
+#define NVME_IOCTL_SUBSYS_RESET        _IO('N', 0x45)
 
 #endif /* _UAPI_LINUX_NVME_H */