@@ -218,15 +218,15 @@ impl<T: DeviceBacking> NvmeDriver<T> {
218
218
219
219
let cc = bar0. cc ( ) ;
220
220
if cc. en ( ) || bar0. csts ( ) . rdy ( ) {
221
- if ! bar0
221
+ if let Err ( e ) = bar0
222
222
. reset ( & driver)
223
223
. instrument ( tracing:: info_span!(
224
224
"nvme_already_enabled" ,
225
225
pci_id = device. id( ) . to_owned( )
226
226
) )
227
227
. await
228
228
{
229
- anyhow:: bail!( "device is gone" ) ;
229
+ anyhow:: bail!( "device is gone, csts: {:#x}" , e ) ;
230
230
}
231
231
}
232
232
@@ -328,12 +328,22 @@ impl<T: DeviceBacking> NvmeDriver<T> {
328
328
let mut backoff = Backoff :: new ( & self . driver ) ;
329
329
loop {
330
330
let csts = worker. registers . bar0 . csts ( ) ;
331
- if u32:: from ( csts) == !0 {
332
- anyhow:: bail!( "device is gone" ) ;
331
+ let csts_val: u32 = csts. into ( ) ;
332
+ if csts_val == !0 {
333
+ anyhow:: bail!( "device is gone, csts: {:#x}" , csts_val) ;
333
334
}
334
335
if csts. cfs ( ) {
335
- worker. registers . bar0 . reset ( & self . driver ) . await ;
336
- anyhow:: bail!( "device had fatal error" ) ;
336
+ // Attempt to leave the device in reset state CC.EN 1 -> 0.
337
+ let after_reset = if let Err ( e) = worker. registers . bar0 . reset ( & self . driver ) . await {
338
+ e
339
+ } else {
340
+ 0
341
+ } ;
342
+ anyhow:: bail!(
343
+ "device had fatal error, csts: {:#x}, after reset: {:#}" ,
344
+ csts_val,
345
+ after_reset
346
+ ) ;
337
347
}
338
348
if csts. rdy ( ) {
339
349
break ;
@@ -485,7 +495,9 @@ impl<T: DeviceBacking> NvmeDriver<T> {
485
495
if let Some ( admin) = worker. admin {
486
496
_admin_responses = admin. shutdown ( ) . await ;
487
497
}
488
- worker. registers . bar0 . reset ( & driver) . await ;
498
+ if let Err ( e) = worker. registers . bar0 . reset ( & driver) . await {
499
+ tracing:: info!( csts = e, "device reset failed" ) ;
500
+ }
489
501
}
490
502
}
491
503
@@ -563,9 +575,13 @@ impl<T: DeviceBacking> NvmeDriver<T> {
563
575
. context ( "failed to map device registers" ) ?;
564
576
let bar0 = Bar0 ( bar0_mapping) ;
565
577
566
- // It is expected the device to be alive when restoring.
567
- if !bar0. csts ( ) . rdy ( ) {
568
- anyhow:: bail!( "device is gone" ) ;
578
+ // It is expected for the device to be alive when restoring.
579
+ let csts = bar0. csts ( ) ;
580
+ if !csts. rdy ( ) {
581
+ anyhow:: bail!(
582
+ "device is not ready during restore, csts: {:#x}" ,
583
+ u32 :: from( csts)
584
+ ) ;
569
585
}
570
586
571
587
let registers = Arc :: new ( DeviceRegisters :: new ( bar0) ) ;
0 commit comments