diff options
author | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2011-02-16 14:59:59 (GMT) |
---|---|---|
committer | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2011-11-04 19:52:58 (GMT) |
commit | 7547881d0951384f9833ec3a80fac8f3f16f3b98 (patch) | |
tree | 44efc578c7caf46df606aaed2dc117f94ee93af9 /drivers/block/nvme.c | |
parent | 740216fc59cba54f65187c9ed92f29bce3cf8778 (diff) | |
download | linux-fsl-qoriq-7547881d0951384f9833ec3a80fac8f3f16f3b98.tar.xz |
NVMe: Correct SQ doorbell semantics
The value written to the doorbell needs to be the first free index in
the queue, not the most recently used index in the queue.
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Diffstat (limited to 'drivers/block/nvme.c')
-rw-r--r-- | drivers/block/nvme.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c index df1d8bd..af45e28 100644 --- a/drivers/block/nvme.c +++ b/drivers/block/nvme.c @@ -246,9 +246,9 @@ static int nvme_submit_cmd(struct nvme_queue *nvmeq, struct nvme_command *cmd) spin_lock_irqsave(&nvmeq->q_lock, flags); tail = nvmeq->sq_tail; memcpy(&nvmeq->sq_cmds[tail], cmd, sizeof(*cmd)); - writel(tail, nvmeq->q_db); if (++tail == nvmeq->q_depth) tail = 0; + writel(tail, nvmeq->q_db); nvmeq->sq_tail = tail; spin_unlock_irqrestore(&nvmeq->q_lock, flags); @@ -471,9 +471,9 @@ static int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns, cmnd->rw.control = cpu_to_le16(control); cmnd->rw.dsmgmt = cpu_to_le32(dsmgmt); - writel(nvmeq->sq_tail, nvmeq->q_db); if (++nvmeq->sq_tail == nvmeq->q_depth) nvmeq->sq_tail = 0; + writel(nvmeq->sq_tail, nvmeq->q_db); return 0; |