@@ -1362,6 +1362,10 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
13621362 int retval = 0 ;
13631363 enum mpi3mr_iocstate ioc_state ;
13641364 u64 base_info ;
1365+ u8 retry = 0 ;
1366+ u64 start_time , elapsed_time_sec ;
1367+
1368+ retry_bring_ioc_ready :
13651369
13661370 ioc_status = readl (& mrioc -> sysif_regs -> ioc_status );
13671371 ioc_config = readl (& mrioc -> sysif_regs -> ioc_configuration );
@@ -1380,26 +1384,23 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
13801384 ioc_info (mrioc , "controller is in %s state during detection\n" ,
13811385 mpi3mr_iocstate_name (ioc_state ));
13821386
1383- if (ioc_state == MRIOC_STATE_BECOMING_READY ||
1384- ioc_state == MRIOC_STATE_RESET_REQUESTED ) {
1385- timeout = mrioc -> ready_timeout * 10 ;
1386- do {
1387- msleep (100 );
1388- } while (-- timeout );
1387+ timeout = mrioc -> ready_timeout * 10 ;
1388+
1389+ do {
1390+ ioc_state = mpi3mr_get_iocstate (mrioc );
1391+
1392+ if (ioc_state != MRIOC_STATE_BECOMING_READY &&
1393+ ioc_state != MRIOC_STATE_RESET_REQUESTED )
1394+ break ;
13891395
13901396 if (!pci_device_is_present (mrioc -> pdev )) {
13911397 mrioc -> unrecoverable = 1 ;
1392- ioc_err (mrioc ,
1393- "controller is not present while waiting to reset\n" );
1394- retval = -1 ;
1398+ ioc_err (mrioc , "controller is not present while waiting to reset\n" );
13951399 goto out_device_not_present ;
13961400 }
13971401
1398- ioc_state = mpi3mr_get_iocstate (mrioc );
1399- ioc_info (mrioc ,
1400- "controller is in %s state after waiting to reset\n" ,
1401- mpi3mr_iocstate_name (ioc_state ));
1402- }
1402+ msleep (100 );
1403+ } while (-- timeout );
14031404
14041405 if (ioc_state == MRIOC_STATE_READY ) {
14051406 ioc_info (mrioc , "issuing message unit reset (MUR) to bring to reset state\n" );
@@ -1460,6 +1461,9 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
14601461 ioc_config |= MPI3_SYSIF_IOC_CONFIG_ENABLE_IOC ;
14611462 writel (ioc_config , & mrioc -> sysif_regs -> ioc_configuration );
14621463
1464+ if (retry == 0 )
1465+ start_time = jiffies ;
1466+
14631467 timeout = mrioc -> ready_timeout * 10 ;
14641468 do {
14651469 ioc_state = mpi3mr_get_iocstate (mrioc );
@@ -1469,6 +1473,12 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
14691473 mpi3mr_iocstate_name (ioc_state ));
14701474 return 0 ;
14711475 }
1476+ ioc_status = readl (& mrioc -> sysif_regs -> ioc_status );
1477+ if ((ioc_status & MPI3_SYSIF_IOC_STATUS_RESET_HISTORY ) ||
1478+ (ioc_status & MPI3_SYSIF_IOC_STATUS_FAULT )) {
1479+ mpi3mr_print_fault_info (mrioc );
1480+ goto out_failed ;
1481+ }
14721482 if (!pci_device_is_present (mrioc -> pdev )) {
14731483 mrioc -> unrecoverable = 1 ;
14741484 ioc_err (mrioc ,
@@ -1477,9 +1487,19 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
14771487 goto out_device_not_present ;
14781488 }
14791489 msleep (100 );
1480- } while (-- timeout );
1490+ elapsed_time_sec = jiffies_to_msecs (jiffies - start_time )/1000 ;
1491+ } while (elapsed_time_sec < mrioc -> ready_timeout );
14811492
14821493out_failed :
1494+ elapsed_time_sec = jiffies_to_msecs (jiffies - start_time )/1000 ;
1495+ if ((retry < 2 ) && (elapsed_time_sec < (mrioc -> ready_timeout - 60 ))) {
1496+ retry ++ ;
1497+
1498+ ioc_warn (mrioc , "retrying to bring IOC ready, retry_count:%d\n"
1499+ " elapsed time =%llu\n" , retry , elapsed_time_sec );
1500+
1501+ goto retry_bring_ioc_ready ;
1502+ }
14831503 ioc_state = mpi3mr_get_iocstate (mrioc );
14841504 ioc_err (mrioc ,
14851505 "failed to bring to ready state, current state: %s\n" ,
@@ -2671,7 +2691,7 @@ static void mpi3mr_watchdog_work(struct work_struct *work)
26712691 return ;
26722692 }
26732693
2674- if (mrioc -> ts_update_counter ++ >= MPI3MR_TSUPDATE_INTERVAL ) {
2694+ if (mrioc -> ts_update_counter ++ >= mrioc -> ts_update_interval ) {
26752695 mrioc -> ts_update_counter = 0 ;
26762696 mpi3mr_sync_timestamp (mrioc );
26772697 }
@@ -3844,6 +3864,29 @@ static int mpi3mr_repost_diag_bufs(struct mpi3mr_ioc *mrioc)
38443864 return retval ;
38453865}
38463866
3867+ /**
3868+ * mpi3mr_read_tsu_interval - Update time stamp interval
3869+ * @mrioc: Adapter instance reference
3870+ *
3871+ * Update time stamp interval if its defined in driver page 1,
3872+ * otherwise use default value.
3873+ *
3874+ * Return: Nothing
3875+ */
3876+ static void
3877+ mpi3mr_read_tsu_interval (struct mpi3mr_ioc * mrioc )
3878+ {
3879+ struct mpi3_driver_page1 driver_pg1 ;
3880+ u16 pg_sz = sizeof (driver_pg1 );
3881+ int retval = 0 ;
3882+
3883+ mrioc -> ts_update_interval = MPI3MR_TSUPDATE_INTERVAL ;
3884+
3885+ retval = mpi3mr_cfg_get_driver_pg1 (mrioc , & driver_pg1 , pg_sz );
3886+ if (!retval && driver_pg1 .time_stamp_update )
3887+ mrioc -> ts_update_interval = (driver_pg1 .time_stamp_update * 60 );
3888+ }
3889+
38473890/**
38483891 * mpi3mr_print_ioc_info - Display controller information
38493892 * @mrioc: Adapter instance reference
@@ -4140,6 +4183,7 @@ int mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc)
41404183 goto out_failed_noretry ;
41414184 }
41424185
4186+ mpi3mr_read_tsu_interval (mrioc );
41434187 mpi3mr_print_ioc_info (mrioc );
41444188
41454189 if (!mrioc -> cfg_page ) {
@@ -4321,6 +4365,7 @@ int mpi3mr_reinit_ioc(struct mpi3mr_ioc *mrioc, u8 is_resume)
43214365 goto out_failed_noretry ;
43224366 }
43234367
4368+ mpi3mr_read_tsu_interval (mrioc );
43244369 mpi3mr_print_ioc_info (mrioc );
43254370
43264371 if (is_resume ) {
0 commit comments