Skip to content

Commit 829fa15

Browse files
cp890582martinkpetersen
authored andcommitted
scsi: mpi3mr: Fix controller init failure on fault during queue creation
Firmware can enter a transient fault while creating operational queues. The driver fails the load immediately. Add a retry loop that checks controller status and history bit after queue creation. If either indicates a fault, retry init up to a set limit before failing. Signed-off-by: Chandrakanth Patil <chandrakanth.patil@broadcom.com> Link: https://lore.kernel.org/r/20250820084138.228471-3-chandrakanth.patil@broadcom.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent d6c8e8b commit 829fa15

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

drivers/scsi/mpi3mr/mpi3mr_fw.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2353,6 +2353,8 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc)
23532353
{
23542354
int retval = 0;
23552355
u16 num_queues = 0, i = 0, msix_count_op_q = 1;
2356+
u32 ioc_status;
2357+
enum mpi3mr_iocstate ioc_state;
23562358

23572359
num_queues = min_t(int, mrioc->facts.max_op_reply_q,
23582360
mrioc->facts.max_op_req_q);
@@ -2408,6 +2410,14 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc)
24082410
retval = -1;
24092411
goto out_failed;
24102412
}
2413+
ioc_status = readl(&mrioc->sysif_regs->ioc_status);
2414+
ioc_state = mpi3mr_get_iocstate(mrioc);
2415+
if ((ioc_status & MPI3_SYSIF_IOC_STATUS_RESET_HISTORY) ||
2416+
ioc_state != MRIOC_STATE_READY) {
2417+
mpi3mr_print_fault_info(mrioc);
2418+
retval = -1;
2419+
goto out_failed;
2420+
}
24112421
mrioc->num_op_reply_q = mrioc->num_op_req_q = i;
24122422
ioc_info(mrioc,
24132423
"successfully created %d operational queue pairs(default/polled) queue = (%d/%d)\n",

0 commit comments

Comments
 (0)