]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
scsi: aacraid: fixed firmware assert issue
authorBalsundar P <balsundar.p@microsemi.com>
Tue, 15 Oct 2019 06:22:00 +0000 (11:52 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 18 Oct 2019 23:34:17 +0000 (19:34 -0400)
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.

Link: https://lore.kernel.org/r/1571120524-6037-4-git-send-email-balsundar.p@microsemi.com
Signed-off-by: Balsundar P <balsundar.p@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/src.c

index 3fa03230f6ba3db0ccf588987ed5bd3660060021..3fdd4583cbb502488272881078d12f5e45d0f75c 100644 (file)
@@ -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) \
index d4fcfa1e54e024fd17132fa902b86521566efefd..f75878d773cf914e33b80e12a4fa961c0232d581 100644 (file)
@@ -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);
index 3b66e06726c8e11437b31afafab9095b242eb9cb..787ec9baebb0b8d2cc03e40c6c7234cc01c20ae3 100644 (file)
@@ -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)