nvme-core.c revision 0e53d18051725da46cbccfb7874a6422d4d4f274
1b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/*
2b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * NVM Express device driver
3b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * Copyright (c) 2011, Intel Corporation.
4b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox *
5b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * This program is free software; you can redistribute it and/or modify it
6b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * under the terms and conditions of the GNU General Public License,
7b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * version 2, as published by the Free Software Foundation.
8b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox *
9b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * This program is distributed in the hope it will be useful, but WITHOUT
10b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * more details.
13b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox *
14b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * You should have received a copy of the GNU General Public License along with
15b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * this program; if not, write to the Free Software Foundation, Inc.,
16b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox */
18b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
19b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/nvme.h>
20b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/bio.h>
218de055350fbaa96b6563892c195a60be583faa9cMatthew Wilcox#include <linux/bitops.h>
22b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/blkdev.h>
23fd63e9ceeeae58cfe877c2d49d41c1bf7532303cMatthew Wilcox#include <linux/delay.h>
24b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/errno.h>
25b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/fs.h>
26b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/genhd.h>
275aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox#include <linux/idr.h>
28b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/init.h>
29b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/interrupt.h>
30b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/io.h>
31b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/kdev_t.h>
321fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox#include <linux/kthread.h>
33b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/kernel.h>
34b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/mm.h>
35b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/module.h>
36b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/moduleparam.h>
37b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/pci.h>
38be7b62754e097adc0cb16c25c9ee86ee20de62fbMatthew Wilcox#include <linux/poison.h>
39c3bfe7176c035a0a2c70bc79180fb13a6c57142aMatthew Wilcox#include <linux/ptrace.h>
40b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/sched.h>
41b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/slab.h>
42b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#include <linux/types.h>
435d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma#include <scsi/sg.h>
44797a796a13df6b84a4791e57306737059b5b2384Hitoshi Mitake#include <asm-generic/io-64-nonatomic-lo-hi.h>
45797a796a13df6b84a4791e57306737059b5b2384Hitoshi Mitake
46b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define NVME_Q_DEPTH 1024
47b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define SQ_SIZE(depth)		(depth * sizeof(struct nvme_command))
48b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define CQ_SIZE(depth)		(depth * sizeof(struct nvme_completion))
49b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define NVME_MINORS 64
50e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox#define ADMIN_TIMEOUT	(60 * HZ)
51b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
52b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int nvme_major;
53b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxmodule_param(nvme_major, int, 0);
54b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
5558ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcoxstatic int use_threaded_interrupts;
5658ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcoxmodule_param(use_threaded_interrupts, int, 0);
5758ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox
581fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcoxstatic DEFINE_SPINLOCK(dev_list_lock);
591fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcoxstatic LIST_HEAD(dev_list);
601fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcoxstatic struct task_struct *nvme_thread;
619a6b94584de1a0467d85b435df9c744c5c45a270Keith Buschstatic struct workqueue_struct *nvme_workq;
621fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox
63d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Buschstatic void nvme_reset_failed_dev(struct work_struct *ws);
64d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch
65b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/*
66b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * An NVM Express queue.  Each device has at least two (one for admin
67b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * commands and one for I/O commands).
68b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox */
69b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstruct nvme_queue {
70b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct device *q_dmadev;
71091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	struct nvme_dev *dev;
72b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	spinlock_t q_lock;
73b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_command *sq_cmds;
74b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	volatile struct nvme_completion *cqes;
75b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dma_addr_t sq_dma_addr;
76b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dma_addr_t cq_dma_addr;
77b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	wait_queue_head_t sq_full;
781fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	wait_queue_t sq_cong_wait;
79b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct bio_list sq_cong;
80b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u32 __iomem *q_db;
81b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 q_depth;
82b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 cq_vector;
83b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 sq_head;
84b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 sq_tail;
85b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 cq_head;
86c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	u16 qid;
87e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox	u8 cq_phase;
88e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox	u8 cqe_seen;
89224042742582c9938788b81165180c876e997a07Keith Busch	u8 q_suspended;
90b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	unsigned long cmdid_data[];
91b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox};
92b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
93b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/*
94b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * Check we didin't inadvertently grow the command struct
95b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox */
96b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic inline void _nvme_check_size(void)
97b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
98b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_rw_command) != 64);
99b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_create_cq) != 64);
100b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_create_sq) != 64);
101b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_delete_queue) != 64);
102b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_features) != 64);
103f8ebf8409abfdaeeb8c847381629a2a8b8e3d816Vishal Verma	BUILD_BUG_ON(sizeof(struct nvme_format_cmd) != 64);
104c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	BUILD_BUG_ON(sizeof(struct nvme_abort_cmd) != 64);
105b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_command) != 64);
106b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_id_ctrl) != 4096);
107b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_id_ns) != 4096);
108b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	BUILD_BUG_ON(sizeof(struct nvme_lba_range_type) != 64);
1096ecec74520d8a357726e6c12f99080dbe7b347ddKeith Busch	BUILD_BUG_ON(sizeof(struct nvme_smart_log) != 512);
110b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
111b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1125c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcoxtypedef void (*nvme_completion_fn)(struct nvme_dev *, void *,
113c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox						struct nvme_completion *);
114c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox
115e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcoxstruct nvme_cmd_info {
116c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	nvme_completion_fn fn;
117c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	void *ctx;
118e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	unsigned long timeout;
119c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	int aborted;
120e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox};
121e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox
122e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcoxstatic struct nvme_cmd_info *nvme_cmd_info(struct nvme_queue *nvmeq)
123e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox{
124e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	return (void *)&nvmeq->cmdid_data[BITS_TO_LONGS(nvmeq->q_depth)];
125e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox}
126e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox
127224042742582c9938788b81165180c876e997a07Keith Buschstatic unsigned nvme_queue_extra(int depth)
128224042742582c9938788b81165180c876e997a07Keith Busch{
129224042742582c9938788b81165180c876e997a07Keith Busch	return DIV_ROUND_UP(depth, 8) + (depth * sizeof(struct nvme_cmd_info));
130224042742582c9938788b81165180c876e997a07Keith Busch}
131224042742582c9938788b81165180c876e997a07Keith Busch
132b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/**
133714a7a22884b74862540bc84955274d86b2f6040Matthew Wilcox * alloc_cmdid() - Allocate a Command ID
134714a7a22884b74862540bc84955274d86b2f6040Matthew Wilcox * @nvmeq: The queue that will be used for this command
135714a7a22884b74862540bc84955274d86b2f6040Matthew Wilcox * @ctx: A pointer that will be passed to the handler
136c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox * @handler: The function to call on completion
137b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox *
138b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * Allocate a Command ID for a queue.  The data passed in will
139b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * be passed to the completion handler.  This is implemented by using
140b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * the bottom two bits of the ctx pointer to store the handler ID.
141b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * Passing in a pointer that's not 4-byte aligned will cause a BUG.
142b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * We can change this if it becomes a problem.
143184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox *
144184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox * May be called with local interrupts disabled and the q_lock held,
145184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox * or with interrupts enabled and no locks held.
146b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox */
147c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcoxstatic int alloc_cmdid(struct nvme_queue *nvmeq, void *ctx,
148c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox				nvme_completion_fn handler, unsigned timeout)
149b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
150e6d15f79f997a98b3a69abbc462fc9041cc1a7b4Matthew Wilcox	int depth = nvmeq->q_depth - 1;
151e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	struct nvme_cmd_info *info = nvme_cmd_info(nvmeq);
152b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int cmdid;
153b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
154b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	do {
155b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		cmdid = find_first_zero_bit(nvmeq->cmdid_data, depth);
156b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		if (cmdid >= depth)
157b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			return -EBUSY;
158b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	} while (test_and_set_bit(cmdid, nvmeq->cmdid_data));
159b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
160c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	info[cmdid].fn = handler;
161c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	info[cmdid].ctx = ctx;
162e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	info[cmdid].timeout = jiffies + timeout;
163c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	info[cmdid].aborted = 0;
164b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return cmdid;
165b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
166b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
167b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int alloc_cmdid_killable(struct nvme_queue *nvmeq, void *ctx,
168c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox				nvme_completion_fn handler, unsigned timeout)
169b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
170b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int cmdid;
171b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	wait_event_killable(nvmeq->sq_full,
172e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox		(cmdid = alloc_cmdid(nvmeq, ctx, handler, timeout)) >= 0);
173b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return (cmdid < 0) ? -EINTR : cmdid;
174b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
175b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
176c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox/* Special values must be less than 0x1000 */
177c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox#define CMD_CTX_BASE		((void *)POISON_POINTER_DELTA)
178d2d8703481f60d67f49e3177196cbe474b11377cMatthew Wilcox#define CMD_CTX_CANCELLED	(0x30C + CMD_CTX_BASE)
179d2d8703481f60d67f49e3177196cbe474b11377cMatthew Wilcox#define CMD_CTX_COMPLETED	(0x310 + CMD_CTX_BASE)
180d2d8703481f60d67f49e3177196cbe474b11377cMatthew Wilcox#define CMD_CTX_INVALID		(0x314 + CMD_CTX_BASE)
18100df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox#define CMD_CTX_FLUSH		(0x318 + CMD_CTX_BASE)
182c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch#define CMD_CTX_ABORT		(0x31C + CMD_CTX_BASE)
183be7b62754e097adc0cb16c25c9ee86ee20de62fbMatthew Wilcox
1845c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcoxstatic void special_completion(struct nvme_dev *dev, void *ctx,
185c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox						struct nvme_completion *cqe)
186c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox{
187c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	if (ctx == CMD_CTX_CANCELLED)
188c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		return;
189c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	if (ctx == CMD_CTX_FLUSH)
190c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		return;
191c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	if (ctx == CMD_CTX_ABORT) {
192c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		++dev->abort_limit;
193c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		return;
194c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	}
195c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	if (ctx == CMD_CTX_COMPLETED) {
1965c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcox		dev_warn(&dev->pci_dev->dev,
197c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox				"completed id %d twice on queue %d\n",
198c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox				cqe->command_id, le16_to_cpup(&cqe->sq_id));
199c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		return;
200c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	}
201c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	if (ctx == CMD_CTX_INVALID) {
2025c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcox		dev_warn(&dev->pci_dev->dev,
203c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox				"invalid id %d completed on queue %d\n",
204c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox				cqe->command_id, le16_to_cpup(&cqe->sq_id));
205c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		return;
206c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	}
207c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox
2085c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcox	dev_warn(&dev->pci_dev->dev, "Unknown special completion %p\n", ctx);
209c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox}
210c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox
211184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox/*
212184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox * Called with local interrupts disabled and the q_lock held.  May not sleep.
213184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox */
214c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcoxstatic void *free_cmdid(struct nvme_queue *nvmeq, int cmdid,
215c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox						nvme_completion_fn *fn)
216b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
217c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	void *ctx;
218e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	struct nvme_cmd_info *info = nvme_cmd_info(nvmeq);
219b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
220c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	if (cmdid >= nvmeq->q_depth) {
221c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		*fn = special_completion;
22248e3d39816416b3bf03dee3a796c0c04427c1a31Matthew Wilcox		return CMD_CTX_INVALID;
223c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	}
224859361a228258edf4821d9f5635825033eca78e8Keith Busch	if (fn)
225859361a228258edf4821d9f5635825033eca78e8Keith Busch		*fn = info[cmdid].fn;
226c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	ctx = info[cmdid].ctx;
227c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	info[cmdid].fn = special_completion;
228e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	info[cmdid].ctx = CMD_CTX_COMPLETED;
229b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	clear_bit(cmdid, nvmeq->cmdid_data);
230b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	wake_up(&nvmeq->sq_full);
231c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	return ctx;
232b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
233b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
234c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcoxstatic void *cancel_cmdid(struct nvme_queue *nvmeq, int cmdid,
235c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox						nvme_completion_fn *fn)
2363c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox{
237c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	void *ctx;
238e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	struct nvme_cmd_info *info = nvme_cmd_info(nvmeq);
239c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	if (fn)
240c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		*fn = info[cmdid].fn;
241c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	ctx = info[cmdid].ctx;
242c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	info[cmdid].fn = special_completion;
243e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	info[cmdid].ctx = CMD_CTX_CANCELLED;
244c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	return ctx;
2453c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox}
2463c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox
2475d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermastruct nvme_queue *get_nvmeq(struct nvme_dev *dev)
248b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
249040a93b52a9eee8177ebaf2ba0ee0f9f518d1bf8Matthew Wilcox	return dev->queues[get_cpu() + 1];
250b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
251b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2525d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermavoid put_nvmeq(struct nvme_queue *nvmeq)
253b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
2541b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	put_cpu();
255b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
256b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
257b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/**
258714a7a22884b74862540bc84955274d86b2f6040Matthew Wilcox * nvme_submit_cmd() - Copy a command into a queue and ring the doorbell
259b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * @nvmeq: The queue to use
260b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * @cmd: The command to send
261b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox *
262b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * Safe to use from interrupt context
263b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox */
264b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int nvme_submit_cmd(struct nvme_queue *nvmeq, struct nvme_command *cmd)
265b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
266b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	unsigned long flags;
267b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 tail;
268b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	spin_lock_irqsave(&nvmeq->q_lock, flags);
269b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	tail = nvmeq->sq_tail;
270b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	memcpy(&nvmeq->sq_cmds[tail], cmd, sizeof(*cmd));
271b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (++tail == nvmeq->q_depth)
272b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		tail = 0;
2737547881d0951384f9833ec3a80fac8f3f16f3b98Matthew Wilcox	writel(tail, nvmeq->q_db);
274b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->sq_tail = tail;
275b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	spin_unlock_irqrestore(&nvmeq->q_lock, flags);
276b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
277b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return 0;
278b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
279b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
280eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcoxstatic __le64 **iod_list(struct nvme_iod *iod)
281e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews{
282eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	return ((void *)iod) + iod->offset;
283e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews}
284e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews
285eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox/*
286eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox * Will slightly overestimate the number of pages needed.  This is OK
287eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox * as it only leads to a small amount of wasted memory for the lifetime of
288eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox * the I/O.
289eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox */
290eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcoxstatic int nvme_npages(unsigned size)
291eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox{
292eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	unsigned nprps = DIV_ROUND_UP(size + PAGE_SIZE, PAGE_SIZE);
293eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	return DIV_ROUND_UP(8 * nprps, PAGE_SIZE - 8);
294eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox}
295b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
296eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcoxstatic struct nvme_iod *
297eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcoxnvme_alloc_iod(unsigned nseg, unsigned nbytes, gfp_t gfp)
298b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
299eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	struct nvme_iod *iod = kmalloc(sizeof(struct nvme_iod) +
300eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox				sizeof(__le64 *) * nvme_npages(nbytes) +
301eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox				sizeof(struct scatterlist) * nseg, gfp);
302eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox
303eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	if (iod) {
304eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		iod->offset = offsetof(struct nvme_iod, sg[nseg]);
305eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		iod->npages = -1;
306eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		iod->length = nbytes;
3072b1960341576bf51c01b12fefeb1cc53820923e7Keith Busch		iod->nents = 0;
3086198221fa0df0298513b35796f63f242ea97134eKeith Busch		iod->start_time = jiffies;
309eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	}
310eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox
311eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	return iod;
312b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
313b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
3145d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermavoid nvme_free_iod(struct nvme_dev *dev, struct nvme_iod *iod)
315b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
316eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	const int last_prp = PAGE_SIZE / 8 - 1;
317eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	int i;
318eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	__le64 **list = iod_list(iod);
319eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	dma_addr_t prp_dma = iod->first_dma;
320eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox
321eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	if (iod->npages == 0)
322eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		dma_pool_free(dev->prp_small_pool, list[0], prp_dma);
323eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	for (i = 0; i < iod->npages; i++) {
324eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		__le64 *prp_list = list[i];
325eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		dma_addr_t next_prp_dma = le64_to_cpu(prp_list[last_prp]);
326eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		dma_pool_free(dev->prp_page_pool, prp_list, prp_dma);
327eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		prp_dma = next_prp_dma;
328eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	}
329eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	kfree(iod);
330b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
331b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
3326198221fa0df0298513b35796f63f242ea97134eKeith Buschstatic void nvme_start_io_acct(struct bio *bio)
3336198221fa0df0298513b35796f63f242ea97134eKeith Busch{
3346198221fa0df0298513b35796f63f242ea97134eKeith Busch	struct gendisk *disk = bio->bi_bdev->bd_disk;
3356198221fa0df0298513b35796f63f242ea97134eKeith Busch	const int rw = bio_data_dir(bio);
3366198221fa0df0298513b35796f63f242ea97134eKeith Busch	int cpu = part_stat_lock();
3376198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_round_stats(cpu, &disk->part0);
3386198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_stat_inc(cpu, &disk->part0, ios[rw]);
3396198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_stat_add(cpu, &disk->part0, sectors[rw], bio_sectors(bio));
3406198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_inc_in_flight(&disk->part0, rw);
3416198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_stat_unlock();
3426198221fa0df0298513b35796f63f242ea97134eKeith Busch}
3436198221fa0df0298513b35796f63f242ea97134eKeith Busch
3446198221fa0df0298513b35796f63f242ea97134eKeith Buschstatic void nvme_end_io_acct(struct bio *bio, unsigned long start_time)
3456198221fa0df0298513b35796f63f242ea97134eKeith Busch{
3466198221fa0df0298513b35796f63f242ea97134eKeith Busch	struct gendisk *disk = bio->bi_bdev->bd_disk;
3476198221fa0df0298513b35796f63f242ea97134eKeith Busch	const int rw = bio_data_dir(bio);
3486198221fa0df0298513b35796f63f242ea97134eKeith Busch	unsigned long duration = jiffies - start_time;
3496198221fa0df0298513b35796f63f242ea97134eKeith Busch	int cpu = part_stat_lock();
3506198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_stat_add(cpu, &disk->part0, ticks[rw], duration);
3516198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_round_stats(cpu, &disk->part0);
3526198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_dec_in_flight(&disk->part0, rw);
3536198221fa0df0298513b35796f63f242ea97134eKeith Busch	part_stat_unlock();
3546198221fa0df0298513b35796f63f242ea97134eKeith Busch}
3556198221fa0df0298513b35796f63f242ea97134eKeith Busch
3565c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcoxstatic void bio_completion(struct nvme_dev *dev, void *ctx,
357b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox						struct nvme_completion *cqe)
358b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
359eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	struct nvme_iod *iod = ctx;
360eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	struct bio *bio = iod->private;
361b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 status = le16_to_cpup(&cqe->status) >> 1;
362b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
3639e59d091b0eb04f223ed037348e3d9e36f30e72bKeith Busch	if (iod->nents) {
3642b1960341576bf51c01b12fefeb1cc53820923e7Keith Busch		dma_unmap_sg(&dev->pci_dev->dev, iod->sg, iod->nents,
365b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			bio_data_dir(bio) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
3669e59d091b0eb04f223ed037348e3d9e36f30e72bKeith Busch		nvme_end_io_acct(bio, iod->start_time);
3679e59d091b0eb04f223ed037348e3d9e36f30e72bKeith Busch	}
368eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	nvme_free_iod(dev, iod);
369427e97080196548557b288517537ab7eb48c309fKeith Busch	if (status)
3701ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox		bio_endio(bio, -EIO);
371427e97080196548557b288517537ab7eb48c309fKeith Busch	else
3721ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox		bio_endio(bio, 0);
373b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
374b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
375184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox/* length is in bytes.  gfp flags indicates whether we may sleep. */
3765d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermaint nvme_setup_prps(struct nvme_dev *dev, struct nvme_common_command *cmd,
3775d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma			struct nvme_iod *iod, int total_len, gfp_t gfp)
378ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox{
37999802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	struct dma_pool *pool;
380eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	int length = total_len;
381eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	struct scatterlist *sg = iod->sg;
382ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	int dma_len = sg_dma_len(sg);
383ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	u64 dma_addr = sg_dma_address(sg);
384ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	int offset = offset_in_page(dma_addr);
385e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews	__le64 *prp_list;
386eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	__le64 **list = iod_list(iod);
387e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews	dma_addr_t prp_dma;
388eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	int nprps, i;
389ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox
390ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	cmd->prp1 = cpu_to_le64(dma_addr);
391ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	length -= (PAGE_SIZE - offset);
392ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	if (length <= 0)
393eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		return total_len;
394ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox
395ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	dma_len -= (PAGE_SIZE - offset);
396ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	if (dma_len) {
397ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox		dma_addr += (PAGE_SIZE - offset);
398ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	} else {
399ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox		sg = sg_next(sg);
400ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox		dma_addr = sg_dma_address(sg);
401ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox		dma_len = sg_dma_len(sg);
402ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	}
403ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox
404ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	if (length <= PAGE_SIZE) {
405ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox		cmd->prp2 = cpu_to_le64(dma_addr);
406eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		return total_len;
407e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews	}
408e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews
409e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews	nprps = DIV_ROUND_UP(length, PAGE_SIZE);
41099802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	if (nprps <= (256 / 8)) {
41199802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox		pool = dev->prp_small_pool;
412eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		iod->npages = 0;
41399802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	} else {
41499802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox		pool = dev->prp_page_pool;
415eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		iod->npages = 1;
41699802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	}
41799802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox
418b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox	prp_list = dma_pool_alloc(pool, gfp, &prp_dma);
419b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox	if (!prp_list) {
420b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox		cmd->prp2 = cpu_to_le64(dma_addr);
421eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		iod->npages = -1;
422eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		return (total_len - length) + PAGE_SIZE;
423b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox	}
424eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	list[0] = prp_list;
425eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	iod->first_dma = prp_dma;
426e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews	cmd->prp2 = cpu_to_le64(prp_dma);
427e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews	i = 0;
428e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews	for (;;) {
4297523d834dd1573610078eb1ac0933f6490232f90Matthew Wilcox		if (i == PAGE_SIZE / 8) {
430e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews			__le64 *old_prp_list = prp_list;
431b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox			prp_list = dma_pool_alloc(pool, gfp, &prp_dma);
432eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox			if (!prp_list)
433eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox				return total_len - length;
434eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox			list[iod->npages++] = prp_list;
4357523d834dd1573610078eb1ac0933f6490232f90Matthew Wilcox			prp_list[0] = old_prp_list[i - 1];
4367523d834dd1573610078eb1ac0933f6490232f90Matthew Wilcox			old_prp_list[i - 1] = cpu_to_le64(prp_dma);
4377523d834dd1573610078eb1ac0933f6490232f90Matthew Wilcox			i = 1;
438e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		}
439e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		prp_list[i++] = cpu_to_le64(dma_addr);
440e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		dma_len -= PAGE_SIZE;
441e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		dma_addr += PAGE_SIZE;
442e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		length -= PAGE_SIZE;
443e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		if (length <= 0)
444e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews			break;
445e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		if (dma_len > 0)
446e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews			continue;
447e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		BUG_ON(dma_len < 0);
448e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		sg = sg_next(sg);
449e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		dma_addr = sg_dma_address(sg);
450e025344c56e08b155f43ea09647969286c78377cShane Michael Matthews		dma_len = sg_dma_len(sg);
451ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	}
452ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox
453eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	return total_len;
454ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox}
455ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox
456427e97080196548557b288517537ab7eb48c309fKeith Buschstruct nvme_bio_pair {
457427e97080196548557b288517537ab7eb48c309fKeith Busch	struct bio b1, b2, *parent;
458427e97080196548557b288517537ab7eb48c309fKeith Busch	struct bio_vec *bv1, *bv2;
459427e97080196548557b288517537ab7eb48c309fKeith Busch	int err;
460427e97080196548557b288517537ab7eb48c309fKeith Busch	atomic_t cnt;
461427e97080196548557b288517537ab7eb48c309fKeith Busch};
462427e97080196548557b288517537ab7eb48c309fKeith Busch
463427e97080196548557b288517537ab7eb48c309fKeith Buschstatic void nvme_bio_pair_endio(struct bio *bio, int err)
464427e97080196548557b288517537ab7eb48c309fKeith Busch{
465427e97080196548557b288517537ab7eb48c309fKeith Busch	struct nvme_bio_pair *bp = bio->bi_private;
466427e97080196548557b288517537ab7eb48c309fKeith Busch
467427e97080196548557b288517537ab7eb48c309fKeith Busch	if (err)
468427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->err = err;
469427e97080196548557b288517537ab7eb48c309fKeith Busch
470427e97080196548557b288517537ab7eb48c309fKeith Busch	if (atomic_dec_and_test(&bp->cnt)) {
471427e97080196548557b288517537ab7eb48c309fKeith Busch		bio_endio(bp->parent, bp->err);
4721b56749e541ad59068582f2a28297843e243b856Keith Busch		kfree(bp->bv1);
4731b56749e541ad59068582f2a28297843e243b856Keith Busch		kfree(bp->bv2);
474427e97080196548557b288517537ab7eb48c309fKeith Busch		kfree(bp);
475427e97080196548557b288517537ab7eb48c309fKeith Busch	}
476427e97080196548557b288517537ab7eb48c309fKeith Busch}
477427e97080196548557b288517537ab7eb48c309fKeith Busch
478427e97080196548557b288517537ab7eb48c309fKeith Buschstatic struct nvme_bio_pair *nvme_bio_split(struct bio *bio, int idx,
479427e97080196548557b288517537ab7eb48c309fKeith Busch							int len, int offset)
480427e97080196548557b288517537ab7eb48c309fKeith Busch{
481427e97080196548557b288517537ab7eb48c309fKeith Busch	struct nvme_bio_pair *bp;
482427e97080196548557b288517537ab7eb48c309fKeith Busch
483427e97080196548557b288517537ab7eb48c309fKeith Busch	BUG_ON(len > bio->bi_size);
484427e97080196548557b288517537ab7eb48c309fKeith Busch	BUG_ON(idx > bio->bi_vcnt);
485427e97080196548557b288517537ab7eb48c309fKeith Busch
486427e97080196548557b288517537ab7eb48c309fKeith Busch	bp = kmalloc(sizeof(*bp), GFP_ATOMIC);
487427e97080196548557b288517537ab7eb48c309fKeith Busch	if (!bp)
488427e97080196548557b288517537ab7eb48c309fKeith Busch		return NULL;
489427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->err = 0;
490427e97080196548557b288517537ab7eb48c309fKeith Busch
491427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b1 = *bio;
492427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b2 = *bio;
493427e97080196548557b288517537ab7eb48c309fKeith Busch
494427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b1.bi_size = len;
495427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b2.bi_size -= len;
496427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b1.bi_vcnt = idx;
497427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b2.bi_idx = idx;
498427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b2.bi_sector += len >> 9;
499427e97080196548557b288517537ab7eb48c309fKeith Busch
500427e97080196548557b288517537ab7eb48c309fKeith Busch	if (offset) {
501427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->bv1 = kmalloc(bio->bi_max_vecs * sizeof(struct bio_vec),
502427e97080196548557b288517537ab7eb48c309fKeith Busch								GFP_ATOMIC);
503427e97080196548557b288517537ab7eb48c309fKeith Busch		if (!bp->bv1)
504427e97080196548557b288517537ab7eb48c309fKeith Busch			goto split_fail_1;
505427e97080196548557b288517537ab7eb48c309fKeith Busch
506427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->bv2 = kmalloc(bio->bi_max_vecs * sizeof(struct bio_vec),
507427e97080196548557b288517537ab7eb48c309fKeith Busch								GFP_ATOMIC);
508427e97080196548557b288517537ab7eb48c309fKeith Busch		if (!bp->bv2)
509427e97080196548557b288517537ab7eb48c309fKeith Busch			goto split_fail_2;
510427e97080196548557b288517537ab7eb48c309fKeith Busch
511427e97080196548557b288517537ab7eb48c309fKeith Busch		memcpy(bp->bv1, bio->bi_io_vec,
512427e97080196548557b288517537ab7eb48c309fKeith Busch			bio->bi_max_vecs * sizeof(struct bio_vec));
513427e97080196548557b288517537ab7eb48c309fKeith Busch		memcpy(bp->bv2, bio->bi_io_vec,
514427e97080196548557b288517537ab7eb48c309fKeith Busch			bio->bi_max_vecs * sizeof(struct bio_vec));
515427e97080196548557b288517537ab7eb48c309fKeith Busch
516427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->b1.bi_io_vec = bp->bv1;
517427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->b2.bi_io_vec = bp->bv2;
518427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->b2.bi_io_vec[idx].bv_offset += offset;
519427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->b2.bi_io_vec[idx].bv_len -= offset;
520427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->b1.bi_io_vec[idx].bv_len = offset;
521427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->b1.bi_vcnt++;
522427e97080196548557b288517537ab7eb48c309fKeith Busch	} else
523427e97080196548557b288517537ab7eb48c309fKeith Busch		bp->bv1 = bp->bv2 = NULL;
524427e97080196548557b288517537ab7eb48c309fKeith Busch
525427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b1.bi_private = bp;
526427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b2.bi_private = bp;
527427e97080196548557b288517537ab7eb48c309fKeith Busch
528427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b1.bi_end_io = nvme_bio_pair_endio;
529427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->b2.bi_end_io = nvme_bio_pair_endio;
530427e97080196548557b288517537ab7eb48c309fKeith Busch
531427e97080196548557b288517537ab7eb48c309fKeith Busch	bp->parent = bio;
532427e97080196548557b288517537ab7eb48c309fKeith Busch	atomic_set(&bp->cnt, 2);
533427e97080196548557b288517537ab7eb48c309fKeith Busch
534427e97080196548557b288517537ab7eb48c309fKeith Busch	return bp;
535427e97080196548557b288517537ab7eb48c309fKeith Busch
536427e97080196548557b288517537ab7eb48c309fKeith Busch split_fail_2:
537427e97080196548557b288517537ab7eb48c309fKeith Busch	kfree(bp->bv1);
538427e97080196548557b288517537ab7eb48c309fKeith Busch split_fail_1:
539427e97080196548557b288517537ab7eb48c309fKeith Busch	kfree(bp);
540427e97080196548557b288517537ab7eb48c309fKeith Busch	return NULL;
541427e97080196548557b288517537ab7eb48c309fKeith Busch}
542427e97080196548557b288517537ab7eb48c309fKeith Busch
543427e97080196548557b288517537ab7eb48c309fKeith Buschstatic int nvme_split_and_submit(struct bio *bio, struct nvme_queue *nvmeq,
544427e97080196548557b288517537ab7eb48c309fKeith Busch						int idx, int len, int offset)
545427e97080196548557b288517537ab7eb48c309fKeith Busch{
546427e97080196548557b288517537ab7eb48c309fKeith Busch	struct nvme_bio_pair *bp = nvme_bio_split(bio, idx, len, offset);
547427e97080196548557b288517537ab7eb48c309fKeith Busch	if (!bp)
548427e97080196548557b288517537ab7eb48c309fKeith Busch		return -ENOMEM;
549427e97080196548557b288517537ab7eb48c309fKeith Busch
550427e97080196548557b288517537ab7eb48c309fKeith Busch	if (bio_list_empty(&nvmeq->sq_cong))
551427e97080196548557b288517537ab7eb48c309fKeith Busch		add_wait_queue(&nvmeq->sq_full, &nvmeq->sq_cong_wait);
552427e97080196548557b288517537ab7eb48c309fKeith Busch	bio_list_add(&nvmeq->sq_cong, &bp->b1);
553427e97080196548557b288517537ab7eb48c309fKeith Busch	bio_list_add(&nvmeq->sq_cong, &bp->b2);
554427e97080196548557b288517537ab7eb48c309fKeith Busch
555427e97080196548557b288517537ab7eb48c309fKeith Busch	return 0;
556427e97080196548557b288517537ab7eb48c309fKeith Busch}
557427e97080196548557b288517537ab7eb48c309fKeith Busch
5581ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox/* NVMe scatterlists require no holes in the virtual address */
5591ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox#define BIOVEC_NOT_VIRT_MERGEABLE(vec1, vec2)	((vec2)->bv_offset || \
5601ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox			(((vec1)->bv_offset + (vec1)->bv_len) % PAGE_SIZE))
5611ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox
562427e97080196548557b288517537ab7eb48c309fKeith Buschstatic int nvme_map_bio(struct nvme_queue *nvmeq, struct nvme_iod *iod,
563b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		struct bio *bio, enum dma_data_direction dma_dir, int psegs)
564b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
565768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox	struct bio_vec *bvec, *bvprv = NULL;
566768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox	struct scatterlist *sg = NULL;
567159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch	int i, length = 0, nsegs = 0, split_len = bio->bi_size;
568159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch
569159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch	if (nvmeq->dev->stripe_size)
570159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch		split_len = nvmeq->dev->stripe_size -
571159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch			((bio->bi_sector << 9) & (nvmeq->dev->stripe_size - 1));
572b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
573eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	sg_init_table(iod->sg, psegs);
574b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	bio_for_each_segment(bvec, bio, i) {
575768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox		if (bvprv && BIOVEC_PHYS_MERGEABLE(bvprv, bvec)) {
576768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox			sg->length += bvec->bv_len;
577768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox		} else {
5781ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox			if (bvprv && BIOVEC_NOT_VIRT_MERGEABLE(bvprv, bvec))
579427e97080196548557b288517537ab7eb48c309fKeith Busch				return nvme_split_and_submit(bio, nvmeq, i,
580427e97080196548557b288517537ab7eb48c309fKeith Busch								length, 0);
581427e97080196548557b288517537ab7eb48c309fKeith Busch
582eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox			sg = sg ? sg + 1 : iod->sg;
583768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox			sg_set_page(sg, bvec->bv_page, bvec->bv_len,
584768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox							bvec->bv_offset);
585768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox			nsegs++;
586768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox		}
587159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch
588159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch		if (split_len - length < bvec->bv_len)
589159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch			return nvme_split_and_submit(bio, nvmeq, i, split_len,
590159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch							split_len - length);
5911ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox		length += bvec->bv_len;
592768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox		bvprv = bvec;
593b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
594eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	iod->nents = nsegs;
595768308400f5b4ce665a072eb976a851978b7706eMatthew Wilcox	sg_mark_end(sg);
596427e97080196548557b288517537ab7eb48c309fKeith Busch	if (dma_map_sg(nvmeq->q_dmadev, iod->sg, iod->nents, dma_dir) == 0)
5971ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox		return -ENOMEM;
598427e97080196548557b288517537ab7eb48c309fKeith Busch
599159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch	BUG_ON(length != bio->bi_size);
6001ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox	return length;
601b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
602b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
6030e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch/*
6040e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch * We reuse the small pool to allocate the 16-byte range here as it is not
6050e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch * worth having a special pool for these or additional cases to handle freeing
6060e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch * the iod.
6070e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch */
6080e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Buschstatic int nvme_submit_discard(struct nvme_queue *nvmeq, struct nvme_ns *ns,
6090e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch		struct bio *bio, struct nvme_iod *iod, int cmdid)
6100e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch{
6110e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	struct nvme_dsm_range *range;
6120e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	struct nvme_command *cmnd = &nvmeq->sq_cmds[nvmeq->sq_tail];
6130e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
6140e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	range = dma_pool_alloc(nvmeq->dev->prp_small_pool, GFP_ATOMIC,
6150e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch							&iod->first_dma);
6160e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	if (!range)
6170e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch		return -ENOMEM;
6180e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
6190e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	iod_list(iod)[0] = (__le64 *)range;
6200e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	iod->npages = 0;
6210e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
6220e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	range->cattr = cpu_to_le32(0);
6230e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	range->nlb = cpu_to_le32(bio->bi_size >> ns->lba_shift);
624063cc6d5591ea9c0631b81ac5c7b829d99738b2fMatthew Wilcox	range->slba = cpu_to_le64(nvme_block_nr(ns, bio->bi_sector));
6250e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
6260e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	memset(cmnd, 0, sizeof(*cmnd));
6270e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	cmnd->dsm.opcode = nvme_cmd_dsm;
6280e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	cmnd->dsm.command_id = cmdid;
6290e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	cmnd->dsm.nsid = cpu_to_le32(ns->ns_id);
6300e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	cmnd->dsm.prp1 = cpu_to_le64(iod->first_dma);
6310e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	cmnd->dsm.nr = 0;
6320e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	cmnd->dsm.attributes = cpu_to_le32(NVME_DSMGMT_AD);
6330e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
6340e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	if (++nvmeq->sq_tail == nvmeq->q_depth)
6350e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch		nvmeq->sq_tail = 0;
6360e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	writel(nvmeq->sq_tail, nvmeq->q_db);
6370e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
6380e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	return 0;
6390e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch}
6400e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
64100df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcoxstatic int nvme_submit_flush(struct nvme_queue *nvmeq, struct nvme_ns *ns,
64200df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox								int cmdid)
64300df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox{
64400df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	struct nvme_command *cmnd = &nvmeq->sq_cmds[nvmeq->sq_tail];
64500df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
64600df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	memset(cmnd, 0, sizeof(*cmnd));
64700df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	cmnd->common.opcode = nvme_cmd_flush;
64800df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	cmnd->common.command_id = cmdid;
64900df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	cmnd->common.nsid = cpu_to_le32(ns->ns_id);
65000df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
65100df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	if (++nvmeq->sq_tail == nvmeq->q_depth)
65200df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox		nvmeq->sq_tail = 0;
65300df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	writel(nvmeq->sq_tail, nvmeq->q_db);
65400df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
65500df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	return 0;
65600df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox}
65700df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
6585d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermaint nvme_submit_flush_data(struct nvme_queue *nvmeq, struct nvme_ns *ns)
65900df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox{
66000df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	int cmdid = alloc_cmdid(nvmeq, (void *)CMD_CTX_FLUSH,
661ff976d724a74e4522e9ca2de1fb37ac4520f454fMatthew Wilcox					special_completion, NVME_IO_TIMEOUT);
66200df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	if (unlikely(cmdid < 0))
66300df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox		return cmdid;
66400df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
66500df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	return nvme_submit_flush(nvmeq, ns, cmdid);
66600df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox}
66700df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
668184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox/*
669184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox * Called with local interrupts disabled and the q_lock held.  May not sleep.
670184d2944cb3b92a2e8e1733c59d1e531ad6e924aMatthew Wilcox */
671b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns,
672b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox								struct bio *bio)
673b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
674ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	struct nvme_command *cmnd;
675eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	struct nvme_iod *iod;
676b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	enum dma_data_direction dma_dir;
6771287dabd345f447bbe0f7a99fc95ab89bcfc0f5dWei Yongjun	int cmdid, length, result;
678b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u16 control;
679b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u32 dsmgmt;
680b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int psegs = bio_phys_segments(ns->queue, bio);
681b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
68200df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	if ((bio->bi_rw & REQ_FLUSH) && psegs) {
68300df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox		result = nvme_submit_flush_data(nvmeq, ns);
68400df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox		if (result)
68500df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox			return result;
68600df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	}
68700df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
6881287dabd345f447bbe0f7a99fc95ab89bcfc0f5dWei Yongjun	result = -ENOMEM;
689eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	iod = nvme_alloc_iod(psegs, bio->bi_size, GFP_ATOMIC);
690eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	if (!iod)
691eeee322647a67c20d9277c5e02c42b2126ea74bcMatthew Wilcox		goto nomem;
692eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	iod->private = bio;
693b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
694eeee322647a67c20d9277c5e02c42b2126ea74bcMatthew Wilcox	result = -EBUSY;
695ff976d724a74e4522e9ca2de1fb37ac4520f454fMatthew Wilcox	cmdid = alloc_cmdid(nvmeq, iod, bio_completion, NVME_IO_TIMEOUT);
696b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (unlikely(cmdid < 0))
697eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		goto free_iod;
698b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
6990e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	if (bio->bi_rw & REQ_DISCARD) {
7000e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch		result = nvme_submit_discard(nvmeq, ns, bio, iod, cmdid);
7010e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch		if (result)
7020e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch			goto free_cmdid;
7030e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch		return result;
7040e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	}
70500df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox	if ((bio->bi_rw & REQ_FLUSH) && !psegs)
70600df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox		return nvme_submit_flush(nvmeq, ns, cmdid);
70700df5cb4eb927078850086f8becc3286a69ea12eMatthew Wilcox
708b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	control = 0;
709b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (bio->bi_rw & REQ_FUA)
710b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		control |= NVME_RW_FUA;
711b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (bio->bi_rw & (REQ_FAILFAST_DEV | REQ_RAHEAD))
712b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		control |= NVME_RW_LR;
713b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
714b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dsmgmt = 0;
715b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (bio->bi_rw & REQ_RAHEAD)
716b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		dsmgmt |= NVME_RW_DSM_FREQ_PREFETCH;
717b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
718ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	cmnd = &nvmeq->sq_cmds[nvmeq->sq_tail];
719b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
720b8deb62cf271fa9381edc8cf52bcae2f0225c55aMatthew Wilcox	memset(cmnd, 0, sizeof(*cmnd));
721b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (bio_data_dir(bio)) {
722ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox		cmnd->rw.opcode = nvme_cmd_write;
723b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		dma_dir = DMA_TO_DEVICE;
724b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	} else {
725ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox		cmnd->rw.opcode = nvme_cmd_read;
726b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		dma_dir = DMA_FROM_DEVICE;
727b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
728b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
729427e97080196548557b288517537ab7eb48c309fKeith Busch	result = nvme_map_bio(nvmeq, iod, bio, dma_dir, psegs);
730427e97080196548557b288517537ab7eb48c309fKeith Busch	if (result <= 0)
731859361a228258edf4821d9f5635825033eca78e8Keith Busch		goto free_cmdid;
7321ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox	length = result;
733b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
734ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	cmnd->rw.command_id = cmdid;
735ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	cmnd->rw.nsid = cpu_to_le32(ns->ns_id);
736eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	length = nvme_setup_prps(nvmeq->dev, &cmnd->common, iod, length,
737eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox								GFP_ATOMIC);
738063cc6d5591ea9c0631b81ac5c7b829d99738b2fMatthew Wilcox	cmnd->rw.slba = cpu_to_le64(nvme_block_nr(ns, bio->bi_sector));
7391ad2f8932a72bf375361727949ced2cb4e8cfcefMatthew Wilcox	cmnd->rw.length = cpu_to_le16((length >> ns->lba_shift) - 1);
740ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	cmnd->rw.control = cpu_to_le16(control);
741ff22b54fda2078fc3cd1bcdcb7a5ce5d08fd6591Matthew Wilcox	cmnd->rw.dsmgmt = cpu_to_le32(dsmgmt);
742b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
7436198221fa0df0298513b35796f63f242ea97134eKeith Busch	nvme_start_io_acct(bio);
744b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (++nvmeq->sq_tail == nvmeq->q_depth)
745b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		nvmeq->sq_tail = 0;
7467547881d0951384f9833ec3a80fac8f3f16f3b98Matthew Wilcox	writel(nvmeq->sq_tail, nvmeq->q_db);
747b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
7481974b1ae8852324a75fb8cfecbc7b758fd5a2c3cMatthew Wilcox	return 0;
7491974b1ae8852324a75fb8cfecbc7b758fd5a2c3cMatthew Wilcox
750859361a228258edf4821d9f5635825033eca78e8Keith Busch free_cmdid:
751859361a228258edf4821d9f5635825033eca78e8Keith Busch	free_cmdid(nvmeq, cmdid, NULL);
752eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox free_iod:
753eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	nvme_free_iod(nvmeq->dev, iod);
754eeee322647a67c20d9277c5e02c42b2126ea74bcMatthew Wilcox nomem:
755eeee322647a67c20d9277c5e02c42b2126ea74bcMatthew Wilcox	return result;
756b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
757b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
758e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcoxstatic int nvme_process_cq(struct nvme_queue *nvmeq)
759b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
760821234603b265f59d7eebce16d9e8beca2a5752dMatthew Wilcox	u16 head, phase;
761b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
762b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	head = nvmeq->cq_head;
763821234603b265f59d7eebce16d9e8beca2a5752dMatthew Wilcox	phase = nvmeq->cq_phase;
764b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
765b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	for (;;) {
766c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		void *ctx;
767c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		nvme_completion_fn fn;
768b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		struct nvme_completion cqe = nvmeq->cqes[head];
769821234603b265f59d7eebce16d9e8beca2a5752dMatthew Wilcox		if ((le16_to_cpu(cqe.status) & 1) != phase)
770b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			break;
771b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		nvmeq->sq_head = le16_to_cpu(cqe.sq_head);
772b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		if (++head == nvmeq->q_depth) {
773b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			head = 0;
774821234603b265f59d7eebce16d9e8beca2a5752dMatthew Wilcox			phase = !phase;
775b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		}
776b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
777c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox		ctx = free_cmdid(nvmeq, cqe.command_id, &fn);
7785c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcox		fn(nvmeq->dev, ctx, &cqe);
779b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
780b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
781b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	/* If the controller ignores the cq head doorbell and continuously
782b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	 * writes to the queue, it is theoretically possible to wrap around
783b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	 * the queue twice and mistakenly return IRQ_NONE.  Linux only
784b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	 * requires that 0.1% of your interrupts are handled, so this isn't
785b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	 * a big problem.
786b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	 */
787821234603b265f59d7eebce16d9e8beca2a5752dMatthew Wilcox	if (head == nvmeq->cq_head && phase == nvmeq->cq_phase)
788e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox		return 0;
789b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
790b80d5ccca3a012e91ca64a2a0b13049163a6a698Haiyan Hu	writel(head, nvmeq->q_db + nvmeq->dev->db_stride);
791b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->cq_head = head;
792821234603b265f59d7eebce16d9e8beca2a5752dMatthew Wilcox	nvmeq->cq_phase = phase;
793b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
794e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox	nvmeq->cqe_seen = 1;
795e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox	return 1;
796b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
797b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
7987d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcoxstatic void nvme_make_request(struct request_queue *q, struct bio *bio)
7997d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox{
8007d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	struct nvme_ns *ns = q->queuedata;
8017d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	struct nvme_queue *nvmeq = get_nvmeq(ns->dev);
8027d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	int result = -EBUSY;
8037d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox
804cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	if (!nvmeq) {
805cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		put_nvmeq(NULL);
806cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		bio_endio(bio, -EIO);
807cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		return;
808cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	}
809cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
8107d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	spin_lock_irq(&nvmeq->q_lock);
811224042742582c9938788b81165180c876e997a07Keith Busch	if (!nvmeq->q_suspended && bio_list_empty(&nvmeq->sq_cong))
8127d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox		result = nvme_submit_bio_queue(nvmeq, ns, bio);
8137d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	if (unlikely(result)) {
8147d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox		if (bio_list_empty(&nvmeq->sq_cong))
8157d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox			add_wait_queue(&nvmeq->sq_full, &nvmeq->sq_cong_wait);
8167d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox		bio_list_add(&nvmeq->sq_cong, bio);
8177d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	}
8187d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox
8197d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	nvme_process_cq(nvmeq);
8207d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	spin_unlock_irq(&nvmeq->q_lock);
8217d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox	put_nvmeq(nvmeq);
8227d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox}
8237d8224574cbd2326a6be00f319f5f7597abec3f6Matthew Wilcox
824b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic irqreturn_t nvme_irq(int irq, void *data)
825b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
82658ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	irqreturn_t result;
82758ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	struct nvme_queue *nvmeq = data;
82858ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	spin_lock(&nvmeq->q_lock);
829e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox	nvme_process_cq(nvmeq);
830e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox	result = nvmeq->cqe_seen ? IRQ_HANDLED : IRQ_NONE;
831e9539f47525ecee05c9f22c3565885f3e9492c52Matthew Wilcox	nvmeq->cqe_seen = 0;
83258ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	spin_unlock(&nvmeq->q_lock);
83358ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	return result;
83458ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox}
83558ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox
83658ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcoxstatic irqreturn_t nvme_irq_check(int irq, void *data)
83758ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox{
83858ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	struct nvme_queue *nvmeq = data;
83958ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	struct nvme_completion cqe = nvmeq->cqes[nvmeq->cq_head];
84058ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	if ((le16_to_cpu(cqe.status) & 1) != nvmeq->cq_phase)
84158ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox		return IRQ_NONE;
84258ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	return IRQ_WAKE_THREAD;
84358ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox}
84458ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox
8453c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcoxstatic void nvme_abort_command(struct nvme_queue *nvmeq, int cmdid)
8463c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox{
8473c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox	spin_lock_irq(&nvmeq->q_lock);
848c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	cancel_cmdid(nvmeq, cmdid, NULL);
8493c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox	spin_unlock_irq(&nvmeq->q_lock);
8503c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox}
8513c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox
852c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcoxstruct sync_cmd_info {
853c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	struct task_struct *task;
854c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	u32 result;
855c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	int status;
856c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox};
857c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox
8585c1281a3bf5655ec1b90db495da3a2b77826ba88Matthew Wilcoxstatic void sync_completion(struct nvme_dev *dev, void *ctx,
859c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox						struct nvme_completion *cqe)
860c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox{
861c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	struct sync_cmd_info *cmdinfo = ctx;
862c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	cmdinfo->result = le32_to_cpup(&cqe->result);
863c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	cmdinfo->status = le16_to_cpup(&cqe->status) >> 1;
864c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	wake_up_process(cmdinfo->task);
865c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox}
866c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox
867b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/*
868b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * Returns 0 on success.  If the result is negative, it's a Linux error code;
869b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox * if the result is positive, it's an NVM Express status code
870b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox */
8715d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermaint nvme_submit_sync_cmd(struct nvme_queue *nvmeq, struct nvme_command *cmd,
8725d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma						u32 *result, unsigned timeout)
873b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
874b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int cmdid;
875b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct sync_cmd_info cmdinfo;
876b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
877b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	cmdinfo.task = current;
878b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	cmdinfo.status = -EINTR;
879b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
880c2f5b65020869215814df03c3941dac9436f99fbMatthew Wilcox	cmdid = alloc_cmdid_killable(nvmeq, &cmdinfo, sync_completion,
881e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox								timeout);
882b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (cmdid < 0)
883b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return cmdid;
884b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	cmd->common.command_id = cmdid;
885b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
8863c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox	set_current_state(TASK_KILLABLE);
8873c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox	nvme_submit_cmd(nvmeq, cmd);
88878f8d2577bd79ce9d62f4d9e6d3b895bd1dd1d1dKeith Busch	schedule_timeout(timeout);
889b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
8903c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox	if (cmdinfo.status == -EINTR) {
8913c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox		nvme_abort_command(nvmeq, cmdid);
8923c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox		return -EINTR;
8933c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox	}
8943c0cf138d7789feb3f335f6f1d24ad8fc8b3a23fMatthew Wilcox
895b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (result)
896b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		*result = cmdinfo.result;
897b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
898b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return cmdinfo.status;
899b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
900b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
9015d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermaint nvme_submit_admin_cmd(struct nvme_dev *dev, struct nvme_command *cmd,
902b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox								u32 *result)
903b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
904e85248e516c550382ba33ca325c272a0ca397e44Matthew Wilcox	return nvme_submit_sync_cmd(dev->queues[0], cmd, result, ADMIN_TIMEOUT);
905b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
906b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
907b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int adapter_delete_queue(struct nvme_dev *dev, u8 opcode, u16 id)
908b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
909b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int status;
910b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_command c;
911b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
912b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	memset(&c, 0, sizeof(c));
913b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.delete_queue.opcode = opcode;
914b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.delete_queue.qid = cpu_to_le16(id);
915b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
916b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	status = nvme_submit_admin_cmd(dev, &c, NULL);
917b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (status)
918b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return -EIO;
919b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return 0;
920b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
921b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
922b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int adapter_alloc_cq(struct nvme_dev *dev, u16 qid,
923b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox						struct nvme_queue *nvmeq)
924b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
925b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int status;
926b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_command c;
927b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int flags = NVME_QUEUE_PHYS_CONTIG | NVME_CQ_IRQ_ENABLED;
928b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
929b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	memset(&c, 0, sizeof(c));
930b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_cq.opcode = nvme_admin_create_cq;
931b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_cq.prp1 = cpu_to_le64(nvmeq->cq_dma_addr);
932b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_cq.cqid = cpu_to_le16(qid);
933b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_cq.qsize = cpu_to_le16(nvmeq->q_depth - 1);
934b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_cq.cq_flags = cpu_to_le16(flags);
935b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_cq.irq_vector = cpu_to_le16(nvmeq->cq_vector);
936b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
937b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	status = nvme_submit_admin_cmd(dev, &c, NULL);
938b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (status)
939b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return -EIO;
940b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return 0;
941b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
942b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
943b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int adapter_alloc_sq(struct nvme_dev *dev, u16 qid,
944b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox						struct nvme_queue *nvmeq)
945b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
946b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int status;
947b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_command c;
948b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int flags = NVME_QUEUE_PHYS_CONTIG | NVME_SQ_PRIO_MEDIUM;
949b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
950b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	memset(&c, 0, sizeof(c));
951b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_sq.opcode = nvme_admin_create_sq;
952b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_sq.prp1 = cpu_to_le64(nvmeq->sq_dma_addr);
953b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_sq.sqid = cpu_to_le16(qid);
954b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_sq.qsize = cpu_to_le16(nvmeq->q_depth - 1);
955b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_sq.sq_flags = cpu_to_le16(flags);
956b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	c.create_sq.cqid = cpu_to_le16(qid);
957b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
958b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	status = nvme_submit_admin_cmd(dev, &c, NULL);
959b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (status)
960b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return -EIO;
961b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return 0;
962b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
963b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
964b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int adapter_delete_cq(struct nvme_dev *dev, u16 cqid)
965b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
966b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return adapter_delete_queue(dev, nvme_admin_delete_cq, cqid);
967b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
968b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
969b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int adapter_delete_sq(struct nvme_dev *dev, u16 sqid)
970b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
971b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return adapter_delete_queue(dev, nvme_admin_delete_sq, sqid);
972b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
973b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
9745d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermaint nvme_identify(struct nvme_dev *dev, unsigned nsid, unsigned cns,
975bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox							dma_addr_t dma_addr)
976bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox{
977bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	struct nvme_command c;
978bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox
979bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	memset(&c, 0, sizeof(c));
980bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	c.identify.opcode = nvme_admin_identify;
981bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	c.identify.nsid = cpu_to_le32(nsid);
982bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	c.identify.prp1 = cpu_to_le64(dma_addr);
983bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	c.identify.cns = cpu_to_le32(cns);
984bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox
985bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	return nvme_submit_admin_cmd(dev, &c, NULL);
986bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox}
987bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox
9885d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermaint nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid,
98908df1e05657fc6712e520e7c09cc6c86160ceb35Keith Busch					dma_addr_t dma_addr, u32 *result)
990bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox{
991bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	struct nvme_command c;
992bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox
993bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	memset(&c, 0, sizeof(c));
994bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	c.features.opcode = nvme_admin_get_features;
995a42ceccef0c43b46ff6bc1b12a7c1076ef243df1Keith Busch	c.features.nsid = cpu_to_le32(nsid);
996bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	c.features.prp1 = cpu_to_le64(dma_addr);
997bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	c.features.fid = cpu_to_le32(fid);
998bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox
99908df1e05657fc6712e520e7c09cc6c86160ceb35Keith Busch	return nvme_submit_admin_cmd(dev, &c, result);
1000df3481399042200792822b6243e36a95a557b57eMatthew Wilcox}
1001df3481399042200792822b6243e36a95a557b57eMatthew Wilcox
10025d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermaint nvme_set_features(struct nvme_dev *dev, unsigned fid, unsigned dword11,
10035d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma					dma_addr_t dma_addr, u32 *result)
1004df3481399042200792822b6243e36a95a557b57eMatthew Wilcox{
1005df3481399042200792822b6243e36a95a557b57eMatthew Wilcox	struct nvme_command c;
1006df3481399042200792822b6243e36a95a557b57eMatthew Wilcox
1007df3481399042200792822b6243e36a95a557b57eMatthew Wilcox	memset(&c, 0, sizeof(c));
1008df3481399042200792822b6243e36a95a557b57eMatthew Wilcox	c.features.opcode = nvme_admin_set_features;
1009df3481399042200792822b6243e36a95a557b57eMatthew Wilcox	c.features.prp1 = cpu_to_le64(dma_addr);
1010df3481399042200792822b6243e36a95a557b57eMatthew Wilcox	c.features.fid = cpu_to_le32(fid);
1011df3481399042200792822b6243e36a95a557b57eMatthew Wilcox	c.features.dword11 = cpu_to_le32(dword11);
1012df3481399042200792822b6243e36a95a557b57eMatthew Wilcox
1013bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	return nvme_submit_admin_cmd(dev, &c, result);
1014bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox}
1015bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox
1016a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox/**
1017c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch * nvme_abort_cmd - Attempt aborting a command
1018c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch * @cmdid: Command id of a timed out IO
1019c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch * @queue: The queue with timed out IO
1020c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch *
1021c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch * Schedule controller reset if the command was already aborted once before and
1022c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch * still hasn't been returned to the driver, or if this is the admin queue.
1023c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch */
1024c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Buschstatic void nvme_abort_cmd(int cmdid, struct nvme_queue *nvmeq)
1025c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch{
1026c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	int a_cmdid;
1027c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	struct nvme_command cmd;
1028c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	struct nvme_dev *dev = nvmeq->dev;
1029c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	struct nvme_cmd_info *info = nvme_cmd_info(nvmeq);
1030c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch
1031c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	if (!nvmeq->qid || info[cmdid].aborted) {
1032c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		if (work_busy(&dev->reset_work))
1033c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch			return;
1034c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		list_del_init(&dev->node);
1035c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		dev_warn(&dev->pci_dev->dev,
1036c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch			"I/O %d QID %d timeout, reset controller\n", cmdid,
1037c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch								nvmeq->qid);
1038c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		INIT_WORK(&dev->reset_work, nvme_reset_failed_dev);
1039c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		queue_work(nvme_workq, &dev->reset_work);
1040c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		return;
1041c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	}
1042c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch
1043c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	if (!dev->abort_limit)
1044c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		return;
1045c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch
1046c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	a_cmdid = alloc_cmdid(dev->queues[0], CMD_CTX_ABORT, special_completion,
1047c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch								ADMIN_TIMEOUT);
1048c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	if (a_cmdid < 0)
1049c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		return;
1050c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch
1051c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	memset(&cmd, 0, sizeof(cmd));
1052c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	cmd.abort.opcode = nvme_admin_abort_cmd;
1053c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	cmd.abort.cid = cmdid;
1054c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	cmd.abort.sqid = cpu_to_le16(nvmeq->qid);
1055c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	cmd.abort.command_id = a_cmdid;
1056c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch
1057c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	--dev->abort_limit;
1058c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	info[cmdid].aborted = 1;
1059c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	info[cmdid].timeout = jiffies + ADMIN_TIMEOUT;
1060c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch
1061c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	dev_warn(nvmeq->q_dmadev, "Aborting I/O %d QID %d\n", cmdid,
1062c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch							nvmeq->qid);
1063c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	nvme_submit_cmd(dev->queues[0], &cmd);
1064c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch}
1065c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch
1066c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch/**
1067a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox * nvme_cancel_ios - Cancel outstanding I/Os
1068a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox * @queue: The queue to cancel I/Os on
1069a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox * @timeout: True to only cancel I/Os which have timed out
1070a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox */
1071a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcoxstatic void nvme_cancel_ios(struct nvme_queue *nvmeq, bool timeout)
1072a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox{
1073a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	int depth = nvmeq->q_depth - 1;
1074a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	struct nvme_cmd_info *info = nvme_cmd_info(nvmeq);
1075a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	unsigned long now = jiffies;
1076a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	int cmdid;
1077a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox
1078a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	for_each_set_bit(cmdid, nvmeq->cmdid_data, depth) {
1079a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox		void *ctx;
1080a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox		nvme_completion_fn fn;
1081a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox		static struct nvme_completion cqe = {
1082af2d9ca744af5e03390eeb3864d08ce75c860899Matthew Wilcox			.status = cpu_to_le16(NVME_SC_ABORT_REQ << 1),
1083a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox		};
1084a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox
1085a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox		if (timeout && !time_after(now, info[cmdid].timeout))
1086a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox			continue;
1087053ab702cc2702f25a97ead087ed344b864785b7Keith Busch		if (info[cmdid].ctx == CMD_CTX_CANCELLED)
1088053ab702cc2702f25a97ead087ed344b864785b7Keith Busch			continue;
1089c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		if (timeout && nvmeq->dev->initialized) {
1090c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch			nvme_abort_cmd(cmdid, nvmeq);
1091c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch			continue;
1092c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		}
1093c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch		dev_warn(nvmeq->q_dmadev, "Cancelling I/O %d QID %d\n", cmdid,
1094c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch								nvmeq->qid);
1095a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox		ctx = cancel_cmdid(nvmeq, cmdid, &fn);
1096a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox		fn(nvmeq->dev, ctx, &cqe);
1097a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	}
1098a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox}
1099a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox
1100224042742582c9938788b81165180c876e997a07Keith Buschstatic void nvme_free_queue(struct nvme_queue *nvmeq)
11019e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox{
1102224042742582c9938788b81165180c876e997a07Keith Busch	spin_lock_irq(&nvmeq->q_lock);
1103224042742582c9938788b81165180c876e997a07Keith Busch	while (bio_list_peek(&nvmeq->sq_cong)) {
1104224042742582c9938788b81165180c876e997a07Keith Busch		struct bio *bio = bio_list_pop(&nvmeq->sq_cong);
1105224042742582c9938788b81165180c876e997a07Keith Busch		bio_endio(bio, -EIO);
1106224042742582c9938788b81165180c876e997a07Keith Busch	}
1107224042742582c9938788b81165180c876e997a07Keith Busch	spin_unlock_irq(&nvmeq->q_lock);
1108224042742582c9938788b81165180c876e997a07Keith Busch
11099e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox	dma_free_coherent(nvmeq->q_dmadev, CQ_SIZE(nvmeq->q_depth),
11109e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox				(void *)nvmeq->cqes, nvmeq->cq_dma_addr);
11119e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox	dma_free_coherent(nvmeq->q_dmadev, SQ_SIZE(nvmeq->q_depth),
11129e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox					nvmeq->sq_cmds, nvmeq->sq_dma_addr);
11139e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox	kfree(nvmeq);
11149e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox}
11159e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox
1116224042742582c9938788b81165180c876e997a07Keith Buschstatic void nvme_free_queues(struct nvme_dev *dev)
1117224042742582c9938788b81165180c876e997a07Keith Busch{
1118224042742582c9938788b81165180c876e997a07Keith Busch	int i;
1119224042742582c9938788b81165180c876e997a07Keith Busch
1120224042742582c9938788b81165180c876e997a07Keith Busch	for (i = dev->queue_count - 1; i >= 0; i--) {
1121224042742582c9938788b81165180c876e997a07Keith Busch		nvme_free_queue(dev->queues[i]);
1122224042742582c9938788b81165180c876e997a07Keith Busch		dev->queue_count--;
1123224042742582c9938788b81165180c876e997a07Keith Busch		dev->queues[i] = NULL;
1124224042742582c9938788b81165180c876e997a07Keith Busch	}
1125224042742582c9938788b81165180c876e997a07Keith Busch}
1126224042742582c9938788b81165180c876e997a07Keith Busch
1127224042742582c9938788b81165180c876e997a07Keith Buschstatic void nvme_disable_queue(struct nvme_dev *dev, int qid)
1128b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1129b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_queue *nvmeq = dev->queues[qid];
1130aba2080f3f1639f9202f1a52993669844abcfb80Matthew Wilcox	int vector = dev->entry[nvmeq->cq_vector].vector;
1131b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1132a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	spin_lock_irq(&nvmeq->q_lock);
1133224042742582c9938788b81165180c876e997a07Keith Busch	if (nvmeq->q_suspended) {
1134224042742582c9938788b81165180c876e997a07Keith Busch		spin_unlock_irq(&nvmeq->q_lock);
1135224042742582c9938788b81165180c876e997a07Keith Busch		return;
11363295874b6074d749516d6decd43afad7bf6e38ffKeith Busch	}
1137224042742582c9938788b81165180c876e997a07Keith Busch	nvmeq->q_suspended = 1;
1138a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox	spin_unlock_irq(&nvmeq->q_lock);
1139a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox
1140aba2080f3f1639f9202f1a52993669844abcfb80Matthew Wilcox	irq_set_affinity_hint(vector, NULL);
1141aba2080f3f1639f9202f1a52993669844abcfb80Matthew Wilcox	free_irq(vector, nvmeq);
1142b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
11430e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch	/* Don't tell the adapter to delete the admin queue.
11440e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch	 * Don't tell a removed adapter to delete IO queues. */
11450e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch	if (qid && readl(&dev->bar->csts) != -1) {
1146b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		adapter_delete_sq(dev, qid);
1147b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		adapter_delete_cq(dev, qid);
1148b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
1149b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1150224042742582c9938788b81165180c876e997a07Keith Busch	spin_lock_irq(&nvmeq->q_lock);
1151224042742582c9938788b81165180c876e997a07Keith Busch	nvme_process_cq(nvmeq);
1152224042742582c9938788b81165180c876e997a07Keith Busch	nvme_cancel_ios(nvmeq, false);
1153224042742582c9938788b81165180c876e997a07Keith Busch	spin_unlock_irq(&nvmeq->q_lock);
1154b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1155b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1156b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid,
1157b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox							int depth, int vector)
1158b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1159b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct device *dmadev = &dev->pci_dev->dev;
1160224042742582c9938788b81165180c876e997a07Keith Busch	unsigned extra = nvme_queue_extra(depth);
1161b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_queue *nvmeq = kzalloc(sizeof(*nvmeq) + extra, GFP_KERNEL);
1162b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!nvmeq)
1163b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return NULL;
1164b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1165b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->cqes = dma_alloc_coherent(dmadev, CQ_SIZE(depth),
1166b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox					&nvmeq->cq_dma_addr, GFP_KERNEL);
1167b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!nvmeq->cqes)
1168b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto free_nvmeq;
1169b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	memset((void *)nvmeq->cqes, 0, CQ_SIZE(depth));
1170b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1171b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->sq_cmds = dma_alloc_coherent(dmadev, SQ_SIZE(depth),
1172b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox					&nvmeq->sq_dma_addr, GFP_KERNEL);
1173b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!nvmeq->sq_cmds)
1174b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto free_cqdma;
1175b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1176b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->q_dmadev = dmadev;
1177091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	nvmeq->dev = dev;
1178b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	spin_lock_init(&nvmeq->q_lock);
1179b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->cq_head = 0;
1180821234603b265f59d7eebce16d9e8beca2a5752dMatthew Wilcox	nvmeq->cq_phase = 1;
1181b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	init_waitqueue_head(&nvmeq->sq_full);
11821fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	init_waitqueue_entry(&nvmeq->sq_cong_wait, nvme_thread);
1183b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	bio_list_init(&nvmeq->sq_cong);
1184b80d5ccca3a012e91ca64a2a0b13049163a6a698Haiyan Hu	nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride];
1185b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->q_depth = depth;
1186b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	nvmeq->cq_vector = vector;
1187c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	nvmeq->qid = qid;
1188224042742582c9938788b81165180c876e997a07Keith Busch	nvmeq->q_suspended = 1;
1189224042742582c9938788b81165180c876e997a07Keith Busch	dev->queue_count++;
1190b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1191b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return nvmeq;
1192b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1193b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox free_cqdma:
119468b8eca5f882230e4991df0db0a3094f49420a90Keith Busch	dma_free_coherent(dmadev, CQ_SIZE(depth), (void *)nvmeq->cqes,
1195b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox							nvmeq->cq_dma_addr);
1196b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox free_nvmeq:
1197b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	kfree(nvmeq);
1198b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return NULL;
1199b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1200b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
12013001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcoxstatic int queue_request_irq(struct nvme_dev *dev, struct nvme_queue *nvmeq,
12023001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcox							const char *name)
12033001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcox{
120458ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox	if (use_threaded_interrupts)
120558ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox		return request_threaded_irq(dev->entry[nvmeq->cq_vector].vector,
1206481e5bad84239b01415b888df2040c1860ae3cfdMichael Opdenacker					nvme_irq_check, nvme_irq, IRQF_SHARED,
120758ffacb545f76fc2c65d1fbfa5acf5184a2a09e6Matthew Wilcox					name, nvmeq);
12083001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcox	return request_irq(dev->entry[nvmeq->cq_vector].vector, nvme_irq,
1209481e5bad84239b01415b888df2040c1860ae3cfdMichael Opdenacker				IRQF_SHARED, name, nvmeq);
12103001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcox}
12113001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcox
1212224042742582c9938788b81165180c876e997a07Keith Buschstatic void nvme_init_queue(struct nvme_queue *nvmeq, u16 qid)
1213b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1214224042742582c9938788b81165180c876e997a07Keith Busch	struct nvme_dev *dev = nvmeq->dev;
1215224042742582c9938788b81165180c876e997a07Keith Busch	unsigned extra = nvme_queue_extra(nvmeq->q_depth);
1216b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1217224042742582c9938788b81165180c876e997a07Keith Busch	nvmeq->sq_tail = 0;
1218224042742582c9938788b81165180c876e997a07Keith Busch	nvmeq->cq_head = 0;
1219224042742582c9938788b81165180c876e997a07Keith Busch	nvmeq->cq_phase = 1;
1220b80d5ccca3a012e91ca64a2a0b13049163a6a698Haiyan Hu	nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride];
1221224042742582c9938788b81165180c876e997a07Keith Busch	memset(nvmeq->cmdid_data, 0, extra);
1222224042742582c9938788b81165180c876e997a07Keith Busch	memset((void *)nvmeq->cqes, 0, CQ_SIZE(nvmeq->q_depth));
1223224042742582c9938788b81165180c876e997a07Keith Busch	nvme_cancel_ios(nvmeq, false);
1224224042742582c9938788b81165180c876e997a07Keith Busch	nvmeq->q_suspended = 0;
1225224042742582c9938788b81165180c876e997a07Keith Busch}
1226224042742582c9938788b81165180c876e997a07Keith Busch
1227224042742582c9938788b81165180c876e997a07Keith Buschstatic int nvme_create_queue(struct nvme_queue *nvmeq, int qid)
1228224042742582c9938788b81165180c876e997a07Keith Busch{
1229224042742582c9938788b81165180c876e997a07Keith Busch	struct nvme_dev *dev = nvmeq->dev;
1230224042742582c9938788b81165180c876e997a07Keith Busch	int result;
12313f85d50b609e8a5ef151656210203a6e94c19538Matthew Wilcox
1232b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	result = adapter_alloc_cq(dev, qid, nvmeq);
1233b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (result < 0)
1234224042742582c9938788b81165180c876e997a07Keith Busch		return result;
1235b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1236b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	result = adapter_alloc_sq(dev, qid, nvmeq);
1237b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (result < 0)
1238b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto release_cq;
1239b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
12403001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcox	result = queue_request_irq(dev, nvmeq, "nvme");
1241b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (result < 0)
1242b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto release_sq;
1243b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
12440a8d44cb33377969337fa6c1961b631605d5f453Matthew Wilcox	spin_lock_irq(&nvmeq->q_lock);
1245224042742582c9938788b81165180c876e997a07Keith Busch	nvme_init_queue(nvmeq, qid);
12460a8d44cb33377969337fa6c1961b631605d5f453Matthew Wilcox	spin_unlock_irq(&nvmeq->q_lock);
1247224042742582c9938788b81165180c876e997a07Keith Busch
1248224042742582c9938788b81165180c876e997a07Keith Busch	return result;
1249b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1250b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox release_sq:
1251b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	adapter_delete_sq(dev, qid);
1252b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox release_cq:
1253b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	adapter_delete_cq(dev, qid);
1254224042742582c9938788b81165180c876e997a07Keith Busch	return result;
1255b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1256b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1257ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcoxstatic int nvme_wait_ready(struct nvme_dev *dev, u64 cap, bool enabled)
1258ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox{
1259ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	unsigned long timeout;
1260ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	u32 bit = enabled ? NVME_CSTS_RDY : 0;
1261ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox
1262ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	timeout = ((NVME_CAP_TIMEOUT(cap) + 1) * HZ / 2) + jiffies;
1263ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox
1264ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	while ((readl(&dev->bar->csts) & NVME_CSTS_RDY) != bit) {
1265ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox		msleep(100);
1266ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox		if (fatal_signal_pending(current))
1267ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox			return -EINTR;
1268ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox		if (time_after(jiffies, timeout)) {
1269ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox			dev_err(&dev->pci_dev->dev,
1270ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox				"Device not ready; aborting initialisation\n");
1271ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox			return -ENODEV;
1272ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox		}
1273ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	}
1274ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox
1275ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	return 0;
1276ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox}
1277ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox
1278ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox/*
1279ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox * If the device has been passed off to us in an enabled state, just clear
1280ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox * the enabled bit.  The spec says we should set the 'shutdown notification
1281ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox * bits', but doing so may cause the device to complete commands to the
1282ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox * admin queue ... and we don't know what memory that might be pointing at!
1283ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox */
1284ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcoxstatic int nvme_disable_ctrl(struct nvme_dev *dev, u64 cap)
1285ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox{
128644af146a84fa4a8e136d824207dcd356958a112bMatthew Wilcox	u32 cc = readl(&dev->bar->cc);
128744af146a84fa4a8e136d824207dcd356958a112bMatthew Wilcox
128844af146a84fa4a8e136d824207dcd356958a112bMatthew Wilcox	if (cc & NVME_CC_ENABLE)
128944af146a84fa4a8e136d824207dcd356958a112bMatthew Wilcox		writel(cc & ~NVME_CC_ENABLE, &dev->bar->cc);
1290ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	return nvme_wait_ready(dev, cap, false);
1291ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox}
1292ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox
1293ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcoxstatic int nvme_enable_ctrl(struct nvme_dev *dev, u64 cap)
1294ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox{
1295ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	return nvme_wait_ready(dev, cap, true);
1296ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox}
1297ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox
12981894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Buschstatic int nvme_shutdown_ctrl(struct nvme_dev *dev)
12991894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch{
13001894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	unsigned long timeout;
13011894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	u32 cc;
13021894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch
13031894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	cc = (readl(&dev->bar->cc) & ~NVME_CC_SHN_MASK) | NVME_CC_SHN_NORMAL;
13041894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	writel(cc, &dev->bar->cc);
13051894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch
13061894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	timeout = 2 * HZ + jiffies;
13071894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	while ((readl(&dev->bar->csts) & NVME_CSTS_SHST_MASK) !=
13081894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch							NVME_CSTS_SHST_CMPLT) {
13091894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch		msleep(100);
13101894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch		if (fatal_signal_pending(current))
13111894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch			return -EINTR;
13121894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch		if (time_after(jiffies, timeout)) {
13131894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch			dev_err(&dev->pci_dev->dev,
13141894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch				"Device shutdown incomplete; abort shutdown\n");
13151894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch			return -ENODEV;
13161894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch		}
13171894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	}
13181894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch
13191894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	return 0;
13201894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch}
13211894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch
13228d85fce77edfc22f1d6dbf78e3af723b4b556f3dGreg Kroah-Hartmanstatic int nvme_configure_admin_queue(struct nvme_dev *dev)
1323b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1324ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	int result;
1325b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u32 aqa;
1326ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	u64 cap = readq(&dev->bar->cap);
1327b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_queue *nvmeq;
1328b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1329ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	result = nvme_disable_ctrl(dev, cap);
1330ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	if (result < 0)
1331ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox		return result;
1332b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1333cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	nvmeq = dev->queues[0];
1334cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	if (!nvmeq) {
1335cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		nvmeq = nvme_alloc_queue(dev, 0, 64, 0);
1336cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		if (!nvmeq)
1337cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch			return -ENOMEM;
1338cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		dev->queues[0] = nvmeq;
1339cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	}
1340b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1341b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	aqa = nvmeq->q_depth - 1;
1342b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	aqa |= aqa << 16;
1343b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1344b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dev->ctrl_config = NVME_CC_ENABLE | NVME_CC_CSS_NVM;
1345b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dev->ctrl_config |= (PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT;
1346b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dev->ctrl_config |= NVME_CC_ARB_RR | NVME_CC_SHN_NONE;
13477f53f9d2424533256ae86f7df5661a17de743de8Matthew Wilcox	dev->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES;
1348b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1349b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	writel(aqa, &dev->bar->aqa);
1350b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	writeq(nvmeq->sq_dma_addr, &dev->bar->asq);
1351b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	writeq(nvmeq->cq_dma_addr, &dev->bar->acq);
1352b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	writel(dev->ctrl_config, &dev->bar->cc);
1353b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1354ba47e3865e8023e79b670793a41508222b5f0322Matthew Wilcox	result = nvme_enable_ctrl(dev, cap);
1355025c557a71bd06a9f6d32259f00e2218b15bf0a4Keith Busch	if (result)
1356cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		return result;
13579e866774aab5d2654b0fa8f97890f68913f05700Matthew Wilcox
13583001082cac4bf6ffd09f72b39e6292ad6394ef17Matthew Wilcox	result = queue_request_irq(dev, nvmeq, "nvme admin");
1359025c557a71bd06a9f6d32259f00e2218b15bf0a4Keith Busch	if (result)
1360cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		return result;
1361025c557a71bd06a9f6d32259f00e2218b15bf0a4Keith Busch
13620a8d44cb33377969337fa6c1961b631605d5f453Matthew Wilcox	spin_lock_irq(&nvmeq->q_lock);
1363224042742582c9938788b81165180c876e997a07Keith Busch	nvme_init_queue(nvmeq, 0);
13640a8d44cb33377969337fa6c1961b631605d5f453Matthew Wilcox	spin_unlock_irq(&nvmeq->q_lock);
1365b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return result;
1366b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1367b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
13685d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermastruct nvme_iod *nvme_map_user_pages(struct nvme_dev *dev, int write,
1369eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox				unsigned long addr, unsigned length)
1370b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
137136c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	int i, err, count, nents, offset;
13727fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	struct scatterlist *sg;
13737fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	struct page **pages;
1374eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	struct nvme_iod *iod;
137536c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox
137636c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	if (addr & 3)
1377eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		return ERR_PTR(-EINVAL);
13785460fc03105fbed01fe27aa572d9f65bb410a61dDan Carpenter	if (!length || length > INT_MAX - PAGE_SIZE)
1379eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		return ERR_PTR(-EINVAL);
13807fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox
138136c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	offset = offset_in_page(addr);
13827fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	count = DIV_ROUND_UP(offset + length, PAGE_SIZE);
13837fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	pages = kcalloc(count, sizeof(*pages), GFP_KERNEL);
138422fff826e715e9727d3c7a69f15e602a9801b673Dan Carpenter	if (!pages)
138522fff826e715e9727d3c7a69f15e602a9801b673Dan Carpenter		return ERR_PTR(-ENOMEM);
138636c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox
138736c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	err = get_user_pages_fast(addr, count, 1, pages);
138836c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	if (err < count) {
138936c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox		count = err;
139036c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox		err = -EFAULT;
139136c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox		goto put_pages;
139236c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	}
13937fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox
1394eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	iod = nvme_alloc_iod(count, length, GFP_KERNEL);
1395eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	sg = iod->sg;
139636c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	sg_init_table(sg, count);
1397d0ba1e497bca83a3d353eb47c9658afc54d83228Matthew Wilcox	for (i = 0; i < count; i++) {
1398d0ba1e497bca83a3d353eb47c9658afc54d83228Matthew Wilcox		sg_set_page(&sg[i], pages[i],
13995460fc03105fbed01fe27aa572d9f65bb410a61dDan Carpenter			    min_t(unsigned, length, PAGE_SIZE - offset),
14005460fc03105fbed01fe27aa572d9f65bb410a61dDan Carpenter			    offset);
1401d0ba1e497bca83a3d353eb47c9658afc54d83228Matthew Wilcox		length -= (PAGE_SIZE - offset);
1402d0ba1e497bca83a3d353eb47c9658afc54d83228Matthew Wilcox		offset = 0;
14037fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	}
1404fe304c43c6d63e29ed4fc46a874d7a74313788c5Matthew Wilcox	sg_mark_end(&sg[i - 1]);
14051c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox	iod->nents = count;
14067fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox
14077fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	err = -ENOMEM;
14087fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	nents = dma_map_sg(&dev->pci_dev->dev, sg, count,
14097fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox				write ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
141036c14ed9caa957c686d4a48fd598a5ec2aa0331bMatthew Wilcox	if (!nents)
1411eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		goto free_iod;
1412b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
14137fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	kfree(pages);
1414eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	return iod;
1415b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1416eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox free_iod:
1417eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	kfree(iod);
14187fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox put_pages:
14197fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	for (i = 0; i < count; i++)
14207fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox		put_page(pages[i]);
14217fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox	kfree(pages);
1422eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	return ERR_PTR(err);
14237fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox}
1424b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
14255d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Vermavoid nvme_unmap_user_pages(struct nvme_dev *dev, int write,
14261c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox			struct nvme_iod *iod)
14277fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox{
14281c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox	int i;
1429b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
14301c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox	dma_unmap_sg(&dev->pci_dev->dev, iod->sg, iod->nents,
14311c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox				write ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
14327fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox
14331c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox	for (i = 0; i < iod->nents; i++)
14341c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox		put_page(sg_page(&iod->sg[i]));
14357fc3cdabba75c2516b8b645eb0ca7907aea70415Matthew Wilcox}
1436b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1437a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcoxstatic int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
1438a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox{
1439a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	struct nvme_dev *dev = ns->dev;
1440a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	struct nvme_queue *nvmeq;
1441a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	struct nvme_user_io io;
1442a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	struct nvme_command c;
1443f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	unsigned length, meta_len;
1444f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	int status, i;
1445f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	struct nvme_iod *iod, *meta_iod = NULL;
1446f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	dma_addr_t meta_dma_addr;
1447f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	void *meta, *uninitialized_var(meta_mem);
1448a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox
1449a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	if (copy_from_user(&io, uio, sizeof(io)))
1450a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox		return -EFAULT;
14516c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	length = (io.nblocks + 1) << ns->lba_shift;
1452f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	meta_len = (io.nblocks + 1) * ns->ms;
1453f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1454f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	if (meta_len && ((io.metadata & 3) || !io.metadata))
1455f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		return -EINVAL;
14566c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox
14576c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	switch (io.opcode) {
14586c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	case nvme_cmd_write:
14596c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	case nvme_cmd_read:
14606bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	case nvme_cmd_compare:
1461eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		iod = nvme_map_user_pages(dev, io.opcode & 1, io.addr, length);
14626413214c5d424fd5aae6567848340f962ad2ce0fMatthew Wilcox		break;
14636c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	default:
14646bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox		return -EINVAL;
14656c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	}
14666c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox
1467eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	if (IS_ERR(iod))
1468eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		return PTR_ERR(iod);
1469a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox
1470a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	memset(&c, 0, sizeof(c));
1471a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	c.rw.opcode = io.opcode;
1472a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	c.rw.flags = io.flags;
14736c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	c.rw.nsid = cpu_to_le32(ns->ns_id);
1474a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	c.rw.slba = cpu_to_le64(io.slba);
14756c7d49455ceb63064f992347d9185ff5bf43497aMatthew Wilcox	c.rw.length = cpu_to_le16(io.nblocks);
1476a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	c.rw.control = cpu_to_le16(io.control);
14771c9b52651dad0ff1fa71fc6205c86d972f25bcc0Matthew Wilcox	c.rw.dsmgmt = cpu_to_le32(io.dsmgmt);
14781c9b52651dad0ff1fa71fc6205c86d972f25bcc0Matthew Wilcox	c.rw.reftag = cpu_to_le32(io.reftag);
14791c9b52651dad0ff1fa71fc6205c86d972f25bcc0Matthew Wilcox	c.rw.apptag = cpu_to_le16(io.apptag);
14801c9b52651dad0ff1fa71fc6205c86d972f25bcc0Matthew Wilcox	c.rw.appmask = cpu_to_le16(io.appmask);
1481f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1482f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	if (meta_len) {
14831b56749e541ad59068582f2a28297843e243b856Keith Busch		meta_iod = nvme_map_user_pages(dev, io.opcode & 1, io.metadata,
14841b56749e541ad59068582f2a28297843e243b856Keith Busch								meta_len);
1485f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		if (IS_ERR(meta_iod)) {
1486f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			status = PTR_ERR(meta_iod);
1487f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			meta_iod = NULL;
1488f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			goto unmap;
1489f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		}
1490f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1491f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		meta_mem = dma_alloc_coherent(&dev->pci_dev->dev, meta_len,
1492f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch						&meta_dma_addr, GFP_KERNEL);
1493f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		if (!meta_mem) {
1494f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			status = -ENOMEM;
1495f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			goto unmap;
1496f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		}
1497f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1498f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		if (io.opcode & 1) {
1499f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			int meta_offset = 0;
1500f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1501f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			for (i = 0; i < meta_iod->nents; i++) {
1502f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				meta = kmap_atomic(sg_page(&meta_iod->sg[i])) +
1503f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch						meta_iod->sg[i].offset;
1504f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				memcpy(meta_mem + meta_offset, meta,
1505f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch						meta_iod->sg[i].length);
1506f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				kunmap_atomic(meta);
1507f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				meta_offset += meta_iod->sg[i].length;
1508f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			}
1509f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		}
1510f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1511f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		c.rw.metadata = cpu_to_le64(meta_dma_addr);
1512f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	}
1513f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1514eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	length = nvme_setup_prps(dev, &c.common, iod, length, GFP_KERNEL);
1515a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox
1516040a93b52a9eee8177ebaf2ba0ee0f9f518d1bf8Matthew Wilcox	nvmeq = get_nvmeq(dev);
1517fa92282149842645931580225647238428374758Matthew Wilcox	/*
1518fa92282149842645931580225647238428374758Matthew Wilcox	 * Since nvme_submit_sync_cmd sleeps, we can't keep preemption
1519b1ad37efcafe396ac3944853589688dd0ec3c64eMatthew Wilcox	 * disabled.  We may be preempted at any point, and be rescheduled
1520b1ad37efcafe396ac3944853589688dd0ec3c64eMatthew Wilcox	 * to a different CPU.  That will cause cacheline bouncing, but no
1521b1ad37efcafe396ac3944853589688dd0ec3c64eMatthew Wilcox	 * additional races since q_lock already protects against other CPUs.
1522b1ad37efcafe396ac3944853589688dd0ec3c64eMatthew Wilcox	 */
1523a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	put_nvmeq(nvmeq);
1524b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox	if (length != (io.nblocks + 1) << ns->lba_shift)
1525b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox		status = -ENOMEM;
1526224042742582c9938788b81165180c876e997a07Keith Busch	else if (!nvmeq || nvmeq->q_suspended)
1527224042742582c9938788b81165180c876e997a07Keith Busch		status = -EBUSY;
1528b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox	else
1529ff976d724a74e4522e9ca2de1fb37ac4520f454fMatthew Wilcox		status = nvme_submit_sync_cmd(nvmeq, &c, NULL, NVME_IO_TIMEOUT);
1530a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox
1531f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	if (meta_len) {
1532f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		if (status == NVME_SC_SUCCESS && !(io.opcode & 1)) {
1533f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			int meta_offset = 0;
1534f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1535f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			for (i = 0; i < meta_iod->nents; i++) {
1536f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				meta = kmap_atomic(sg_page(&meta_iod->sg[i])) +
1537f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch						meta_iod->sg[i].offset;
1538f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				memcpy(meta, meta_mem + meta_offset,
1539f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch						meta_iod->sg[i].length);
1540f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				kunmap_atomic(meta);
1541f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch				meta_offset += meta_iod->sg[i].length;
1542f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch			}
1543f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		}
1544f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1545f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		dma_free_coherent(&dev->pci_dev->dev, meta_len, meta_mem,
1546f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch								meta_dma_addr);
1547f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	}
1548f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1549f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch unmap:
15501c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox	nvme_unmap_user_pages(dev, io.opcode & 1, iod);
1551eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	nvme_free_iod(dev, iod);
1552f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1553f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	if (meta_iod) {
1554f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		nvme_unmap_user_pages(dev, io.opcode & 1, meta_iod);
1555f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch		nvme_free_iod(dev, meta_iod);
1556f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	}
1557f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch
1558a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	return status;
1559a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox}
1560a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox
156150af8baec46a99a9b81a4600c0374f83a5a590a9Keith Buschstatic int nvme_user_admin_cmd(struct nvme_dev *dev,
15626bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox					struct nvme_admin_cmd __user *ucmd)
15636ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox{
15646bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	struct nvme_admin_cmd cmd;
15656ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox	struct nvme_command c;
1566eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox	int status, length;
1567c7d36ab8fa04c213328119a9c0d66985fe204ee5Keith Busch	struct nvme_iod *uninitialized_var(iod);
156894f370cab6e5ac514b658c6b2b3aa308cefc5c7aKeith Busch	unsigned timeout;
15696ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox
15706bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	if (!capable(CAP_SYS_ADMIN))
15716bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox		return -EACCES;
15726bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	if (copy_from_user(&cmd, ucmd, sizeof(cmd)))
15736ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox		return -EFAULT;
15746ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox
15756ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox	memset(&c, 0, sizeof(c));
15766bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.opcode = cmd.opcode;
15776bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.flags = cmd.flags;
15786bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.nsid = cpu_to_le32(cmd.nsid);
15796bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw2[0] = cpu_to_le32(cmd.cdw2);
15806bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw2[1] = cpu_to_le32(cmd.cdw3);
15816bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw10[0] = cpu_to_le32(cmd.cdw10);
15826bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw10[1] = cpu_to_le32(cmd.cdw11);
15836bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw10[2] = cpu_to_le32(cmd.cdw12);
15846bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw10[3] = cpu_to_le32(cmd.cdw13);
15856bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw10[4] = cpu_to_le32(cmd.cdw14);
15866bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	c.common.cdw10[5] = cpu_to_le32(cmd.cdw15);
15876bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox
15886bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	length = cmd.data_len;
15896bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	if (cmd.data_len) {
1590497421880acecd0281d3182d534f3d28c927caecMatthew Wilcox		iod = nvme_map_user_pages(dev, cmd.opcode & 1, cmd.addr,
1591497421880acecd0281d3182d534f3d28c927caecMatthew Wilcox								length);
1592eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		if (IS_ERR(iod))
1593eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox			return PTR_ERR(iod);
1594eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		length = nvme_setup_prps(dev, &c.common, iod, length,
1595eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox								GFP_KERNEL);
15966bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	}
15976bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox
159894f370cab6e5ac514b658c6b2b3aa308cefc5c7aKeith Busch	timeout = cmd.timeout_ms ? msecs_to_jiffies(cmd.timeout_ms) :
159994f370cab6e5ac514b658c6b2b3aa308cefc5c7aKeith Busch								ADMIN_TIMEOUT;
16006bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	if (length != cmd.data_len)
1601b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox		status = -ENOMEM;
1602b77954cbddff28d55a36fad3c16f4daebb0f01dfMatthew Wilcox	else
160394f370cab6e5ac514b658c6b2b3aa308cefc5c7aKeith Busch		status = nvme_submit_sync_cmd(dev->queues[0], &c, &cmd.result,
160494f370cab6e5ac514b658c6b2b3aa308cefc5c7aKeith Busch								timeout);
1605eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox
16066bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	if (cmd.data_len) {
16071c2ad9faaf662b4a525348775deca3ac8e6c35a0Matthew Wilcox		nvme_unmap_user_pages(dev, cmd.opcode & 1, iod);
1608eca18b2394a9387feeaf14cd884ddddd7a809d19Matthew Wilcox		nvme_free_iod(dev, iod);
16096bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	}
1610f4f117f64baf8840d22266d518227b2a186d294bKeith Busch
1611cf90bc4830b858487fe4b9b9ecd0031e23ca3e83Chayan Biswas	if ((status >= 0) && copy_to_user(&ucmd->result, &cmd.result,
1612f4f117f64baf8840d22266d518227b2a186d294bKeith Busch							sizeof(cmd.result)))
1613f4f117f64baf8840d22266d518227b2a186d294bKeith Busch		status = -EFAULT;
1614f4f117f64baf8840d22266d518227b2a186d294bKeith Busch
16156ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox	return status;
16166ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox}
16176ee44cdced04a53dc4f27eb97067e6cd33784726Matthew Wilcox
1618b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int nvme_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
1619b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox							unsigned long arg)
1620b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1621b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_ns *ns = bdev->bd_disk->private_data;
1622b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1623b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	switch (cmd) {
16246bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	case NVME_IOCTL_ID:
1625c3bfe7176c035a0a2c70bc79180fb13a6c57142aMatthew Wilcox		force_successful_syscall_return();
16266bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox		return ns->ns_id;
16276bbf1acddeed0bfb345a5578f9fcada16f1e514fMatthew Wilcox	case NVME_IOCTL_ADMIN_CMD:
162850af8baec46a99a9b81a4600c0374f83a5a590a9Keith Busch		return nvme_user_admin_cmd(ns->dev, (void __user *)arg);
1629a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox	case NVME_IOCTL_SUBMIT_IO:
1630a53295b6998f62d961c29e54051c1cf1d738c2b3Matthew Wilcox		return nvme_submit_io(ns, (void __user *)arg);
16315d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma	case SG_GET_VERSION_NUM:
16325d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma		return nvme_sg_get_version_num((void __user *)arg);
16335d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma	case SG_IO:
16345d0f6131a79adfa1fb51309c5f81a2a4ef879dd4Vishal Verma		return nvme_sg_io(ns, (void __user *)arg);
1635b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	default:
1636b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return -ENOTTY;
1637b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
1638b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1639b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1640320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch#ifdef CONFIG_COMPAT
1641320a382746e0ab1304476ea7e986a8d416ab99dbKeith Buschstatic int nvme_compat_ioctl(struct block_device *bdev, fmode_t mode,
1642320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch					unsigned int cmd, unsigned long arg)
1643320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch{
1644320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch	struct nvme_ns *ns = bdev->bd_disk->private_data;
1645320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch
1646320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch	switch (cmd) {
1647320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch	case SG_IO:
1648320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch		return nvme_sg_io32(ns, arg);
1649320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch	}
1650320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch	return nvme_ioctl(bdev, mode, cmd, arg);
1651320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch}
1652320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch#else
1653320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch#define nvme_compat_ioctl	NULL
1654320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch#endif
1655320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch
1656b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic const struct block_device_operations nvme_fops = {
1657b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.owner		= THIS_MODULE,
1658b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.ioctl		= nvme_ioctl,
1659320a382746e0ab1304476ea7e986a8d416ab99dbKeith Busch	.compat_ioctl	= nvme_compat_ioctl,
1660b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox};
1661b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
16621fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcoxstatic void nvme_resubmit_bios(struct nvme_queue *nvmeq)
16631fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox{
16641fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	while (bio_list_peek(&nvmeq->sq_cong)) {
16651fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		struct bio *bio = bio_list_pop(&nvmeq->sq_cong);
16661fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		struct nvme_ns *ns = bio->bi_bdev->bd_disk->private_data;
1667427e97080196548557b288517537ab7eb48c309fKeith Busch
1668427e97080196548557b288517537ab7eb48c309fKeith Busch		if (bio_list_empty(&nvmeq->sq_cong))
1669427e97080196548557b288517537ab7eb48c309fKeith Busch			remove_wait_queue(&nvmeq->sq_full,
1670427e97080196548557b288517537ab7eb48c309fKeith Busch							&nvmeq->sq_cong_wait);
16711fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		if (nvme_submit_bio_queue(nvmeq, ns, bio)) {
1672427e97080196548557b288517537ab7eb48c309fKeith Busch			if (bio_list_empty(&nvmeq->sq_cong))
1673427e97080196548557b288517537ab7eb48c309fKeith Busch				add_wait_queue(&nvmeq->sq_full,
1674427e97080196548557b288517537ab7eb48c309fKeith Busch							&nvmeq->sq_cong_wait);
16751fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox			bio_list_add_head(&nvmeq->sq_cong, bio);
16761fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox			break;
16771fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		}
16781fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	}
16791fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox}
16801fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox
16811fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcoxstatic int nvme_kthread(void *data)
16821fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox{
1683d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch	struct nvme_dev *dev, *next;
16841fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox
16851fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	while (!kthread_should_stop()) {
1686564a232c059913d91b491e04c2b2d670b8f94615Arjan van de Ven		set_current_state(TASK_INTERRUPTIBLE);
16871fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		spin_lock(&dev_list_lock);
1688d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch		list_for_each_entry_safe(dev, next, &dev_list, node) {
16891fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox			int i;
1690d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch			if (readl(&dev->bar->csts) & NVME_CSTS_CFS &&
1691d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch							dev->initialized) {
1692d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch				if (work_busy(&dev->reset_work))
1693d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch					continue;
1694d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch				list_del_init(&dev->node);
1695d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch				dev_warn(&dev->pci_dev->dev,
1696d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch					"Failed status, reset controller\n");
1697d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch				INIT_WORK(&dev->reset_work,
1698d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch							nvme_reset_failed_dev);
1699d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch				queue_work(nvme_workq, &dev->reset_work);
1700d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch				continue;
1701d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch			}
17021fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox			for (i = 0; i < dev->queue_count; i++) {
17031fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox				struct nvme_queue *nvmeq = dev->queues[i];
1704740216fc59cba54f65187c9ed92f29bce3cf8778Matthew Wilcox				if (!nvmeq)
1705740216fc59cba54f65187c9ed92f29bce3cf8778Matthew Wilcox					continue;
17061fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox				spin_lock_irq(&nvmeq->q_lock);
1707224042742582c9938788b81165180c876e997a07Keith Busch				if (nvmeq->q_suspended)
1708224042742582c9938788b81165180c876e997a07Keith Busch					goto unlock;
1709bc57a0f7a44cfcf3e9873f6c6b8dcecdca486b1fMatthew Wilcox				nvme_process_cq(nvmeq);
1710a09115b23e2002bb35b7bfd337683f00875671ecMatthew Wilcox				nvme_cancel_ios(nvmeq, true);
17111fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox				nvme_resubmit_bios(nvmeq);
1712224042742582c9938788b81165180c876e997a07Keith Busch unlock:
17131fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox				spin_unlock_irq(&nvmeq->q_lock);
17141fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox			}
17151fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		}
17161fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		spin_unlock(&dev_list_lock);
1717acb7aa0db09b8abd38abeb84334a8a27a52fbb1bArjan van de Ven		schedule_timeout(round_jiffies_relative(HZ));
17181fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	}
17191fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	return 0;
17201fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox}
17211fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox
17225aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcoxstatic DEFINE_IDA(nvme_index_ida);
17235aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox
17245aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcoxstatic int nvme_get_ns_idx(void)
17255aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox{
17265aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	int index, error;
17275aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox
17285aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	do {
17295aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox		if (!ida_pre_get(&nvme_index_ida, GFP_KERNEL))
17305aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox			return -1;
17315aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox
17325aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox		spin_lock(&dev_list_lock);
17335aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox		error = ida_get_new(&nvme_index_ida, &index);
17345aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox		spin_unlock(&dev_list_lock);
17355aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	} while (error == -EAGAIN);
17365aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox
17375aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	if (error)
17385aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox		index = -1;
17395aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	return index;
17405aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox}
17415aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox
17425aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcoxstatic void nvme_put_ns_idx(int index)
17435aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox{
17445aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	spin_lock(&dev_list_lock);
17455aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	ida_remove(&nvme_index_ida, index);
17465aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	spin_unlock(&dev_list_lock);
17475aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox}
17485aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox
17490e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Buschstatic void nvme_config_discard(struct nvme_ns *ns)
17500e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch{
17510e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	u32 logical_block_size = queue_logical_block_size(ns->queue);
17520e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	ns->queue->limits.discard_zeroes_data = 0;
17530e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	ns->queue->limits.discard_alignment = logical_block_size;
17540e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	ns->queue->limits.discard_granularity = logical_block_size;
17550e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	ns->queue->limits.max_discard_sectors = 0xffffffff;
17560e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, ns->queue);
17570e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch}
17580e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
1759c3bfe7176c035a0a2c70bc79180fb13a6c57142aMatthew Wilcoxstatic struct nvme_ns *nvme_alloc_ns(struct nvme_dev *dev, unsigned nsid,
1760b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			struct nvme_id_ns *id, struct nvme_lba_range_type *rt)
1761b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1762b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_ns *ns;
1763b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct gendisk *disk;
1764b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int lbaf;
1765b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1766b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (rt->attributes & NVME_LBART_ATTRIB_HIDE)
1767b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return NULL;
1768b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1769b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	ns = kzalloc(sizeof(*ns), GFP_KERNEL);
1770b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!ns)
1771b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return NULL;
1772b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	ns->queue = blk_alloc_queue(GFP_KERNEL);
1773b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!ns->queue)
1774b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto out_free_ns;
17754eeb9215a0d5c9494ca8b20158cc8ee82618840cMatthew Wilcox	ns->queue->queue_flags = QUEUE_FLAG_DEFAULT;
17764eeb9215a0d5c9494ca8b20158cc8ee82618840cMatthew Wilcox	queue_flag_set_unlocked(QUEUE_FLAG_NOMERGES, ns->queue);
17774eeb9215a0d5c9494ca8b20158cc8ee82618840cMatthew Wilcox	queue_flag_set_unlocked(QUEUE_FLAG_NONROT, ns->queue);
1778b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	blk_queue_make_request(ns->queue, nvme_make_request);
1779b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	ns->dev = dev;
1780b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	ns->queue->queuedata = ns;
1781b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1782b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	disk = alloc_disk(NVME_MINORS);
1783b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!disk)
1784b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto out_free_queue;
17855aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	ns->ns_id = nsid;
1786b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	ns->disk = disk;
1787b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	lbaf = id->flbas & 0xf;
1788b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	ns->lba_shift = id->lbaf[lbaf].ds;
1789f410c680b5344f1cb63ff011c6ae3d4963f45c30Keith Busch	ns->ms = le16_to_cpu(id->lbaf[lbaf].ms);
1790e9ef46369f5107e634a93b7fc4e62a1f53343197Keith Busch	blk_queue_logical_block_size(ns->queue, 1 << ns->lba_shift);
17918fc23e032debd682f5ba9fc524a5846c10d2c522Keith Busch	if (dev->max_hw_sectors)
17928fc23e032debd682f5ba9fc524a5846c10d2c522Keith Busch		blk_queue_max_hw_sectors(ns->queue, dev->max_hw_sectors);
1793b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1794b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	disk->major = nvme_major;
1795b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	disk->minors = NVME_MINORS;
17965aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	disk->first_minor = NVME_MINORS * nvme_get_ns_idx();
1797b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	disk->fops = &nvme_fops;
1798b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	disk->private_data = ns;
1799b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	disk->queue = ns->queue;
1800388f037f4e7f0a24bac6b1a24f144f5d939f58cfMatthew Wilcox	disk->driverfs_dev = &dev->pci_dev->dev;
18015aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	sprintf(disk->disk_name, "nvme%dn%d", dev->instance, nsid);
1802b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	set_capacity(disk, le64_to_cpup(&id->nsze) << (ns->lba_shift - 9));
1803b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
18040e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	if (dev->oncs & NVME_CTRL_ONCS_DSM)
18050e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch		nvme_config_discard(ns);
18060e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch
1807b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return ns;
1808b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1809b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox out_free_queue:
1810b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	blk_cleanup_queue(ns->queue);
1811b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox out_free_ns:
1812b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	kfree(ns);
1813b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return NULL;
1814b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1815b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1816b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic void nvme_ns_free(struct nvme_ns *ns)
1817b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
18185aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	int index = ns->disk->first_minor / NVME_MINORS;
1819b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	put_disk(ns->disk);
18205aff9382ddc8aac6eb0c70ffbb351652d71da69aMatthew Wilcox	nvme_put_ns_idx(index);
1821b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	blk_cleanup_queue(ns->queue);
1822b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	kfree(ns);
1823b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1824b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1825b3b06812e199f248561ce7824a4a8a9cd573c05aMatthew Wilcoxstatic int set_queue_count(struct nvme_dev *dev, int count)
1826b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1827b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	int status;
1828b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	u32 result;
1829b3b06812e199f248561ce7824a4a8a9cd573c05aMatthew Wilcox	u32 q_count = (count - 1) | ((count - 1) << 16);
1830b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1831df3481399042200792822b6243e36a95a557b57eMatthew Wilcox	status = nvme_set_features(dev, NVME_FEAT_NUM_QUEUES, q_count, 0,
1832bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox								&result);
1833b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (status)
18347e03b124065507e72008ef294c30001eca74a031Keith Busch		return status < 0 ? -EIO : -EBUSY;
1835b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return min(result & 0xffff, result >> 16) + 1;
1836b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1837b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
18389d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Buschstatic size_t db_bar_size(struct nvme_dev *dev, unsigned nr_io_queues)
18399d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch{
1840b80d5ccca3a012e91ca64a2a0b13049163a6a698Haiyan Hu	return 4096 + ((nr_io_queues + 1) * 8 * dev->db_stride);
18419d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch}
18429d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch
18438d85fce77edfc22f1d6dbf78e3af723b4b556f3dGreg Kroah-Hartmanstatic int nvme_setup_io_queues(struct nvme_dev *dev)
1844b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
1845fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula	struct pci_dev *pdev = dev->pci_dev;
18469d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch	int result, cpu, i, vecs, nr_io_queues, size, q_depth;
1847b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1848b348b7d54368c87811907a8e88f0d96713c43009Matthew Wilcox	nr_io_queues = num_online_cpus();
1849b348b7d54368c87811907a8e88f0d96713c43009Matthew Wilcox	result = set_queue_count(dev, nr_io_queues);
18501b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	if (result < 0)
18511b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox		return result;
1852b348b7d54368c87811907a8e88f0d96713c43009Matthew Wilcox	if (result < nr_io_queues)
1853b348b7d54368c87811907a8e88f0d96713c43009Matthew Wilcox		nr_io_queues = result;
1854b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
18559d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch	size = db_bar_size(dev, nr_io_queues);
18569d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch	if (size > 8192) {
1857f1938f6e1ee1583c87ec74dc406fdd8694e99ac8Matthew Wilcox		iounmap(dev->bar);
18589d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch		do {
18599d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch			dev->bar = ioremap(pci_resource_start(pdev, 0), size);
18609d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch			if (dev->bar)
18619d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch				break;
18629d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch			if (!--nr_io_queues)
18639d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch				return -ENOMEM;
18649d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch			size = db_bar_size(dev, nr_io_queues);
18659d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch		} while (1);
1866f1938f6e1ee1583c87ec74dc406fdd8694e99ac8Matthew Wilcox		dev->dbs = ((void __iomem *)dev->bar) + 4096;
1867f1938f6e1ee1583c87ec74dc406fdd8694e99ac8Matthew Wilcox		dev->queues[0]->q_db = dev->dbs;
1868f1938f6e1ee1583c87ec74dc406fdd8694e99ac8Matthew Wilcox	}
1869f1938f6e1ee1583c87ec74dc406fdd8694e99ac8Matthew Wilcox
18709d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch	/* Deregister the admin queue's interrupt */
18719d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch	free_irq(dev->entry[0].vector, dev->queues[0]);
18729d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch
1873063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	vecs = nr_io_queues;
1874063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	for (i = 0; i < vecs; i++)
18751b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox		dev->entry[i].entry = i;
18761b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	for (;;) {
1877063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox		result = pci_enable_msix(pdev, dev->entry, vecs);
1878063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox		if (result <= 0)
18791b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox			break;
1880063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox		vecs = result;
18811b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	}
18821b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox
1883063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	if (result < 0) {
1884063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox		vecs = nr_io_queues;
1885063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox		if (vecs > 32)
1886063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox			vecs = 32;
1887fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula		for (;;) {
1888063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox			result = pci_enable_msi_block(pdev, vecs);
1889fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula			if (result == 0) {
1890063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox				for (i = 0; i < vecs; i++)
1891fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula					dev->entry[i].vector = i + pdev->irq;
1892fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula				break;
1893063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox			} else if (result < 0) {
1894063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox				vecs = 1;
1895fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula				break;
1896fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula			}
1897063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox			vecs = result;
1898fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula		}
1899fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula	}
1900fa08a396647767abd24a9e7015cb177121d0cf15Ramachandra Rao Gajula
1901063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	/*
1902063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	 * Should investigate if there's a performance win from allocating
1903063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	 * more queues than interrupt vectors; it might allow the submission
1904063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	 * path to scale better, even if the receive path is limited by the
1905063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	 * number of interrupts.
1906063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	 */
1907063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox	nr_io_queues = vecs;
1908063a8096f3dbca7521d5918b3aea7ab46c5d2fe9Matthew Wilcox
19091b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	result = queue_request_irq(dev, dev->queues[0], "nvme admin");
19109d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch	if (result) {
19119d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch		dev->queues[0]->q_suspended = 1;
1912224042742582c9938788b81165180c876e997a07Keith Busch		goto free_queues;
19139d713c2bfb5e1d6abb18a8b12293631f9fcdc708Keith Busch	}
19141b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox
1915cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	/* Free previously allocated queues that are no longer usable */
1916cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	spin_lock(&dev_list_lock);
1917cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	for (i = dev->queue_count - 1; i > nr_io_queues; i--) {
1918cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		struct nvme_queue *nvmeq = dev->queues[i];
1919cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
19200a8d44cb33377969337fa6c1961b631605d5f453Matthew Wilcox		spin_lock_irq(&nvmeq->q_lock);
1921cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		nvme_cancel_ios(nvmeq, false);
19220a8d44cb33377969337fa6c1961b631605d5f453Matthew Wilcox		spin_unlock_irq(&nvmeq->q_lock);
1923cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
1924cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		nvme_free_queue(nvmeq);
1925cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		dev->queue_count--;
1926cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		dev->queues[i] = NULL;
1927cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	}
1928cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	spin_unlock(&dev_list_lock);
1929cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
19301b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	cpu = cpumask_first(cpu_online_mask);
1931b348b7d54368c87811907a8e88f0d96713c43009Matthew Wilcox	for (i = 0; i < nr_io_queues; i++) {
19321b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox		irq_set_affinity_hint(dev->entry[i].vector, get_cpu_mask(cpu));
19331b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox		cpu = cpumask_next(cpu, cpu_online_mask);
19341b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	}
19351b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox
1936a0cadb85b8b758608ae0759151e29de7581c6731Keith Busch	q_depth = min_t(int, NVME_CAP_MQES(readq(&dev->bar->cap)) + 1,
1937a0cadb85b8b758608ae0759151e29de7581c6731Keith Busch								NVME_Q_DEPTH);
1938cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	for (i = dev->queue_count - 1; i < nr_io_queues; i++) {
1939224042742582c9938788b81165180c876e997a07Keith Busch		dev->queues[i + 1] = nvme_alloc_queue(dev, i + 1, q_depth, i);
1940224042742582c9938788b81165180c876e997a07Keith Busch		if (!dev->queues[i + 1]) {
1941224042742582c9938788b81165180c876e997a07Keith Busch			result = -ENOMEM;
1942224042742582c9938788b81165180c876e997a07Keith Busch			goto free_queues;
1943224042742582c9938788b81165180c876e997a07Keith Busch		}
19441b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	}
1945b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
19469ecdc946212f7cd592986b2c519b470404caa6b8Matthew Wilcox	for (; i < num_possible_cpus(); i++) {
19479ecdc946212f7cd592986b2c519b470404caa6b8Matthew Wilcox		int target = i % rounddown_pow_of_two(dev->queue_count - 1);
19489ecdc946212f7cd592986b2c519b470404caa6b8Matthew Wilcox		dev->queues[i + 1] = dev->queues[target + 1];
19499ecdc946212f7cd592986b2c519b470404caa6b8Matthew Wilcox	}
19509ecdc946212f7cd592986b2c519b470404caa6b8Matthew Wilcox
1951224042742582c9938788b81165180c876e997a07Keith Busch	for (i = 1; i < dev->queue_count; i++) {
1952224042742582c9938788b81165180c876e997a07Keith Busch		result = nvme_create_queue(dev->queues[i], i);
1953224042742582c9938788b81165180c876e997a07Keith Busch		if (result) {
1954224042742582c9938788b81165180c876e997a07Keith Busch			for (--i; i > 0; i--)
1955224042742582c9938788b81165180c876e997a07Keith Busch				nvme_disable_queue(dev, i);
1956224042742582c9938788b81165180c876e997a07Keith Busch			goto free_queues;
1957224042742582c9938788b81165180c876e997a07Keith Busch		}
1958224042742582c9938788b81165180c876e997a07Keith Busch	}
1959b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1960224042742582c9938788b81165180c876e997a07Keith Busch	return 0;
1961b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1962224042742582c9938788b81165180c876e997a07Keith Busch free_queues:
1963224042742582c9938788b81165180c876e997a07Keith Busch	nvme_free_queues(dev);
1964224042742582c9938788b81165180c876e997a07Keith Busch	return result;
1965b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
1966b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1967422ef0c7c81934c3344e1623d2dcfda5fa2fab8dMatthew Wilcox/*
1968422ef0c7c81934c3344e1623d2dcfda5fa2fab8dMatthew Wilcox * Return: error value if an error occurred setting up the queues or calling
1969422ef0c7c81934c3344e1623d2dcfda5fa2fab8dMatthew Wilcox * Identify Device.  0 if these succeeded, even if adding some of the
1970422ef0c7c81934c3344e1623d2dcfda5fa2fab8dMatthew Wilcox * namespaces failed.  At the moment, these failures are silent.  TBD which
1971422ef0c7c81934c3344e1623d2dcfda5fa2fab8dMatthew Wilcox * failures should be reported.
1972422ef0c7c81934c3344e1623d2dcfda5fa2fab8dMatthew Wilcox */
19738d85fce77edfc22f1d6dbf78e3af723b4b556f3dGreg Kroah-Hartmanstatic int nvme_dev_add(struct nvme_dev *dev)
1974b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
197568608c268bf265b039daeaafee6c902dfef32024Matthew Wilcox	struct pci_dev *pdev = dev->pci_dev;
1976c3bfe7176c035a0a2c70bc79180fb13a6c57142aMatthew Wilcox	int res;
1977c3bfe7176c035a0a2c70bc79180fb13a6c57142aMatthew Wilcox	unsigned nn, i;
1978cbb6218fd4ae8f98ddf0d66f0826a7a3a9c88298Keith Busch	struct nvme_ns *ns;
197951814232ecae90f888c902e252306df8d017f0ddMatthew Wilcox	struct nvme_id_ctrl *ctrl;
1980bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	struct nvme_id_ns *id_ns;
1981bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	void *mem;
1982b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dma_addr_t dma_addr;
1983159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch	int shift = NVME_CAP_MPSMIN(readq(&dev->bar->cap)) + 12;
1984b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
198568608c268bf265b039daeaafee6c902dfef32024Matthew Wilcox	mem = dma_alloc_coherent(&pdev->dev, 8192, &dma_addr, GFP_KERNEL);
1986a9ef4343afbe67a6abf83c0f0294e80db48e513aKeith Busch	if (!mem)
1987a9ef4343afbe67a6abf83c0f0294e80db48e513aKeith Busch		return -ENOMEM;
1988b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1989bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	res = nvme_identify(dev, 0, 1, dma_addr);
1990b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (res) {
1991b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		res = -EIO;
1992cbb6218fd4ae8f98ddf0d66f0826a7a3a9c88298Keith Busch		goto out;
1993b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
1994b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
1995bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	ctrl = mem;
199651814232ecae90f888c902e252306df8d017f0ddMatthew Wilcox	nn = le32_to_cpup(&ctrl->nn);
19970e5e4f0e56aca0df1d5648db0be9028bd573b25cKeith Busch	dev->oncs = le16_to_cpup(&ctrl->oncs);
1998c30341dc3c436cf43508cd44cdfbb3810c38c195Keith Busch	dev->abort_limit = ctrl->acl + 1;
199951814232ecae90f888c902e252306df8d017f0ddMatthew Wilcox	memcpy(dev->serial, ctrl->sn, sizeof(ctrl->sn));
200051814232ecae90f888c902e252306df8d017f0ddMatthew Wilcox	memcpy(dev->model, ctrl->mn, sizeof(ctrl->mn));
200151814232ecae90f888c902e252306df8d017f0ddMatthew Wilcox	memcpy(dev->firmware_rev, ctrl->fr, sizeof(ctrl->fr));
2002159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch	if (ctrl->mdts)
20038fc23e032debd682f5ba9fc524a5846c10d2c522Keith Busch		dev->max_hw_sectors = 1 << (ctrl->mdts + shift - 9);
200468608c268bf265b039daeaafee6c902dfef32024Matthew Wilcox	if ((pdev->vendor == PCI_VENDOR_ID_INTEL) &&
200568608c268bf265b039daeaafee6c902dfef32024Matthew Wilcox			(pdev->device == 0x0953) && ctrl->vs[3])
2006159b67d7aefe3902df91075be5d80943c1570aa8Keith Busch		dev->stripe_size = 1 << (ctrl->vs[3] + shift);
2007b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2008bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox	id_ns = mem;
20092b2c1896871838cdf549442e8ad0264be5fa74e3Matthew Wilcox	for (i = 1; i <= nn; i++) {
2010bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox		res = nvme_identify(dev, i, 0, dma_addr);
2011b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		if (res)
2012b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			continue;
2013b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2014bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox		if (id_ns->ncap == 0)
2015b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			continue;
2016b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2017bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox		res = nvme_get_features(dev, NVME_FEAT_LBA_RANGE, i,
201808df1e05657fc6712e520e7c09cc6c86160ceb35Keith Busch							dma_addr + 4096, NULL);
2019b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		if (res)
2020122090366d1d5c6ec1bfb6dfdb3a6d121ff074aaKeith Busch			memset(mem + 4096, 0, 4096);
2021b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2022bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox		ns = nvme_alloc_ns(dev, i, mem, mem + 4096);
2023b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		if (ns)
2024b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox			list_add_tail(&ns->list, &dev->namespaces);
2025b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
2026b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	list_for_each_entry(ns, &dev->namespaces, list)
2027b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		add_disk(ns->disk);
2028422ef0c7c81934c3344e1623d2dcfda5fa2fab8dMatthew Wilcox	res = 0;
2029b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2030bc5fc7e4b22ca855902aba02b28c96f09b446407Matthew Wilcox out:
2031684f5c2025b067a23722e620d0b3b858d8dc5d01Matthew Wilcox	dma_free_coherent(&dev->pci_dev->dev, 8192, mem, dma_addr);
2032b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return res;
2033b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2034b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
20350877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Buschstatic int nvme_dev_map(struct nvme_dev *dev)
20360877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch{
20370877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	int bars, result = -ENOMEM;
20380877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	struct pci_dev *pdev = dev->pci_dev;
20390877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20400877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	if (pci_enable_device_mem(pdev))
20410877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		return result;
20420877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20430877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	dev->entry[0].vector = pdev->irq;
20440877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	pci_set_master(pdev);
20450877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	bars = pci_select_bars(pdev, IORESOURCE_MEM);
20460877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	if (pci_request_selected_regions(pdev, bars, "nvme"))
20470877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		goto disable_pci;
20480877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
2049052d0efada8ccfccd924059b75f5fb119cd10f9aRussell King	if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) &&
2050052d0efada8ccfccd924059b75f5fb119cd10f9aRussell King	    dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
2051052d0efada8ccfccd924059b75f5fb119cd10f9aRussell King		goto disable;
20520877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20530877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	dev->bar = ioremap(pci_resource_start(pdev, 0), 8192);
20540877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	if (!dev->bar)
20550877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		goto disable;
20560e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch	if (readl(&dev->bar->csts) == -1) {
20570e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch		result = -ENODEV;
20580e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch		goto unmap;
20590e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch	}
2060b80d5ccca3a012e91ca64a2a0b13049163a6a698Haiyan Hu	dev->db_stride = 1 << NVME_CAP_STRIDE(readq(&dev->bar->cap));
20610877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	dev->dbs = ((void __iomem *)dev->bar) + 4096;
20620877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20630877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	return 0;
20640877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20650e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch unmap:
20660e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch	iounmap(dev->bar);
20670e53d18051725da46cbccfb7874a6422d4d4f274Keith Busch	dev->bar = NULL;
20680877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch disable:
20690877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	pci_release_regions(pdev);
20700877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch disable_pci:
20710877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	pci_disable_device(pdev);
20720877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	return result;
20730877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch}
20740877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20750877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Buschstatic void nvme_dev_unmap(struct nvme_dev *dev)
20760877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch{
20770877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	if (dev->pci_dev->msi_enabled)
20780877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		pci_disable_msi(dev->pci_dev);
20790877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	else if (dev->pci_dev->msix_enabled)
20800877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		pci_disable_msix(dev->pci_dev);
20810877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20820877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	if (dev->bar) {
20830877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		iounmap(dev->bar);
20840877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		dev->bar = NULL;
20859a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		pci_release_regions(dev->pci_dev);
20860877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	}
20870877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
20880877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	if (pci_is_enabled(dev->pci_dev))
20890877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		pci_disable_device(dev->pci_dev);
20900877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch}
20910877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch
2092f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Buschstatic void nvme_dev_shutdown(struct nvme_dev *dev)
2093b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
2094224042742582c9938788b81165180c876e997a07Keith Busch	int i;
2095224042742582c9938788b81165180c876e997a07Keith Busch
2096d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch	dev->initialized = 0;
2097224042742582c9938788b81165180c876e997a07Keith Busch	for (i = dev->queue_count - 1; i >= 0; i--)
2098224042742582c9938788b81165180c876e997a07Keith Busch		nvme_disable_queue(dev, i);
2099b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
21001fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	spin_lock(&dev_list_lock);
2101f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	list_del_init(&dev->node);
21021fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	spin_unlock(&dev_list_lock);
21031fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox
21041894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch	if (dev->bar)
21051894d8f16afe5ad54b732f0fa6c4e80bd4d40b91Keith Busch		nvme_shutdown_ctrl(dev);
2106f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	nvme_dev_unmap(dev);
2107f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch}
2108f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2109f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Buschstatic void nvme_dev_remove(struct nvme_dev *dev)
2110f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch{
2111f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	struct nvme_ns *ns, *next;
2112f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2113b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	list_for_each_entry_safe(ns, next, &dev->namespaces, list) {
2114b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		list_del(&ns->list);
2115b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		del_gendisk(ns->disk);
2116b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		nvme_ns_free(ns);
2117b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	}
2118b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2119b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2120091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcoxstatic int nvme_setup_prp_pools(struct nvme_dev *dev)
2121091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox{
2122091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	struct device *dmadev = &dev->pci_dev->dev;
2123091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	dev->prp_page_pool = dma_pool_create("prp list page", dmadev,
2124091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox						PAGE_SIZE, PAGE_SIZE, 0);
2125091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	if (!dev->prp_page_pool)
2126091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox		return -ENOMEM;
2127091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox
212899802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	/* Optimisation for I/Os between 4k and 128k */
212999802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	dev->prp_small_pool = dma_pool_create("prp list 256", dmadev,
213099802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox						256, 256, 0);
213199802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	if (!dev->prp_small_pool) {
213299802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox		dma_pool_destroy(dev->prp_page_pool);
213399802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox		return -ENOMEM;
213499802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	}
2135091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	return 0;
2136091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox}
2137091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox
2138091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcoxstatic void nvme_release_prp_pools(struct nvme_dev *dev)
2139091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox{
2140091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	dma_pool_destroy(dev->prp_page_pool);
214199802a7aee2b3dd720e382c52b892cc6a8122b11Matthew Wilcox	dma_pool_destroy(dev->prp_small_pool);
2142091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox}
2143091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox
2144cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anhstatic DEFINE_IDA(nvme_instance_ida);
2145cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh
2146cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anhstatic int nvme_set_instance(struct nvme_dev *dev)
2147b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
2148cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	int instance, error;
2149cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh
2150cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	do {
2151cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh		if (!ida_pre_get(&nvme_instance_ida, GFP_KERNEL))
2152cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh			return -ENODEV;
2153cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh
2154cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh		spin_lock(&dev_list_lock);
2155cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh		error = ida_get_new(&nvme_instance_ida, &instance);
2156cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh		spin_unlock(&dev_list_lock);
2157cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	} while (error == -EAGAIN);
2158cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh
2159cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	if (error)
2160cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh		return -ENODEV;
2161cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh
2162cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	dev->instance = instance;
2163cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	return 0;
2164b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2165b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2166b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic void nvme_release_instance(struct nvme_dev *dev)
2167b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
2168cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	spin_lock(&dev_list_lock);
2169cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	ida_remove(&nvme_instance_ida, dev->instance);
2170cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	spin_unlock(&dev_list_lock);
2171b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2172b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
21735e82e952f04681c10f35e02ee0a4a43ec027137aKeith Buschstatic void nvme_free_dev(struct kref *kref)
21745e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch{
21755e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	struct nvme_dev *dev = container_of(kref, struct nvme_dev, kref);
21765e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	kfree(dev->queues);
21775e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	kfree(dev->entry);
21785e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	kfree(dev);
21795e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch}
21805e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch
21815e82e952f04681c10f35e02ee0a4a43ec027137aKeith Buschstatic int nvme_dev_open(struct inode *inode, struct file *f)
21825e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch{
21835e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	struct nvme_dev *dev = container_of(f->private_data, struct nvme_dev,
21845e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch								miscdev);
21855e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	kref_get(&dev->kref);
21865e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	f->private_data = dev;
21875e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	return 0;
21885e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch}
21895e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch
21905e82e952f04681c10f35e02ee0a4a43ec027137aKeith Buschstatic int nvme_dev_release(struct inode *inode, struct file *f)
21915e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch{
21925e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	struct nvme_dev *dev = f->private_data;
21935e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	kref_put(&dev->kref, nvme_free_dev);
21945e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	return 0;
21955e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch}
21965e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch
21975e82e952f04681c10f35e02ee0a4a43ec027137aKeith Buschstatic long nvme_dev_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
21985e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch{
21995e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	struct nvme_dev *dev = f->private_data;
22005e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	switch (cmd) {
22015e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	case NVME_IOCTL_ADMIN_CMD:
22025e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch		return nvme_user_admin_cmd(dev, (void __user *)arg);
22035e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	default:
22045e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch		return -ENOTTY;
22055e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	}
22065e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch}
22075e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch
22085e82e952f04681c10f35e02ee0a4a43ec027137aKeith Buschstatic const struct file_operations nvme_dev_fops = {
22095e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	.owner		= THIS_MODULE,
22105e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	.open		= nvme_dev_open,
22115e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	.release	= nvme_dev_release,
22125e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	.unlocked_ioctl	= nvme_dev_ioctl,
22135e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	.compat_ioctl	= nvme_dev_ioctl,
22145e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch};
22155e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch
2216f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Buschstatic int nvme_dev_start(struct nvme_dev *dev)
2217f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch{
2218f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	int result;
2219f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2220f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	result = nvme_dev_map(dev);
2221f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	if (result)
2222f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch		return result;
2223f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2224f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	result = nvme_configure_admin_queue(dev);
2225f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	if (result)
2226f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch		goto unmap;
2227f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2228f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	spin_lock(&dev_list_lock);
2229f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	list_add(&dev->node, &dev_list);
2230f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	spin_unlock(&dev_list_lock);
2231f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2232f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	result = nvme_setup_io_queues(dev);
2233d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch	if (result && result != -EBUSY)
2234f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch		goto disable;
2235f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2236d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch	return result;
2237f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
2238f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch disable:
2239f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	spin_lock(&dev_list_lock);
2240f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	list_del_init(&dev->node);
2241f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	spin_unlock(&dev_list_lock);
2242f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch unmap:
2243f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	nvme_dev_unmap(dev);
2244f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	return result;
2245f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch}
2246f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch
22479a6b94584de1a0467d85b435df9c744c5c45a270Keith Buschstatic int nvme_remove_dead_ctrl(void *arg)
22489a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch{
22499a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	struct nvme_dev *dev = (struct nvme_dev *)arg;
22509a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	struct pci_dev *pdev = dev->pci_dev;
22519a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
22529a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	if (pci_get_drvdata(pdev))
22539a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		pci_stop_and_remove_bus_device(pdev);
22549a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	kref_put(&dev->kref, nvme_free_dev);
22559a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	return 0;
22569a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch}
22579a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
22589a6b94584de1a0467d85b435df9c744c5c45a270Keith Buschstatic void nvme_remove_disks(struct work_struct *ws)
22599a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch{
22609a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	int i;
22619a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	struct nvme_dev *dev = container_of(ws, struct nvme_dev, reset_work);
22629a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
22639a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_dev_remove(dev);
22649a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	spin_lock(&dev_list_lock);
22659a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	for (i = dev->queue_count - 1; i > 0; i--) {
22669a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		BUG_ON(!dev->queues[i] || !dev->queues[i]->q_suspended);
22679a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		nvme_free_queue(dev->queues[i]);
22689a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		dev->queue_count--;
22699a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		dev->queues[i] = NULL;
22709a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	}
22719a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	spin_unlock(&dev_list_lock);
22729a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch}
22739a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
22749a6b94584de1a0467d85b435df9c744c5c45a270Keith Buschstatic int nvme_dev_resume(struct nvme_dev *dev)
22759a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch{
22769a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	int ret;
22779a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
22789a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	ret = nvme_dev_start(dev);
22799a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	if (ret && ret != -EBUSY)
22809a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		return ret;
22819a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	if (ret == -EBUSY) {
22829a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		spin_lock(&dev_list_lock);
22839a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		INIT_WORK(&dev->reset_work, nvme_remove_disks);
22849a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		queue_work(nvme_workq, &dev->reset_work);
22859a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		spin_unlock(&dev_list_lock);
22869a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	}
2287d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch	dev->initialized = 1;
22889a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	return 0;
22899a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch}
22909a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
22919a6b94584de1a0467d85b435df9c744c5c45a270Keith Buschstatic void nvme_dev_reset(struct nvme_dev *dev)
22929a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch{
22939a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_dev_shutdown(dev);
22949a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	if (nvme_dev_resume(dev)) {
22959a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		dev_err(&dev->pci_dev->dev, "Device failed to resume\n");
22969a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		kref_get(&dev->kref);
22979a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		if (IS_ERR(kthread_run(nvme_remove_dead_ctrl, dev, "nvme%d",
22989a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch							dev->instance))) {
22999a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch			dev_err(&dev->pci_dev->dev,
23009a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch				"Failed to start controller remove task\n");
23019a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch			kref_put(&dev->kref, nvme_free_dev);
23029a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		}
23039a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	}
23049a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch}
23059a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
23069a6b94584de1a0467d85b435df9c744c5c45a270Keith Buschstatic void nvme_reset_failed_dev(struct work_struct *ws)
23079a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch{
23089a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	struct nvme_dev *dev = container_of(ws, struct nvme_dev, reset_work);
23099a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_dev_reset(dev);
23109a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch}
23119a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
23128d85fce77edfc22f1d6dbf78e3af723b4b556f3dGreg Kroah-Hartmanstatic int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2313b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
23140877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	int result = -ENOMEM;
2315b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_dev *dev;
2316b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2317b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
2318b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!dev)
2319b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		return -ENOMEM;
2320b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dev->entry = kcalloc(num_possible_cpus(), sizeof(*dev->entry),
2321b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox								GFP_KERNEL);
2322b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!dev->entry)
2323b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto free;
23241b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox	dev->queues = kcalloc(num_possible_cpus() + 1, sizeof(void *),
23251b23484bd012c078de2ea939249e2fb2e85a0a6eMatthew Wilcox								GFP_KERNEL);
2326b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	if (!dev->queues)
2327b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox		goto free;
2328b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2329b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	INIT_LIST_HEAD(&dev->namespaces);
2330b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	dev->pci_dev = pdev;
23319a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	pci_set_drvdata(pdev, dev);
2332cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	result = nvme_set_instance(dev);
2333cd58ad7d188c643cf572b038909c2f7dd96fdafeQuoc-Son Anh	if (result)
23340877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		goto free;
2335b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2336091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	result = nvme_setup_prp_pools(dev);
2337091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	if (result)
23380877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		goto release;
2339091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox
2340f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	result = nvme_dev_start(dev);
2341d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch	if (result) {
2342d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch		if (result == -EBUSY)
2343d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch			goto create_cdev;
23440877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch		goto release_pools;
2345d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch	}
2346b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2347740216fc59cba54f65187c9ed92f29bce3cf8778Matthew Wilcox	result = nvme_dev_add(dev);
2348d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch	if (result)
2349f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch		goto shutdown;
2350740216fc59cba54f65187c9ed92f29bce3cf8778Matthew Wilcox
2351d82e8bfdef9afae83b894be49af4644d9ac3c359Keith Busch create_cdev:
23525e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	scnprintf(dev->name, sizeof(dev->name), "nvme%d", dev->instance);
23535e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	dev->miscdev.minor = MISC_DYNAMIC_MINOR;
23545e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	dev->miscdev.parent = &pdev->dev;
23555e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	dev->miscdev.name = dev->name;
23565e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	dev->miscdev.fops = &nvme_dev_fops;
23575e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	result = misc_register(&dev->miscdev);
23585e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	if (result)
23595e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch		goto remove;
23605e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch
2361d4b4ff8e28b474fac0fbfa9cfc40f88b9e41e380Keith Busch	dev->initialized = 1;
23625e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	kref_init(&dev->kref);
2363b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return 0;
2364b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
23655e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch remove:
23665e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	nvme_dev_remove(dev);
2367f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch shutdown:
2368f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	nvme_dev_shutdown(dev);
23690877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch release_pools:
2370f0b50732a979c55c2d15fe8ec4503fa5b3260c53Keith Busch	nvme_free_queues(dev);
2371091b609258b8e01cc45b01a41ca5e496f674d989Matthew Wilcox	nvme_release_prp_pools(dev);
23720877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch release:
23730877cb0d285c7f1d53d0b84b360bdea4be4f3f59Keith Busch	nvme_release_instance(dev);
2374b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox free:
2375b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	kfree(dev->queues);
2376b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	kfree(dev->entry);
2377b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	kfree(dev);
2378b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return result;
2379b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2380b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
23818d85fce77edfc22f1d6dbf78e3af723b4b556f3dGreg Kroah-Hartmanstatic void nvme_remove(struct pci_dev *pdev)
2382b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
2383b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	struct nvme_dev *dev = pci_get_drvdata(pdev);
23849a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
23859a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	spin_lock(&dev_list_lock);
23869a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	list_del_init(&dev->node);
23879a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	spin_unlock(&dev_list_lock);
23889a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
23899a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	pci_set_drvdata(pdev, NULL);
23909a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	flush_work(&dev->reset_work);
23915e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	misc_deregister(&dev->miscdev);
23929a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_dev_remove(dev);
23939a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_dev_shutdown(dev);
23949a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_free_queues(dev);
23959a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_release_instance(dev);
23969a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_release_prp_pools(dev);
23975e82e952f04681c10f35e02ee0a4a43ec027137aKeith Busch	kref_put(&dev->kref, nvme_free_dev);
2398b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2399b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2400b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/* These functions are yet to be implemented */
2401b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define nvme_error_detected NULL
2402b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define nvme_dump_registers NULL
2403b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define nvme_link_reset NULL
2404b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define nvme_slot_reset NULL
2405b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define nvme_error_resume NULL
2406cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
2407cd63894630ab17a192bf97427d16dbec10710a6aKeith Buschstatic int nvme_suspend(struct device *dev)
2408cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch{
2409cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	struct pci_dev *pdev = to_pci_dev(dev);
2410cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	struct nvme_dev *ndev = pci_get_drvdata(pdev);
2411cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
2412cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	nvme_dev_shutdown(ndev);
2413cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	return 0;
2414cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch}
2415cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
2416cd63894630ab17a192bf97427d16dbec10710a6aKeith Buschstatic int nvme_resume(struct device *dev)
2417cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch{
2418cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	struct pci_dev *pdev = to_pci_dev(dev);
2419cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	struct nvme_dev *ndev = pci_get_drvdata(pdev);
2420cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
24219a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	if (nvme_dev_resume(ndev) && !work_busy(&ndev->reset_work)) {
24229a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		INIT_WORK(&ndev->reset_work, nvme_reset_failed_dev);
24239a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		queue_work(nvme_workq, &ndev->reset_work);
24249a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	}
24259a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	return 0;
2426cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch}
2427cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch
2428cd63894630ab17a192bf97427d16dbec10710a6aKeith Buschstatic SIMPLE_DEV_PM_OPS(nvme_dev_pm_ops, nvme_suspend, nvme_resume);
2429b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
24301d3520357df99baf4ad89f86268ac96cd38092d9Stephen Hemmingerstatic const struct pci_error_handlers nvme_err_handler = {
2431b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.error_detected	= nvme_error_detected,
2432b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.mmio_enabled	= nvme_dump_registers,
2433b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.link_reset	= nvme_link_reset,
2434b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.slot_reset	= nvme_slot_reset,
2435b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.resume		= nvme_error_resume,
2436b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox};
2437b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2438b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox/* Move to pci_ids.h later */
2439b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox#define PCI_CLASS_STORAGE_EXPRESS	0x010802
2440b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2441b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic DEFINE_PCI_DEVICE_TABLE(nvme_id_table) = {
2442b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) },
2443b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	{ 0, }
2444b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox};
2445b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew WilcoxMODULE_DEVICE_TABLE(pci, nvme_id_table);
2446b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2447b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic struct pci_driver nvme_driver = {
2448b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.name		= "nvme",
2449b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.id_table	= nvme_id_table,
2450b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.probe		= nvme_probe,
24518d85fce77edfc22f1d6dbf78e3af723b4b556f3dGreg Kroah-Hartman	.remove		= nvme_remove,
2452cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	.driver		= {
2453cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch		.pm	= &nvme_dev_pm_ops,
2454cd63894630ab17a192bf97427d16dbec10710a6aKeith Busch	},
2455b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	.err_handler	= &nvme_err_handler,
2456b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox};
2457b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2458b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic int __init nvme_init(void)
2459b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
24600ac13140d796eb1e2f8956aea97a6e5e4ebcf981Matthew Wilcox	int result;
24611fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox
24621fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	nvme_thread = kthread_run(nvme_kthread, NULL, "nvme");
24631fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	if (IS_ERR(nvme_thread))
24641fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		return PTR_ERR(nvme_thread);
2465b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
24669a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	result = -ENOMEM;
24679a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	nvme_workq = create_singlethread_workqueue("nvme");
24689a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	if (!nvme_workq)
24699a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		goto kill_kthread;
24709a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch
24715c42ea1643a630060f9e71e06d3933d244970967Keith Busch	result = register_blkdev(nvme_major, "nvme");
24725c42ea1643a630060f9e71e06d3933d244970967Keith Busch	if (result < 0)
24739a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch		goto kill_workq;
24745c42ea1643a630060f9e71e06d3933d244970967Keith Busch	else if (result > 0)
24750ac13140d796eb1e2f8956aea97a6e5e4ebcf981Matthew Wilcox		nvme_major = result;
2476b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2477b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	result = pci_register_driver(&nvme_driver);
24781fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	if (result)
24791fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox		goto unregister_blkdev;
24801fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	return 0;
2481b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
24821fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox unregister_blkdev:
2483b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	unregister_blkdev(nvme_major, "nvme");
24849a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch kill_workq:
24859a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	destroy_workqueue(nvme_workq);
24861fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox kill_kthread:
24871fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	kthread_stop(nvme_thread);
2488b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	return result;
2489b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2490b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2491b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxstatic void __exit nvme_exit(void)
2492b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox{
2493b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	pci_unregister_driver(&nvme_driver);
2494b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox	unregister_blkdev(nvme_major, "nvme");
24959a6b94584de1a0467d85b435df9c744c5c45a270Keith Busch	destroy_workqueue(nvme_workq);
24961fa6aeadf18aeebd7a217d7a3a933856448375b6Matthew Wilcox	kthread_stop(nvme_thread);
2497b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox}
2498b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcox
2499b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew WilcoxMODULE_AUTHOR("Matthew Wilcox <willy@linux.intel.com>");
2500b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew WilcoxMODULE_LICENSE("GPL");
2501366e8217e5ec6ce9f73aec19c46d983110fb4a98Matthew WilcoxMODULE_VERSION("0.8");
2502b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxmodule_init(nvme_init);
2503b60503ba432b16fc84442a84e29a7aad2c0c363dMatthew Wilcoxmodule_exit(nvme_exit);
2504