The documentation for the 8070 and 8072 SPCv chip explicitly states that
a minimum of 500ms must elapse before issuing commands, otherwise the
SPCv may not process them and the firmware may get into an unrecoverable
state requiring a reboot.  While the Linux guys will probably think this
is 'racy', it is called out in the chip documentation and inserting this
delay makes power management function properly.

Signed-off-by: Benjamin Rood <br...@attotech.com>
---
Changes from v1 -> v2:
        -Used mdelay(500) instead of a loop to facilitate required delay
        -Added comment as to why this behavior exists

 drivers/scsi/pm8001/pm8001_init.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/scsi/pm8001/pm8001_init.c 
b/drivers/scsi/pm8001/pm8001_init.c
index 7ce7ea3..d147c41 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -1243,6 +1243,19 @@ static int pm8001_pci_resume(struct pci_dev *pdev)
                for (i = 1; i < pm8001_ha->number_of_intr; i++)
                        PM8001_CHIP_DISP->interrupt_enable(pm8001_ha, i);
        }
+
+       /* Chip documentation for the 8070 and 8072 SPCv    */
+       /* states that a 500ms minimum delay is required    */
+       /* before issuing commands.  Otherwise, the firmare */
+       /* will enter an unrecoverable state.               */
+
+       if (pm8001_ha->chip_id == chip_8070 ||
+               pm8001_ha->chip_id == chip_8072) {
+               mdelay(500);
+       }
+
+       /* Spin up the PHYs */
+
        pm8001_ha->flags = PM8001F_RUN_TIME;
        for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
                pm8001_ha->phy[i].enable_completion = &completion;
-- 
2.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to