From: Balsundar P <balsunda...@microsemi.com>

Before issuing IOP reset, INTX mode is selected. This is triggering
MSGU lockup and ended in basecode assert. Use DROP_IO command when
IOP reset is sent in preparation for interrupt mode switch

Signed-off-by: Balsundar P <balsunda...@microsemi.com>
---
 drivers/scsi/aacraid/aacraid.h  |  1 +
 drivers/scsi/aacraid/comminit.c |  5 +++++
 drivers/scsi/aacraid/src.c      | 10 ++++++++++
 3 files changed, 16 insertions(+)

diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 3fa03230f6ba..3fdd4583cbb5 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -1673,6 +1673,7 @@ struct aac_dev
        u8                      adapter_shutdown;
        u32                     handle_pci_error;
        bool                    init_reset;
+       u8                      soft_reset_support;
 };
 
 #define aac_adapter_interrupt(dev) \
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
index d4fcfa1e54e0..f75878d773cf 100644
--- a/drivers/scsi/aacraid/comminit.c
+++ b/drivers/scsi/aacraid/comminit.c
@@ -571,6 +571,11 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
                else
                        dev->sa_firmware = 0;
 
+               if (status[4] & le32_to_cpu(AAC_EXTOPT_SOFT_RESET))
+                       dev->soft_reset_support = 1;
+               else
+                       dev->soft_reset_support = 0;
+
                if ((dev->comm_interface == AAC_COMM_MESSAGE) &&
                    (status[2] > dev->base_size)) {
                        aac_adapter_ioremap(dev, 0);
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 3b66e06726c8..787ec9baebb0 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -733,10 +733,20 @@ static bool aac_is_ctrl_up_and_running(struct aac_dev 
*dev)
        return ctrl_up;
 }
 
+static void aac_src_drop_io(struct aac_dev *dev)
+{
+       if (!dev->soft_reset_support)
+               return;
+
+       aac_adapter_sync_cmd(dev, DROP_IO,
+                       0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
+}
+
 static void aac_notify_fw_of_iop_reset(struct aac_dev *dev)
 {
        aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 0, 0, 0, 0, 0, 0, NULL,
                                                NULL, NULL, NULL, NULL);
+       aac_src_drop_io(dev);
 }
 
 static void aac_send_iop_reset(struct aac_dev *dev)
-- 
2.18.1

Reply via email to