NVMe: Change nvme_enable_ctrl to set EN and manage CC thru ctrl_config.
authorDan McLeran <daniel.mcleran@intel.com>
Mon, 23 Jun 2014 14:24:36 +0000 (08:24 -0600)
committerJens Axboe <axboe@fb.com>
Tue, 4 Nov 2014 20:17:07 +0000 (13:17 -0700)
Change the behavior of nvme_enable_ctrl to set EN.
Clear CC.SH for both nvme_enable_ctrl and nvme_disable_ctrl.
Remove reading of the CC register and manage the state in
dev->ctrl_config.

Signed-off-by: Dan McLeran <daniel.mcleran@intel.com>
[removed an unwanted write to CC]
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/nvme-core.c

index e60bb0fec7e3d7dbc529589519f4d048623c3e78..0a98de813a1237f8e7c4c8866c6122b836d35b3b 100644 (file)
@@ -1422,25 +1422,30 @@ static int nvme_wait_ready(struct nvme_dev *dev, u64 cap, bool enabled)
  */
 static int nvme_disable_ctrl(struct nvme_dev *dev, u64 cap)
 {
-       u32 cc = readl(&dev->bar->cc);
+       dev->ctrl_config &= ~NVME_CC_SHN_MASK;
+       dev->ctrl_config &= ~NVME_CC_ENABLE;
+       writel(dev->ctrl_config, &dev->bar->cc);
 
-       if (cc & NVME_CC_ENABLE)
-               writel(cc & ~NVME_CC_ENABLE, &dev->bar->cc);
        return nvme_wait_ready(dev, cap, false);
 }
 
 static int nvme_enable_ctrl(struct nvme_dev *dev, u64 cap)
 {
+       dev->ctrl_config &= ~NVME_CC_SHN_MASK;
+       dev->ctrl_config |= NVME_CC_ENABLE;
+       writel(dev->ctrl_config, &dev->bar->cc);
+
        return nvme_wait_ready(dev, cap, true);
 }
 
 static int nvme_shutdown_ctrl(struct nvme_dev *dev)
 {
        unsigned long timeout;
-       u32 cc;
 
-       cc = (readl(&dev->bar->cc) & ~NVME_CC_SHN_MASK) | NVME_CC_SHN_NORMAL;
-       writel(cc, &dev->bar->cc);
+       dev->ctrl_config &= ~NVME_CC_SHN_MASK;
+       dev->ctrl_config |= NVME_CC_SHN_NORMAL;
+
+       writel(dev->ctrl_config, &dev->bar->cc);
 
        timeout = 2 * HZ + jiffies;
        while ((readl(&dev->bar->csts) & NVME_CSTS_SHST_MASK) !=
@@ -1499,7 +1504,7 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
 
        dev->page_size = 1 << page_shift;
 
-       dev->ctrl_config = NVME_CC_ENABLE | NVME_CC_CSS_NVM;
+       dev->ctrl_config = NVME_CC_CSS_NVM;
        dev->ctrl_config |= (page_shift - 12) << NVME_CC_MPS_SHIFT;
        dev->ctrl_config |= NVME_CC_ARB_RR | NVME_CC_SHN_NONE;
        dev->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES;
@@ -1507,7 +1512,6 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
        writel(aqa, &dev->bar->aqa);
        writeq(nvmeq->sq_dma_addr, &dev->bar->asq);
        writeq(nvmeq->cq_dma_addr, &dev->bar->acq);
-       writel(dev->ctrl_config, &dev->bar->cc);
 
        result = nvme_enable_ctrl(dev, cap);
        if (result)