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)
 {
        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;
        }
 
        __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 */
 
 #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 */