Skip to content

Commit c0b00a9

Browse files
sreekanthbrcmmartinkpetersen
authored andcommitted
scsi: mpi3mr: Add IOC reinit function
Add IOC reinitialization function. Link: https://lore.kernel.org/r/20211220141159.16117-16-sreekanth.reddy@broadcom.com Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent fe6db61 commit c0b00a9

1 file changed

Lines changed: 115 additions & 1 deletion

File tree

drivers/scsi/mpi3mr/mpi3mr_fw.c

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3568,10 +3568,124 @@ int mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc)
35683568
return retval;
35693569
}
35703570

3571+
/**
3572+
* mpi3mr_reinit_ioc - Re-Initialize the controller
3573+
* @mrioc: Adapter instance reference
3574+
* @is_resume: Called from resume or reset path
3575+
*
3576+
* This the controller re-initialization routine, executed from
3577+
* the soft reset handler or resume callback. Creates
3578+
* operational reply queue pairs, allocate required memory for
3579+
* reply pool, sense buffer pool, issue IOC init request to the
3580+
* firmware, unmask the events and issue port enable to discover
3581+
* SAS/SATA/NVMe devices and RAID volumes.
3582+
*
3583+
* Return: 0 on success and non-zero on failure.
3584+
*/
35713585
int mpi3mr_reinit_ioc(struct mpi3mr_ioc *mrioc, u8 is_resume)
35723586
{
3587+
int retval = 0;
3588+
u8 retry = 0;
3589+
struct mpi3_ioc_facts_data facts_data;
35733590

3574-
return 0;
3591+
retry_init:
3592+
dprint_reset(mrioc, "bringing up the controller to ready state\n");
3593+
retval = mpi3mr_bring_ioc_ready(mrioc);
3594+
if (retval) {
3595+
ioc_err(mrioc, "failed to bring to ready state\n");
3596+
goto out_failed_noretry;
3597+
}
3598+
3599+
if (is_resume) {
3600+
dprint_reset(mrioc, "setting up single ISR\n");
3601+
retval = mpi3mr_setup_isr(mrioc, 1);
3602+
if (retval) {
3603+
ioc_err(mrioc, "failed to setup ISR\n");
3604+
goto out_failed_noretry;
3605+
}
3606+
} else
3607+
mpi3mr_ioc_enable_intr(mrioc);
3608+
3609+
dprint_reset(mrioc, "getting ioc_facts\n");
3610+
retval = mpi3mr_issue_iocfacts(mrioc, &facts_data);
3611+
if (retval) {
3612+
ioc_err(mrioc, "failed to get ioc_facts\n");
3613+
goto out_failed;
3614+
}
3615+
3616+
mpi3mr_process_factsdata(mrioc, &facts_data);
3617+
3618+
mpi3mr_print_ioc_info(mrioc);
3619+
3620+
dprint_reset(mrioc, "sending ioc_init\n");
3621+
retval = mpi3mr_issue_iocinit(mrioc);
3622+
if (retval) {
3623+
ioc_err(mrioc, "failed to send ioc_init\n");
3624+
goto out_failed;
3625+
}
3626+
3627+
dprint_reset(mrioc, "getting package version\n");
3628+
retval = mpi3mr_print_pkg_ver(mrioc);
3629+
if (retval) {
3630+
ioc_err(mrioc, "failed to get package version\n");
3631+
goto out_failed;
3632+
}
3633+
3634+
if (is_resume) {
3635+
dprint_reset(mrioc, "setting up multiple ISR\n");
3636+
retval = mpi3mr_setup_isr(mrioc, 0);
3637+
if (retval) {
3638+
ioc_err(mrioc, "failed to re-setup ISR\n");
3639+
goto out_failed_noretry;
3640+
}
3641+
}
3642+
3643+
dprint_reset(mrioc, "creating operational queue pairs\n");
3644+
retval = mpi3mr_create_op_queues(mrioc);
3645+
if (retval) {
3646+
ioc_err(mrioc, "failed to create operational queue pairs\n");
3647+
goto out_failed;
3648+
}
3649+
3650+
if (mrioc->shost->nr_hw_queues > mrioc->num_op_reply_q) {
3651+
ioc_err(mrioc,
3652+
"cannot create minimum number of operatioanl queues expected:%d created:%d\n",
3653+
mrioc->shost->nr_hw_queues, mrioc->num_op_reply_q);
3654+
goto out_failed_noretry;
3655+
}
3656+
3657+
dprint_reset(mrioc, "enabling events\n");
3658+
retval = mpi3mr_enable_events(mrioc);
3659+
if (retval) {
3660+
ioc_err(mrioc, "failed to enable events\n");
3661+
goto out_failed;
3662+
}
3663+
3664+
ioc_info(mrioc, "sending port enable\n");
3665+
retval = mpi3mr_issue_port_enable(mrioc, 0);
3666+
if (retval) {
3667+
ioc_err(mrioc, "failed to issue port enable\n");
3668+
goto out_failed;
3669+
}
3670+
3671+
ioc_info(mrioc, "controller %s completed successfully\n",
3672+
(is_resume)?"resume":"re-initialization");
3673+
return retval;
3674+
out_failed:
3675+
if (retry < 2) {
3676+
retry++;
3677+
ioc_warn(mrioc, "retrying controller %s, retry_count:%d\n",
3678+
(is_resume)?"resume":"re-initialization", retry);
3679+
mpi3mr_memset_buffers(mrioc);
3680+
goto retry_init;
3681+
}
3682+
out_failed_noretry:
3683+
ioc_err(mrioc, "controller %s is failed\n",
3684+
(is_resume)?"resume":"re-initialization");
3685+
mpi3mr_issue_reset(mrioc, MPI3_SYSIF_HOST_DIAG_RESET_ACTION_DIAG_FAULT,
3686+
MPI3MR_RESET_FROM_CTLR_CLEANUP);
3687+
mrioc->unrecoverable = 1;
3688+
return retval;
35753689
}
35763690

35773691
/**

0 commit comments

Comments
 (0)