Skip to content

Commit

Permalink
NVMe: Add nvme subsystem reset IOCTL
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jon Derrick authored and Jens Axboe committed Aug 18, 2015
1 parent dfbac8c commit 81f03fe
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 1 deletion.
11 changes: 11 additions & 0 deletions drivers/block/nvme-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion include/linux/nvme.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
1 change: 1 addition & 0 deletions include/uapi/linux/nvme.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit 81f03fe

Please sign in to comment.