scsi: cxlflash: Improve EEH recovery time
authorMatthew R. Ochs <mrochs@linux.vnet.ibm.com>
Fri, 2 Sep 2016 20:40:03 +0000 (15:40 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 14 Sep 2016 16:46:20 +0000 (12:46 -0400)
When an EEH occurs during device initialization, the port timeout logic
can cause excessive delays as MMIO reads will fail. Depending on where
they are experienced, these delays can lead to a prolonged reset,
causing an unnecessary triggering of other timeout logic in the SCSI
stack or user applications.

To expedite recovery, the port timeout logic is updated to decay the
timeout at a much faster rate when in the presence of a likely EEH
frozen event.

Signed-off-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
Acked-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/cxlflash/main.c

index 4ef5235053647cf40e862101aa0453fcd68d2c3b..42970a40d49b1a4462d92b1ca96dfa4b88147ac3 100644 (file)
@@ -1040,6 +1040,8 @@ static int wait_port_online(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)
        do {
                msleep(delay_us / 1000);
                status = readq_be(&fc_regs[FC_MTIP_STATUS / 8]);
+               if (status == U64_MAX)
+                       nretry /= 2;
        } while ((status & FC_MTIP_STATUS_MASK) != FC_MTIP_STATUS_ONLINE &&
                 nretry--);
 
@@ -1071,6 +1073,8 @@ static int wait_port_offline(__be64 __iomem *fc_regs, u32 delay_us, u32 nretry)
        do {
                msleep(delay_us / 1000);
                status = readq_be(&fc_regs[FC_MTIP_STATUS / 8]);
+               if (status == U64_MAX)
+                       nretry /= 2;
        } while ((status & FC_MTIP_STATUS_MASK) != FC_MTIP_STATUS_OFFLINE &&
                 nretry--);