[PATCH] nvme-pci: fix resume after AER recovery

Javier.gonz at samsung.com Javier.gonz at samsung.com
Mon Feb 6 09:51:42 PST 2023


On 06.02.2023 09:22, Keith Busch wrote:
>On Mon, Feb 06, 2023 at 04:42:18PM +0100, Christoph Hellwig wrote:
>> On Mon, Feb 06, 2023 at 03:02:20PM +0100, Javier.gonz at samsung.com wrote:
>> > Is there a chance we can get a quirk for this for this FW. Seems like an
>> > issue on our side that is creating problems.
>>
>> So waht would the quirk look like?  This would have to be something in
>> the core PCIe code, not NVMe as far as I can tell.

Yes. I was wondering if you had a reason for this not being a good idea.

>
>Yeah, I'm assuming it's a PCI level quirk because the remove-rescan was
>successful at reinitializing. The remove-rescan should do a very similiar
>config space setup and nvme startup as an AER recovery, so I'm guessing this is
>a matter of timing. If so, the below is how I'd imagine the quirk may look.

Thanks Keith. Let me try this out. I need to reproduce this first.

Maciej: It would be helpful if you can try this at your end.

>But if this idea isn't successful, it'd be bit a more work to figure out what
>sequence this device wants to happen in order to complete recovery.

Ok. Thanks!

>
>---
>diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
>index fba95486caaf2..f642e7029e0e9 100644
>--- a/drivers/pci/pci.c
>+++ b/drivers/pci/pci.c
>@@ -5054,7 +5054,10 @@ void pci_reset_secondary_bus(struct pci_dev *dev)
> 	 * PCI spec v3.0 7.6.4.2 requires minimum Trst of 1ms.  Double
> 	 * this to 2ms to ensure that we meet the minimum requirement.
> 	 */
>-	msleep(2);
>+	if (dev->quirks & <NEW_SB_DELAY_QUIRK_BIT>)
>+		msleep(100);
>+	else
>+		msleep(2);
>
> 	ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET;
> 	pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl);
>@@ -5066,7 +5069,10 @@ void pci_reset_secondary_bus(struct pci_dev *dev)
> 	 * be re-initialized.  PCIe has some ways to shorten this,
> 	 * but we don't make use of them yet.
> 	 */
>-	ssleep(1);
>+	if (dev->quirks & <NEW_SB_DELAY_QUIRK_BIT>)
>+		ssleep(5);
>+	else
>+		ssleep(1);
> }
>
> void __weak pcibios_reset_secondary_bus(struct pci_dev *dev)
>--



More information about the Linux-nvme mailing list