From 63ebc39891f7b292197f653f8f3aa9dfe35135ee Mon Sep 17 00:00:00 2001
From: "Kevin.xie" <kevin.xie@starfivetech.com>
Date: Thu, 24 Nov 2022 16:59:12 +0800
Subject: [PATCH 13/55] drivers: nvme: Add precheck and delay for CQE pending
 status.

To workaroud the NVMe I/O timeout problem in bootup S10udev case
which caused by the CQE update lantancy.

Signed-off-by: Kevin.xie <kevin.xie@starfivetech.com>
---
 drivers/nvme/host/pci.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -28,6 +28,7 @@
 #include <linux/io-64-nonatomic-hi-lo.h>
 #include <linux/sed-opal.h>
 #include <linux/pci-p2pdma.h>
+#include <linux/delay.h>
 
 #include "trace.h"
 #include "nvme.h"
@@ -1156,6 +1157,15 @@ static inline int nvme_poll_cq(struct nv
 {
 	int found = 0;
 
+	/*
+	 * In some cases, such as udev trigger, cqe status may update
+	 * a little bit later than MSI, which cause an irq handle missing.
+	 * To workaound, here we will prefetch the status first, and wait
+	 * 1us if we get nothing.
+	 */
+	if (!nvme_cqe_pending(nvmeq))
+		udelay(1);
+
 	while (nvme_cqe_pending(nvmeq)) {
 		found++;
 		/*
