Skip to content

Commit

Permalink
scsi: aacraid: fixed firmware assert issue
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Balsundar P authored and Martin K. Petersen committed Oct 18, 2019
1 parent f2244c1 commit c02a334
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/scsi/aacraid/aacraid.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) \
Expand Down
5 changes: 5 additions & 0 deletions drivers/scsi/aacraid/comminit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
10 changes: 10 additions & 0 deletions drivers/scsi/aacraid/src.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit c02a334

Please sign in to comment.