[PATCH] NVMe: Change nvme_enable_ctrl to set CC.EN and stop tracking CC in nvme_dev

Dan McLeran daniel.mcleran at intel.com
Mon Jun 23 04:00:46 PDT 2014


I took another crack at changing nvme_enable_ctrl so that it sets
CC.EN. nvme_enable_ctrl and nvme_disable_ctrl ensure that CC.SH
is cleared before setting/clearing CC.EN. I have also removed ctrl_config
from struct nvme_dev. We don't need to track the state of CC in software.

Signed-off-by: Dan McLeran <daniel.mcleran at intel.com>
---
 drivers/block/nvme-core.c |   27 +++++++++++++++++++--------
 include/linux/nvme.h      |    1 -
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c
index 02351e2..87c3b9a 100644
--- a/drivers/block/nvme-core.c
+++ b/drivers/block/nvme-core.c
@@ -1408,15 +1408,25 @@ 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);
+	u32 cc = (readl(&dev->bar->cc) & ~NVME_CC_SHN_MASK);
+
+	if (cc & NVME_CC_ENABLE) {
+		cc &= ~NVME_CC_ENABLE;
+		writel(cc, &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)
 {
+	u32 cc = (readl(&dev->bar->cc) & ~NVME_CC_SHN_MASK);
+
+	if (!(cc & NVME_CC_ENABLE)) {
+		cc |= NVME_CC_ENABLE;
+		writel(cc, &dev->bar->cc);
+	}
+
 	return nvme_wait_ready(dev, cap, true);
 }
 
@@ -1448,6 +1458,7 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
 {
 	int result;
 	u32 aqa;
+	u32 cc;
 	u64 cap = readq(&dev->bar->cap);
 	struct nvme_queue *nvmeq;
 
@@ -1465,15 +1476,15 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
 	aqa = nvmeq->q_depth - 1;
 	aqa |= aqa << 16;
 
-	dev->ctrl_config = NVME_CC_ENABLE | 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;
+	cc = NVME_CC_CSS_NVM;
+	cc |= (PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT;
+	cc |= NVME_CC_ARB_RR | NVME_CC_SHN_NONE;
+	cc |= NVME_CC_IOSQES | NVME_CC_IOCQES;
 
 	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);
+	writel(cc, &dev->bar->cc);
 
 	result = nvme_enable_ctrl(dev, cap);
 	if (result)
diff --git a/include/linux/nvme.h b/include/linux/nvme.h
index 2bf4031..3d70be5 100644
--- a/include/linux/nvme.h
+++ b/include/linux/nvme.h
@@ -82,7 +82,6 @@ struct nvme_dev {
 	unsigned max_qid;
 	int q_depth;
 	u32 db_stride;
-	u32 ctrl_config;
 	struct msix_entry *entry;
 	struct nvme_bar __iomem *bar;
 	struct list_head namespaces;
-- 
1.7.10.4




More information about the Linux-nvme mailing list