From: Ashok Vairavan Date: Mon, 13 Mar 2017 01:43:27 +0000 (-0700) Subject: Revert "NVMe: Don't unmap controller registers on reset" X-Git-Tag: v4.1.12-102.0.20170601_1400~210 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=de28bd4a8725adfd95c710c91240ed2d4ab54025;p=users%2Fjedix%2Flinux-maple.git Revert "NVMe: Don't unmap controller registers on reset" This reverts commit 75502b9da27d7be3132b9eb3b7da52eae48c3556. --- diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 84e5f70c86f2d..cbe8ad7ff4328 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -2623,10 +2623,10 @@ static int nvme_dev_add(struct nvme_dev *dev) return 0; } -static int nvme_pci_enable(struct nvme_dev *dev) +static int nvme_dev_map(struct nvme_dev *dev) { u64 cap; - int result = -ENOMEM; + int bars, result = -ENOMEM; struct pci_dev *pdev = to_pci_dev(dev->dev); if (pci_enable_device_mem(pdev)) @@ -2634,14 +2634,24 @@ static int nvme_pci_enable(struct nvme_dev *dev) dev->entry[0].vector = pdev->irq; pci_set_master(pdev); + bars = pci_select_bars(pdev, IORESOURCE_MEM); + if (!bars) + goto disable_pci; + + if (pci_request_selected_regions(pdev, bars, "nvme")) + goto disable_pci; if (dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(64)) && dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(32))) goto disable; + dev->bar = ioremap(pci_resource_start(pdev, 0), 8192); + if (!dev->bar) + goto disable; + if (readl(&dev->bar->csts) == -1) { result = -ENODEV; - goto disable; + goto unmap; } /* @@ -2651,7 +2661,7 @@ static int nvme_pci_enable(struct nvme_dev *dev) if (!pdev->irq) { result = pci_enable_msix(pdev, dev->entry, 1); if (result < 0) - goto disable; + goto unmap; } cap = lo_hi_readq(&dev->bar->cap); @@ -2675,19 +2685,17 @@ static int nvme_pci_enable(struct nvme_dev *dev) return 0; + unmap: + iounmap(dev->bar); + dev->bar = NULL; disable: + pci_release_regions(pdev); + disable_pci: pci_disable_device(pdev); return result; } static void nvme_dev_unmap(struct nvme_dev *dev) -{ - if (dev->bar) - iounmap(dev->bar); - pci_release_regions(to_pci_dev(dev->dev)); -} - -static void nvme_pci_disable(struct nvme_dev *dev) { struct pci_dev *pdev = to_pci_dev(dev->dev); @@ -2696,6 +2704,12 @@ static void nvme_pci_disable(struct nvme_dev *dev) else if (pdev->msix_enabled) pci_disable_msix(pdev); + if (dev->bar) { + iounmap(dev->bar); + dev->bar = NULL; + pci_release_regions(pdev); + } + if (pci_is_enabled(pdev)) pci_disable_device(pdev); } @@ -2903,7 +2917,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) nvme_dev_list_remove(dev); - if (pci_is_enabled(to_pci_dev(dev->dev))) { + if (dev->bar) { nvme_freeze_queues(dev); csts = readl(&dev->bar->csts); } @@ -2917,7 +2931,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) nvme_shutdown_ctrl(dev); nvme_disable_queue(dev, 0); } - nvme_pci_disable(dev); + nvme_dev_unmap(dev); for (i = dev->queue_count - 1; i >= 0; i--) nvme_clear_queue(dev->queues[i]); @@ -3099,7 +3113,7 @@ static void nvme_probe_work(struct work_struct *work) bool start_thread = false; int result; - result = nvme_pci_enable(dev); + result = nvme_dev_map(dev); if (result) goto out; @@ -3161,7 +3175,7 @@ static void nvme_probe_work(struct work_struct *work) nvme_disable_queue(dev, 0); nvme_dev_list_remove(dev); unmap: - nvme_pci_disable(dev); + nvme_dev_unmap(dev); out: if (!work_busy(&dev->reset_work)) nvme_dead_ctrl(dev); @@ -3256,27 +3270,6 @@ static ssize_t nvme_sysfs_reset(struct device *dev, } static DEVICE_ATTR(reset_controller, S_IWUSR, NULL, nvme_sysfs_reset); -static int nvme_dev_map(struct nvme_dev *dev) -{ - int bars; - struct pci_dev *pdev = to_pci_dev(dev->dev); - - bars = pci_select_bars(pdev, IORESOURCE_MEM); - if (!bars) - return -ENODEV; - if (pci_request_selected_regions(pdev, bars, "nvme")) - return -ENODEV; - - dev->bar = ioremap(pci_resource_start(pdev, 0), 8192); - if (!dev->bar) - goto release; - - return 0; - release: - pci_release_regions(pdev); - return -ENODEV; -} - static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) { int node, result = -ENOMEM; @@ -3303,10 +3296,6 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) INIT_WORK(&dev->reset_work, nvme_reset_work); dev->dev = get_device(&pdev->dev); pci_set_drvdata(pdev, dev); - result = nvme_dev_map(dev); - if (result) - goto free; - result = nvme_set_instance(dev); if (result) goto put_pci; @@ -3345,7 +3334,6 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) nvme_release_instance(dev); put_pci: put_device(dev->dev); - nvme_dev_unmap(dev); free: kfree(dev->queues); kfree(dev->entry); @@ -3389,7 +3377,6 @@ static void nvme_remove(struct pci_dev *pdev) nvme_free_queues(dev, 0); nvme_release_cmb(dev); nvme_release_prp_pools(dev); - nvme_dev_unmap(dev); kref_put(&dev->kref, nvme_free_dev); }