mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
NVMe: Add nvme subsystem reset support
Controllers part of an NVMe subsystem may be reset by any other controller in the subsystem. If the device is capable of subsystem resets, this patch adds detection for such events and performs appropriate controller initialization upon subsystem reset detection. The register bit is a RW1C type, so the driver needs to write a 1 to the status bit to clear the subsystem reset occured bit during initialization. Signed-off-by: Keith Busch <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
parent
b2b1ec9b55
commit
dfbac8c7ac
2 changed files with 13 additions and 1 deletions
|
|
@ -1735,6 +1735,12 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
|
|||
page_shift = dev_page_max;
|
||||
}
|
||||
|
||||
dev->subsystem = readl(&dev->bar->vs) >= NVME_VS(1, 1) ?
|
||||
NVME_CAP_NSSRC(cap) : 0;
|
||||
|
||||
if (dev->subsystem && (readl(&dev->bar->csts) & NVME_CSTS_NSSRO))
|
||||
writel(NVME_CSTS_NSSRO, &dev->bar->csts);
|
||||
|
||||
result = nvme_disable_ctrl(dev, cap);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
|
@ -2059,7 +2065,10 @@ static int nvme_kthread(void *data)
|
|||
spin_lock(&dev_list_lock);
|
||||
list_for_each_entry_safe(dev, next, &dev_list, node) {
|
||||
int i;
|
||||
if (readl(&dev->bar->csts) & NVME_CSTS_CFS) {
|
||||
u32 csts = readl(&dev->bar->csts);
|
||||
|
||||
if ((dev->subsystem && (csts & NVME_CSTS_NSSRO)) ||
|
||||
csts & NVME_CSTS_CFS) {
|
||||
if (work_busy(&dev->reset_work))
|
||||
continue;
|
||||
list_del_init(&dev->node);
|
||||
|
|
|
|||
Loading…
Reference in a new issue