@@ -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+ */
35713585int 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