@@ -1362,6 +1362,10 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
1362
1362
int retval = 0 ;
1363
1363
enum mpi3mr_iocstate ioc_state ;
1364
1364
u64 base_info ;
1365
+ u8 retry = 0 ;
1366
+ u64 start_time , elapsed_time_sec ;
1367
+
1368
+ retry_bring_ioc_ready :
1365
1369
1366
1370
ioc_status = readl (& mrioc -> sysif_regs -> ioc_status );
1367
1371
ioc_config = readl (& mrioc -> sysif_regs -> ioc_configuration );
@@ -1380,26 +1384,23 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
1380
1384
ioc_info (mrioc , "controller is in %s state during detection\n" ,
1381
1385
mpi3mr_iocstate_name (ioc_state ));
1382
1386
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 ;
1389
1395
1390
1396
if (!pci_device_is_present (mrioc -> pdev )) {
1391
1397
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" );
1395
1399
goto out_device_not_present ;
1396
1400
}
1397
1401
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 );
1403
1404
1404
1405
if (ioc_state == MRIOC_STATE_READY ) {
1405
1406
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)
1460
1461
ioc_config |= MPI3_SYSIF_IOC_CONFIG_ENABLE_IOC ;
1461
1462
writel (ioc_config , & mrioc -> sysif_regs -> ioc_configuration );
1462
1463
1464
+ if (retry == 0 )
1465
+ start_time = jiffies ;
1466
+
1463
1467
timeout = mrioc -> ready_timeout * 10 ;
1464
1468
do {
1465
1469
ioc_state = mpi3mr_get_iocstate (mrioc );
@@ -1469,6 +1473,12 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
1469
1473
mpi3mr_iocstate_name (ioc_state ));
1470
1474
return 0 ;
1471
1475
}
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
+ }
1472
1482
if (!pci_device_is_present (mrioc -> pdev )) {
1473
1483
mrioc -> unrecoverable = 1 ;
1474
1484
ioc_err (mrioc ,
@@ -1477,9 +1487,19 @@ static int mpi3mr_bring_ioc_ready(struct mpi3mr_ioc *mrioc)
1477
1487
goto out_device_not_present ;
1478
1488
}
1479
1489
msleep (100 );
1480
- } while (-- timeout );
1490
+ elapsed_time_sec = jiffies_to_msecs (jiffies - start_time )/1000 ;
1491
+ } while (elapsed_time_sec < mrioc -> ready_timeout );
1481
1492
1482
1493
out_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
+ }
1483
1503
ioc_state = mpi3mr_get_iocstate (mrioc );
1484
1504
ioc_err (mrioc ,
1485
1505
"failed to bring to ready state, current state: %s\n" ,
@@ -2671,7 +2691,7 @@ static void mpi3mr_watchdog_work(struct work_struct *work)
2671
2691
return ;
2672
2692
}
2673
2693
2674
- if (mrioc -> ts_update_counter ++ >= MPI3MR_TSUPDATE_INTERVAL ) {
2694
+ if (mrioc -> ts_update_counter ++ >= mrioc -> ts_update_interval ) {
2675
2695
mrioc -> ts_update_counter = 0 ;
2676
2696
mpi3mr_sync_timestamp (mrioc );
2677
2697
}
@@ -3844,6 +3864,29 @@ static int mpi3mr_repost_diag_bufs(struct mpi3mr_ioc *mrioc)
3844
3864
return retval ;
3845
3865
}
3846
3866
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
+
3847
3890
/**
3848
3891
* mpi3mr_print_ioc_info - Display controller information
3849
3892
* @mrioc: Adapter instance reference
@@ -4140,6 +4183,7 @@ int mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc)
4140
4183
goto out_failed_noretry ;
4141
4184
}
4142
4185
4186
+ mpi3mr_read_tsu_interval (mrioc );
4143
4187
mpi3mr_print_ioc_info (mrioc );
4144
4188
4145
4189
if (!mrioc -> cfg_page ) {
@@ -4321,6 +4365,7 @@ int mpi3mr_reinit_ioc(struct mpi3mr_ioc *mrioc, u8 is_resume)
4321
4365
goto out_failed_noretry ;
4322
4366
}
4323
4367
4368
+ mpi3mr_read_tsu_interval (mrioc );
4324
4369
mpi3mr_print_ioc_info (mrioc );
4325
4370
4326
4371
if (is_resume ) {
0 commit comments