Commit cb32de1b authored by Mario Limonciello's avatar Mario Limonciello Committed by Jens Axboe

nvme: Add quirk for LiteON CL1 devices running FW 22301111

One of the components in LiteON CL1 device has limitations that
can be encountered based upon boundary race conditions using the
nvme bus specific suspend to idle flow.

When this situation occurs the drive doesn't resume properly from
suspend-to-idle.

LiteON has confirmed this problem and fixed in the next firmware
version.  As this firmware is already in the field, avoid running
nvme specific suspend to idle flow.

Fixes: d916b1be ("nvme-pci: use host managed power state for suspend")
Link: http://lists.infradead.org/pipermail/linux-nvme/2019-July/thread.htmlSigned-off-by: default avatarMario Limonciello <mario.limonciello@dell.com>
Signed-off-by: default avatarCharles Hyde <charles.hyde@dellteam.com>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent a89fcca8
...@@ -2257,6 +2257,16 @@ static const struct nvme_core_quirk_entry core_quirks[] = { ...@@ -2257,6 +2257,16 @@ static const struct nvme_core_quirk_entry core_quirks[] = {
.vid = 0x1179, .vid = 0x1179,
.mn = "THNSF5256GPUK TOSHIBA", .mn = "THNSF5256GPUK TOSHIBA",
.quirks = NVME_QUIRK_NO_APST, .quirks = NVME_QUIRK_NO_APST,
},
{
/*
* This LiteON CL1-3D*-Q11 firmware version has a race
* condition associated with actions related to suspend to idle
* LiteON has resolved the problem in future firmware
*/
.vid = 0x14a4,
.fr = "22301111",
.quirks = NVME_QUIRK_SIMPLE_SUSPEND,
} }
}; };
......
...@@ -92,6 +92,11 @@ enum nvme_quirks { ...@@ -92,6 +92,11 @@ enum nvme_quirks {
* Broken Write Zeroes. * Broken Write Zeroes.
*/ */
NVME_QUIRK_DISABLE_WRITE_ZEROES = (1 << 9), NVME_QUIRK_DISABLE_WRITE_ZEROES = (1 << 9),
/*
* Force simple suspend/resume path.
*/
NVME_QUIRK_SIMPLE_SUSPEND = (1 << 10),
}; };
/* /*
......
...@@ -2876,7 +2876,8 @@ static int nvme_suspend(struct device *dev) ...@@ -2876,7 +2876,8 @@ static int nvme_suspend(struct device *dev)
* state (which may not be possible if the link is up). * state (which may not be possible if the link is up).
*/ */
if (pm_suspend_via_firmware() || !ctrl->npss || if (pm_suspend_via_firmware() || !ctrl->npss ||
!pcie_aspm_enabled(pdev)) { !pcie_aspm_enabled(pdev) ||
(ndev->ctrl.quirks & NVME_QUIRK_SIMPLE_SUSPEND)) {
nvme_dev_disable(ndev, true); nvme_dev_disable(ndev, true);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment