@@ -1119,14 +1119,14 @@ struct __packed wdc_bd_ca_log_format {
1119
1119
__u8 raw_value [8 ];
1120
1120
};
1121
1121
1122
- #define LATENCY_LOG_BUCKET_READ 3
1123
- #define LATENCY_LOG_BUCKET_WRITE 2
1124
- #define LATENCY_LOG_BUCKET_TRIM 1
1125
- #define LATENCY_LOG_BUCKET_RESERVED 0
1122
+ #define WDC_LATENCY_LOG_BUCKET_READ 3
1123
+ #define WDC_LATENCY_LOG_BUCKET_WRITE 2
1124
+ #define WDC_LATENCY_LOG_BUCKET_TRIM 1
1125
+ #define WDC_LATENCY_LOG_BUCKET_RESERVED 0
1126
1126
1127
- #define LATENCY_LOG_MEASURED_LAT_READ 2
1128
- #define LATENCY_LOG_MEASURED_LAT_WRITE 1
1129
- #define LATENCY_LOG_MEASURED_LAT_TRIM 0
1127
+ #define WDC_LATENCY_LOG_MEASURED_LAT_READ 2
1128
+ #define WDC_LATENCY_LOG_MEASURED_LAT_WRITE 1
1129
+ #define WDC_LATENCY_LOG_MEASURED_LAT_TRIM 0
1130
1130
1131
1131
struct __packed wdc_ssd_latency_monitor_log {
1132
1132
__u8 feature_status ; /* 0x00 */
@@ -1151,8 +1151,9 @@ struct __packed wdc_ssd_latency_monitor_log {
1151
1151
__le64 static_latency_timestamp [4 ][3 ]; /* 0x130 - 0x18F */
1152
1152
__le16 static_measured_latency [4 ][3 ]; /* 0x190 - 0x1A7 */
1153
1153
__le16 static_latency_stamp_units ; /* 0x1A8 */
1154
- __u8 rsvd4 [0x16 ]; /* 0x1AA */
1154
+ __u8 rsvd4 [10 ]; /* 0x1AA */
1155
1155
1156
+ __u8 debug_telemetry_log_size [12 ]; /* 0x1B4 */
1156
1157
__le16 debug_log_trigger_enable ; /* 0x1C0 */
1157
1158
__le16 debug_log_measured_latency ; /* 0x1C2 */
1158
1159
__le64 debug_log_latency_stamp ; /* 0x1C4 */
@@ -1220,25 +1221,29 @@ struct __packed wdc_ssd_d0_smart_log {
1220
1221
#define WDC_OCP_C1_GUID_LENGTH 16
1221
1222
#define WDC_ERROR_REC_LOG_BUF_LEN 512
1222
1223
#define WDC_ERROR_REC_LOG_ID 0xC1
1223
- #define WDC_ERROR_REC_LOG_VERSION1 0001
1224
- #define WDC_ERROR_REC_LOG_VERSION2 0002
1225
1224
1226
1225
struct __packed wdc_ocp_c1_error_recovery_log {
1227
- __le16 panic_reset_wait_time ; /* 000 - Panic Reset Wait Time */
1228
- __u8 panic_reset_action ; /* 002 - Panic Reset Action */
1229
- __u8 dev_recovery_action1 ; /* 003 - Device Recovery Action 1 */
1230
- __le64 panic_id ; /* 004 - Panic ID */
1231
- __le32 dev_capabilities ; /* 012 - Device Capabilities */
1232
- __u8 vs_recovery_opc ; /* 016 - Vendor Specific Recovery Opcode */
1233
- __u8 rsvd1 [3 ]; /* 017 - 3 Reserved Bytes */
1234
- __le32 vs_cmd_cdw12 ; /* 020 - Vendor Specific Command CDW12 */
1235
- __le32 vs_cmd_cdw13 ; /* 024 - Vendor Specific Command CDW13 */
1236
- __u8 vs_cmd_to ; /* 028 - Vendor Specific Command Timeout V2 */
1237
- __u8 dev_recovery_action2 ; /* 029 - Device Recovery Action 2 V2 */
1238
- __u8 dev_recovery_action2_to ; /* 030 - Device Recovery Action 2 Timeout V2 */
1239
- __u8 rsvd2 [463 ]; /* 031 - 463 Reserved Bytes */
1240
- __le16 log_page_version ; /* 494 - Log Page Version */
1241
- __u8 log_page_guid [WDC_OCP_C1_GUID_LENGTH ]; /* 496 - Log Page GUID */
1226
+ __le16 panic_reset_wait_time ; /* 000 - Panic Reset Wait Time */
1227
+ __u8 panic_reset_action ; /* 002 - Panic Reset Action */
1228
+ __u8 dev_recovery_action1 ; /* 003 - Device Recovery Action 1 */
1229
+ __le64 panic_id ; /* 004 - Panic ID */
1230
+ __le32 dev_capabilities ; /* 012 - Device Capabilities */
1231
+ __u8 vs_recovery_opc ; /* 016 - Vendor Specific Recovery Opcode */
1232
+ __u8 rsvd1 [3 ]; /* 017 - 3 Reserved Bytes */
1233
+ __le32 vs_cmd_cdw12 ; /* 020 - Vendor Specific Command CDW12 */
1234
+ __le32 vs_cmd_cdw13 ; /* 024 - Vendor Specific Command CDW13 */
1235
+ __u8 vs_cmd_to ; /* 028 - Vendor Specific Command Timeout V2 */
1236
+ __u8 dev_recovery_action2 ; /* 029 - Device Recovery Action 2 V2 */
1237
+ __u8 dev_recovery_action2_to ; /* 030 - Device Recovery Action 2 Timeout V2 */
1238
+ __u8 panic_count ; /* 031 - Number of panics encountered */
1239
+ __le64 prev_panic_ids [4 ]; /* 032 - 063 Previous Panic ID's */
1240
+ __u8 rsvd2 [430 ]; /* 064 - 493 Reserved Bytes */
1241
+ /* 430 reserved bytes aligns with the rest */
1242
+ /* of the data structure. The size of 463 */
1243
+ /* bytes mentioned in the OCP spec */
1244
+ /* (version 2.5) would not fit here. */
1245
+ __le16 log_page_version ; /* 494 - Log Page Version */
1246
+ __u8 log_page_guid [WDC_OCP_C1_GUID_LENGTH ]; /* 496 - Log Page GUID */
1242
1247
};
1243
1248
1244
1249
static __u8 wdc_ocp_c1_guid [WDC_OCP_C1_GUID_LENGTH ] = { 0x44 , 0xD9 , 0x31 , 0x21 , 0xFE , 0x30 , 0x34 , 0xAE ,
@@ -4652,20 +4657,30 @@ static int wdc_print_latency_monitor_log_normal(struct nvme_dev *dev,
4652
4657
printf (" Active Latency Minimum Window %d ms\n" , 100 * log_data -> active_latency_min_window );
4653
4658
printf (" Active Latency Stamp Units %d\n" , le16_to_cpu (log_data -> active_latency_stamp_units ));
4654
4659
printf (" Static Latency Stamp Units %d\n" , le16_to_cpu (log_data -> static_latency_stamp_units ));
4655
- printf (" Debug Log Trigger Enable %d\n" , le16_to_cpu (log_data -> debug_log_trigger_enable ));
4660
+ if (le16_to_cpu (log_data -> log_page_version ) >= 4 )
4661
+ printf (" Debug Telemetry Log Size %" PRIu64 "\n" ,
4662
+ le64_to_cpu (* (uint64_t * )log_data -> debug_telemetry_log_size ));
4663
+ printf (" Debug Log Trigger Enable %d\n" ,
4664
+ le16_to_cpu (log_data -> debug_log_trigger_enable ));
4665
+ printf (" Log Page Version %d\n" ,
4666
+ le16_to_cpu (log_data -> log_page_version ));
4667
+ printf (" Log page GUID 0x" );
4668
+ for (j = 0 ; j < WDC_C3_GUID_LENGTH ; j ++ )
4669
+ printf ("%x" , log_data -> log_page_guid [j ]);
4670
+ printf ("\n" );
4656
4671
4657
4672
printf (" Read Write Deallocate/Trim\n" );
4658
4673
for (i = 0 ; i <= 3 ; i ++ )
4659
4674
printf (" Active Bucket Counter: Bucket %d %27d %27d %27d\n" ,
4660
- i , le32_to_cpu (log_data -> active_bucket_counter [i ][LATENCY_LOG_BUCKET_READ ]),
4661
- le32_to_cpu (log_data -> active_bucket_counter [i ][LATENCY_LOG_BUCKET_WRITE ]),
4662
- le32_to_cpu (log_data -> active_bucket_counter [i ][LATENCY_LOG_BUCKET_TRIM ]));
4675
+ i , le32_to_cpu (log_data -> active_bucket_counter [i ][WDC_LATENCY_LOG_BUCKET_READ ]),
4676
+ le32_to_cpu (log_data -> active_bucket_counter [i ][WDC_LATENCY_LOG_BUCKET_WRITE ]),
4677
+ le32_to_cpu (log_data -> active_bucket_counter [i ][WDC_LATENCY_LOG_BUCKET_TRIM ]));
4663
4678
4664
4679
for (i = 3 ; i >= 0 ; i -- )
4665
4680
printf (" Active Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n" ,
4666
- 3 - i , le16_to_cpu (log_data -> active_measured_latency [i ][LATENCY_LOG_MEASURED_LAT_READ ]),
4667
- le16_to_cpu (log_data -> active_measured_latency [i ][LATENCY_LOG_MEASURED_LAT_WRITE ]),
4668
- le16_to_cpu (log_data -> active_measured_latency [i ][LATENCY_LOG_MEASURED_LAT_TRIM ]));
4681
+ 3 - i , le16_to_cpu (log_data -> active_measured_latency [i ][WDC_LATENCY_LOG_MEASURED_LAT_READ ]),
4682
+ le16_to_cpu (log_data -> active_measured_latency [i ][WDC_LATENCY_LOG_MEASURED_LAT_WRITE ]),
4683
+ le16_to_cpu (log_data -> active_measured_latency [i ][WDC_LATENCY_LOG_MEASURED_LAT_TRIM ]));
4669
4684
4670
4685
for (i = 3 ; i >= 0 ; i -- ) {
4671
4686
printf (" Active Latency Time Stamp: Bucket %d " , 3 - i );
@@ -4682,15 +4697,15 @@ static int wdc_print_latency_monitor_log_normal(struct nvme_dev *dev,
4682
4697
4683
4698
for (i = 0 ; i <= 3 ; i ++ )
4684
4699
printf (" Static Bucket Counter: Bucket %d %27d %27d %27d\n" ,
4685
- i , le32_to_cpu (log_data -> static_bucket_counter [i ][LATENCY_LOG_BUCKET_READ ]),
4686
- le32_to_cpu (log_data -> static_bucket_counter [i ][LATENCY_LOG_BUCKET_WRITE ]),
4687
- le32_to_cpu (log_data -> static_bucket_counter [i ][LATENCY_LOG_BUCKET_TRIM ]));
4700
+ i , le32_to_cpu (log_data -> static_bucket_counter [i ][WDC_LATENCY_LOG_BUCKET_READ ]),
4701
+ le32_to_cpu (log_data -> static_bucket_counter [i ][WDC_LATENCY_LOG_BUCKET_WRITE ]),
4702
+ le32_to_cpu (log_data -> static_bucket_counter [i ][WDC_LATENCY_LOG_BUCKET_TRIM ]));
4688
4703
4689
4704
for (i = 3 ; i >= 0 ; i -- )
4690
4705
printf (" Static Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n" ,
4691
- 3 - i , le16_to_cpu (log_data -> static_measured_latency [i ][LATENCY_LOG_MEASURED_LAT_READ ]),
4692
- le16_to_cpu (log_data -> static_measured_latency [i ][LATENCY_LOG_MEASURED_LAT_WRITE ]),
4693
- le16_to_cpu (log_data -> static_measured_latency [i ][LATENCY_LOG_MEASURED_LAT_TRIM ]));
4706
+ 3 - i , le16_to_cpu (log_data -> static_measured_latency [i ][WDC_LATENCY_LOG_MEASURED_LAT_READ ]),
4707
+ le16_to_cpu (log_data -> static_measured_latency [i ][WDC_LATENCY_LOG_MEASURED_LAT_WRITE ]),
4708
+ le16_to_cpu (log_data -> static_measured_latency [i ][WDC_LATENCY_LOG_MEASURED_LAT_TRIM ]));
4694
4709
4695
4710
for (i = 3 ; i >= 0 ; i -- ) {
4696
4711
printf (" Static Latency Time Stamp: Bucket %d " , 3 - i );
@@ -4726,7 +4741,22 @@ static void wdc_print_latency_monitor_log_json(struct wdc_ssd_latency_monitor_lo
4726
4741
json_object_add_value_int (root , "Active Lantency Minimum Window" , 100 * log_data -> active_latency_min_window );
4727
4742
json_object_add_value_int (root , "Active Latency Stamp Units" , le16_to_cpu (log_data -> active_latency_stamp_units ));
4728
4743
json_object_add_value_int (root , "Static Latency Stamp Units" , le16_to_cpu (log_data -> static_latency_stamp_units ));
4729
- json_object_add_value_int (root , "Debug Log Trigger Enable" , le16_to_cpu (log_data -> debug_log_trigger_enable ));
4744
+ if (le16_to_cpu (log_data -> log_page_version ) >= 4 ) {
4745
+ json_object_add_value_int (root , "Debug Telemetry Log Size" ,
4746
+ le64_to_cpu (* (uint64_t * )log_data -> debug_telemetry_log_size ));
4747
+ }
4748
+ json_object_add_value_int (root , "Debug Log Trigger Enable" ,
4749
+ le16_to_cpu (log_data -> debug_log_trigger_enable ));
4750
+ json_object_add_value_int (root , "Log Page Version" ,
4751
+ le16_to_cpu (log_data -> log_page_version ));
4752
+
4753
+ char guid [40 ];
4754
+
4755
+ memset ((void * )guid , 0 , 40 );
4756
+ sprintf ((char * )guid , "0x%" PRIx64 "%" PRIx64 "" ,
4757
+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data -> log_page_guid [8 ]),
4758
+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data -> log_page_guid [0 ]));
4759
+ json_object_add_value_string (root , "Log page GUID" , guid );
4730
4760
4731
4761
for (i = 0 ; i <= 3 ; i ++ ) {
4732
4762
for (j = 2 ; j >= 0 ; j -- ) {
@@ -4785,20 +4815,29 @@ static void wdc_print_error_rec_log_normal(struct wdc_ocp_c1_error_recovery_log
4785
4815
printf (" Vendor Specific Recovery Opcode : 0x%x\n" , log_data -> vs_recovery_opc );
4786
4816
printf (" Vendor Specific Command CDW12 : 0x%x\n" , le32_to_cpu (log_data -> vs_cmd_cdw12 ));
4787
4817
printf (" Vendor Specific Command CDW13 : 0x%x\n" , le32_to_cpu (log_data -> vs_cmd_cdw13 ));
4788
- if (le16_to_cpu (log_data -> log_page_version ) == WDC_ERROR_REC_LOG_VERSION2 ) {
4818
+ if (le16_to_cpu (log_data -> log_page_version ) >= 2 ) {
4789
4819
printf (" Vendor Specific Command Timeout : 0x%x\n" , log_data -> vs_cmd_to );
4790
4820
printf (" Device Recovery Action 2 : 0x%x\n" , log_data -> dev_recovery_action2 );
4791
4821
printf (" Device Recovery Action 2 Timeout : 0x%x\n" , log_data -> dev_recovery_action2_to );
4792
4822
}
4793
- printf (" Log Page Version : 0x%x\n" , le16_to_cpu (log_data -> log_page_version ));
4794
- printf (" Log page GUID : 0x" );
4823
+ if (le16_to_cpu (log_data -> log_page_version ) >= 3 ) {
4824
+ printf (" Panic Count : 0x%x\n" , log_data -> panic_count );
4825
+ for (j = 0 ; j < 4 ; j ++ )
4826
+ printf (" Previous Panic ID N-%d : 0x%" PRIx64 "\n" ,
4827
+ j + 1 , le64_to_cpu (log_data -> prev_panic_ids [j ]));
4828
+ }
4829
+ printf (" Log Page Version : 0x%x\n" ,
4830
+ le16_to_cpu (log_data -> log_page_version ));
4831
+ printf (" Log page GUID : 0x" );
4795
4832
for (j = 0 ; j < WDC_OCP_C1_GUID_LENGTH ; j ++ )
4796
4833
printf ("%x" , log_data -> log_page_guid [j ]);
4797
4834
printf ("\n" );
4798
4835
}
4799
4836
4800
4837
static void wdc_print_error_rec_log_json (struct wdc_ocp_c1_error_recovery_log * log_data )
4801
4838
{
4839
+ int j ;
4840
+ char buf [128 ];
4802
4841
struct json_object * root = json_create_object ();
4803
4842
4804
4843
json_object_add_value_int (root , "Panic Reset Wait Time" , le16_to_cpu (log_data -> panic_reset_wait_time ));
@@ -4809,12 +4848,21 @@ static void wdc_print_error_rec_log_json(struct wdc_ocp_c1_error_recovery_log *l
4809
4848
json_object_add_value_int (root , "Vendor Specific Recovery Opcode" , log_data -> vs_recovery_opc );
4810
4849
json_object_add_value_int (root , "Vendor Specific Command CDW12" , le32_to_cpu (log_data -> vs_cmd_cdw12 ));
4811
4850
json_object_add_value_int (root , "Vendor Specific Command CDW13" , le32_to_cpu (log_data -> vs_cmd_cdw13 ));
4812
- if (le16_to_cpu (log_data -> log_page_version ) == WDC_ERROR_REC_LOG_VERSION2 ) {
4851
+ if (le16_to_cpu (log_data -> log_page_version ) >= 2 ) {
4813
4852
json_object_add_value_int (root , "Vendor Specific Command Timeout" , log_data -> vs_cmd_to );
4814
4853
json_object_add_value_int (root , "Device Recovery Action 2" , log_data -> dev_recovery_action2 );
4815
4854
json_object_add_value_int (root , "Device Recovery Action 2 Timeout" , log_data -> dev_recovery_action2_to );
4816
4855
}
4817
- json_object_add_value_int (root , "Log Page Version" , le16_to_cpu (log_data -> log_page_version ));
4856
+ if (le16_to_cpu (log_data -> log_page_version ) >= 3 ) {
4857
+ json_object_add_value_int (root , "Panic Count" , log_data -> panic_count );
4858
+ for (j = 0 ; j < 4 ; j ++ ) {
4859
+ sprintf (buf , "Previous Panic ID N-%d" , j + 1 );
4860
+ json_object_add_value_int (root , buf ,
4861
+ le64_to_cpu (log_data -> prev_panic_ids [j ]));
4862
+ }
4863
+ }
4864
+ json_object_add_value_int (root , "Log Page Version" ,
4865
+ le16_to_cpu (log_data -> log_page_version ));
4818
4866
4819
4867
char guid [40 ];
4820
4868
@@ -7351,9 +7399,10 @@ static int wdc_get_ocp_c1_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo
7351
7399
log_data = (struct wdc_ocp_c1_error_recovery_log * )data ;
7352
7400
7353
7401
/* check log page version */
7354
- if ((log_data -> log_page_version != WDC_ERROR_REC_LOG_VERSION1 ) &&
7355
- (log_data -> log_page_version != WDC_ERROR_REC_LOG_VERSION2 )) {
7356
- fprintf (stderr , "ERROR: WDC: invalid error recovery log version - %d\n" , log_data -> log_page_version );
7402
+ if ((log_data -> log_page_version < 1 ) ||
7403
+ (log_data -> log_page_version > 3 )) {
7404
+ fprintf (stderr , "ERROR: WDC: invalid error recovery log version - %d\n" ,
7405
+ log_data -> log_page_version );
7357
7406
ret = -1 ;
7358
7407
goto out ;
7359
7408
}
0 commit comments