diff options
Diffstat (limited to 'plugins/wdc')
-rw-r--r-- | plugins/wdc/wdc-nvme.c | 5932 | ||||
-rw-r--r-- | plugins/wdc/wdc-utils.c | 14 |
2 files changed, 3026 insertions, 2920 deletions
diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 2d5d173..ec3f2b0 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -20,7 +20,7 @@ * Author: Chaitanya Kulkarni <chaitanya.kulkarni@hgst.com>, * Dong Ho <dong.ho@hgst.com>, * Jeff Lien <jeff.lien@wdc.com> - * Brandon Paupore <brandon.paupore@wdc.com> + * Brandon Paupore <brandon.paupore@wdc.com> */ #include <stdio.h> #include <string.h> @@ -51,7 +51,7 @@ #define WDC_NVME_LOG_SIZE_HDR_LEN 0x08 /* Enclosure */ -#define WDC_OPENFLEX_MI_DEVICE_MODEL "OpenFlex" +#define WDC_OPENFLEX_MI_DEVICE_MODEL "OpenFlex" #define WDC_RESULT_MORE_DATA 0x80000000 #define WDC_RESULT_NOT_AVAILABLE 0x7FFFFFFF @@ -69,40 +69,41 @@ #define WDC_NVME_SN640_DEV_ID 0x2400 #define WDC_NVME_SN640_DEV_ID_1 0x2401 #define WDC_NVME_SN640_DEV_ID_2 0x2402 -#define WDC_NVME_SN640_DEV_ID_3 0x2404 -#define WDC_NVME_ZN540_DEV_ID 0x2600 -#define WDC_NVME_SN540_DEV_ID 0x2610 +#define WDC_NVME_SN640_DEV_ID_3 0x2404 +#define WDC_NVME_ZN540_DEV_ID 0x2600 +#define WDC_NVME_SN540_DEV_ID 0x2610 #define WDC_NVME_SN650_DEV_ID 0x2700 -#define WDC_NVME_SN650_DEV_ID_1 0x2701 -#define WDC_NVME_SN650_DEV_ID_2 0x2702 -#define WDC_NVME_SN650_DEV_ID_3 0x2720 -#define WDC_NVME_SN650_DEV_ID_4 0x2721 -#define WDC_NVME_SN655_DEV_ID 0x2722 -#define WDC_NVME_SN860_DEV_ID 0x2730 -#define WDC_NVME_SN660_DEV_ID 0x2704 +#define WDC_NVME_SN650_DEV_ID_1 0x2701 +#define WDC_NVME_SN650_DEV_ID_2 0x2702 +#define WDC_NVME_SN650_DEV_ID_3 0x2720 +#define WDC_NVME_SN650_DEV_ID_4 0x2721 +#define WDC_NVME_SN655_DEV_ID 0x2722 +#define WDC_NVME_SN860_DEV_ID 0x2730 +#define WDC_NVME_SN660_DEV_ID 0x2704 /* This id's are no longer supported, delete ?? */ -#define WDC_NVME_SN550_DEV_ID 0x2708 -#define WDC_NVME_SN560_DEV_ID_1 0x2712 -#define WDC_NVME_SN560_DEV_ID_2 0x2713 -#define WDC_NVME_SN560_DEV_ID_3 0x2714 +#define WDC_NVME_SN550_DEV_ID 0x2708 +#define WDC_NVME_SN560_DEV_ID_1 0x2712 +#define WDC_NVME_SN560_DEV_ID_2 0x2713 +#define WDC_NVME_SN560_DEV_ID_3 0x2714 #define WDC_NVME_SXSLCL_DEV_ID 0x2001 #define WDC_NVME_SN520_DEV_ID 0x5003 #define WDC_NVME_SN520_DEV_ID_1 0x5004 #define WDC_NVME_SN520_DEV_ID_2 0x5005 #define WDC_NVME_SN530_DEV_ID 0x5009 +#define WDC_NVME_SN530_DEV_ID_1 0x501d #define WDC_NVME_SN720_DEV_ID 0x5002 #define WDC_NVME_SN730A_DEV_ID 0x5006 #define WDC_NVME_SN740_DEV_ID 0x5015 -#define WDC_NVME_SN740_DEV_ID_1 0x5016 -#define WDC_NVME_SN740_DEV_ID_2 0x5017 -#define WDC_NVME_SN740_DEV_ID_3 0x5025 +#define WDC_NVME_SN740_DEV_ID_1 0x5016 +#define WDC_NVME_SN740_DEV_ID_2 0x5017 +#define WDC_NVME_SN740_DEV_ID_3 0x5025 #define WDC_NVME_SN340_DEV_ID 0x500d #define WDC_NVME_ZN350_DEV_ID 0x5010 -#define WDC_NVME_ZN350_DEV_ID_1 0x5018 +#define WDC_NVME_ZN350_DEV_ID_1 0x5018 #define WDC_NVME_SN810_DEV_ID 0x5011 -#define WDC_NVME_SN820CL_DEV_ID 0x5037 +#define WDC_NVME_SN820CL_DEV_ID 0x5037 #define WDC_DRIVE_CAP_CAP_DIAG 0x0000000000000001 #define WDC_DRIVE_CAP_INTERNAL_LOG 0x0000000000000002 @@ -114,49 +115,53 @@ #define WDC_DRIVE_CAP_CLEAR_PCIE 0x0000000000000080 #define WDC_DRIVE_CAP_RESIZE 0x0000000000000100 #define WDC_DRIVE_CAP_NAND_STATS 0x0000000000000200 -#define WDC_DRIVE_CAP_DRIVE_LOG 0x0000000000000400 -#define WDC_DRIVE_CAP_CRASH_DUMP 0x0000000000000800 -#define WDC_DRIVE_CAP_PFAIL_DUMP 0x0000000000001000 -#define WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY 0x0000000000002000 -#define WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY 0x0000000000004000 -#define WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG 0x0000000000008000 -#define WDC_DRIVE_CAP_REASON_ID 0x0000000000010000 -#define WDC_DRIVE_CAP_LOG_PAGE_DIR 0x0000000000020000 -#define WDC_DRIVE_CAP_NS_RESIZE 0x0000000000040000 -#define WDC_DRIVE_CAP_INFO 0x0000000000080000 -#define WDC_DRIVE_CAP_C0_LOG_PAGE 0x0000000000100000 -#define WDC_DRIVE_CAP_TEMP_STATS 0x0000000000200000 -#define WDC_DRIVE_CAP_VUC_CLEAR_PCIE 0x0000000000400000 -#define WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE 0x0000000000800000 -#define WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2 0x0000000001000000 +#define WDC_DRIVE_CAP_DRIVE_LOG 0x0000000000000400 +#define WDC_DRIVE_CAP_CRASH_DUMP 0x0000000000000800 +#define WDC_DRIVE_CAP_PFAIL_DUMP 0x0000000000001000 +#define WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY 0x0000000000002000 +#define WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY 0x0000000000004000 +#define WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG 0x0000000000008000 +#define WDC_DRIVE_CAP_REASON_ID 0x0000000000010000 +#define WDC_DRIVE_CAP_LOG_PAGE_DIR 0x0000000000020000 +#define WDC_DRIVE_CAP_NS_RESIZE 0x0000000000040000 +#define WDC_DRIVE_CAP_INFO 0x0000000000080000 +#define WDC_DRIVE_CAP_C0_LOG_PAGE 0x0000000000100000 +#define WDC_DRIVE_CAP_TEMP_STATS 0x0000000000200000 +#define WDC_DRIVE_CAP_VUC_CLEAR_PCIE 0x0000000000400000 +#define WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE 0x0000000000800000 +#define WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2 0x0000000001000000 #define WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY 0x0000000002000000 -#define WDC_DRIVE_CAP_CLOUD_SSD_VERSION 0x0000000004000000 +#define WDC_DRIVE_CAP_CLOUD_SSD_VERSION 0x0000000004000000 #define WDC_DRIVE_CAP_PCIE_STATS 0x0000000008000000 -#define WDC_DRIVE_CAP_HW_REV_LOG_PAGE 0x0000000010000000 +#define WDC_DRIVE_CAP_HW_REV_LOG_PAGE 0x0000000010000000 #define WDC_DRIVE_CAP_C3_LOG_PAGE 0x0000000020000000 #define WDC_DRIVE_CAP_CLOUD_BOOT_SSD_VERSION 0x0000000040000000 -#define WDC_DRIVE_CAP_CLOUD_LOG_PAGE 0x0000000080000000 +#define WDC_DRIVE_CAP_CLOUD_LOG_PAGE 0x0000000080000000 -#define WDC_DRIVE_CAP_DRIVE_ESSENTIALS 0x0000000100000000 +#define WDC_DRIVE_CAP_DRIVE_ESSENTIALS 0x0000000100000000 #define WDC_DRIVE_CAP_DUI_DATA 0x0000000200000000 #define WDC_SN730B_CAP_VUC_LOG 0x0000000400000000 -#define WDC_DRIVE_CAP_DUI 0x0000000800000000 -#define WDC_DRIVE_CAP_PURGE 0x0000001000000000 -#define WDC_DRIVE_CAP_OCP_C1_LOG_PAGE 0x0000002000000000 -#define WDC_DRIVE_CAP_OCP_C4_LOG_PAGE 0x0000004000000000 -#define WDC_DRIVE_CAP_OCP_C5_LOG_PAGE 0x0000008000000000 -#define WDC_DRIVE_CAP_DEVICE_WAF 0x0000010000000000 -#define WDC_DRIVE_CAP_SMART_LOG_MASK (WDC_DRIVE_CAP_C0_LOG_PAGE | WDC_DRIVE_CAP_C1_LOG_PAGE | \ - WDC_DRIVE_CAP_CA_LOG_PAGE | WDC_DRIVE_CAP_D0_LOG_PAGE) -#define WDC_DRIVE_CAP_CLEAR_PCIE_MASK (WDC_DRIVE_CAP_CLEAR_PCIE | \ - WDC_DRIVE_CAP_VUC_CLEAR_PCIE | \ - WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE) +#define WDC_DRIVE_CAP_DUI 0x0000000800000000 +#define WDC_DRIVE_CAP_PURGE 0x0000001000000000 +#define WDC_DRIVE_CAP_OCP_C1_LOG_PAGE 0x0000002000000000 +#define WDC_DRIVE_CAP_OCP_C4_LOG_PAGE 0x0000004000000000 +#define WDC_DRIVE_CAP_OCP_C5_LOG_PAGE 0x0000008000000000 +#define WDC_DRIVE_CAP_DEVICE_WAF 0x0000010000000000 +#define WDC_DRIVE_CAP_SMART_LOG_MASK (WDC_DRIVE_CAP_C0_LOG_PAGE | \ + WDC_DRIVE_CAP_C1_LOG_PAGE | \ + WDC_DRIVE_CAP_CA_LOG_PAGE | \ + WDC_DRIVE_CAP_D0_LOG_PAGE) +#define WDC_DRIVE_CAP_CLEAR_PCIE_MASK (WDC_DRIVE_CAP_CLEAR_PCIE | \ + WDC_DRIVE_CAP_VUC_CLEAR_PCIE | \ + WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE) #define WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_MASK (WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY | \ - WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2) + WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2) #define WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY_MASK (WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY | \ - WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY) -#define WDC_DRIVE_CAP_INTERNAL_LOG_MASK (WDC_DRIVE_CAP_INTERNAL_LOG | WDC_DRIVE_CAP_DUI | \ - WDC_DRIVE_CAP_DUI_DATA | WDC_SN730B_CAP_VUC_LOG) + WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY) +#define WDC_DRIVE_CAP_INTERNAL_LOG_MASK (WDC_DRIVE_CAP_INTERNAL_LOG | \ + WDC_DRIVE_CAP_DUI | \ + WDC_DRIVE_CAP_DUI_DATA | \ + WDC_SN730B_CAP_VUC_LOG) /* SN730 Get Log Capabilities */ #define SN730_NVME_GET_LOG_OPCODE 0xc2 #define SN730_GET_FULL_LOG_LENGTH 0x00080009 @@ -171,9 +176,9 @@ #define SN730_LOG_CHUNK_SIZE 0x1000 /* Customer ID's */ -#define WDC_CUSTOMER_ID_GN 0x0001 -#define WDC_CUSTOMER_ID_GD 0x0101 -#define WDC_CUSTOMER_ID_BD 0x1009 +#define WDC_CUSTOMER_ID_GN 0x0001 +#define WDC_CUSTOMER_ID_GD 0x0101 +#define WDC_CUSTOMER_ID_BD 0x1009 #define WDC_CUSTOMER_ID_0x1005 0x1005 @@ -182,27 +187,27 @@ #define WDC_CUSTOMER_ID_0x1304 0x1304 #define WDC_INVALID_CUSTOMER_ID -1 -#define WDC_ALL_PAGE_MASK 0xFFFF -#define WDC_C0_PAGE_MASK 0x0001 -#define WDC_C1_PAGE_MASK 0x0002 -#define WDC_CA_PAGE_MASK 0x0004 -#define WDC_D0_PAGE_MASK 0x0008 +#define WDC_ALL_PAGE_MASK 0xFFFF +#define WDC_C0_PAGE_MASK 0x0001 +#define WDC_C1_PAGE_MASK 0x0002 +#define WDC_CA_PAGE_MASK 0x0004 +#define WDC_D0_PAGE_MASK 0x0008 /* Drive Resize */ #define WDC_NVME_DRIVE_RESIZE_OPCODE 0xCC #define WDC_NVME_DRIVE_RESIZE_CMD 0x03 #define WDC_NVME_DRIVE_RESIZE_SUBCMD 0x01 -/* Namespace Resize */ -#define WDC_NVME_NAMESPACE_RESIZE_OPCODE 0xFB +/* Namespace Resize */ +#define WDC_NVME_NAMESPACE_RESIZE_OPCODE 0xFB /* Drive Info */ -#define WDC_NVME_DRIVE_INFO_OPCODE 0xC6 -#define WDC_NVME_DRIVE_INFO_CMD 0x22 -#define WDC_NVME_DRIVE_INFO_SUBCMD 0x06 +#define WDC_NVME_DRIVE_INFO_OPCODE 0xC6 +#define WDC_NVME_DRIVE_INFO_CMD 0x22 +#define WDC_NVME_DRIVE_INFO_SUBCMD 0x06 /* VS PCIE Stats */ -#define WDC_NVME_PCIE_STATS_OPCODE 0xD1 +#define WDC_NVME_PCIE_STATS_OPCODE 0xD1 /* Capture Diagnostics */ #define WDC_NVME_CAP_DIAG_HEADER_TOC_SIZE WDC_NVME_LOG_SIZE_DATA_LEN @@ -217,19 +222,19 @@ /* Capture Device Unit Info */ #define WDC_NVME_CAP_DUI_HEADER_SIZE 0x400 #define WDC_NVME_CAP_DUI_OPCODE 0xFA -#define WDC_NVME_CAP_DUI_DISABLE_IO 0x01 +#define WDC_NVME_CAP_DUI_DISABLE_IO 0x01 #define WDC_NVME_DUI_MAX_SECTION 0x3A #define WDC_NVME_DUI_MAX_SECTION_V2 0x26 #define WDC_NVME_DUI_MAX_SECTION_V3 0x23 #define WDC_NVME_DUI_MAX_DATA_AREA 0x05 -#define WDC_NVME_SN730_SECTOR_SIZE 512 +#define WDC_NVME_SN730_SECTOR_SIZE 512 -/* Telemtery types for vs-internal-log command */ -#define WDC_TELEMETRY_TYPE_NONE 0x0 -#define WDC_TELEMETRY_TYPE_HOST 0x1 -#define WDC_TELEMETRY_TYPE_CONTROLLER 0x2 -#define WDC_TELEMETRY_HEADER_LENGTH 512 -#define WDC_TELEMETRY_BLOCK_SIZE 512 +/* Telemtery types for vs-internal-log command */ +#define WDC_TELEMETRY_TYPE_NONE 0x0 +#define WDC_TELEMETRY_TYPE_HOST 0x1 +#define WDC_TELEMETRY_TYPE_CONTROLLER 0x2 +#define WDC_TELEMETRY_HEADER_LENGTH 512 +#define WDC_TELEMETRY_BLOCK_SIZE 512 /* Crash dump */ #define WDC_NVME_CRASH_DUMP_SIZE_DATA_LEN WDC_NVME_LOG_SIZE_DATA_LEN @@ -284,7 +289,7 @@ #define WDC_NVME_CLEAR_PF_CRASH_DUMP_SUBCMD 0x06 /* Clear FW Activate History */ -#define WDC_NVME_CLEAR_FW_ACT_HIST_OPCODE 0xC6 +#define WDC_NVME_CLEAR_FW_ACT_HIST_OPCODE 0xC6 #define WDC_NVME_CLEAR_FW_ACT_HIST_CMD 0x23 #define WDC_NVME_CLEAR_FW_ACT_HIST_SUBCMD 0x05 #define WDC_NVME_CLEAR_FW_ACT_HIST_VU_FID 0xC1 @@ -297,10 +302,10 @@ /* C2 Log Page */ #define WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE 0xC2 -#define WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE_C8 0xC8 +#define WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE_C8 0xC8 #define WDC_C2_LOG_BUF_LEN 0x1000 #define WDC_C2_LOG_PAGES_SUPPORTED_ID 0x08 -#define WDC_C2_CUSTOMER_ID_ID 0x15 +#define WDC_C2_CUSTOMER_ID_ID 0x15 #define WDC_C2_THERMAL_THROTTLE_STATUS_ID 0x18 #define WDC_C2_ASSERT_DUMP_PRESENT_ID 0x19 #define WDC_C2_USER_EOL_STATUS_ID 0x1A @@ -321,69 +326,72 @@ /* CA Log Page */ #define WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE 0xCA -#define WDC_FB_CA_LOG_BUF_LEN 0x80 -#define WDC_BD_CA_LOG_BUF_LEN 0xA0 /* Added 4 padding bytes to resolve build warning messages */ +#define WDC_FB_CA_LOG_BUF_LEN 0x80 +/* Added 4 padding bytes to resolve build warning messages */ +#define WDC_BD_CA_LOG_BUF_LEN 0xA0 /* C0 EOL Status Log Page */ #define WDC_NVME_GET_EOL_STATUS_LOG_OPCODE 0xC0 -#define WDC_NVME_EOL_STATUS_LOG_LEN 0x200 +#define WDC_NVME_EOL_STATUS_LOG_LEN 0x200 #define WDC_NVME_SMART_CLOUD_ATTR_LEN 0x200 /* C0 SMART Cloud Attributes Log Page*/ -#define WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID 0xC0 +#define WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID 0xC0 /* CB - FW Activate History Log Page */ -#define WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID 0xCB -#define WDC_FW_ACT_HISTORY_LOG_BUF_LEN 0x3d0 +#define WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID 0xCB +#define WDC_FW_ACT_HISTORY_LOG_BUF_LEN 0x3d0 /* C2 - FW Activation History Log Page */ -#define WDC_NVME_GET_FW_ACT_HISTORY_C2_LOG_ID 0xC2 -#define WDC_FW_ACT_HISTORY_C2_LOG_BUF_LEN 0x1000 -#define WDC_MAX_NUM_ACT_HIST_ENTRIES 20 -#define WDC_C2_GUID_LENGTH 16 +#define WDC_NVME_GET_FW_ACT_HISTORY_C2_LOG_ID 0xC2 +#define WDC_FW_ACT_HISTORY_C2_LOG_BUF_LEN 0x1000 +#define WDC_MAX_NUM_ACT_HIST_ENTRIES 20 +#define WDC_C2_GUID_LENGTH 16 /* C3 Latency Monitor Log Page */ -#define WDC_LATENCY_MON_LOG_BUF_LEN 0x200 -#define WDC_LATENCY_MON_LOG_ID 0xC3 -#define WDC_LATENCY_MON_VERSION 0x0001 - -#define WDC_C3_GUID_LENGTH 16 -static __u8 wdc_lat_mon_guid[WDC_C3_GUID_LENGTH] = { 0x92, 0x7a, 0xc0, 0x8c, 0xd0, 0x84, 0x6c, 0x9c, - 0x70, 0x43, 0xe6, 0xd4, 0x58, 0x5e, 0xd4, 0x85 }; +#define WDC_LATENCY_MON_LOG_BUF_LEN 0x200 +#define WDC_LATENCY_MON_LOG_ID 0xC3 +#define WDC_LATENCY_MON_VERSION 0x0001 + +#define WDC_C3_GUID_LENGTH 16 +static __u8 wdc_lat_mon_guid[WDC_C3_GUID_LENGTH] = { + 0x92, 0x7a, 0xc0, 0x8c, 0xd0, 0x84, 0x6c, 0x9c, + 0x70, 0x43, 0xe6, 0xd4, 0x58, 0x5e, 0xd4, 0x85 +}; /* D0 Smart Log Page */ #define WDC_NVME_GET_VU_SMART_LOG_OPCODE 0xD0 -#define WDC_NVME_VU_SMART_LOG_LEN 0x200 - -/* Log Page Directory defines */ -#define NVME_LOG_PERSISTENT_EVENT 0x0D -#define WDC_LOG_ID_C0 0xC0 -#define WDC_LOG_ID_C1 0xC1 -#define WDC_LOG_ID_C2 WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE -#define WDC_LOG_ID_C3 0xC3 -#define WDC_LOG_ID_C4 0xC4 -#define WDC_LOG_ID_C5 0xC5 -#define WDC_LOG_ID_C6 0xC6 -#define WDC_LOG_ID_C8 WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE_C8 -#define WDC_LOG_ID_CA WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE -#define WDC_LOG_ID_CB WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID -#define WDC_LOG_ID_D0 WDC_NVME_GET_VU_SMART_LOG_OPCODE -#define WDC_LOG_ID_D1 0xD1 -#define WDC_LOG_ID_D6 0xD6 -#define WDC_LOG_ID_D7 0xD7 -#define WDC_LOG_ID_D8 0xD8 -#define WDC_LOG_ID_DE 0xDE -#define WDC_LOG_ID_F0 0xF0 -#define WDC_LOG_ID_F1 0xF1 -#define WDC_LOG_ID_F2 0xF2 -#define WDC_LOG_ID_FA 0xFA +#define WDC_NVME_VU_SMART_LOG_LEN 0x200 + +/* Log Page Directory defines */ +#define NVME_LOG_PERSISTENT_EVENT 0x0D +#define WDC_LOG_ID_C0 0xC0 +#define WDC_LOG_ID_C1 0xC1 +#define WDC_LOG_ID_C2 WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE +#define WDC_LOG_ID_C3 0xC3 +#define WDC_LOG_ID_C4 0xC4 +#define WDC_LOG_ID_C5 0xC5 +#define WDC_LOG_ID_C6 0xC6 +#define WDC_LOG_ID_C8 WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE_C8 +#define WDC_LOG_ID_CA WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE +#define WDC_LOG_ID_CB WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID +#define WDC_LOG_ID_D0 WDC_NVME_GET_VU_SMART_LOG_OPCODE +#define WDC_LOG_ID_D1 0xD1 +#define WDC_LOG_ID_D6 0xD6 +#define WDC_LOG_ID_D7 0xD7 +#define WDC_LOG_ID_D8 0xD8 +#define WDC_LOG_ID_DE 0xDE +#define WDC_LOG_ID_F0 0xF0 +#define WDC_LOG_ID_F1 0xF1 +#define WDC_LOG_ID_F2 0xF2 +#define WDC_LOG_ID_FA 0xFA /* Clear PCIe Correctable Errors */ -#define WDC_NVME_CLEAR_PCIE_CORR_OPCODE WDC_NVME_CAP_DIAG_CMD_OPCODE -#define WDC_NVME_CLEAR_PCIE_CORR_CMD 0x22 -#define WDC_NVME_CLEAR_PCIE_CORR_SUBCMD 0x04 -#define WDC_NVME_CLEAR_PCIE_CORR_OPCODE_VUC 0xD2 -#define WDC_NVME_CLEAR_PCIE_CORR_FEATURE_ID 0xC3 +#define WDC_NVME_CLEAR_PCIE_CORR_OPCODE WDC_NVME_CAP_DIAG_CMD_OPCODE +#define WDC_NVME_CLEAR_PCIE_CORR_CMD 0x22 +#define WDC_NVME_CLEAR_PCIE_CORR_SUBCMD 0x04 +#define WDC_NVME_CLEAR_PCIE_CORR_OPCODE_VUC 0xD2 +#define WDC_NVME_CLEAR_PCIE_CORR_FEATURE_ID 0xC3 /* Clear Assert Dump Status */ #define WDC_NVME_CLEAR_ASSERT_DUMP_OPCODE 0xD8 #define WDC_NVME_CLEAR_ASSERT_DUMP_CMD 0x03 @@ -423,52 +431,49 @@ static __u8 wdc_lat_mon_guid[WDC_C3_GUID_LENGTH] = { 0x92, 0x7a, 0xc0, 0x8c, #define WDC_DE_DESTN_SPI 1 #define WDC_DE_DUMPTRACE_DESTINATION 6 -#define NVME_ID_CTRL_MODEL_NUMBER_SIZE 40 -#define NVME_ID_CTRL_SERIAL_NUMBER_SIZE 20 +#define NVME_ID_CTRL_MODEL_NUMBER_SIZE 40 +#define NVME_ID_CTRL_SERIAL_NUMBER_SIZE 20 /* Enclosure log */ -#define WDC_NVME_ENC_LOG_SIZE_CHUNK 0x1000 -#define WDC_NVME_ENC_NIC_LOG_SIZE 0x400000 +#define WDC_NVME_ENC_LOG_SIZE_CHUNK 0x1000 +#define WDC_NVME_ENC_NIC_LOG_SIZE 0x400000 /* Enclosure nic crash dump get-log id */ -#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_1 0xD1 -#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_2 0xD2 -#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_3 0xD3 -#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_4 0xD4 -#define WDC_ENC_CRASH_DUMP_ID 0xE4 -#define WDC_ENC_LOG_DUMP_ID 0xE2 - -typedef enum _NVME_FEATURES_SELECT -{ - FS_CURRENT = 0, - FS_DEFAULT = 1, - FS_SAVED = 2, - FS_SUPPORTED_CAPBILITIES = 3 -} NVME_FEATURES_SELECT; - -typedef enum _NVME_FEATURE_IDENTIFIERS -{ - FID_ARBITRATION = 0x01, - FID_POWER_MANAGEMENT = 0x02, - FID_LBA_RANGE_TYPE = 0x03, - FID_TEMPERATURE_THRESHOLD = 0x04, - FID_ERROR_RECOVERY = 0x05, - FID_VOLATILE_WRITE_CACHE = 0x06, - FID_NUMBER_OF_QUEUES = 0x07, - FID_INTERRUPT_COALESCING = 0x08, - FID_INTERRUPT_VECTOR_CONFIGURATION = 0x09, - FID_WRITE_ATOMICITY = 0x0A, - FID_ASYNCHRONOUS_EVENT_CONFIGURATION = 0x0B, - FID_AUTONOMOUS_POWER_STATE_TRANSITION = 0x0C, -/*Below FID's are NVM Command Set Specific*/ - FID_SOFTWARE_PROGRESS_MARKER = 0x80, - FID_HOST_IDENTIFIER = 0x81, - FID_RESERVATION_NOTIFICATION_MASK = 0x82, - FID_RESERVATION_PERSISTENCE = 0x83 -} NVME_FEATURE_IDENTIFIERS; - -typedef enum -{ +#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_1 0xD1 +#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_2 0xD2 +#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_3 0xD3 +#define WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_4 0xD4 +#define WDC_ENC_CRASH_DUMP_ID 0xE4 +#define WDC_ENC_LOG_DUMP_ID 0xE2 + +enum _NVME_FEATURES_SELECT { + FS_CURRENT = 0, + FS_DEFAULT = 1, + FS_SAVED = 2, + FS_SUPPORTED_CAPBILITIES = 3 +}; + +enum NVME_FEATURE_IDENTIFIERS { + FID_ARBITRATION = 0x01, + FID_POWER_MANAGEMENT = 0x02, + FID_LBA_RANGE_TYPE = 0x03, + FID_TEMPERATURE_THRESHOLD = 0x04, + FID_ERROR_RECOVERY = 0x05, + FID_VOLATILE_WRITE_CACHE = 0x06, + FID_NUMBER_OF_QUEUES = 0x07, + FID_INTERRUPT_COALESCING = 0x08, + FID_INTERRUPT_VECTOR_CONFIGURATION = 0x09, + FID_WRITE_ATOMICITY = 0x0A, + FID_ASYNCHRONOUS_EVENT_CONFIGURATION = 0x0B, + FID_AUTONOMOUS_POWER_STATE_TRANSITION = 0x0C, + /*Below FID's are NVM Command Set Specific*/ + FID_SOFTWARE_PROGRESS_MARKER = 0x80, + FID_HOST_IDENTIFIER = 0x81, + FID_RESERVATION_NOTIFICATION_MASK = 0x82, + FID_RESERVATION_PERSISTENCE = 0x83 +}; + +enum WDC_DRIVE_ESSENTIAL_TYPE { WDC_DE_TYPE_IDENTIFY = 0x1, WDC_DE_TYPE_SMARTATTRIBUTEDUMP = 0x2, WDC_DE_TYPE_EVENTLOG = 0x4, @@ -496,13 +501,12 @@ typedef enum WDC_DE_TYPE_NVME_MANF_INFO = 0x2000000, WDC_DE_TYPE_NONE = 0x1000000, WDC_DE_TYPE_ALL = 0xFFFFFFF, -} WDC_DRIVE_ESSENTIAL_TYPE; +}; #define WDC_C0_GUID_LENGTH 16 #define WDC_SCA_V1_NAND_STATS 0x1 #define WDC_SCA_V1_ALL 0xF -typedef enum -{ +enum { SCAO_V1_PMUWT = 0, /* Physical media units written TLC */ SCAO_V1_PMUWS = 16, /* Physical media units written SLC */ SCAO_V1_BUNBN = 32, /* Bad user nand blocks normalized */ @@ -528,7 +532,7 @@ typedef enum SCAO_V1_SVN = 160, /* Security Version Number */ SCAO_V1_PFBS = 168, /* Percent free blocks (System) */ SCAO_V1_DCC = 172, /* Deallocate Commands Completed */ - SCAO_V1_TNU = 188, /* Total Namespace Utilization */ + SCAO_V1_TNU = 188, /* Total Namespace Utilization */ SCAO_V1_FCC = 196, /* Format NVM Commands Completed */ SCAO_V1_BBPG = 198, /* Background Back-Pressure Gauge */ SCAO_V1_SEEC = 202, /* Soft ECC error count */ @@ -548,18 +552,19 @@ typedef enum SCAO_V1_MIVF = 302, /* Boot SSD minor version field */ SCAO_V1_PVF = 304, /* Boot SSD point version field */ SCAO_V1_EVF = 306, /* Boot SSD errata version field */ - SCAO_V1_FTLUS = 308, /* FTL Unit Size */ + SCAO_V1_FTLUS = 308, /* FTL Unit Size */ SCAO_V1_TCGOS = 312, /* TCG Ownership Status */ SCAO_V1_LPV = 494, /* Log page version - 0x0001 */ SCAO_V1_LPG = 496, /* Log page GUID */ -} SMART_CLOUD_ATTRIBUTE_OFFSETS_V1; +}; -static __u8 ext_smart_guid[WDC_C0_GUID_LENGTH] = { 0x65, 0x43, 0x88, 0x78, 0xAC, 0xD8, 0x78, 0xA1, - 0x66, 0x42, 0x1E, 0x0F, 0x92, 0xD7, 0x6D, 0xC4 }; +static __u8 ext_smart_guid[WDC_C0_GUID_LENGTH] = { + 0x65, 0x43, 0x88, 0x78, 0xAC, 0xD8, 0x78, 0xA1, + 0x66, 0x42, 0x1E, 0x0F, 0x92, 0xD7, 0x6D, 0xC4 +}; -typedef struct __attribute__((__packed__)) wdc_nvme_ext_smart_log -{ +struct __packed wdc_nvme_ext_smart_log { __u8 ext_smart_pmuwt[16]; /* 000 Physical media units written TLC */ __u8 ext_smart_pmuws[16]; /* 016 Physical media units written SLC */ __u8 ext_smart_bunbc[8]; /* 032 Bad user nand block count */ @@ -576,8 +581,8 @@ typedef struct __attribute__((__packed__)) wdc_nvme_ext_smart_log __u64 ext_smart_mnec; /* 108 Min Erase counts (SLC) */ __u64 ext_smart_mxec; /* 116 Max Erase counts (SLC) */ __u64 ext_smart_avec; /* 124 Average Erase counts (SLC) */ - __u8 ext_smart_pfc[8]; /* 132 Program fail count */ - __u8 ext_smart_efc[8]; /* 140 Erase fail count */ + __u8 ext_smart_pfc[8]; /* 132 Program fail count */ + __u8 ext_smart_efc[8]; /* 140 Erase fail count */ __u64 ext_smart_pcec; /* 148 PCIe correctable error count */ __u8 ext_smart_pfbu; /* 156 Percent free blocks (User) */ __u8 ext_smart_rsvd2[3]; /* 157 reserved */ @@ -585,17 +590,17 @@ typedef struct __attribute__((__packed__)) wdc_nvme_ext_smart_log __u8 ext_smart_pfbs; /* 168 Percent free blocks (System) */ __u8 ext_smart_rsvd3[3]; /* 169 reserved */ __u8 ext_smart_dcc[16]; /* 172 Deallocate Commands Completed */ - __u64 ext_smart_tnu; /* 188 Total Namespace Utilization */ - __u16 ext_smart_fcc; /* 196 Format NVM Commands Completed */ + __u64 ext_smart_tnu; /* 188 Total Namespace Utilization */ + __u16 ext_smart_fcc; /* 196 Format NVM Commands Completed */ __u8 ext_smart_bbpg; /* 198 Background Back-Pressure Gauge */ __u8 ext_smart_rsvd4[3]; /* 199 reserved */ __u64 ext_smart_seec; /* 202 Soft ECC error count */ __u64 ext_smart_rfsc; /* 210 Refresh count */ __u8 ext_smart_bsnbc[8]; /* 218 Bad system nand block count */ __u8 ext_smart_eest[16]; /* 226 Endurance estimate */ - __u16 ext_smart_ttc; /* 242 Thermal throttling count */ + __u16 ext_smart_ttc; /* 242 Thermal throttling count */ __u64 ext_smart_uio; /* 244 Unaligned I/O */ - __u8 ext_smart_pmur[16]; /* 252 Physical media units read */ + __u8 ext_smart_pmur[16]; /* 252 Physical media units read */ __u32 ext_smart_rtoc; /* 268 Read command timeout count */ __u32 ext_smart_wtoc; /* 272 Write command timeout count */ __u32 ext_smart_ttoc; /* 276 Trim command timeout count */ @@ -604,144 +609,141 @@ typedef struct __attribute__((__packed__)) wdc_nvme_ext_smart_log __u64 ext_smart_pscc; /* 292 Power State Change Count */ __u16 ext_smart_maj; /* 300 Boot SSD major version field */ __u16 ext_smart_min; /* 302 Boot SSD minor version field */ - __u16 ext_smart_pt; /* 304 Boot SSD point version field */ + __u16 ext_smart_pt; /* 304 Boot SSD point version field */ __u16 ext_smart_err; /* 306 Boot SSD errata version field */ - __u32 ext_smart_ftlus; /* 308 FTL Unit Size */ + __u32 ext_smart_ftlus; /* 308 FTL Unit Size */ __u32 ext_smart_tcgos; /* 312 TCG Ownership Status */ __u8 ext_smart_rsvd6[178]; /* 316 reserved */ __u16 ext_smart_lpv; /* 494 Log page version - 0x0001 */ __u8 ext_smart_lpg[16]; /* 496 Log page GUID */ -} wdc_nvme_ext_smart_log; - -typedef enum -{ - SCAO_PMUW = 0, /* Physical media units written */ - SCAO_PMUR = 16, /* Physical media units read */ - SCAO_BUNBR = 32, /* Bad user nand blocks raw */ - SCAO_BUNBN = 38, /* Bad user nand blocks normalized */ - SCAO_BSNBR = 40, /* Bad system nand blocks raw */ - SCAO_BSNBN = 46, /* Bad system nand blocks normalized */ - SCAO_XRC = 48, /* XOR recovery count */ - SCAO_UREC = 56, /* Uncorrectable read error count */ - SCAO_SEEC = 64, /* Soft ecc error count */ - SCAO_EECE = 72, /* End to end corrected errors */ - SCAO_EEDC = 76, /* End to end detected errors */ - SCAO_SDPU = 80, /* System data percent used */ - SCAO_RFSC = 81, /* Refresh counts */ - SCAO_MXUDEC = 88, /* Max User data erase counts */ - SCAO_MNUDEC = 92, /* Min User data erase counts */ - SCAO_NTTE = 96, /* Number of Thermal throttling events */ - SCAO_CTS = 97, /* Current throttling status */ - SCAO_EVF = 98, /* Errata Version Field */ - SCAO_PVF = 99, /* Point Version Field */ - SCAO_MIVF = 101, /* Minor Version Field */ - SCAO_MAVF = 103, /* Major Version Field */ - SCAO_PCEC = 104, /* PCIe correctable error count */ - SCAO_ICS = 112, /* Incomplete shutdowns */ - SCAO_PFB = 120, /* Percent free blocks */ - SCAO_CPH = 128, /* Capacitor health */ - SCAO_NEV = 130, /* NVMe Errata Version */ - SCAO_UIO = 136, /* Unaligned I/O */ - SCAO_SVN = 144, /* Security Version Number */ - SCAO_NUSE = 152, /* NUSE - Namespace utilization */ - SCAO_PSC = 160, /* PLP start count */ - SCAO_EEST = 176, /* Endurance estimate */ - SCAO_PLRC = 192, /* PCIe Link Retraining Count */ - SCAO_PSCC = 200, /* Power State Change Count */ - SCAO_LPV = 494, /* Log page version */ - SCAO_LPG = 496, /* Log page GUID */ -} SMART_CLOUD_ATTRIBUTE_OFFSETS_V3; - -static __u8 scao_guid[WDC_C0_GUID_LENGTH] = { 0xC5, 0xAF, 0x10, 0x28, 0xEA, 0xBF, 0xF2, 0xA4, - 0x9C, 0x4F, 0x6F, 0x7C, 0xC9, 0x14, 0xD5, 0xAF }; - -typedef enum -{ - EOL_RBC = 76, /* Realloc Block Count */ - EOL_ECCR = 80, /* ECC Rate */ - EOL_WRA = 84, /* Write Amp */ - EOL_PLR = 88, /* Percent Life Remaining */ - EOL_RSVBC = 92, /* Reserved Block Count */ - EOL_PFC = 96, /* Program Fail Count */ - EOL_EFC = 100, /* Erase Fail Count */ - EOL_RRER = 108, /* Raw Read Error Rate */ -} EOL_LOG_PAGE_C0_OFFSETS; +}; + +enum { + SCAO_PMUW = 0, /* Physical media units written */ + SCAO_PMUR = 16, /* Physical media units read */ + SCAO_BUNBR = 32, /* Bad user nand blocks raw */ + SCAO_BUNBN = 38, /* Bad user nand blocks normalized */ + SCAO_BSNBR = 40, /* Bad system nand blocks raw */ + SCAO_BSNBN = 46, /* Bad system nand blocks normalized */ + SCAO_XRC = 48, /* XOR recovery count */ + SCAO_UREC = 56, /* Uncorrectable read error count */ + SCAO_SEEC = 64, /* Soft ecc error count */ + SCAO_EECE = 72, /* End to end corrected errors */ + SCAO_EEDC = 76, /* End to end detected errors */ + SCAO_SDPU = 80, /* System data percent used */ + SCAO_RFSC = 81, /* Refresh counts */ + SCAO_MXUDEC = 88, /* Max User data erase counts */ + SCAO_MNUDEC = 92, /* Min User data erase counts */ + SCAO_NTTE = 96, /* Number of Thermal throttling events */ + SCAO_CTS = 97, /* Current throttling status */ + SCAO_EVF = 98, /* Errata Version Field */ + SCAO_PVF = 99, /* Point Version Field */ + SCAO_MIVF = 101, /* Minor Version Field */ + SCAO_MAVF = 103, /* Major Version Field */ + SCAO_PCEC = 104, /* PCIe correctable error count */ + SCAO_ICS = 112, /* Incomplete shutdowns */ + SCAO_PFB = 120, /* Percent free blocks */ + SCAO_CPH = 128, /* Capacitor health */ + SCAO_NEV = 130, /* NVMe Errata Version */ + SCAO_UIO = 136, /* Unaligned I/O */ + SCAO_SVN = 144, /* Security Version Number */ + SCAO_NUSE = 152, /* NUSE - Namespace utilization */ + SCAO_PSC = 160, /* PLP start count */ + SCAO_EEST = 176, /* Endurance estimate */ + SCAO_PLRC = 192, /* PCIe Link Retraining Count */ + SCAO_PSCC = 200, /* Power State Change Count */ + SCAO_LPV = 494, /* Log page version */ + SCAO_LPG = 496, /* Log page GUID */ +}; + +static __u8 scao_guid[WDC_C0_GUID_LENGTH] = { + 0xC5, 0xAF, 0x10, 0x28, 0xEA, 0xBF, 0xF2, 0xA4, + 0x9C, 0x4F, 0x6F, 0x7C, 0xC9, 0x14, 0xD5, 0xAF +}; + +enum { + EOL_RBC = 76, /* Realloc Block Count */ + EOL_ECCR = 80, /* ECC Rate */ + EOL_WRA = 84, /* Write Amp */ + EOL_PLR = 88, /* Percent Life Remaining */ + EOL_RSVBC = 92, /* Reserved Block Count */ + EOL_PFC = 96, /* Program Fail Count */ + EOL_EFC = 100, /* Erase Fail Count */ + EOL_RRER = 108, /* Raw Read Error Rate */ +}; #define WDC_NVME_C6_GUID_LENGTH 16 #define WDC_NVME_GET_HW_REV_LOG_OPCODE 0xc6 #define WDC_NVME_HW_REV_LOG_PAGE_LEN 512 -typedef struct __attribute__((__packed__)) wdc_nvme_hw_rev_log -{ - __u8 hw_rev_gdr; /* 0 Global Device HW Revision */ - __u8 hw_rev_ar; /* 1 ASIC HW Revision */ - __u8 hw_rev_pbc_mc; /* 2 PCB Manufacturer Code */ - __u8 hw_rev_dram_mc; /* 3 DRAM Manufacturer Code */ - __u8 hw_rev_nand_mc; /* 4 NAND Manufacturer Code */ - __u8 hw_rev_pmic1_mc; /* 5 PMIC 1 Manufacturer Code */ - __u8 hw_rev_pmic2_mc; /* 6 PMIC 2 Manufacturer Code */ - __u8 hw_rev_c1_mc; /* 7 Other Component 1 Manf Code */ - __u8 hw_rev_c2_mc; /* 8 Other Component 2 Manf Code */ - __u8 hw_rev_c3_mc; /* 9 Other Component 3 Manf Code */ - __u8 hw_rev_c4_mc; /* 10 Other Component 4 Manf Code */ - __u8 hw_rev_c5_mc; /* 11 Other Component 5 Manf Code */ - __u8 hw_rev_c6_mc; /* 12 Other Component 6 Manf Code */ - __u8 hw_rev_c7_mc; /* 13 Other Component 7 Manf Code */ - __u8 hw_rev_c8_mc; /* 14 Other Component 8 Manf Code */ - __u8 hw_rev_c9_mc; /* 15 Other Component 9 Manf Code */ - __u8 hw_rev_rsrvd1[48]; /* 16 Reserved 48 bytes */ - __u8 hw_rev_dev_mdi[16]; /* 64 Device Manf Detailed Info */ - __u8 hw_rev_asic_di[16]; /* 80 ASIC Detailed Info */ - __u8 hw_rev_pcb_di[16]; /* 96 PCB Detailed Info */ - __u8 hw_rev_dram_di[16]; /* 112 DRAM Detailed Info */ - __u8 hw_rev_nand_di[16]; /* 128 NAND Detailed Info */ - __u8 hw_rev_pmic1_di[16]; /* 144 PMIC1 Detailed Info */ - __u8 hw_rev_pmic2_di[16]; /* 160 PMIC2 Detailed Info */ - __u8 hw_rev_c1_di[16]; /* 176 Component 1 Detailed Info */ - __u8 hw_rev_c2_di[16]; /* 192 Component 2 Detailed Info */ - __u8 hw_rev_c3_di[16]; /* 208 Component 3 Detailed Info */ - __u8 hw_rev_c4_di[16]; /* 224 Component 4 Detailed Info */ - __u8 hw_rev_c5_di[16]; /* 240 Component 5 Detailed Info */ - __u8 hw_rev_c6_di[16]; /* 256 Component 6 Detailed Info */ - __u8 hw_rev_c7_di[16]; /* 272 Component 7 Detailed Info */ - __u8 hw_rev_c8_di[16]; /* 288 Component 8 Detailed Info */ - __u8 hw_rev_c9_di[16]; /* 304 Component 9 Detailed Info */ - __u8 hw_rev_sn[32]; /* 320 Serial Number */ - __u8 hw_rev_rsrvd2[142]; /* 352 Reserved 143 bytes */ - __u16 hw_rev_version; /* 494 Log Page Version */ - __u8 hw_rev_guid[16]; /* 496 Log Page GUID */ -} wdc_nvme_hw_rev_log; - -static __u8 hw_rev_log_guid[WDC_NVME_C6_GUID_LENGTH] = { 0xAA, 0xB0, 0x05, 0xF5, 0x13, 0x5E, 0x48, 0x15, - 0xAB, 0x89, 0x05, 0xBA, 0x8B, 0xE2, 0xBF, 0x3C }; - -typedef struct __attribute__((__packed__)) _WDC_DE_VU_FILE_META_DATA -{ - __u8 fileName[WDC_DE_FILE_NAME_SIZE]; - __u16 fileID; - __u64 fileSize; -} WDC_DE_VU_FILE_META_DATA, *PWDC_DE_VU_FILE_META_DATA; - -typedef struct _WDC_DRIVE_ESSENTIALS -{ - WDC_DE_VU_FILE_META_DATA metaData; - WDC_DRIVE_ESSENTIAL_TYPE essentialType; -} WDC_DRIVE_ESSENTIALS; - -typedef struct _WDC_DE_VU_LOG_DIRECTORY -{ - WDC_DRIVE_ESSENTIALS *logEntry; /* Caller to allocate memory */ - __u32 maxNumLogEntries; /* Caller to input memory allocated */ - __u32 numOfValidLogEntries; /* API will output this value */ -} WDC_DE_VU_LOG_DIRECTORY,*PWDC_DE_VU_LOG_DIRECTORY; - -typedef struct _WDC_DE_CSA_FEATURE_ID_LIST -{ - NVME_FEATURE_IDENTIFIERS featureId; - __u8 featureName[WDC_DE_GENERIC_BUFFER_SIZE]; -} WDC_DE_CSA_FEATURE_ID_LIST; - -typedef struct tarfile_metadata { +struct __packed wdc_nvme_hw_rev_log { + __u8 hw_rev_gdr; /* 0 Global Device HW Revision */ + __u8 hw_rev_ar; /* 1 ASIC HW Revision */ + __u8 hw_rev_pbc_mc; /* 2 PCB Manufacturer Code */ + __u8 hw_rev_dram_mc; /* 3 DRAM Manufacturer Code */ + __u8 hw_rev_nand_mc; /* 4 NAND Manufacturer Code */ + __u8 hw_rev_pmic1_mc; /* 5 PMIC 1 Manufacturer Code */ + __u8 hw_rev_pmic2_mc; /* 6 PMIC 2 Manufacturer Code */ + __u8 hw_rev_c1_mc; /* 7 Other Component 1 Manf Code */ + __u8 hw_rev_c2_mc; /* 8 Other Component 2 Manf Code */ + __u8 hw_rev_c3_mc; /* 9 Other Component 3 Manf Code */ + __u8 hw_rev_c4_mc; /* 10 Other Component 4 Manf Code */ + __u8 hw_rev_c5_mc; /* 11 Other Component 5 Manf Code */ + __u8 hw_rev_c6_mc; /* 12 Other Component 6 Manf Code */ + __u8 hw_rev_c7_mc; /* 13 Other Component 7 Manf Code */ + __u8 hw_rev_c8_mc; /* 14 Other Component 8 Manf Code */ + __u8 hw_rev_c9_mc; /* 15 Other Component 9 Manf Code */ + __u8 hw_rev_rsrvd1[48]; /* 16 Reserved 48 bytes */ + __u8 hw_rev_dev_mdi[16]; /* 64 Device Manf Detailed Info */ + __u8 hw_rev_asic_di[16]; /* 80 ASIC Detailed Info */ + __u8 hw_rev_pcb_di[16]; /* 96 PCB Detailed Info */ + __u8 hw_rev_dram_di[16]; /* 112 DRAM Detailed Info */ + __u8 hw_rev_nand_di[16]; /* 128 NAND Detailed Info */ + __u8 hw_rev_pmic1_di[16]; /* 144 PMIC1 Detailed Info */ + __u8 hw_rev_pmic2_di[16]; /* 160 PMIC2 Detailed Info */ + __u8 hw_rev_c1_di[16]; /* 176 Component 1 Detailed Info */ + __u8 hw_rev_c2_di[16]; /* 192 Component 2 Detailed Info */ + __u8 hw_rev_c3_di[16]; /* 208 Component 3 Detailed Info */ + __u8 hw_rev_c4_di[16]; /* 224 Component 4 Detailed Info */ + __u8 hw_rev_c5_di[16]; /* 240 Component 5 Detailed Info */ + __u8 hw_rev_c6_di[16]; /* 256 Component 6 Detailed Info */ + __u8 hw_rev_c7_di[16]; /* 272 Component 7 Detailed Info */ + __u8 hw_rev_c8_di[16]; /* 288 Component 8 Detailed Info */ + __u8 hw_rev_c9_di[16]; /* 304 Component 9 Detailed Info */ + __u8 hw_rev_sn[32]; /* 320 Serial Number */ + __u8 hw_rev_rsrvd2[142]; /* 352 Reserved 143 bytes */ + __u16 hw_rev_version; /* 494 Log Page Version */ + __u8 hw_rev_guid[16]; /* 496 Log Page GUID */ +}; + +static __u8 hw_rev_log_guid[WDC_NVME_C6_GUID_LENGTH] = { + 0xAA, 0xB0, 0x05, 0xF5, 0x13, 0x5E, 0x48, 0x15, + 0xAB, 0x89, 0x05, 0xBA, 0x8B, 0xE2, 0xBF, 0x3C +}; + +struct __packed WDC_DE_VU_FILE_META_DATA { + __u8 fileName[WDC_DE_FILE_NAME_SIZE]; + __u16 fileID; + __u64 fileSize; +}; + +struct WDC_DRIVE_ESSENTIALS { + struct __packed WDC_DE_VU_FILE_META_DATA metaData; + enum WDC_DRIVE_ESSENTIAL_TYPE essentialType; +}; + +struct WDC_DE_VU_LOG_DIRECTORY { + struct WDC_DRIVE_ESSENTIALS *logEntry; /* Caller to allocate memory */ + __u32 maxNumLogEntries; /* Caller to input memory allocated */ + __u32 numOfValidLogEntries; /* API will output this value */ +}; + +struct WDC_DE_CSA_FEATURE_ID_LIST { + enum NVME_FEATURE_IDENTIFIERS featureId; + __u8 featureName[WDC_DE_GENERIC_BUFFER_SIZE]; +}; + +struct tarfile_metadata { char fileName[MAX_PATH_LEN]; int8_t bufferFolderPath[MAX_PATH_LEN]; char bufferFolderName[MAX_PATH_LEN]; @@ -750,107 +752,93 @@ typedef struct tarfile_metadata { char tarCmd[MAX_PATH_LEN+MAX_PATH_LEN]; char currDir[MAX_PATH_LEN]; UtilsTimeInfo timeInfo; - uint8_t* timeString[MAX_PATH_LEN]; -} tarfile_metadata; - -static WDC_DE_CSA_FEATURE_ID_LIST deFeatureIdList[] = -{ - {0x00 , "Dummy Placeholder"}, - {FID_ARBITRATION , "Arbitration"}, - {FID_POWER_MANAGEMENT , "PowerMgmnt"}, - {FID_LBA_RANGE_TYPE , "LbaRangeType"}, - {FID_TEMPERATURE_THRESHOLD , "TempThreshold"}, - {FID_ERROR_RECOVERY , "ErrorRecovery"}, - {FID_VOLATILE_WRITE_CACHE , "VolatileWriteCache"}, - {FID_NUMBER_OF_QUEUES , "NumOfQueues"}, - {FID_INTERRUPT_COALESCING , "InterruptCoalesing"}, - {FID_INTERRUPT_VECTOR_CONFIGURATION , "InterruptVectorConfig"}, - {FID_WRITE_ATOMICITY , "WriteAtomicity"}, - {FID_ASYNCHRONOUS_EVENT_CONFIGURATION , "AsynEventConfig"}, - {FID_AUTONOMOUS_POWER_STATE_TRANSITION , "AutonomousPowerState"}, + uint8_t *timeString[MAX_PATH_LEN]; }; -typedef enum _NVME_VU_DE_LOGPAGE_NAMES -{ - NVME_DE_LOGPAGE_E3 = 0x01, - NVME_DE_LOGPAGE_C0 = 0x02 -} NVME_VU_DE_LOGPAGE_NAMES; -typedef struct _NVME_VU_DE_LOGPAGE_LIST -{ - NVME_VU_DE_LOGPAGE_NAMES logPageName; +static struct WDC_DE_CSA_FEATURE_ID_LIST deFeatureIdList[] = { + {0x00, "Dummy Placeholder"}, + {FID_ARBITRATION, "Arbitration"}, + {FID_POWER_MANAGEMENT, "PowerMgmnt"}, + {FID_LBA_RANGE_TYPE, "LbaRangeType"}, + {FID_TEMPERATURE_THRESHOLD, "TempThreshold"}, + {FID_ERROR_RECOVERY, "ErrorRecovery"}, + {FID_VOLATILE_WRITE_CACHE, "VolatileWriteCache"}, + {FID_NUMBER_OF_QUEUES, "NumOfQueues"}, + {FID_INTERRUPT_COALESCING, "InterruptCoalesing"}, + {FID_INTERRUPT_VECTOR_CONFIGURATION, "InterruptVectorConfig"}, + {FID_WRITE_ATOMICITY, "WriteAtomicity"}, + {FID_ASYNCHRONOUS_EVENT_CONFIGURATION, "AsynEventConfig"}, + {FID_AUTONOMOUS_POWER_STATE_TRANSITION, "AutonomousPowerState"}, +}; + +enum NVME_VU_DE_LOGPAGE_NAMES { + NVME_DE_LOGPAGE_E3 = 0x01, + NVME_DE_LOGPAGE_C0 = 0x02 +}; + +struct NVME_VU_DE_LOGPAGE_LIST { + enum NVME_VU_DE_LOGPAGE_NAMES logPageName; __u32 logPageId; __u32 logPageLen; char logPageIdStr[5]; -} NVME_VU_DE_LOGPAGE_LIST, *PNVME_VU_DE_LOGPAGE_LIST; +}; -typedef struct _WDC_NVME_DE_VU_LOGPAGES -{ - NVME_VU_DE_LOGPAGE_NAMES vuLogPageReqd; - __u32 numOfVULogPages; -} WDC_NVME_DE_VU_LOGPAGES, *PWDC_NVME_DE_VU_LOGPAGES; +struct WDC_NVME_DE_VU_LOGPAGES { + enum NVME_VU_DE_LOGPAGE_NAMES vuLogPageReqd; + __u32 numOfVULogPages; +}; -static NVME_VU_DE_LOGPAGE_LIST deVULogPagesList[] = -{ - { NVME_DE_LOGPAGE_E3, 0xE3, 1072, "0xe3"}, - { NVME_DE_LOGPAGE_C0, 0xC0, 512, "0xc0"} +static struct NVME_VU_DE_LOGPAGE_LIST deVULogPagesList[] = { + { NVME_DE_LOGPAGE_E3, 0xE3, 1072, "0xe3"}, + { NVME_DE_LOGPAGE_C0, 0xC0, 512, "0xc0"} }; -static int wdc_get_serial_name(struct nvme_dev *dev, char *file, size_t len, - const char *suffix); -static int wdc_create_log_file(char *file, __u8 *drive_log_data, - __u32 drive_log_length); +static int wdc_get_serial_name(struct nvme_dev *dev, char *file, size_t len, const char *suffix); +static int wdc_create_log_file(char *file, __u8 *drive_log_data, __u32 drive_log_length); static int wdc_do_clear_dump(struct nvme_dev *dev, __u8 opcode, __u32 cdw12); -static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode,__u32 data_len, - __u32 cdw12, char *file, __u32 xfer_size); +static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode, __u32 data_len, __u32 cdw12, char *file, + __u32 xfer_size); static int wdc_do_crash_dump(struct nvme_dev *dev, char *file, int type); static int wdc_crash_dump(struct nvme_dev *dev, char *file, int type); static int wdc_get_crash_dump(int argc, char **argv, struct command *command, - struct plugin *plugin); + struct plugin *plugin); static int wdc_do_drive_log(struct nvme_dev *dev, char *file); -static int wdc_drive_log(int argc, char **argv, struct command *command, - struct plugin *plugin); -static const char* wdc_purge_mon_status_to_string(__u32 status); -static int wdc_purge(int argc, char **argv, - struct command *command, struct plugin *plugin); -static int wdc_purge_monitor(int argc, char **argv, - struct command *command, struct plugin *plugin); -static bool wdc_nvme_check_supported_log_page(nvme_root_t r, - struct nvme_dev *dev, __u8 log_id); +static int wdc_drive_log(int argc, char **argv, struct command *command, struct plugin *plugin); +static const char *wdc_purge_mon_status_to_string(__u32 status); +static int wdc_purge(int argc, char **argv, struct command *command, struct plugin *plugin); +static int wdc_purge_monitor(int argc, char **argv, struct command *command, struct plugin *plugin); +static bool wdc_nvme_check_supported_log_page(nvme_root_t r, struct nvme_dev *dev, __u8 log_id); static int wdc_clear_pcie_correctable_errors(int argc, char **argv, struct command *command, - struct plugin *plugin); + struct plugin *plugin); static int wdc_do_drive_essentials(nvme_root_t r, struct nvme_dev *dev, char *dir, char *key); static int wdc_drive_essentials(int argc, char **argv, struct command *command, - struct plugin *plugin); -static int wdc_drive_status(int argc, char **argv, struct command *command, - struct plugin *plugin); + struct plugin *plugin); +static int wdc_drive_status(int argc, char **argv, struct command *command, struct plugin *plugin); static int wdc_clear_assert_dump(int argc, char **argv, struct command *command, - struct plugin *plugin); -static int wdc_drive_resize(int argc, char **argv, - struct command *command, struct plugin *plugin); + struct plugin *plugin); +static int wdc_drive_resize(int argc, char **argv, struct command *command, struct plugin *plugin); static int wdc_do_drive_resize(struct nvme_dev *dev, uint64_t new_size); -static int wdc_namespace_resize(int argc, char **argv, - struct command *command, struct plugin *plugin); -static int wdc_do_namespace_resize(struct nvme_dev *dev, __u32 nsid, - __u32 op_option); -static int wdc_reason_identifier(int argc, char **argv, - struct command *command, struct plugin *plugin); +static int wdc_namespace_resize(int argc, char **argv, struct command *command, + struct plugin *plugin); +static int wdc_do_namespace_resize(struct nvme_dev *dev, __u32 nsid, __u32 op_option); +static int wdc_reason_identifier(int argc, char **argv, struct command *command, + struct plugin *plugin); static int wdc_do_get_reason_id(struct nvme_dev *dev, char *file, int log_id); static int wdc_save_reason_id(struct nvme_dev *dev, __u8 *rsn_ident, int size); static int wdc_clear_reason_id(struct nvme_dev *dev); static int wdc_log_page_directory(int argc, char **argv, struct command *command, - struct plugin *plugin); + struct plugin *plugin); static int wdc_do_drive_info(struct nvme_dev *dev, __u32 *result); -static int wdc_vs_drive_info(int argc, char **argv, struct command *command, - struct plugin *plugin); +static int wdc_vs_drive_info(int argc, char **argv, struct command *command, struct plugin *plugin); static int wdc_vs_temperature_stats(int argc, char **argv, struct command *command, - struct plugin *plugin); + struct plugin *plugin); static __u64 wdc_get_enc_drive_capabilities(nvme_root_t r, struct nvme_dev *dev); -static int wdc_enc_get_nic_log(struct nvme_dev *dev, __u8 log_id, - __u32 xfer_size, __u32 data_len, FILE *out); -static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, - int xfer_size, FILE *out, int data_id, int cdw14, int cdw15); -static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, - __u8 log_id, void **cbs_data); +static int wdc_enc_get_nic_log(struct nvme_dev *dev, __u8 log_id, __u32 xfer_size, __u32 data_len, + FILE *out); +static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, int xfer_size, + FILE *out, int data_id, int cdw14, int cdw15); +static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, __u8 log_id, + void **cbs_data); static __u32 wdc_get_fw_cust_id(nvme_root_t r, struct nvme_dev *dev); /* Drive log data size */ @@ -872,7 +860,7 @@ struct wdc_dui_log_section { }; /* DUI log header V2 */ -struct __attribute__((__packed__)) wdc_dui_log_section_v2 { +struct __packed wdc_dui_log_section_v2 { __le16 section_type; __le16 data_area_id; __le64 section_size; @@ -895,7 +883,7 @@ struct wdc_dui_log_hdr { __u8 log_data[40]; }; -struct __attribute__((__packed__)) wdc_dui_log_hdr_v2 { +struct __packed wdc_dui_log_hdr_v2 { __u8 telemetry_hdr[512]; __u8 hdr_version; __u8 product_id; @@ -905,7 +893,7 @@ struct __attribute__((__packed__)) wdc_dui_log_hdr_v2 { __u8 log_data[40]; }; -struct __attribute__((__packed__)) wdc_dui_log_hdr_v3 { +struct __packed wdc_dui_log_hdr_v3 { __u8 telemetry_hdr[512]; __u8 hdr_version; __u8 product_id; @@ -916,7 +904,7 @@ struct __attribute__((__packed__)) wdc_dui_log_hdr_v3 { __u8 log_data[40]; }; -struct __attribute__((__packed__)) wdc_dui_log_hdr_v4 { +struct __packed wdc_dui_log_hdr_v4 { __u8 telemetry_hdr[512]; __u8 hdr_version; __u8 product_id; @@ -928,17 +916,17 @@ struct __attribute__((__packed__)) wdc_dui_log_hdr_v4 { /* Purge monitor response */ struct wdc_nvme_purge_monitor_data { - __le16 rsvd1; - __le16 rsvd2; - __le16 first_erase_failure_cnt; - __le16 second_erase_failure_cnt; - __le16 rsvd3; - __le16 programm_failure_cnt; - __le32 rsvd4; - __le32 rsvd5; - __le32 entire_progress_total; - __le32 entire_progress_current; - __u8 rsvd6[14]; + __le16 rsvd1; + __le16 rsvd2; + __le16 first_erase_failure_cnt; + __le16 second_erase_failure_cnt; + __le16 rsvd3; + __le16 programm_failure_cnt; + __le32 rsvd4; + __le32 rsvd5; + __le32 entire_progress_total; + __le32 entire_progress_current; + __u8 rsvd6[14]; }; /* Additional Smart Log */ @@ -955,21 +943,21 @@ struct wdc_log_page_subpage_header { }; struct wdc_ssd_perf_stats { - __le64 hr_cmds; /* Host Read Commands */ - __le64 hr_blks; /* Host Read Blocks */ + __le64 hr_cmds; /* Host Read Commands */ + __le64 hr_blks; /* Host Read Blocks */ __le64 hr_ch_cmds; /* Host Read Cache Hit Commands */ __le64 hr_ch_blks; /* Host Read Cache Hit Blocks */ __le64 hr_st_cmds; /* Host Read Stalled Commands */ - __le64 hw_cmds; /* Host Write Commands */ - __le64 hw_blks; /* Host Write Blocks */ + __le64 hw_cmds; /* Host Write Commands */ + __le64 hw_blks; /* Host Write Blocks */ __le64 hw_os_cmds; /* Host Write Odd Start Commands */ __le64 hw_oe_cmds; /* Host Write Odd End Commands */ __le64 hw_st_cmds; /* Host Write Commands Stalled */ - __le64 nr_cmds; /* NAND Read Commands */ - __le64 nr_blks; /* NAND Read Blocks */ - __le64 nw_cmds; /* NAND Write Commands */ - __le64 nw_blks; /* NAND Write Blocks */ - __le64 nrbw; /* NAND Read Before Write */ + __le64 nr_cmds; /* NAND Read Commands */ + __le64 nr_blks; /* NAND Read Blocks */ + __le64 nw_cmds; /* NAND Write Commands */ + __le64 nw_blks; /* NAND Write Blocks */ + __le64 nrbw; /* NAND Read Before Write */ }; /* Additional C2 Log Page */ @@ -989,7 +977,7 @@ struct wdc_c2_cbs_data { __u8 data[]; }; -struct __attribute__((__packed__)) wdc_bd_ca_log_format { +struct __packed wdc_bd_ca_log_format { __u8 field_id; __u8 reserved1[2]; __u8 normalized_value; @@ -1005,26 +993,26 @@ struct __attribute__((__packed__)) wdc_bd_ca_log_format { #define LATENCY_LOG_MEASURED_LAT_WRITE 1 #define LATENCY_LOG_MEASURED_LAT_TRIM 0 -struct __attribute__((__packed__)) wdc_ssd_latency_monitor_log { - __u8 feature_status; /* 0x00 */ - __u8 rsvd1; /* 0x01 */ - __le16 active_bucket_timer; /* 0x02 */ - __le16 active_bucket_timer_threshold; /* 0x04 */ - __u8 active_threshold_a; /* 0x06 */ - __u8 active_threshold_b; /* 0x07 */ - __u8 active_threshold_c; /* 0x08 */ - __u8 active_threshold_d; /* 0x09 */ - __le16 active_latency_config; /* 0x0A */ - __u8 active_latency_min_window; /* 0x0C */ - __u8 rsvd2[0x13]; /* 0x0D */ - - __le32 active_bucket_counter[4][4]; /* 0x20 - 0x5F */ - __le64 active_latency_timestamp[4][3]; /* 0x60 - 0xBF */ - __le16 active_measured_latency[4][3]; /* 0xC0 - 0xD7 */ - __le16 active_latency_stamp_units; /* 0xD8 */ - __u8 rsvd3[0x16]; /* 0xDA */ - - __le32 static_bucket_counter[4][4] ; /* 0xF0 - 0x12F */ +struct __packed wdc_ssd_latency_monitor_log { + __u8 feature_status; /* 0x00 */ + __u8 rsvd1; /* 0x01 */ + __le16 active_bucket_timer; /* 0x02 */ + __le16 active_bucket_timer_threshold; /* 0x04 */ + __u8 active_threshold_a; /* 0x06 */ + __u8 active_threshold_b; /* 0x07 */ + __u8 active_threshold_c; /* 0x08 */ + __u8 active_threshold_d; /* 0x09 */ + __le16 active_latency_config; /* 0x0A */ + __u8 active_latency_min_window; /* 0x0C */ + __u8 rsvd2[0x13]; /* 0x0D */ + + __le32 active_bucket_counter[4][4]; /* 0x20 - 0x5F */ + __le64 active_latency_timestamp[4][3]; /* 0x60 - 0xBF */ + __le16 active_measured_latency[4][3]; /* 0xC0 - 0xD7 */ + __le16 active_latency_stamp_units; /* 0xD8 */ + __u8 rsvd3[0x16]; /* 0xDA */ + + __le32 static_bucket_counter[4][4] ; /* 0xF0 - 0x12F */ __le64 static_latency_timestamp[4][3]; /* 0x130 - 0x18F */ __le16 static_measured_latency[4][3]; /* 0x190 - 0x1A7 */ __le16 static_latency_stamp_units; /* 0x1A8 */ @@ -1042,56 +1030,56 @@ struct __attribute__((__packed__)) wdc_ssd_latency_monitor_log { __u8 log_page_guid[0x10]; /* 0x1F0 */ }; -struct __attribute__((__packed__)) wdc_ssd_ca_perf_stats { - __le64 nand_bytes_wr_lo; /* 0x00 - NAND Bytes Written lo */ - __le64 nand_bytes_wr_hi; /* 0x08 - NAND Bytes Written hi */ - __le64 nand_bytes_rd_lo; /* 0x10 - NAND Bytes Read lo */ - __le64 nand_bytes_rd_hi; /* 0x18 - NAND Bytes Read hi */ - __le64 nand_bad_block; /* 0x20 - NAND Bad Block Count */ - __le64 uncorr_read_count; /* 0x28 - Uncorrectable Read Count */ - __le64 ecc_error_count; /* 0x30 - Soft ECC Error Count */ - __le32 ssd_detect_count; /* 0x38 - SSD End to End Detection Count */ - __le32 ssd_correct_count; /* 0x3C - SSD End to End Correction Count */ - __u8 data_percent_used; /* 0x40 - System Data Percent Used */ - __le32 data_erase_max; /* 0x41 - User Data Erase Counts */ - __le32 data_erase_min; /* 0x45 - User Data Erase Counts */ - __le64 refresh_count; /* 0x49 - Refresh Count */ - __le64 program_fail; /* 0x51 - Program Fail Count */ - __le64 user_erase_fail; /* 0x59 - User Data Erase Fail Count */ - __le64 system_erase_fail; /* 0x61 - System Area Erase Fail Count */ - __u8 thermal_throttle_status; /* 0x69 - Thermal Throttling Status */ - __u8 thermal_throttle_count; /* 0x6A - Thermal Throttling Count */ - __le64 pcie_corr_error; /* 0x6B - pcie Correctable Error Count */ - __le32 incomplete_shutdown_count; /* 0x73 - Incomplete Shutdown Count */ - __u8 percent_free_blocks; /* 0x77 - Percent Free Blocks */ - __u8 rsvd[392]; /* 0x78 - Reserved bytes 120-511 */ +struct __packed wdc_ssd_ca_perf_stats { + __le64 nand_bytes_wr_lo; /* 0x00 - NAND Bytes Written lo */ + __le64 nand_bytes_wr_hi; /* 0x08 - NAND Bytes Written hi */ + __le64 nand_bytes_rd_lo; /* 0x10 - NAND Bytes Read lo */ + __le64 nand_bytes_rd_hi; /* 0x18 - NAND Bytes Read hi */ + __le64 nand_bad_block; /* 0x20 - NAND Bad Block Count */ + __le64 uncorr_read_count; /* 0x28 - Uncorrectable Read Count */ + __le64 ecc_error_count; /* 0x30 - Soft ECC Error Count */ + __le32 ssd_detect_count; /* 0x38 - SSD End to End Detection Count */ + __le32 ssd_correct_count; /* 0x3C - SSD End to End Correction Count */ + __u8 data_percent_used; /* 0x40 - System Data Percent Used */ + __le32 data_erase_max; /* 0x41 - User Data Erase Counts */ + __le32 data_erase_min; /* 0x45 - User Data Erase Counts */ + __le64 refresh_count; /* 0x49 - Refresh Count */ + __le64 program_fail; /* 0x51 - Program Fail Count */ + __le64 user_erase_fail; /* 0x59 - User Data Erase Fail Count */ + __le64 system_erase_fail; /* 0x61 - System Area Erase Fail Count */ + __u8 thermal_throttle_status; /* 0x69 - Thermal Throttling Status */ + __u8 thermal_throttle_count; /* 0x6A - Thermal Throttling Count */ + __le64 pcie_corr_error; /* 0x6B - pcie Correctable Error Count */ + __le32 incomplete_shutdown_count; /* 0x73 - Incomplete Shutdown Count */ + __u8 percent_free_blocks; /* 0x77 - Percent Free Blocks */ + __u8 rsvd[392]; /* 0x78 - Reserved bytes 120-511 */ }; -struct __attribute__((__packed__)) wdc_ssd_d0_smart_log { - __le32 smart_log_page_header; /* 0x00 - Smart Log Page Header */ - __le32 lifetime_realloc_erase_block_count; /* 0x04 - Lifetime reallocated erase block count */ - __le32 lifetime_power_on_hours; /* 0x08 - Lifetime power on hours */ - __le32 lifetime_uecc_count; /* 0x0C - Lifetime UECC count */ - __le32 lifetime_wrt_amp_factor; /* 0x10 - Lifetime write amplification factor */ - __le32 trailing_hr_wrt_amp_factor; /* 0x14 - Trailing hour write amplification factor */ - __le32 reserve_erase_block_count; /* 0x18 - Reserve erase block count */ - __le32 lifetime_program_fail_count; /* 0x1C - Lifetime program fail count */ - __le32 lifetime_block_erase_fail_count; /* 0x20 - Lifetime block erase fail count */ - __le32 lifetime_die_failure_count; /* 0x24 - Lifetime die failure count */ - __le32 lifetime_link_rate_downgrade_count; /* 0x28 - Lifetime link rate downgrade count */ - __le32 lifetime_clean_shutdown_count; /* 0x2C - Lifetime clean shutdown count on power loss */ - __le32 lifetime_unclean_shutdown_count; /* 0x30 - Lifetime unclean shutdowns on power loss */ - __le32 current_temp; /* 0x34 - Current temperature */ - __le32 max_recorded_temp; /* 0x38 - Max recorded temperature */ - __le32 lifetime_retired_block_count; /* 0x3C - Lifetime retired block count */ - __le32 lifetime_read_disturb_realloc_events; /* 0x40 - Lifetime read disturb reallocation events */ - __le64 lifetime_nand_writes; /* 0x44 - Lifetime NAND write Lpages */ - __le32 capacitor_health; /* 0x4C - Capacitor health */ - __le64 lifetime_user_writes; /* 0x50 - Lifetime user writes */ - __le64 lifetime_user_reads; /* 0x58 - Lifetime user reads */ - __le32 lifetime_thermal_throttle_act; /* 0x60 - Lifetime thermal throttle activations */ - __le32 percentage_pe_cycles_remaining; /* 0x64 - Percentage of P/E cycles remaining */ - __u8 rsvd[408]; /* 0x68 - 408 Reserved bytes */ +struct __packed wdc_ssd_d0_smart_log { + __le32 smart_log_page_header; /* 0x00 - Smart Log Page Header */ + __le32 lifetime_realloc_erase_block_count; /* 0x04 - Lifetime reallocated erase block count */ + __le32 lifetime_power_on_hours; /* 0x08 - Lifetime power on hours */ + __le32 lifetime_uecc_count; /* 0x0C - Lifetime UECC count */ + __le32 lifetime_wrt_amp_factor; /* 0x10 - Lifetime write amplification factor */ + __le32 trailing_hr_wrt_amp_factor; /* 0x14 - Trailing hour write amplification factor */ + __le32 reserve_erase_block_count; /* 0x18 - Reserve erase block count */ + __le32 lifetime_program_fail_count; /* 0x1C - Lifetime program fail count */ + __le32 lifetime_block_erase_fail_count; /* 0x20 - Lifetime block erase fail count */ + __le32 lifetime_die_failure_count; /* 0x24 - Lifetime die failure count */ + __le32 lifetime_link_rate_downgrade_count; /* 0x28 - Lifetime link rate downgrade count */ + __le32 lifetime_clean_shutdown_count; /* 0x2C - Lifetime clean shutdown count on power loss */ + __le32 lifetime_unclean_shutdown_count; /* 0x30 - Lifetime unclean shutdowns on power loss */ + __le32 current_temp; /* 0x34 - Current temperature */ + __le32 max_recorded_temp; /* 0x38 - Max recorded temperature */ + __le32 lifetime_retired_block_count; /* 0x3C - Lifetime retired block count */ + __le32 lifetime_read_disturb_realloc_events; /* 0x40 - Lifetime read disturb reallocation events */ + __le64 lifetime_nand_writes; /* 0x44 - Lifetime NAND write Lpages */ + __le32 capacitor_health; /* 0x4C - Capacitor health */ + __le64 lifetime_user_writes; /* 0x50 - Lifetime user writes */ + __le64 lifetime_user_reads; /* 0x58 - Lifetime user reads */ + __le32 lifetime_thermal_throttle_act; /* 0x60 - Lifetime thermal throttle activations */ + __le32 percentage_pe_cycles_remaining; /* 0x64 - Percentage of P/E cycles remaining */ + __u8 rsvd[408]; /* 0x68 - 408 Reserved bytes */ }; #define WDC_OCP_C1_GUID_LENGTH 16 @@ -1100,29 +1088,29 @@ struct __attribute__((__packed__)) wdc_ssd_d0_smart_log { #define WDC_ERROR_REC_LOG_VERSION1 0001 #define WDC_ERROR_REC_LOG_VERSION2 0002 -struct __attribute__((__packed__)) wdc_ocp_c1_error_recovery_log { - __le16 panic_reset_wait_time; /* 000 - Panic Reset Wait Time */ - __u8 panic_reset_action; /* 002 - Panic Reset Action */ - __u8 dev_recovery_action1; /* 003 - Device Recovery Action 1 */ - __le64 panic_id; /* 004 - Panic ID */ - __le32 dev_capabilities; /* 012 - Device Capabilities */ - __u8 vs_recovery_opc; /* 016 - Vendor Specific Recovery Opcode */ - __u8 rsvd1[3]; /* 017 - 3 Reserved Bytes */ - __le32 vs_cmd_cdw12; /* 020 - Vendor Specific Command CDW12 */ - __le32 vs_cmd_cdw13; /* 024 - Vendor Specific Command CDW13 */ - __u8 vs_cmd_to; /* 028 - Vendor Specific Command Timeout V2 */ - __u8 dev_recovery_action2; /* 029 - Device Recovery Action 2 V2 */ - __u8 dev_recovery_action2_to; /* 030 - Device Recovery Action 2 Timeout V2*/ - __u8 rsvd2[463]; /* 031 - 463 Reserved Bytes */ - __le16 log_page_version; /* 494 - Log Page Version */ - __u8 log_page_guid[WDC_OCP_C1_GUID_LENGTH]; /* 496 - Log Page GUID */ +struct __packed wdc_ocp_c1_error_recovery_log { + __le16 panic_reset_wait_time; /* 000 - Panic Reset Wait Time */ + __u8 panic_reset_action; /* 002 - Panic Reset Action */ + __u8 dev_recovery_action1; /* 003 - Device Recovery Action 1 */ + __le64 panic_id; /* 004 - Panic ID */ + __le32 dev_capabilities; /* 012 - Device Capabilities */ + __u8 vs_recovery_opc; /* 016 - Vendor Specific Recovery Opcode */ + __u8 rsvd1[3]; /* 017 - 3 Reserved Bytes */ + __le32 vs_cmd_cdw12; /* 020 - Vendor Specific Command CDW12 */ + __le32 vs_cmd_cdw13; /* 024 - Vendor Specific Command CDW13 */ + __u8 vs_cmd_to; /* 028 - Vendor Specific Command Timeout V2 */ + __u8 dev_recovery_action2; /* 029 - Device Recovery Action 2 V2 */ + __u8 dev_recovery_action2_to; /* 030 - Device Recovery Action 2 Timeout V2 */ + __u8 rsvd2[463]; /* 031 - 463 Reserved Bytes */ + __le16 log_page_version; /* 494 - Log Page Version */ + __u8 log_page_guid[WDC_OCP_C1_GUID_LENGTH]; /* 496 - Log Page GUID */ }; static __u8 wdc_ocp_c1_guid[WDC_OCP_C1_GUID_LENGTH] = { 0x44, 0xD9, 0x31, 0x21, 0xFE, 0x30, 0x34, 0xAE, 0xAB, 0x4D, 0xFD, 0x3D, 0xBA, 0x83, 0x19, 0x5A }; /* NAND Stats */ -struct __attribute__((__packed__)) wdc_nand_stats { +struct __packed wdc_nand_stats { __u8 nand_write_tlc[16]; __u8 nand_write_slc[16]; __le32 nand_prog_failure; @@ -1132,10 +1120,10 @@ struct __attribute__((__packed__)) wdc_nand_stats { __le64 e2e_error_counter; __le64 successful_ns_resize_event; __u8 rsvd[442]; - __u16 log_page_version; + __u16 log_page_version; }; -struct __attribute__((__packed__)) wdc_nand_stats_V3 { +struct __packed wdc_nand_stats_V3 { __u8 nand_write_tlc[16]; __u8 nand_write_slc[16]; __u8 bad_nand_block_count[8]; @@ -1144,8 +1132,8 @@ struct __attribute__((__packed__)) wdc_nand_stats_V3 { __u8 ssd_correction_counts[16]; __u8 percent_life_used; __le64 user_data_erase_counts[4]; - __u8 program_fail_count[8]; - __u8 erase_fail_count[8]; + __u8 program_fail_count[8]; + __u8 erase_fail_count[8]; __le64 correctable_error_count; __u8 percent_free_blocks_user; __le64 security_version_number; @@ -1160,53 +1148,52 @@ struct __attribute__((__packed__)) wdc_nand_stats_V3 { __le64 unaligned_IO; __u8 physical_media_units[16]; __u8 reserved[279]; - __u16 log_page_version; + __u16 log_page_version; }; -struct wdc_vs_pcie_stats -{ - __le64 unsupportedRequestErrorCount; - __le64 ecrcErrorStatusCount; - __le64 malformedTlpStatusCount; - __le64 receiverOverflowStatusCount; - __le64 unexpectedCmpltnStatusCount; - __le64 completeAbortStatusCount; - __le64 cmpltnTimoutStatusCount; - __le64 flowControlErrorStatusCount; - __le64 poisonedTlpStatusCount; - __le64 dLinkPrtclErrorStatusCount; - __le64 advsryNFatalErrStatusCount; - __le64 replayTimerToStatusCount; - __le64 replayNumRolloverStCount; - __le64 badDllpStatusCount; - __le64 badTlpStatusCount; - __le64 receiverErrStatusCount; - __u8 reserved1[384]; +struct wdc_vs_pcie_stats { + __le64 unsupportedRequestErrorCount; + __le64 ecrcErrorStatusCount; + __le64 malformedTlpStatusCount; + __le64 receiverOverflowStatusCount; + __le64 unexpectedCmpltnStatusCount; + __le64 completeAbortStatusCount; + __le64 cmpltnTimoutStatusCount; + __le64 flowControlErrorStatusCount; + __le64 poisonedTlpStatusCount; + __le64 dLinkPrtclErrorStatusCount; + __le64 advsryNFatalErrStatusCount; + __le64 replayTimerToStatusCount; + __le64 replayNumRolloverStCount; + __le64 badDllpStatusCount; + __le64 badTlpStatusCount; + __le64 receiverErrStatusCount; + __u8 reserved1[384]; }; struct wdc_fw_act_history_log_hdr { - __le32 eye_catcher; - __u8 version; - __u8 reserved1; - __u8 num_entries; - __u8 reserved2; - __le32 entry_size; - __le32 reserved3; + __le32 eye_catcher; + __u8 version; + __u8 reserved1; + __u8 num_entries; + __u8 reserved2; + __le32 entry_size; + __le32 reserved3; }; struct wdc_fw_act_history_log_entry { - __le32 entry_num; - __le32 power_cycle_count; - __le64 power_on_seconds; - __le64 previous_fw_version; - __le64 new_fw_version; - __u8 slot_number; - __u8 commit_action_type; - __le16 result; - __u8 reserved[12]; + __le32 entry_num; + __le32 power_cycle_count; + __le64 power_on_seconds; + __le64 previous_fw_version; + __le64 new_fw_version; + __u8 slot_number; + __u8 commit_action_type; + __le16 result; + __u8 reserved[12]; }; -struct __attribute__((__packed__)) wdc_fw_act_history_log_entry_c2 { +struct __packed wdc_fw_act_history_log_entry_c2 { __u8 entry_version_num; __u8 entry_len; __le16 reserved; @@ -1222,14 +1209,14 @@ struct __attribute__((__packed__)) wdc_fw_act_history_log_entry_c2 { __u8 reserved3[14]; }; -struct __attribute__((__packed__)) wdc_fw_act_history_log_format_c2 { +struct __packed wdc_fw_act_history_log_format_c2 { __u8 log_identifier; - __u8 reserved[3]; + __u8 reserved[3]; __le32 num_entries; - struct wdc_fw_act_history_log_entry_c2 entry[WDC_MAX_NUM_ACT_HIST_ENTRIES]; - __u8 reserved2[2790]; - __le16 log_page_version; - __u8 log_page_guid[WDC_C2_GUID_LENGTH]; + struct wdc_fw_act_history_log_entry_c2 entry[WDC_MAX_NUM_ACT_HIST_ENTRIES]; + __u8 reserved2[2790]; + __le16 log_page_version; + __u8 log_page_guid[WDC_C2_GUID_LENGTH]; }; #define WDC_OCP_C4_GUID_LENGTH 16 @@ -1238,24 +1225,26 @@ struct __attribute__((__packed__)) wdc_fw_act_history_log_format_c2 { #define WDC_DEV_CAP_LOG_VERSION 0001 #define WDC_OCP_C4_NUM_PS_DESCR 127 -struct __attribute__((__packed__)) wdc_ocp_C4_dev_cap_log { - __le16 num_pcie_ports; /* 0000 - Number of PCI Express Ports */ - __le16 oob_mgmt_support; /* 0002 - OOB Management Interfaces Supported */ - __le16 wrt_zeros_support; /* 0004 - Write Zeros Commmand Support */ - __le16 sanitize_support; /* 0006 - Sanitize Command Support */ - __le16 dsm_support; /* 0008 - Dataset Management Command Support */ - __le16 wrt_uncor_support; /* 0010 - Write Uncorrectable Command Support */ - __le16 fused_support; /* 0012 - Fused Operation Support */ - __le16 min_dssd_ps; /* 0014 - Minimum Valid DSSD Power State */ - __u8 rsvd1; /* 0016 - Reserved must be cleared to zero */ - __u8 dssd_ps_descr[WDC_OCP_C4_NUM_PS_DESCR];/* 0017 - DSSD Power State Descriptors */ - __u8 rsvd2[3934]; /* 0144 - Reserved must be cleared to zero */ - __le16 log_page_version; /* 4078 - Log Page Version */ - __u8 log_page_guid[WDC_OCP_C4_GUID_LENGTH]; /* 4080 - Log Page GUID */ +struct __packed wdc_ocp_C4_dev_cap_log { + __le16 num_pcie_ports; /* 0000 - Number of PCI Express Ports */ + __le16 oob_mgmt_support; /* 0002 - OOB Management Interfaces Supported */ + __le16 wrt_zeros_support; /* 0004 - Write Zeros Commmand Support */ + __le16 sanitize_support; /* 0006 - Sanitize Command Support */ + __le16 dsm_support; /* 0008 - Dataset Management Command Support */ + __le16 wrt_uncor_support; /* 0010 - Write Uncorrectable Command Support */ + __le16 fused_support; /* 0012 - Fused Operation Support */ + __le16 min_dssd_ps; /* 0014 - Minimum Valid DSSD Power State */ + __u8 rsvd1; /* 0016 - Reserved must be cleared to zero */ + __u8 dssd_ps_descr[WDC_OCP_C4_NUM_PS_DESCR];/* 0017 - DSSD Power State Descriptors */ + __u8 rsvd2[3934]; /* 0144 - Reserved must be cleared to zero */ + __le16 log_page_version; /* 4078 - Log Page Version */ + __u8 log_page_guid[WDC_OCP_C4_GUID_LENGTH]; /* 4080 - Log Page GUID */ }; -static __u8 wdc_ocp_c4_guid[WDC_OCP_C4_GUID_LENGTH] = { 0x97, 0x42, 0x05, 0x0D, 0xD1, 0xE1, 0xC9, 0x98, - 0x5D, 0x49, 0x58, 0x4B, 0x91, 0x3C, 0x05, 0xB7 }; +static __u8 wdc_ocp_c4_guid[WDC_OCP_C4_GUID_LENGTH] = { + 0x97, 0x42, 0x05, 0x0D, 0xD1, 0xE1, 0xC9, 0x98, + 0x5D, 0x49, 0x58, 0x4B, 0x91, 0x3C, 0x05, 0xB7 +}; #define WDC_OCP_C5_GUID_LENGTH 16 #define WDC_UNSUPPORTED_REQS_LOG_BUF_LEN 4096 @@ -1263,13 +1252,13 @@ static __u8 wdc_ocp_c4_guid[WDC_OCP_C4_GUID_LENGTH] = { 0x97, 0x42, 0x05, 0x0 #define WDC_UNSUPPORTED_REQS_LOG_VERSION 0001 #define WDC_NUM_UNSUPPORTED_REQ_ENTRIES 253 -struct __attribute__((__packed__)) wdc_ocp_C5_unsupported_reqs { - __le16 unsupported_count; /* 0000 - Number of Unsupported Requirement IDs */ - __u8 rsvd1[14]; /* 0002 - Reserved must be cleared to zero */ - __u8 unsupported_req_list[WDC_NUM_UNSUPPORTED_REQ_ENTRIES][16]; /* 0016 - Unsupported Requirements List */ - __u8 rsvd2[14]; /* 4064 - Reserved must be cleared to zero */ - __le16 log_page_version; /* 4078 - Log Page Version */ - __u8 log_page_guid[WDC_OCP_C5_GUID_LENGTH]; /* 4080 - Log Page GUID */ +struct __packed wdc_ocp_C5_unsupported_reqs { + __le16 unsupported_count; /* 0000 - Number of Unsupported Requirement IDs */ + __u8 rsvd1[14]; /* 0002 - Reserved must be cleared to zero */ + __u8 unsupported_req_list[WDC_NUM_UNSUPPORTED_REQ_ENTRIES][16]; /* 0016 - Unsupported Requirements List */ + __u8 rsvd2[14]; /* 4064 - Reserved must be cleared to zero */ + __le16 log_page_version; /* 4078 - Log Page Version */ + __u8 log_page_guid[WDC_OCP_C5_GUID_LENGTH]; /* 4080 - Log Page GUID */ }; static __u8 wdc_ocp_c5_guid[WDC_OCP_C5_GUID_LENGTH] = { 0x2F, 0x72, 0x9C, 0x0E, 0x99, 0x23, 0x2C, 0xBB, @@ -1322,7 +1311,7 @@ static int wdc_get_pci_ids(nvme_root_t r, struct nvme_dev *dev, fd = open(vid, O_RDONLY); if (fd < 0) { - fprintf(stderr, "ERROR : WDC : %s : Open vendor file failed\n", __func__); + fprintf(stderr, "ERROR: WDC: %s : Open vendor file failed\n", __func__); return -1; } @@ -1342,7 +1331,7 @@ static int wdc_get_pci_ids(nvme_root_t r, struct nvme_dev *dev, fd = open(did, O_RDONLY); if (fd < 0) { - fprintf(stderr, "ERROR : WDC : %s : Open device file failed\n", __func__); + fprintf(stderr, "ERROR: WDC: %s : Open device file failed\n", __func__); return -1; } @@ -1369,8 +1358,7 @@ static int wdc_get_vendor_id(struct nvme_dev *dev, uint32_t *vendor_id) memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed " - "0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed 0x%x\n", ret); return -1; } @@ -1381,27 +1369,27 @@ static int wdc_get_vendor_id(struct nvme_dev *dev, uint32_t *vendor_id) static bool wdc_check_power_of_2(int num) { - return (num && ( !(num & (num-1)))); + return num && (!(num & (num-1))); } static int wdc_get_model_number(struct nvme_dev *dev, char *model) { - int ret,i; + int ret, i; struct nvme_id_ctrl ctrl; memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed " - "0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed 0x%x\n", ret); return -1; } - memcpy(model,ctrl.mn,NVME_ID_CTRL_MODEL_NUMBER_SIZE); + memcpy(model, ctrl.mn, NVME_ID_CTRL_MODEL_NUMBER_SIZE); /* get rid of the padded spaces */ i = NVME_ID_CTRL_MODEL_NUMBER_SIZE-1; - while (model[i] == ' ') i--; - model[i+1]=0; + while (model[i] == ' ') + i--; + model[i+1] = 0; return ret; } @@ -1426,8 +1414,9 @@ static bool wdc_check_device(nvme_root_t r, struct nvme_dev *dev) read_vendor_id == WDC_NVME_SNDK_VID) supported = true; else - fprintf(stderr, "ERROR : WDC: unsupported WDC device, Vendor ID = 0x%x, Device ID = 0x%x\n", - read_vendor_id, read_device_id); + fprintf(stderr, + "ERROR: WDC: unsupported WDC device, Vendor ID = 0x%x, Device ID = 0x%x\n", + read_vendor_id, read_device_id); return supported; } @@ -1444,10 +1433,10 @@ static bool wdc_enc_check_model(struct nvme_dev *dev) supported = false; model[NVME_ID_CTRL_MODEL_NUMBER_SIZE] = 0; /* forced termination */ - if (strstr(model,WDC_OPENFLEX_MI_DEVICE_MODEL) != NULL) + if (strstr(model, WDC_OPENFLEX_MI_DEVICE_MODEL)) supported = true; else - fprintf(stderr, "ERROR : WDC: unsupported WDC enclosure, Model = %s\n",model); + fprintf(stderr, "ERROR: WDC: unsupported WDC enclosure, Model = %s\n", model); return supported; } @@ -1460,15 +1449,13 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) __u32 cust_id; ret = wdc_get_pci_ids(r, dev, &read_device_id, &read_vendor_id); - if (ret < 0) - { + if (ret < 0) { if (wdc_get_vendor_id(dev, &read_vendor_id) < 0) return capabilities; } /* below check condition is added due in NVMeOF device we dont have device_id so we need to use only vendor_id*/ - if (read_device_id == -1 && read_vendor_id != -1) - { + if (read_device_id == -1 && read_vendor_id != -1) { capabilities = wdc_get_enc_drive_capabilities(r, dev); return capabilities; } @@ -1503,7 +1490,7 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) case WDC_NVME_VID_2: switch (read_device_id) { case WDC_NVME_SN630_DEV_ID: - /* FALLTHRU */ + fallthrough; case WDC_NVME_SN630_DEV_ID_1: capabilities = (WDC_DRIVE_CAP_CAP_DIAG | WDC_DRIVE_CAP_INTERNAL_LOG | WDC_DRIVE_CAP_DRIVE_STATUS | WDC_DRIVE_CAP_CLEAR_ASSERT | @@ -1515,25 +1502,24 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) /* verify the 0xD0 log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, - WDC_NVME_GET_VU_SMART_LOG_OPCODE) - == true) + WDC_NVME_GET_VU_SMART_LOG_OPCODE)) capabilities |= WDC_DRIVE_CAP_D0_LOG_PAGE; break; case WDC_NVME_SN640_DEV_ID: - /* FALLTHRU */ + fallthrough; case WDC_NVME_SN640_DEV_ID_1: - /* FALLTHRU */ + fallthrough; case WDC_NVME_SN640_DEV_ID_2: - /* FALLTHRU */ - case WDC_NVME_SN640_DEV_ID_3: - /* FALLTHRU */ - case WDC_NVME_SN560_DEV_ID_1: - /* FALLTHRU */ - case WDC_NVME_SN560_DEV_ID_2: - /* FALLTHRU */ - case WDC_NVME_SN560_DEV_ID_3: - /* FALLTHRU */ - case WDC_NVME_SN660_DEV_ID: + fallthrough; + case WDC_NVME_SN640_DEV_ID_3: + fallthrough; + case WDC_NVME_SN560_DEV_ID_1: + fallthrough; + case WDC_NVME_SN560_DEV_ID_2: + fallthrough; + case WDC_NVME_SN560_DEV_ID_3: + fallthrough; + case WDC_NVME_SN660_DEV_ID: /* verify the 0xC0 log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID) @@ -1579,7 +1565,7 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) cust_id = wdc_get_fw_cust_id(r, dev); if (cust_id == WDC_INVALID_CUSTOMER_ID) { - fprintf(stderr, "%s: ERROR : WDC : invalid customer id\n", __func__); + fprintf(stderr, "%s: ERROR: WDC: invalid customer id\n", __func__); return -1; } @@ -1590,27 +1576,26 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) else capabilities |= (WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_CLEAR_PCIE); - break; + break; case WDC_NVME_SN840_DEV_ID: - /* FALLTHRU */ + fallthrough; case WDC_NVME_SN840_DEV_ID_1: - /* FALLTHRU */ + fallthrough; case WDC_NVME_SN860_DEV_ID: /* verify the 0xC0 log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_EOL_STATUS_LOG_OPCODE)) capabilities |= WDC_DRIVE_CAP_C0_LOG_PAGE; - /* FALLTHRU */ + fallthrough; case WDC_NVME_ZN540_DEV_ID: - /* FALLTHRU */ - case WDC_NVME_SN540_DEV_ID: - /* FALLTHRU */ + fallthrough; + case WDC_NVME_SN540_DEV_ID: capabilities |= (WDC_DRIVE_CAP_CAP_DIAG | WDC_DRIVE_CAP_INTERNAL_LOG | WDC_DRIVE_CAP_DRIVE_STATUS | WDC_DRIVE_CAP_CLEAR_ASSERT | WDC_DRIVE_CAP_RESIZE | WDC_DRIVE_CAP_CLEAR_PCIE | WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY | WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY | WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG | WDC_DRIVE_CAP_REASON_ID | - WDC_DRIVE_CAP_LOG_PAGE_DIR ); + WDC_DRIVE_CAP_LOG_PAGE_DIR); /* verify the 0xCA log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, @@ -1623,11 +1608,17 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) capabilities |= WDC_DRIVE_CAP_D0_LOG_PAGE; break; case WDC_NVME_SN650_DEV_ID: + fallthrough; case WDC_NVME_SN650_DEV_ID_1: + fallthrough; case WDC_NVME_SN650_DEV_ID_2: + fallthrough; case WDC_NVME_SN650_DEV_ID_3: + fallthrough; case WDC_NVME_SN650_DEV_ID_4: + fallthrough; case WDC_NVME_SN655_DEV_ID: + fallthrough; case WDC_NVME_SN550_DEV_ID: /* verify the 0xC0 log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, @@ -1651,23 +1642,28 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) capabilities |= WDC_DRIVE_CAP_OCP_C5_LOG_PAGE; capabilities |= (WDC_DRIVE_CAP_CAP_DIAG | WDC_DRIVE_CAP_INTERNAL_LOG | - WDC_DRIVE_CAP_DRIVE_STATUS | WDC_DRIVE_CAP_CLEAR_ASSERT | - WDC_DRIVE_CAP_RESIZE | WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY | - WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG | WDC_DRIVE_CAP_REASON_ID | - WDC_DRIVE_CAP_LOG_PAGE_DIR); + WDC_DRIVE_CAP_DRIVE_STATUS | WDC_DRIVE_CAP_CLEAR_ASSERT | + WDC_DRIVE_CAP_RESIZE | WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY | + WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG | + WDC_DRIVE_CAP_REASON_ID | WDC_DRIVE_CAP_LOG_PAGE_DIR); cust_id = wdc_get_fw_cust_id(r, dev); if (cust_id == WDC_INVALID_CUSTOMER_ID) { - fprintf(stderr, "%s: ERROR : WDC : invalid customer id\n", __func__); + fprintf(stderr, "%s: ERROR: WDC: invalid customer id\n", __func__); return -1; } - if ((cust_id == WDC_CUSTOMER_ID_0x1004) || (cust_id == WDC_CUSTOMER_ID_0x1008) || - (cust_id == WDC_CUSTOMER_ID_0x1005) || (cust_id == WDC_CUSTOMER_ID_0x1304)) - capabilities |= (WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE | - WDC_DRIVE_CAP_INFO | WDC_DRIVE_CAP_CLOUD_SSD_VERSION); + if ((cust_id == WDC_CUSTOMER_ID_0x1004) || + (cust_id == WDC_CUSTOMER_ID_0x1008) || + (cust_id == WDC_CUSTOMER_ID_0x1005) || + (cust_id == WDC_CUSTOMER_ID_0x1304)) + capabilities |= (WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY | + WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE | + WDC_DRIVE_CAP_INFO | + WDC_DRIVE_CAP_CLOUD_SSD_VERSION); else - capabilities |= (WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_CLEAR_PCIE); + capabilities |= (WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY | + WDC_DRIVE_CAP_CLEAR_PCIE); break; default: @@ -1680,41 +1676,54 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) capabilities = WDC_DRIVE_CAP_DRIVE_ESSENTIALS; break; case WDC_NVME_SN520_DEV_ID: - /* FALLTHRU */ + fallthrough; case WDC_NVME_SN520_DEV_ID_1: - /* FALLTHRU */ + fallthrough; case WDC_NVME_SN520_DEV_ID_2: + fallthrough; case WDC_NVME_SN530_DEV_ID: + fallthrough; + case WDC_NVME_SN530_DEV_ID_1: + fallthrough; case WDC_NVME_SN810_DEV_ID: capabilities = WDC_DRIVE_CAP_DUI_DATA; break; case WDC_NVME_SN820CL_DEV_ID: - capabilities = WDC_DRIVE_CAP_DUI_DATA | WDC_DRIVE_CAP_CLOUD_BOOT_SSD_VERSION | - WDC_DRIVE_CAP_CLOUD_LOG_PAGE | WDC_DRIVE_CAP_C0_LOG_PAGE | - WDC_DRIVE_CAP_HW_REV_LOG_PAGE | WDC_DRIVE_CAP_INFO | - WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE | WDC_DRIVE_CAP_NAND_STATS | - WDC_DRIVE_CAP_DEVICE_WAF | WDC_DRIVE_CAP_TEMP_STATS; + capabilities = WDC_DRIVE_CAP_DUI_DATA | + WDC_DRIVE_CAP_CLOUD_BOOT_SSD_VERSION | + WDC_DRIVE_CAP_CLOUD_LOG_PAGE | WDC_DRIVE_CAP_C0_LOG_PAGE | + WDC_DRIVE_CAP_HW_REV_LOG_PAGE | WDC_DRIVE_CAP_INFO | + WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE | WDC_DRIVE_CAP_NAND_STATS | + WDC_DRIVE_CAP_DEVICE_WAF | WDC_DRIVE_CAP_TEMP_STATS; break; case WDC_NVME_SN720_DEV_ID: - capabilities = WDC_DRIVE_CAP_DUI_DATA | WDC_DRIVE_CAP_NAND_STATS | WDC_DRIVE_CAP_NS_RESIZE; + capabilities = WDC_DRIVE_CAP_DUI_DATA | WDC_DRIVE_CAP_NAND_STATS | + WDC_DRIVE_CAP_NS_RESIZE; break; case WDC_NVME_SN730A_DEV_ID: - capabilities = WDC_DRIVE_CAP_DUI | WDC_DRIVE_CAP_NAND_STATS | WDC_DRIVE_CAP_INFO | - WDC_DRIVE_CAP_TEMP_STATS | WDC_DRIVE_CAP_VUC_CLEAR_PCIE | WDC_DRIVE_CAP_PCIE_STATS; + capabilities = WDC_DRIVE_CAP_DUI | WDC_DRIVE_CAP_NAND_STATS | + WDC_DRIVE_CAP_INFO | WDC_DRIVE_CAP_TEMP_STATS | + WDC_DRIVE_CAP_VUC_CLEAR_PCIE | WDC_DRIVE_CAP_PCIE_STATS; break; - case WDC_NVME_SN740_DEV_ID: - case WDC_NVME_SN740_DEV_ID_1: - case WDC_NVME_SN740_DEV_ID_2: - case WDC_NVME_SN740_DEV_ID_3: + case WDC_NVME_SN740_DEV_ID: + fallthrough; + case WDC_NVME_SN740_DEV_ID_1: + fallthrough; + case WDC_NVME_SN740_DEV_ID_2: + fallthrough; + case WDC_NVME_SN740_DEV_ID_3: + fallthrough; case WDC_NVME_SN340_DEV_ID: capabilities = WDC_DRIVE_CAP_DUI; break; case WDC_NVME_ZN350_DEV_ID: - /* FALLTHRU */ + fallthrough; case WDC_NVME_ZN350_DEV_ID_1: - capabilities = WDC_DRIVE_CAP_DUI_DATA | WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE | WDC_DRIVE_CAP_C0_LOG_PAGE | - WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2 | - WDC_DRIVE_CAP_INFO | WDC_DRIVE_CAP_CLOUD_SSD_VERSION | WDC_DRIVE_CAP_LOG_PAGE_DIR; + capabilities = WDC_DRIVE_CAP_DUI_DATA | WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE | + WDC_DRIVE_CAP_C0_LOG_PAGE | + WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY | + WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2 | WDC_DRIVE_CAP_INFO | + WDC_DRIVE_CAP_CLOUD_SSD_VERSION | WDC_DRIVE_CAP_LOG_PAGE_DIR; break; default: capabilities = 0; @@ -1740,57 +1749,57 @@ static __u64 wdc_get_enc_drive_capabilities(nvme_root_t r, return capabilities; switch (read_vendor_id) { - case WDC_NVME_VID: - capabilities = (WDC_DRIVE_CAP_CAP_DIAG | WDC_DRIVE_CAP_INTERNAL_LOG | WDC_DRIVE_CAP_CLEAR_PCIE | - WDC_DRIVE_CAP_DRIVE_LOG | WDC_DRIVE_CAP_CRASH_DUMP | WDC_DRIVE_CAP_PFAIL_DUMP); + case WDC_NVME_VID: + capabilities = (WDC_DRIVE_CAP_CAP_DIAG | WDC_DRIVE_CAP_INTERNAL_LOG | WDC_DRIVE_CAP_CLEAR_PCIE | + WDC_DRIVE_CAP_DRIVE_LOG | WDC_DRIVE_CAP_CRASH_DUMP | WDC_DRIVE_CAP_PFAIL_DUMP); - /* verify the 0xCA log page is supported */ - if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE) == true) - capabilities |= WDC_DRIVE_CAP_CA_LOG_PAGE; + /* verify the 0xCA log page is supported */ + if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE) == true) + capabilities |= WDC_DRIVE_CAP_CA_LOG_PAGE; - /* verify the 0xC1 log page is supported */ - if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_ADD_LOG_OPCODE) == true) - capabilities |= WDC_DRIVE_CAP_C1_LOG_PAGE; - break; - case WDC_NVME_VID_2: - capabilities = (WDC_DRIVE_CAP_CAP_DIAG | WDC_DRIVE_CAP_INTERNAL_LOG | - WDC_DRIVE_CAP_DRIVE_STATUS | WDC_DRIVE_CAP_CLEAR_ASSERT | - WDC_DRIVE_CAP_RESIZE); + /* verify the 0xC1 log page is supported */ + if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_ADD_LOG_OPCODE) == true) + capabilities |= WDC_DRIVE_CAP_C1_LOG_PAGE; + break; + case WDC_NVME_VID_2: + capabilities = (WDC_DRIVE_CAP_CAP_DIAG | WDC_DRIVE_CAP_INTERNAL_LOG | + WDC_DRIVE_CAP_DRIVE_STATUS | WDC_DRIVE_CAP_CLEAR_ASSERT | + WDC_DRIVE_CAP_RESIZE); - /* verify the 0xC3 log page is supported */ - if (wdc_nvme_check_supported_log_page(r, dev, WDC_LATENCY_MON_LOG_ID) == true) - capabilities |= WDC_DRIVE_CAP_C3_LOG_PAGE; + /* verify the 0xC3 log page is supported */ + if (wdc_nvme_check_supported_log_page(r, dev, WDC_LATENCY_MON_LOG_ID) == true) + capabilities |= WDC_DRIVE_CAP_C3_LOG_PAGE; - /* verify the 0xCB log page is supported */ - if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID) == true) - capabilities |= WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY; + /* verify the 0xCB log page is supported */ + if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID) == true) + capabilities |= WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY; - /* verify the 0xCA log page is supported */ - if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE) == true) - capabilities |= WDC_DRIVE_CAP_CA_LOG_PAGE; + /* verify the 0xCA log page is supported */ + if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE) == true) + capabilities |= WDC_DRIVE_CAP_CA_LOG_PAGE; - /* verify the 0xD0 log page is supported */ - if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_VU_SMART_LOG_OPCODE) == true) - capabilities |= WDC_DRIVE_CAP_D0_LOG_PAGE; + /* verify the 0xD0 log page is supported */ + if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_VU_SMART_LOG_OPCODE) == true) + capabilities |= WDC_DRIVE_CAP_D0_LOG_PAGE; - cust_id = wdc_get_fw_cust_id(r, dev); - if (cust_id == WDC_INVALID_CUSTOMER_ID) { - fprintf(stderr, "%s: ERROR : WDC : invalid customer id\n", __func__); - return -1; - } + cust_id = wdc_get_fw_cust_id(r, dev); + if (cust_id == WDC_INVALID_CUSTOMER_ID) { + fprintf(stderr, "%s: ERROR: WDC: invalid customer id\n", __func__); + return -1; + } - if ((cust_id == WDC_CUSTOMER_ID_0x1004) || (cust_id == WDC_CUSTOMER_ID_0x1008) || - (cust_id == WDC_CUSTOMER_ID_0x1005) || (cust_id == WDC_CUSTOMER_ID_0x1304)) - capabilities |= (WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE); - else - capabilities |= (WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_CLEAR_PCIE); + if ((cust_id == WDC_CUSTOMER_ID_0x1004) || (cust_id == WDC_CUSTOMER_ID_0x1008) || + (cust_id == WDC_CUSTOMER_ID_0x1005) || (cust_id == WDC_CUSTOMER_ID_0x1304)) + capabilities |= (WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE); + else + capabilities |= (WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY | WDC_DRIVE_CAP_CLEAR_PCIE); - break; - case WDC_NVME_SNDK_VID: - capabilities = WDC_DRIVE_CAP_DRIVE_ESSENTIALS; - break; - default: - capabilities = 0; + break; + case WDC_NVME_SNDK_VID: + capabilities = WDC_DRIVE_CAP_DRIVE_ESSENTIALS; + break; + default: + capabilities = 0; } return capabilities; @@ -1804,16 +1813,15 @@ static int wdc_get_serial_name(struct nvme_dev *dev, char *file, size_t len, int res_len = 0; char orig[PATH_MAX] = {0}; struct nvme_id_ctrl ctrl; - int ctrl_sn_len = sizeof (ctrl.sn); + int ctrl_sn_len = sizeof(ctrl.sn); - i = sizeof (ctrl.sn) - 1; + i = sizeof(ctrl.sn) - 1; strncpy(orig, file, PATH_MAX - 1); memset(file, 0, len); - memset(&ctrl, 0, sizeof (struct nvme_id_ctrl)); + memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed " - "0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed 0x%x\n", ret); return -1; } /* Remove trailing spaces from the name */ @@ -1821,14 +1829,13 @@ static int wdc_get_serial_name(struct nvme_dev *dev, char *file, size_t len, ctrl.sn[i] = '\0'; i--; } - if (ctrl.sn[sizeof (ctrl.sn) - 1] == '\0') { + if (ctrl.sn[sizeof(ctrl.sn) - 1] == '\0') ctrl_sn_len = strlen(ctrl.sn); - } res_len = snprintf(file, len, "%s%.*s%s", orig, ctrl_sn_len, ctrl.sn, suffix); if (len <= res_len) { - fprintf(stderr, "ERROR : WDC : cannot format serial number due to data " - "of unexpected length\n"); + fprintf(stderr, + "ERROR: WDC: cannot format serial number due to data of unexpected length\n"); return -1; } @@ -1841,21 +1848,21 @@ static int wdc_create_log_file(char *file, __u8 *drive_log_data, int fd; int ret; - if (drive_log_length == 0) { - fprintf(stderr, "ERROR : WDC: invalid log file length\n"); + if (!drive_log_length) { + fprintf(stderr, "ERROR: WDC: invalid log file length\n"); return -1; } fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd < 0) { - fprintf(stderr, "ERROR : WDC: open : %s\n", strerror(errno)); + fprintf(stderr, "ERROR: WDC: open: %s\n", strerror(errno)); return -1; } while (drive_log_length > WRITE_SIZE) { ret = write(fd, drive_log_data, WRITE_SIZE); if (ret < 0) { - fprintf (stderr, "ERROR : WDC: write : %s\n", strerror(errno)); + fprintf(stderr, "ERROR: WDC: write: %s\n", strerror(errno)); close(fd); return -1; } @@ -1865,13 +1872,13 @@ static int wdc_create_log_file(char *file, __u8 *drive_log_data, ret = write(fd, drive_log_data, drive_log_length); if (ret < 0) { - fprintf(stderr, "ERROR : WDC : write : %s\n", strerror(errno)); + fprintf(stderr, "ERROR: WDC: write: %s\n", strerror(errno)); close(fd); return -1; } if (fsync(fd) < 0) { - fprintf(stderr, "ERROR : WDC : fsync : %s\n", strerror(errno)); + fprintf(stderr, "ERROR: WDC: fsync: %s\n", strerror(errno)); close(fd); return -1; } @@ -1879,104 +1886,107 @@ static int wdc_create_log_file(char *file, __u8 *drive_log_data, return 0; } -bool wdc_get_dev_mng_log_entry(__u32 log_length, - __u32 entry_id, - struct wdc_c2_log_page_header* p_log_hdr, - struct wdc_c2_log_subpage_header **p_p_found_log_entry) -{ - __u32 remaining_len = 0; - __u32 log_entry_hdr_size = sizeof(struct wdc_c2_log_subpage_header) - 1; - __u32 log_entry_size = 0; - __u32 size = 0; - bool valid_log; - __u32 current_data_offset = 0; - struct wdc_c2_log_subpage_header *p_next_log_entry = NULL; - - if (*p_p_found_log_entry == NULL) { - fprintf(stderr, "ERROR : WDC - wdc_get_dev_mng_log_entry: No ppLogEntry pointer.\n"); - return false; - } - - *p_p_found_log_entry = NULL; - - /* Ensure log data is large enough for common header */ - if (log_length < sizeof(struct wdc_c2_log_page_header)) { - fprintf(stderr, "ERROR : WDC - wdc_get_dev_mng_log_entry: \ - Buffer is not large enough for the common header. BufSize: 0x%x HdrSize: %"PRIxPTR"\n", - log_length, sizeof(struct wdc_c2_log_page_header)); - return false; - } - - /* Get pointer to first log Entry */ - size = sizeof(struct wdc_c2_log_page_header); - current_data_offset = size; - p_next_log_entry = (struct wdc_c2_log_subpage_header *)((__u8*)p_log_hdr + current_data_offset); - remaining_len = log_length - size; - valid_log = false; - - /* Walk the entire structure. Perform a sanity check to make sure this is a - standard version of the structure. This means making sure each entry looks - valid. But allow for the data to overflow the allocated - buffer (we don't want a false negative because of a FW formatting error) */ - - /* Proceed only if there is at least enough data to read an entry header */ - while (remaining_len >= log_entry_hdr_size) { - /* Get size of the next entry */ - log_entry_size = p_next_log_entry->length; - - /* If log entry size is 0 or the log entry goes past the end - of the data, we must be at the end of the data */ - if ((log_entry_size == 0) || - (log_entry_size > remaining_len)) { - fprintf(stderr, "ERROR : WDC: wdc_get_dev_mng_log_entry: \ - Detected unaligned end of the data. Data Offset: 0x%x \ - Entry Size: 0x%x, Remaining Log Length: 0x%x Entry Id: 0x%x\n", - current_data_offset, log_entry_size, remaining_len, p_next_log_entry->entry_id); - - /* Force the loop to end */ - remaining_len = 0; - } else if ((p_next_log_entry->entry_id == 0) || - (p_next_log_entry->entry_id > 200)) { - /* Invalid entry - fail the search */ - fprintf(stderr, "ERROR : WDC: wdc_get_dev_mng_log_entry: \ - Invalid entry found at offset: 0x%x Entry Size: 0x%x, \ - Remaining Log Length: 0x%x Entry Id: 0x%x\n", - current_data_offset, log_entry_size, remaining_len, p_next_log_entry->entry_id); - - /* Force the loop to end */ - remaining_len = 0; - valid_log = false; - - /* The struture is invalid, so any match that was found is invalid. */ - *p_p_found_log_entry = NULL; - } else { - /* Structure must have at least one valid entry to be considered valid */ - valid_log = true; - if (p_next_log_entry->entry_id == entry_id) { - /* A potential match. */ - *p_p_found_log_entry = p_next_log_entry; - } - - remaining_len -= log_entry_size; - - if (remaining_len > 0) { - /* Increment the offset counter */ - current_data_offset += log_entry_size; - - /* Get the next entry */ - p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8*)p_log_hdr) + current_data_offset); - } - } - } - - return valid_log; +bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, + struct wdc_c2_log_page_header *p_log_hdr, + struct wdc_c2_log_subpage_header **p_p_found_log_entry) +{ + __u32 remaining_len = 0; + __u32 log_entry_hdr_size = sizeof(struct wdc_c2_log_subpage_header) - 1; + __u32 log_entry_size = 0; + __u32 size = 0; + bool valid_log; + __u32 current_data_offset = 0; + struct wdc_c2_log_subpage_header *p_next_log_entry = NULL; + + if (!*p_p_found_log_entry) { + fprintf(stderr, "ERROR: WDC - %s: No ppLogEntry pointer.\n", __func__); + return false; + } + + *p_p_found_log_entry = NULL; + + /* Ensure log data is large enough for common header */ + if (log_length < sizeof(struct wdc_c2_log_page_header)) { + fprintf(stderr, + "ERROR: WDC - %s: Buffer is not large enough for the common header. BufSize: 0x%x HdrSize: %"PRIxPTR"\n", + __func__, log_length, sizeof(struct wdc_c2_log_page_header)); + return false; + } + + /* Get pointer to first log Entry */ + size = sizeof(struct wdc_c2_log_page_header); + current_data_offset = size; + p_next_log_entry = (struct wdc_c2_log_subpage_header *)((__u8 *)p_log_hdr + current_data_offset); + remaining_len = log_length - size; + valid_log = false; + + /* + * Walk the entire structure. Perform a sanity check to make sure this is a + * standard version of the structure. This means making sure each entry looks + * valid. But allow for the data to overflow the allocated + * buffer (we don't want a false negative because of a FW formatting error) + */ + + /* Proceed only if there is at least enough data to read an entry header */ + while (remaining_len >= log_entry_hdr_size) { + /* Get size of the next entry */ + log_entry_size = p_next_log_entry->length; + + /* + * If log entry size is 0 or the log entry goes past the end + * of the data, we must be at the end of the data + */ + if (!log_entry_size || log_entry_size > remaining_len) { + fprintf(stderr, "ERROR: WDC: %s: Detected unaligned end of the data. ", + __func__); + fprintf(stderr, "Data Offset: 0x%x Entry Size: 0x%x, ", + current_data_offset, log_entry_size); + fprintf(stderr, "Remaining Log Length: 0x%x Entry Id: 0x%x\n", + remaining_len, p_next_log_entry->entry_id); + + /* Force the loop to end */ + remaining_len = 0; + } else if (!p_next_log_entry->entry_id || p_next_log_entry->entry_id > 200) { + /* Invalid entry - fail the search */ + fprintf(stderr, "ERROR: WDC: %s: Invalid entry found at offset: 0x%x ", + __func__, current_data_offset); + fprintf(stderr, "Entry Size: 0x%x, Remaining Log Length: 0x%x ", + log_entry_size, remaining_len); + fprintf(stderr, "Entry Id: 0x%x\n", p_next_log_entry->entry_id); + + /* Force the loop to end */ + remaining_len = 0; + valid_log = false; + + /* The struture is invalid, so any match that was found is invalid. */ + *p_p_found_log_entry = NULL; + } else { + /* Structure must have at least one valid entry to be considered valid */ + valid_log = true; + if (p_next_log_entry->entry_id == entry_id) + /* A potential match. */ + *p_p_found_log_entry = p_next_log_entry; + + remaining_len -= log_entry_size; + + if (remaining_len > 0) { + /* Increment the offset counter */ + current_data_offset += log_entry_size; + + /* Get the next entry */ + p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)p_log_hdr) + current_data_offset); + } + } + } + + return valid_log; } static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, - __u8 log_id, void **cbs_data) + __u8 log_id, void **cbs_data) { int ret = -1; - void* data; + void *data; struct wdc_c2_log_page_header *hdr_ptr; struct wdc_c2_log_subpage_header *sph; __u32 length = 0; @@ -1987,17 +1997,19 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, __u32 device_id, read_vendor_id; ret = wdc_get_pci_ids(r, dev, &device_id, &read_vendor_id); - if(device_id == WDC_NVME_ZN350_DEV_ID || device_id == WDC_NVME_ZN350_DEV_ID_1) { + if (device_id == WDC_NVME_ZN350_DEV_ID || device_id == WDC_NVME_ZN350_DEV_ID_1) { lid = WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE_C8; uuid_ix = 0; - } else + } else { lid = WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE; + } - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_C2_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_C2_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return false; } - memset(data, 0, sizeof (__u8) * WDC_C2_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_C2_LOG_BUF_LEN); /* get the log page length */ struct nvme_get_log_args args_len = { @@ -2019,7 +2031,7 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, }; ret = nvme_get_log(&args_len); if (ret) { - fprintf(stderr, "ERROR : WDC : Unable to get 0x%x Log Page length, ret = 0x%x\n", lid, ret); + fprintf(stderr, "ERROR: WDC: Unable to get 0x%x Log Page length, ret = 0x%x\n", lid, ret); goto end; } @@ -2030,8 +2042,8 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, /* Log Page buffer too small, free and reallocate the necessary size */ free(data); data = calloc(length, sizeof(__u8)); - if (data == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return false; } } @@ -2057,7 +2069,7 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, ret = nvme_get_log(&args_data); if (ret) { - fprintf(stderr, "ERROR : WDC : Unable to read 0x%x Log Page data, ret = 0x%x\n", lid, ret); + fprintf(stderr, "ERROR: WDC: Unable to read 0x%x Log Page data, ret = 0x%x\n", lid, ret); goto end; } @@ -2069,8 +2081,8 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, found = wdc_get_dev_mng_log_entry(le32_to_cpu(hdr_ptr->length), log_id, hdr_ptr, &sph); if (found) { *cbs_data = calloc(le32_to_cpu(sph->length), sizeof(__u8)); - if (*cbs_data == NULL) { - fprintf(stderr, "ERROR : WDC : calloc : %s\n", strerror(errno)); + if (!*cbs_data) { + fprintf(stderr, "ERROR: WDC: calloc: %s\n", strerror(errno)); goto end; } memcpy((void *)*cbs_data, (void *)&sph->data, le32_to_cpu(sph->length)); @@ -2102,32 +2114,30 @@ static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, found = wdc_get_dev_mng_log_entry(le32_to_cpu(hdr_ptr->length), log_id, hdr_ptr, &sph); if (found) { *cbs_data = calloc(le32_to_cpu(sph->length), sizeof(__u8)); - if (*cbs_data == NULL) { - fprintf(stderr, "ERROR : WDC : calloc : %s\n", strerror(errno)); + if (!*cbs_data) { + fprintf(stderr, "ERROR: WDC: calloc: %s\n", strerror(errno)); goto end; } memcpy((void *)*cbs_data, (void *)&sph->data, le32_to_cpu(sph->length)); - } else { - /* WD version not found */ - fprintf(stderr, "ERROR : WDC : Unable to find correct version of page 0x%x, entry id = %d\n", lid, log_id); + /* WD version not found */ + fprintf(stderr, "ERROR: WDC: Unable to find correct version of page 0x%x, entry id = %d\n", lid, log_id); } } + end: free(data); return found; } -static bool wdc_nvme_check_supported_log_page(nvme_root_t r, - struct nvme_dev *dev, - __u8 log_id) +static bool wdc_nvme_check_supported_log_page(nvme_root_t r, struct nvme_dev *dev, __u8 log_id) { int i; bool found = false; struct wdc_c2_cbs_data *cbs_data = NULL; if (get_dev_mgment_cbs_data(r, dev, WDC_C2_LOG_PAGES_SUPPORTED_ID, (void *)&cbs_data)) { - if (cbs_data != NULL) { + if (cbs_data) { for (i = 0; i < le32_to_cpu(cbs_data->length); i++) { if (log_id == cbs_data->data[i]) { found = true; @@ -2137,30 +2147,31 @@ static bool wdc_nvme_check_supported_log_page(nvme_root_t r, #ifdef WDC_NVME_CLI_DEBUG if (!found) { - fprintf(stderr, "ERROR : WDC : Log Page 0x%x not supported\n", log_id); - fprintf(stderr, "WDC : Supported Log Pages:\n"); + fprintf(stderr, "ERROR: WDC: Log Page 0x%x not supported\n", log_id); + fprintf(stderr, "WDC: Supported Log Pages:\n"); /* print the supported pages */ d((__u8 *)cbs_data->data, le32_to_cpu(cbs_data->length), 16, 1); } #endif free(cbs_data); - } else - fprintf(stderr, "ERROR : WDC : cbs_data ptr = NULL\n"); - } else - fprintf(stderr, "ERROR : WDC : 0xC2 Log Page entry ID 0x%x not found\n", WDC_C2_LOG_PAGES_SUPPORTED_ID); + } else { + fprintf(stderr, "ERROR: WDC: cbs_data ptr = NULL\n"); + } + } else { + fprintf(stderr, "ERROR: WDC: 0xC2 Log Page entry ID 0x%x not found\n", + WDC_C2_LOG_PAGES_SUPPORTED_ID); + } return found; } -static bool wdc_nvme_get_dev_status_log_data(nvme_root_t r, - struct nvme_dev *dev, - __le32 *ret_data, - __u8 log_id) +static bool wdc_nvme_get_dev_status_log_data(nvme_root_t r, struct nvme_dev *dev, __le32 *ret_data, + __u8 log_id) { __u32 *cbs_data = NULL; if (get_dev_mgment_cbs_data(r, dev, log_id, (void *)&cbs_data)) { - if (cbs_data != NULL) { + if (cbs_data) { memcpy((void *)ret_data, (void *)cbs_data, 4); free(cbs_data); @@ -2177,13 +2188,12 @@ static int wdc_do_clear_dump(struct nvme_dev *dev, __u8 opcode, __u32 cdw12) int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = opcode; admin_cmd.cdw12 = cdw12; ret = nvme_submit_admin_passthru(dev_fd(dev), &admin_cmd, NULL); - if (ret != 0) { - fprintf(stdout, "ERROR : WDC : Crash dump erase failed\n"); - } + if (ret) + fprintf(stdout, "ERROR: WDC: Crash dump erase failed\n"); nvme_show_status(ret); return ret; } @@ -2196,7 +2206,7 @@ static __u32 wdc_dump_length(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, __u struct nvme_passthru_cmd admin_cmd; l = (struct wdc_log_size *) buf; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = opcode; admin_cmd.addr = (__u64)(uintptr_t)buf; admin_cmd.data_len = WDC_NVME_LOG_SIZE_DATA_LEN; @@ -2204,10 +2214,10 @@ static __u32 wdc_dump_length(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, __u admin_cmd.cdw12 = cdw12; ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); - if (ret != 0) { + if (ret) { l->log_size = 0; ret = -1; - fprintf(stderr, "ERROR : WDC : reading dump length failed\n"); + fprintf(stderr, "ERROR: WDC: reading dump length failed\n"); nvme_show_status(ret); return ret; } @@ -2224,7 +2234,7 @@ static __u32 wdc_dump_length_e6(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = opcode; admin_cmd.addr = (__u64)(uintptr_t)dump_hdr; admin_cmd.data_len = WDC_NVME_LOG_SIZE_HDR_LEN; @@ -2232,8 +2242,8 @@ static __u32 wdc_dump_length_e6(int fd, __u32 opcode, __u32 cdw10, __u32 cdw12, admin_cmd.cdw12 = cdw12; ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); - if (ret != 0) { - fprintf(stderr, "ERROR : WDC : reading dump length failed\n"); + if (ret) { + fprintf(stderr, "ERROR: WDC: reading dump length failed\n"); nvme_show_status(ret); } @@ -2245,7 +2255,7 @@ static __u32 wdc_dump_dui_data(int fd, __u32 dataLen, __u32 offset, __u8 *dump_d int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_CAP_DUI_OPCODE; admin_cmd.nsid = 0xFFFFFFFF; admin_cmd.addr = (__u64)(uintptr_t)dump_data; @@ -2259,8 +2269,8 @@ static __u32 wdc_dump_dui_data(int fd, __u32 dataLen, __u32 offset, __u8 *dump_d ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); - if (ret != 0) { - fprintf(stderr, "ERROR : WDC : reading DUI data failed\n"); + if (ret) { + fprintf(stderr, "ERROR: WDC: reading DUI data failed\n"); nvme_show_status(ret); } @@ -2273,7 +2283,7 @@ static __u32 wdc_dump_dui_data_v2(int fd, __u32 dataLen, __u64 offset, __u8 *dum struct nvme_passthru_cmd admin_cmd; __u64 offset_lo, offset_hi; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_CAP_DUI_OPCODE; admin_cmd.nsid = 0xFFFFFFFF; admin_cmd.addr = (__u64)(uintptr_t)dump_data; @@ -2290,15 +2300,15 @@ static __u32 wdc_dump_dui_data_v2(int fd, __u32 dataLen, __u64 offset, __u8 *dum admin_cmd.cdw14 = WDC_NVME_CAP_DUI_DISABLE_IO; ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); - if (ret != 0) { - fprintf(stderr, "ERROR : WDC : reading DUI data V2 failed\n"); + if (ret) { + fprintf(stderr, "ERROR: WDC: reading DUI data V2 failed\n"); nvme_show_status(ret); } return ret; } -static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode,__u32 data_len, +static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode, __u32 data_len, __u32 cdw12, char *file, __u32 xfer_size) { int ret = 0; @@ -2308,13 +2318,13 @@ static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode,__u32 data_len, struct nvme_passthru_cmd admin_cmd; __u32 dump_length = data_len; - dump_data = (__u8 *) malloc(sizeof (__u8) * dump_length); - if (dump_data == NULL) { - fprintf(stderr, "%s: ERROR : malloc : %s\n", __func__, strerror(errno)); + dump_data = (__u8 *)malloc(sizeof(__u8) * dump_length); + if (!dump_data) { + fprintf(stderr, "%s: ERROR: malloc: %s\n", __func__, strerror(errno)); return -1; } - memset(dump_data, 0, sizeof (__u8) * dump_length); - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(dump_data, 0, sizeof(__u8) * dump_length); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); curr_data_offset = 0; curr_data_len = xfer_size; i = 0; @@ -2329,10 +2339,10 @@ static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode,__u32 data_len, while (curr_data_offset < data_len) { ret = nvme_submit_admin_passthru(dev_fd(dev), &admin_cmd, NULL); - if (ret != 0) { + if (ret) { nvme_show_status(ret); - fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n", - __func__, i, admin_cmd.data_len, curr_data_offset, (long unsigned int)admin_cmd.addr); + fprintf(stderr, "%s: ERROR: WDC: Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n", + __func__, i, admin_cmd.data_len, curr_data_offset, (unsigned long)admin_cmd.addr); break; } @@ -2349,7 +2359,7 @@ static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode,__u32 data_len, i++; } - if (ret == 0) { + if (!ret) { nvme_show_status(ret); ret = wdc_create_log_file(file, dump_data, dump_length); } @@ -2357,7 +2367,7 @@ static int wdc_do_dump(struct nvme_dev *dev, __u32 opcode,__u32 data_len, return ret; } -static int wdc_do_dump_e6(int fd, __u32 opcode,__u32 data_len, +static int wdc_do_dump_e6(int fd, __u32 opcode, __u32 data_len, __u32 cdw12, char *file, __u32 xfer_size, __u8 *log_hdr) { int ret = 0; @@ -2366,14 +2376,14 @@ static int wdc_do_dump_e6(int fd, __u32 opcode,__u32 data_len, int i; struct nvme_passthru_cmd admin_cmd; - dump_data = (__u8 *) malloc(sizeof (__u8) * data_len); + dump_data = (__u8 *)malloc(sizeof(__u8) * data_len); - if (dump_data == NULL) { - fprintf(stderr, "%s: ERROR : malloc : %s\n", __func__, strerror(errno)); + if (!dump_data) { + fprintf(stderr, "%s: ERROR: malloc: %s\n", __func__, strerror(errno)); return -1; } - memset(dump_data, 0, sizeof (__u8) * data_len); - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(dump_data, 0, sizeof(__u8) * data_len); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); curr_data_offset = WDC_NVME_LOG_SIZE_HDR_LEN; i = 0; @@ -2393,10 +2403,10 @@ static int wdc_do_dump_e6(int fd, __u32 opcode,__u32 data_len, admin_cmd.cdw13 = curr_data_offset >> 2; ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); - if (ret != 0) { + if (ret) { nvme_show_status(ret); - fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n", - __func__, i, admin_cmd.data_len, curr_data_offset, (long unsigned int)admin_cmd.addr); + fprintf(stderr, "%s: ERROR: WDC: Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n", + __func__, i, admin_cmd.data_len, curr_data_offset, (unsigned long)admin_cmd.addr); break; } @@ -2405,13 +2415,13 @@ static int wdc_do_dump_e6(int fd, __u32 opcode,__u32 data_len, i++; } - if (ret == 0) { - fprintf(stderr, "%s: ", __func__); + if (!ret) { + fprintf(stderr, "%s: INFO: ", __func__); nvme_show_status(ret); } else { - fprintf(stderr, "%s: FAILURE: ", __func__); + fprintf(stderr, "%s: FAILURE: ", __func__); nvme_show_status(ret); - fprintf(stderr, "%s: Partial data may have been captured\n", __func__); + fprintf(stderr, "%s: Partial data may have been captured\n", __func__); snprintf(file + strlen(file), PATH_MAX, "%s", "-PARTIAL"); } @@ -2422,7 +2432,7 @@ static int wdc_do_dump_e6(int fd, __u32 opcode,__u32 data_len, } static int wdc_do_cap_telemetry_log(struct nvme_dev *dev, char *file, - __u32 bs, int type, int data_area) + __u32 bs, int type, int data_area) { struct nvme_telemetry_log *log; size_t full_size = 0; @@ -2437,11 +2447,10 @@ static int wdc_do_cap_telemetry_log(struct nvme_dev *dev, char *file, __u64 capabilities = 0; nvme_root_t r; - memset(&ctrl, 0, sizeof (struct nvme_id_ctrl)); + memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); err = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (err) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed " - "0x%x\n", err); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed 0x%x\n", err); return err; } @@ -2460,26 +2469,23 @@ static int wdc_do_cap_telemetry_log(struct nvme_dev *dev, char *file, if ((capabilities & WDC_DRIVE_CAP_INTERNAL_LOG) == WDC_DRIVE_CAP_INTERNAL_LOG) { /* Verify the Controller Initiated Option is enabled */ err = nvme_get_features_data(dev_fd(dev), - WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, - 0, 4, buf, &result); - if (err == 0) { - if (result == 0) { + WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, + 0, 4, buf, &result); + if (!err) { + if (!result) { /* enabled */ host_gen = 0; ctrl_init = 1; - } - else { + } else { fprintf(stderr, "%s: Controller initiated option telemetry log page disabled\n", __func__); return -EINVAL; } - } - else { - fprintf(stderr, "ERROR : WDC: Get telemetry option feature failed."); + } else { + fprintf(stderr, "ERROR: WDC: Get telemetry option feature failed."); nvme_show_status(err); return -EPERM; } - } - else { + } else { host_gen = 0; ctrl_init = 1; } @@ -2502,13 +2508,13 @@ static int wdc_do_cap_telemetry_log(struct nvme_dev *dev, char *file, if (ctrl_init) err = nvme_get_ctrl_telemetry(dev_fd(dev), true, &log, - data_area, &full_size); + data_area, &full_size); else if (host_gen) err = nvme_get_new_host_telemetry(dev_fd(dev), &log, data_area, &full_size); else err = nvme_get_host_telemetry(dev_fd(dev), &log, data_area, - &full_size); + &full_size); if (err < 0) { perror("get-telemetry-log"); @@ -2520,8 +2526,8 @@ static int wdc_do_cap_telemetry_log(struct nvme_dev *dev, char *file, } /* - * Continuously pull data until the offset hits the end of the last - * block. + *Continuously pull data until the offset hits the end of the last + *block. */ data_written = 0; data_remaining = full_size; @@ -2545,7 +2551,7 @@ static int wdc_do_cap_telemetry_log(struct nvme_dev *dev, char *file, } if (fsync(output) < 0) { - fprintf(stderr, "ERROR : %s: fsync : %s\n", __func__, strerror(errno)); + fprintf(stderr, "ERROR: %s: fsync: %s\n", __func__, strerror(errno)); err = -1; } @@ -2563,9 +2569,9 @@ static int wdc_do_cap_diag(nvme_root_t r, struct nvme_dev *dev, char *file, struct wdc_e6_log_hdr *log_hdr; __u32 cap_diag_length; - log_hdr = (struct wdc_e6_log_hdr *) malloc(e6_log_hdr_size); - if (log_hdr == NULL) { - fprintf(stderr, "%s: ERROR : malloc : %s\n", __func__, strerror(errno)); + log_hdr = (struct wdc_e6_log_hdr *)malloc(e6_log_hdr_size); + if (!log_hdr) { + fprintf(stderr, "%s: ERROR: malloc: %s\n", __func__, strerror(errno)); ret = -1; goto out; } @@ -2585,401 +2591,487 @@ static int wdc_do_cap_diag(nvme_root_t r, struct nvme_dev *dev, char *file, cap_diag_length = (log_hdr->log_size[0] << 24 | log_hdr->log_size[1] << 16 | log_hdr->log_size[2] << 8 | log_hdr->log_size[3]); - if (cap_diag_length == 0) { - fprintf(stderr, "INFO : WDC : Capture Diagnostics log is empty\n"); + if (!cap_diag_length) { + fprintf(stderr, "INFO: WDC: Capture Diagnostics log is empty\n"); } else { ret = wdc_do_dump_e6(dev_fd(dev), - WDC_NVME_CAP_DIAG_OPCODE, + WDC_NVME_CAP_DIAG_OPCODE, cap_diag_length, (WDC_NVME_CAP_DIAG_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_CAP_DIAG_CMD, file, xfer_size, (__u8 *)log_hdr); - fprintf(stderr, "INFO : WDC : Capture Diagnostics log, length = 0x%x\n", cap_diag_length); + fprintf(stderr, "INFO: WDC: Capture Diagnostics log, length = 0x%x\n", cap_diag_length); } } else if ((type == WDC_TELEMETRY_TYPE_HOST) || (type == WDC_TELEMETRY_TYPE_CONTROLLER)) { /* Get the desired telemetry log page */ ret = wdc_do_cap_telemetry_log(dev, file, xfer_size, type, data_area); - } else - fprintf(stderr, "%s: ERROR : Invalid type : %d\n", __func__, type); + } else { + fprintf(stderr, "%s: ERROR: Invalid type : %d\n", __func__, type); + } out: free(log_hdr); return ret; } -static int wdc_do_cap_dui(int fd, char *file, __u32 xfer_size, int data_area, int verbose, __u64 file_size, __u64 offset) +static int wdc_do_cap_dui_v1(int fd, char *file, __u32 xfer_size, int data_area, int verbose, + struct wdc_dui_log_hdr *log_hdr, __s64 *total_size) { - int ret = 0; - __u32 dui_log_hdr_size = WDC_NVME_CAP_DUI_HEADER_SIZE; - struct wdc_dui_log_hdr *log_hdr; - struct wdc_dui_log_hdr_v3 *log_hdr_v3; - __u32 cap_dui_length; - __u64 cap_dui_length_v3; - __u64 cap_dui_length_v4; - __u8 *dump_data = NULL; + __s32 log_size = 0; + __u32 cap_dui_length = le32_to_cpu(log_hdr->log_size); + __u32 curr_data_offset = 0; __u8 *buffer_addr; - __s64 total_size = 0; + __u8 *dump_data = NULL; + bool last_xfer = false; + int err; int i; int j; - bool last_xfer = false; - int err = 0, output = 0; + int output; + int ret = 0; - log_hdr = (struct wdc_dui_log_hdr *) malloc(dui_log_hdr_size); - if (log_hdr == NULL) { - fprintf(stderr, "%s: ERROR : log header malloc failed : status %s, size 0x%x\n", - __func__, strerror(errno), dui_log_hdr_size); + if (verbose) { + fprintf(stderr, "INFO: WDC: Capture V1 Device Unit Info log, data area = %d\n", + data_area); + fprintf(stderr, "INFO: WDC: DUI Header Version = 0x%x\n", log_hdr->hdr_version); + } + + if (!cap_dui_length) { + fprintf(stderr, "INFO: WDC: Capture V1 Device Unit Info log is empty\n"); + return 0; + } + + /* parse log header for all sections up to specified data area inclusively */ + if (data_area != WDC_NVME_DUI_MAX_DATA_AREA) { + for (j = 0; j < WDC_NVME_DUI_MAX_SECTION; j++) { + if (log_hdr->log_section[j].data_area_id <= data_area && + log_hdr->log_section[j].data_area_id) { + log_size += log_hdr->log_section[j].section_size; + if (verbose) + fprintf(stderr, + "%s: Data area ID %d : section size 0x%x, total size = 0x%x\n", + __func__, log_hdr->log_section[j].data_area_id, + (unsigned int)log_hdr->log_section[j].section_size, + (unsigned int)log_size); + + } else { + if (verbose) + fprintf(stderr, "%s: break, total size = 0x%x\n", __func__, + (unsigned int)log_size); + break; + } + } + } else { + log_size = cap_dui_length; + } + + *total_size = log_size; + + dump_data = (__u8 *)malloc(sizeof(__u8) * xfer_size); + if (!dump_data) { + fprintf(stderr, "%s: ERROR: dump data V1 malloc failed : status %s, size = 0x%x\n", + __func__, strerror(errno), (unsigned int)xfer_size); return -1; } - memset(log_hdr, 0, dui_log_hdr_size); + memset(dump_data, 0, sizeof(__u8) * xfer_size); - /* get the dui telemetry and log headers */ - ret = wdc_dump_dui_data(fd, WDC_NVME_CAP_DUI_HEADER_SIZE, 0x00, (__u8 *)log_hdr, last_xfer); - if (ret != 0) { - fprintf(stderr, "%s: ERROR : WDC : Get DUI headers failed\n", __func__); - fprintf(stderr, "%s: ERROR : WDC : ", __func__); - nvme_show_status(ret); - goto out; + output = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (output < 0) { + fprintf(stderr, "%s: Failed to open output file %s: %s!\n", __func__, file, + strerror(errno)); + free(dump_data); + return output; } - /* Check the Log Header version */ - if ((log_hdr->hdr_version & 0xFF) == 0x00 || - (log_hdr->hdr_version & 0xFF) == 0x01) { - __s32 log_size = 0; - __u32 curr_data_offset = 0; + /* write the telemetry and log headers into the dump_file */ + err = write(output, (void *)log_hdr, WDC_NVME_CAP_DUI_HEADER_SIZE); + if (err != WDC_NVME_CAP_DUI_HEADER_SIZE) { + fprintf(stderr, "%s: Failed to flush header data to file!\n", __func__); + goto free_mem; + } - cap_dui_length = le32_to_cpu(log_hdr->log_size); + log_size -= WDC_NVME_CAP_DUI_HEADER_SIZE; + curr_data_offset = WDC_NVME_CAP_DUI_HEADER_SIZE; + i = 0; + buffer_addr = dump_data; - if (verbose) { - fprintf(stderr, "INFO : WDC : Capture V1 Device Unit Info log, data area = %d\n", data_area); - fprintf(stderr, "INFO : WDC : DUI Header Version = 0x%x\n", log_hdr->hdr_version); - } + for (; log_size > 0; log_size -= xfer_size) { + xfer_size = min(xfer_size, log_size); - if (cap_dui_length == 0) { - fprintf(stderr, "INFO : WDC : Capture V1 Device Unit Info log is empty\n"); - } else { - /* parse log header for all sections up to specified data area inclusively */ - if (data_area != WDC_NVME_DUI_MAX_DATA_AREA) { - for(j = 0; j < WDC_NVME_DUI_MAX_SECTION; j++) { - if (log_hdr->log_section[j].data_area_id <= data_area && - log_hdr->log_section[j].data_area_id != 0) { - log_size += log_hdr->log_section[j].section_size; - if (verbose) - fprintf(stderr, "%s: Data area ID %d : section size 0x%x, total size = 0x%x\n", - __func__, log_hdr->log_section[j].data_area_id, (unsigned int)log_hdr->log_section[j].section_size, (unsigned int)log_size); - - } - else { - if (verbose) - fprintf(stderr, "%s: break, total size = 0x%x\n", __func__, (unsigned int)log_size); - break; - } - } - } else - log_size = cap_dui_length; + if (log_size <= xfer_size) + last_xfer = true; - total_size = log_size; + ret = wdc_dump_dui_data(fd, xfer_size, curr_data_offset, buffer_addr, last_xfer); + if (ret) { + fprintf(stderr, + "%s: ERROR: WDC: Get chunk %d, size = 0x%"PRIx64", offset = 0x%x, addr = %p\n", + __func__, i, (uint64_t)log_size, curr_data_offset, buffer_addr); + fprintf(stderr, "%s: ERROR: WDC: ", __func__); + nvme_show_status(ret); + break; + } - dump_data = (__u8 *) malloc(sizeof (__u8) * xfer_size); - if (dump_data == NULL) { - fprintf(stderr, "%s: ERROR : dump data V1 malloc failed : status %s, size = 0x%x\n", - __func__, strerror(errno), (unsigned int)xfer_size); - ret = -1; - goto out; - } - memset(dump_data, 0, sizeof (__u8) * xfer_size); - - output = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (output < 0) { - fprintf(stderr, "%s: Failed to open output file %s: %s!\n", - __func__, file, strerror(errno)); - ret = output; - goto free_mem; - } + /* write the dump data into the file */ + err = write(output, (void *)buffer_addr, xfer_size); + if (err != xfer_size) { + fprintf(stderr, + "%s: ERROR: WDC: Failed to flush DUI data to file! chunk %d, err = 0x%x, xfer_size = 0x%x\n", + __func__, i, err, xfer_size); + ret = -1; + goto free_mem; + } - /* write the telemetry and log headers into the dump_file */ - err = write(output, (void *)log_hdr, WDC_NVME_CAP_DUI_HEADER_SIZE); - if (err != WDC_NVME_CAP_DUI_HEADER_SIZE) { - fprintf(stderr, "%s: Failed to flush header data to file!\n", __func__); - goto free_mem; - } + curr_data_offset += xfer_size; + i++; + } - log_size -= WDC_NVME_CAP_DUI_HEADER_SIZE; - curr_data_offset = WDC_NVME_CAP_DUI_HEADER_SIZE; - i = 0; - buffer_addr = dump_data; +free_mem: + close(output); + free(dump_data); + return ret; +} - for(; log_size > 0; log_size -= xfer_size) { - xfer_size = min(xfer_size, log_size); +static int wdc_do_cap_dui_v2_v3(int fd, char *file, __u32 xfer_size, int data_area, int verbose, + struct wdc_dui_log_hdr *log_hdr, __s64 *total_size, __u64 file_size, + __u64 offset) +{ + __u64 cap_dui_length_v3; + __u64 curr_data_offset = 0; + __s64 log_size = 0; + __u64 xfer_size_long = (__u64)xfer_size; + __u8 *buffer_addr; + __u8 *dump_data = NULL; + bool last_xfer = false; + int err; + int i; + int j; + int output; + int ret = 0; + struct wdc_dui_log_hdr_v3 *log_hdr_v3 = (struct wdc_dui_log_hdr_v3 *)log_hdr; - if (log_size <= xfer_size) - last_xfer = true; + cap_dui_length_v3 = le64_to_cpu(log_hdr_v3->log_size); - ret = wdc_dump_dui_data(fd, xfer_size, curr_data_offset, buffer_addr, last_xfer); - if (ret != 0) { - fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%"PRIx64", offset = 0x%x, addr = %p\n", - __func__, i, (uint64_t)log_size, curr_data_offset, buffer_addr); - fprintf(stderr, "%s: ERROR : WDC : ", - __func__); - nvme_show_status(ret); - break; - } + if (verbose) { + fprintf(stderr, + "INFO: WDC: Capture V2 or V3 Device Unit Info log, data area = %d\n", + data_area); - /* write the dump data into the file */ - err = write(output, (void *)buffer_addr, xfer_size); - if (err != xfer_size) { - fprintf(stderr, "%s: ERROR : WDC : Failed to flush DUI data to file! chunk %d, err = 0x%x, xfer_size = 0x%x\n", - __func__, i, err, xfer_size); - goto free_mem; - } + fprintf(stderr, "INFO: WDC: DUI Header Version = 0x%x\n", + log_hdr_v3->hdr_version); + if ((log_hdr->hdr_version & 0xFF) == 0x03) + fprintf(stderr, "INFO: WDC: DUI Product ID = 0x%x/%c\n", + log_hdr_v3->product_id, log_hdr_v3->product_id); + } - curr_data_offset += xfer_size; - i++; + if (!cap_dui_length_v3) { + fprintf(stderr, "INFO: WDC: Capture V2 or V3 Device Unit Info log is empty\n"); + return 0; + } + + /* parse log header for all sections up to specified data area inclusively */ + if (data_area != WDC_NVME_DUI_MAX_DATA_AREA) { + for (j = 0; j < WDC_NVME_DUI_MAX_SECTION_V3; j++) { + if (log_hdr_v3->log_section[j].data_area_id <= data_area && + log_hdr_v3->log_section[j].data_area_id) { + log_size += log_hdr_v3->log_section[j].section_size; + if (verbose) + fprintf(stderr, + "%s: Data area ID %d : section size 0x%x, total size = 0x%"PRIx64"\n", + __func__, log_hdr_v3->log_section[j].data_area_id, + (unsigned int)log_hdr_v3->log_section[j].section_size, + (uint64_t)log_size); + } else { + if (verbose) + fprintf(stderr, "%s: break, total size = 0x%"PRIx64"\n", + __func__, (uint64_t)log_size); + break; } } + } else { + log_size = cap_dui_length_v3; } - else if (((log_hdr->hdr_version & 0xFF) == 0x02) || - ((log_hdr->hdr_version & 0xFF) == 0x03)) { /* Process Version 2 or 3 header */ - __s64 log_size = 0; - __u64 curr_data_offset = 0; - __u64 xfer_size_long = (__u64)xfer_size; - log_hdr_v3 = (struct wdc_dui_log_hdr_v3 *)log_hdr; + *total_size = log_size; - cap_dui_length_v3 = le64_to_cpu(log_hdr_v3->log_size); + if (offset >= *total_size) { + fprintf(stderr, + "%s: INFO: WDC: Offset 0x%"PRIx64" exceeds total size 0x%"PRIx64", no data retrieved\n", + __func__, (uint64_t)offset, (uint64_t)*total_size); + return -1; + } - if (verbose) { - fprintf(stderr, "INFO : WDC : Capture V2 or V3 Device Unit Info log, data area = %d\n", data_area); + dump_data = (__u8 *)malloc(sizeof(__u8) * xfer_size_long); + if (!dump_data) { + fprintf(stderr, + "%s: ERROR: dump data v3 malloc failed : status %s, size = 0x%"PRIx64"\n", + __func__, strerror(errno), (uint64_t)xfer_size_long); + return -1; + } + memset(dump_data, 0, sizeof(__u8) * xfer_size_long); - fprintf(stderr, "INFO : WDC : DUI Header Version = 0x%x\n", log_hdr_v3->hdr_version); - if ((log_hdr->hdr_version & 0xFF) == 0x03) - fprintf(stderr, "INFO : WDC : DUI Product ID = 0x%x/%c\n", log_hdr_v3->product_id, log_hdr_v3->product_id); - } + output = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (output < 0) { + fprintf(stderr, "%s: Failed to open output file %s: %s!\n", + __func__, file, strerror(errno)); + free(dump_data); + return output; + } - if (cap_dui_length_v3 == 0) { - fprintf(stderr, "INFO : WDC : Capture V2 or V3 Device Unit Info log is empty\n"); - } else { - /* parse log header for all sections up to specified data area inclusively */ - if (data_area != WDC_NVME_DUI_MAX_DATA_AREA) { - for(j = 0; j < WDC_NVME_DUI_MAX_SECTION_V3; j++) { - if (log_hdr_v3->log_section[j].data_area_id <= data_area && - log_hdr_v3->log_section[j].data_area_id != 0) { - log_size += log_hdr_v3->log_section[j].section_size; - if (verbose) - fprintf(stderr, "%s: Data area ID %d : section size 0x%x, total size = 0x%"PRIx64"\n", - __func__, log_hdr_v3->log_section[j].data_area_id, (unsigned int)log_hdr_v3->log_section[j].section_size, (uint64_t)log_size); - } - else { - if (verbose) - fprintf(stderr, "%s: break, total size = 0x%"PRIx64"\n", __func__, (uint64_t)log_size); - break; - } - } - } else - log_size = cap_dui_length_v3; + curr_data_offset = 0; - total_size = log_size; + if (file_size) { + /* Write the DUI data based on the passed in file size */ + if ((offset + file_size) > *total_size) + log_size = min((*total_size - offset), file_size); + else + log_size = min(*total_size, file_size); - if (offset >= total_size) { - fprintf(stderr, "%s: INFO : WDC : Offset 0x%"PRIx64" exceeds total size 0x%"PRIx64", no data retrieved\n", - __func__, (uint64_t)offset, (uint64_t)total_size); - goto out; - } + if (verbose) + fprintf(stderr, + "%s: INFO: WDC: Offset 0x%"PRIx64", file size 0x%"PRIx64", total size 0x%"PRIx64", log size 0x%"PRIx64"\n", + __func__, (uint64_t)offset, + (uint64_t)file_size, (uint64_t)*total_size, (uint64_t)log_size); - dump_data = (__u8 *) malloc(sizeof (__u8) * xfer_size_long); - if (dump_data == NULL) { - fprintf(stderr, "%s: ERROR : dump data v3 malloc failed : status %s, size = 0x%"PRIx64"\n", - __func__, strerror(errno), (uint64_t)xfer_size_long); - ret = -1; - goto out; - } - memset(dump_data, 0, sizeof (__u8) * xfer_size_long); - - output = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (output < 0) { - fprintf(stderr, "%s: Failed to open output file %s: %s!\n", - __func__, file, strerror(errno)); - ret = output; - goto free_mem; - } + curr_data_offset = offset; + } - curr_data_offset = 0; + i = 0; + buffer_addr = dump_data; - if (file_size != 0) { - /* Write the DUI data based on the passed in file size */ - if ((offset + file_size) > total_size) - log_size = min((total_size - offset), file_size); - else - log_size = min(total_size, file_size); + for (; log_size > 0; log_size -= xfer_size_long) { + xfer_size_long = min(xfer_size_long, log_size); - if (verbose) - fprintf(stderr, "%s: INFO : WDC : Offset 0x%"PRIx64", file size 0x%"PRIx64", total size 0x%"PRIx64", log size 0x%"PRIx64"\n", - __func__, (uint64_t)offset, (uint64_t)file_size, (uint64_t)total_size, (uint64_t)log_size); + if (log_size <= xfer_size_long) + last_xfer = true; - curr_data_offset = offset; + ret = wdc_dump_dui_data_v2(fd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, + last_xfer); + if (ret) { + fprintf(stderr, + "%s: ERROR: WDC: Get chunk %d, size = 0x%"PRIx64", offset = 0x%"PRIx64", addr = %p\n", + __func__, i, (uint64_t)*total_size, (uint64_t)curr_data_offset, + buffer_addr); + fprintf(stderr, "%s: ERROR: WDC: ", __func__); + nvme_show_status(ret); + break; + } - } + /* write the dump data into the file */ + err = write(output, (void *)buffer_addr, xfer_size_long); + if (err != xfer_size_long) { + fprintf(stderr, + "%s: ERROR: WDC: Failed to flush DUI data to file! chunk %d, err = 0x%x, xfer_size = 0x%"PRIx64"\n", + __func__, i, err, (uint64_t)xfer_size_long); + ret = -1; + goto free_mem; + } + + curr_data_offset += xfer_size_long; + i++; + } - i = 0; - buffer_addr = dump_data; +free_mem: + close(output); + free(dump_data); + return ret; +} - for(; log_size > 0; log_size -= xfer_size_long) { - xfer_size_long = min(xfer_size_long, log_size); +static int wdc_do_cap_dui_v4(int fd, char *file, __u32 xfer_size, int data_area, int verbose, + struct wdc_dui_log_hdr *log_hdr, __s64 *total_size, __u64 file_size, + __u64 offset) +{ + __s64 log_size = 0; + __s64 section_size_bytes = 0; + __s64 xfer_size_long = (__s64)xfer_size; + __u64 cap_dui_length_v4; + __u64 curr_data_offset = 0; + __u8 *buffer_addr; + __u8 *dump_data = NULL; + int err; + int i; + int j; + int output; + int ret = 0; + bool last_xfer = false; + struct wdc_dui_log_hdr_v4 *log_hdr_v4 = (struct wdc_dui_log_hdr_v4 *)log_hdr; - if (log_size <= xfer_size_long) - last_xfer = true; + cap_dui_length_v4 = le64_to_cpu(log_hdr_v4->log_size_sectors) * WDC_NVME_SN730_SECTOR_SIZE; - ret = wdc_dump_dui_data_v2(fd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, last_xfer); - if (ret != 0) { - fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%"PRIx64", offset = 0x%"PRIx64", addr = %p\n", - __func__, i, (uint64_t)total_size, (uint64_t)curr_data_offset, buffer_addr); - fprintf(stderr, "%s: ERROR : WDC : ", __func__); - nvme_show_status(ret); - break; - } + if (verbose) { + fprintf(stderr, "INFO: WDC: Capture V4 Device Unit Info log, data area = %d\n", data_area); + fprintf(stderr, "INFO: WDC: DUI Header Version = 0x%x\n", log_hdr_v4->hdr_version); + fprintf(stderr, "INFO: WDC: DUI Product ID = 0x%x/%c\n", log_hdr_v4->product_id, log_hdr_v4->product_id); + fprintf(stderr, "INFO: WDC: DUI log size sectors = 0x%x\n", log_hdr_v4->log_size_sectors); + fprintf(stderr, "INFO: WDC: DUI cap_dui_length = 0x%"PRIx64"\n", (uint64_t)cap_dui_length_v4); + } - /* write the dump data into the file */ - err = write(output, (void *)buffer_addr, xfer_size_long); - if (err != xfer_size_long) { - fprintf(stderr, "%s: ERROR : WDC : Failed to flush DUI data to file! chunk %d, err = 0x%x, xfer_size = 0x%"PRIx64"\n", - __func__, i, err, (uint64_t)xfer_size_long); - goto free_mem; - } + if (!cap_dui_length_v4) { + fprintf(stderr, "INFO: WDC: Capture V4 Device Unit Info log is empty\n"); + return 0; + } - curr_data_offset += xfer_size_long; - i++; + /* parse log header for all sections up to specified data area inclusively */ + if (data_area != WDC_NVME_DUI_MAX_DATA_AREA) { + for (j = 0; j < WDC_NVME_DUI_MAX_SECTION; j++) { + if (log_hdr_v4->log_section[j].data_area_id <= data_area && + log_hdr_v4->log_section[j].data_area_id) { + section_size_bytes = ((__s64)log_hdr_v4->log_section[j].section_size_sectors * WDC_NVME_SN730_SECTOR_SIZE); + log_size += section_size_bytes; + if (verbose) + fprintf(stderr, + "%s: Data area ID %d : section size 0x%x sectors, section size 0x%"PRIx64" bytes, total size = 0x%"PRIx64"\n", + __func__, log_hdr_v4->log_section[j].data_area_id, + log_hdr_v4->log_section[j].section_size_sectors, + (uint64_t)section_size_bytes, (uint64_t)log_size); + } else { + if (verbose) + fprintf(stderr, "%s: break, total size = 0x%"PRIx64"\n", __func__, (uint64_t)log_size); + break; } } + } else { + log_size = cap_dui_length_v4; } - else if ((log_hdr->hdr_version & 0xFF) == 0x04) { - __s64 log_size = 0; - __u64 curr_data_offset = 0; - struct wdc_dui_log_hdr_v4 *log_hdr_v4; - log_hdr_v4 = (struct wdc_dui_log_hdr_v4 *)log_hdr; - __s64 xfer_size_long = (__s64)xfer_size; - __s64 section_size_bytes = 0; - - cap_dui_length_v4 = le64_to_cpu(log_hdr_v4->log_size_sectors) * WDC_NVME_SN730_SECTOR_SIZE; - - if (verbose) { - fprintf(stderr, "INFO : WDC : Capture V4 Device Unit Info log, data area = %d\n", data_area); - fprintf(stderr, "INFO : WDC : DUI Header Version = 0x%x\n", log_hdr_v4->hdr_version); - fprintf(stderr, "INFO : WDC : DUI Product ID = 0x%x/%c\n", log_hdr_v4->product_id, log_hdr_v4->product_id); - fprintf(stderr, "INFO : WDC : DUI log size sectors = 0x%x\n", log_hdr_v4->log_size_sectors); - fprintf(stderr, "INFO : WDC : DUI cap_dui_length = 0x%"PRIx64"\n", (uint64_t)cap_dui_length_v4); - } - if (cap_dui_length_v4 == 0) { - fprintf(stderr, "INFO : WDC : Capture V4 Device Unit Info log is empty\n"); - } else { - /* parse log header for all sections up to specified data area inclusively */ - if (data_area != WDC_NVME_DUI_MAX_DATA_AREA) { - for(j = 0; j < WDC_NVME_DUI_MAX_SECTION; j++) { - if (log_hdr_v4->log_section[j].data_area_id <= data_area && - log_hdr_v4->log_section[j].data_area_id != 0) { - section_size_bytes = ((__s64)log_hdr_v4->log_section[j].section_size_sectors * WDC_NVME_SN730_SECTOR_SIZE); - log_size += section_size_bytes; - if (verbose) - fprintf(stderr, "%s: Data area ID %d : section size 0x%x sectors, section size 0x%"PRIx64" bytes, total size = 0x%"PRIx64"\n", - __func__, log_hdr_v4->log_section[j].data_area_id, log_hdr_v4->log_section[j].section_size_sectors, (uint64_t)section_size_bytes, - (uint64_t)log_size); - } - else { - if (verbose) - fprintf(stderr, "%s: break, total size = 0x%"PRIx64"\n", __func__, (uint64_t)log_size); - break; - } - } - } else - log_size = cap_dui_length_v4; + *total_size = log_size; - total_size = log_size; + if (offset >= *total_size) { + fprintf(stderr, + "%s: INFO: WDC: Offset 0x%"PRIx64" exceeds total size 0x%"PRIx64", no data retrieved\n", + __func__, (uint64_t)offset, (uint64_t)*total_size); + return -1; + } - if (offset >= total_size) { - fprintf(stderr, "%s: INFO : WDC : Offset 0x%"PRIx64" exceeds total size 0x%"PRIx64", no data retrieved\n", - __func__, (uint64_t)offset, (uint64_t)total_size); - goto out; - } + dump_data = (__u8 *)malloc(sizeof(__u8) * xfer_size_long); + if (!dump_data) { + fprintf(stderr, "%s: ERROR: dump data V4 malloc failed : status %s, size = 0x%x\n", + __func__, strerror(errno), (unsigned int)xfer_size_long); + return -1; + } + memset(dump_data, 0, sizeof(__u8) * xfer_size_long); - dump_data = (__u8 *) malloc(sizeof (__u8) * xfer_size_long); - if (dump_data == NULL) { - fprintf(stderr, "%s: ERROR : dump data V4 malloc failed : status %s, size = 0x%x\n", - __func__, strerror(errno), (unsigned int)xfer_size_long); - ret = -1; - goto out; - } - memset(dump_data, 0, sizeof (__u8) * xfer_size_long); - - output = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (output < 0) { - fprintf(stderr, "%s: Failed to open output file %s: %s!\n", - __func__, file, strerror(errno)); - ret = output; - goto free_mem; - } + output = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (output < 0) { + fprintf(stderr, "%s: Failed to open output file %s: %s!\n", __func__, file, + strerror(errno)); + free(dump_data); + return output; + } - curr_data_offset = 0; + curr_data_offset = 0; - if (file_size != 0) { - /* Write the DUI data based on the passed in file size */ - if ((offset + file_size) > total_size) - log_size = min((total_size - offset), file_size); - else - log_size = min(total_size, file_size); + if (file_size) { + /* Write the DUI data based on the passed in file size */ + if ((offset + file_size) > *total_size) + log_size = min((*total_size - offset), file_size); + else + log_size = min(*total_size, file_size); - if (verbose) - fprintf(stderr, "%s: INFO : WDC : Offset 0x%"PRIx64", file size 0x%"PRIx64", total size 0x%"PRIx64", log size 0x%"PRIx64"\n", - __func__, (uint64_t)offset, (uint64_t)file_size, (uint64_t)total_size, (uint64_t)log_size); + if (verbose) + fprintf(stderr, + "%s: INFO: WDC: Offset 0x%"PRIx64", file size 0x%"PRIx64", total size 0x%"PRIx64", log size 0x%"PRIx64"\n", + __func__, (uint64_t)offset, (uint64_t)file_size, + (uint64_t)*total_size, (uint64_t)log_size); - curr_data_offset = offset; + curr_data_offset = offset; + } - } + i = 0; + buffer_addr = dump_data; - i = 0; - buffer_addr = dump_data; + for (; log_size > 0; log_size -= xfer_size_long) { + xfer_size_long = min(xfer_size_long, log_size); - for(; log_size > 0; log_size -= xfer_size_long) { - xfer_size_long = min(xfer_size_long, log_size); + if (log_size <= xfer_size_long) + last_xfer = true; - if (log_size <= xfer_size_long) - last_xfer = true; + ret = wdc_dump_dui_data_v2(fd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, last_xfer); + if (ret) { + fprintf(stderr, + "%s: ERROR: WDC: Get chunk %d, size = 0x%"PRIx64", offset = 0x%"PRIx64", addr = %p\n", + __func__, i, (uint64_t)log_size, (uint64_t)curr_data_offset, + buffer_addr); + fprintf(stderr, "%s: ERROR: WDC:", __func__); + nvme_show_status(ret); + break; + } - ret = wdc_dump_dui_data_v2(fd, (__u32)xfer_size_long, curr_data_offset, buffer_addr, last_xfer); - if (ret != 0) { - fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%"PRIx64", offset = 0x%"PRIx64", addr = %p\n", - __func__, i, (uint64_t)log_size, (uint64_t)curr_data_offset, buffer_addr); - fprintf(stderr, "%s: ERROR : WDC :", __func__); - nvme_show_status(ret); - break; - } + /* write the dump data into the file */ + err = write(output, (void *)buffer_addr, xfer_size_long); + if (err != xfer_size_long) { + fprintf(stderr, + "%s: ERROR: WDC: Failed to flush DUI data to file! chunk %d, err = 0x%x, xfer_size_long = 0x%"PRIx64"\n", + __func__, i, err, (uint64_t)xfer_size_long); + ret = -1; + goto free_mem; + } - /* write the dump data into the file */ - err = write(output, (void *)buffer_addr, xfer_size_long); - if (err != xfer_size_long) { - fprintf(stderr, "%s: ERROR : WDC : Failed to flush DUI data to file! chunk %d, err = 0x%x, xfer_size_long = 0x%"PRIx64"\n", - __func__, i, err, (uint64_t)xfer_size_long); - goto free_mem; - } + curr_data_offset += xfer_size_long; + i++; + } - curr_data_offset += xfer_size_long; - i++; - } - } +free_mem: + close(output); + free(dump_data); + return ret; +} + +static int wdc_do_cap_dui(int fd, char *file, __u32 xfer_size, int data_area, int verbose, + __u64 file_size, __u64 offset) +{ + int ret = 0; + __u32 dui_log_hdr_size = WDC_NVME_CAP_DUI_HEADER_SIZE; + struct wdc_dui_log_hdr *log_hdr; + __s64 total_size = 0; + bool last_xfer = false; + + log_hdr = (struct wdc_dui_log_hdr *)malloc(dui_log_hdr_size); + if (!log_hdr) { + fprintf(stderr, "%s: ERROR: log header malloc failed : status %s, size 0x%x\n", + __func__, strerror(errno), dui_log_hdr_size); + return -1; + } + memset(log_hdr, 0, dui_log_hdr_size); + + /* get the dui telemetry and log headers */ + ret = wdc_dump_dui_data(fd, WDC_NVME_CAP_DUI_HEADER_SIZE, 0x00, (__u8 *)log_hdr, last_xfer); + if (ret) { + fprintf(stderr, "%s: ERROR: WDC: Get DUI headers failed\n", __func__); + fprintf(stderr, "%s: ERROR: WDC: ", __func__); + nvme_show_status(ret); + goto out; } - else { - fprintf(stderr, "INFO : WDC : Unsupported header version = 0x%x\n", log_hdr->hdr_version); - goto out; + + /* Check the Log Header version */ + if ((log_hdr->hdr_version & 0xFF) == 0x00 || (log_hdr->hdr_version & 0xFF) == 0x01) { + ret = wdc_do_cap_dui_v1(fd, file, xfer_size, data_area, verbose, log_hdr, + &total_size); + if (ret) + goto out; + } else if ((log_hdr->hdr_version & 0xFF) == 0x02 || + (log_hdr->hdr_version & 0xFF) == 0x03) { + /* Process Version 2 or 3 header */ + ret = wdc_do_cap_dui_v2_v3(fd, file, xfer_size, data_area, verbose, log_hdr, + &total_size, file_size, offset); + if (ret) + goto out; + } else if ((log_hdr->hdr_version & 0xFF) == 0x04) { + ret = wdc_do_cap_dui_v4(fd, file, xfer_size, data_area, verbose, log_hdr, + &total_size, file_size, offset); + if (ret) + goto out; + } else { + fprintf(stderr, "INFO: WDC: Unsupported header version = 0x%x\n", + log_hdr->hdr_version); + goto out; } nvme_show_status(ret); if (verbose) - fprintf(stderr, "INFO : WDC : Capture Device Unit Info log, length = 0x%"PRIx64"\n", (uint64_t)total_size); + fprintf(stderr, "INFO: WDC: Capture Device Unit Info log, length = 0x%"PRIx64"\n", + (uint64_t)total_size); - free_mem: - close(output); - free(dump_data); - - out: +out: free(log_hdr); return ret; } @@ -3019,18 +3111,18 @@ static int wdc_cap_diag(int argc, char **argv, struct command *command, r = nvme_scan(NULL); - if (cfg.file != NULL) + if (cfg.file) strncpy(f, cfg.file, PATH_MAX - 1); - if (cfg.xfer_size != 0) + if (cfg.xfer_size) xfer_size = cfg.xfer_size; ret = wdc_get_serial_name(dev, f, PATH_MAX, "cap_diag"); if (ret) { - fprintf(stderr, "ERROR : WDC: failed to generate file name\n"); + fprintf(stderr, "ERROR: WDC: failed to generate file name\n"); goto out; } - if (cfg.file == NULL) { + if (!cfg.file) { if (strlen(f) > PATH_MAX - 5) { - fprintf(stderr, "ERROR : WDC: file name overflow\n"); + fprintf(stderr, "ERROR: WDC: file name overflow\n"); ret = -1; goto out; } @@ -3041,8 +3133,7 @@ static int wdc_cap_diag(int argc, char **argv, struct command *command, if ((capabilities & WDC_DRIVE_CAP_CAP_DIAG) == WDC_DRIVE_CAP_CAP_DIAG) ret = wdc_do_cap_diag(r, dev, f, xfer_size, 0, 0); else - fprintf(stderr, - "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); out: nvme_free_tree(r); dev_close(dev); @@ -3055,12 +3146,13 @@ static int wdc_do_get_sn730_log_len(int fd, uint32_t *len_buf, uint32_t subopcod uint32_t *output = NULL; struct nvme_passthru_cmd admin_cmd; - if ((output = (uint32_t*)malloc(sizeof(uint32_t))) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + output = (uint32_t *)malloc(sizeof(uint32_t)); + if (!output) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(output, 0, sizeof (uint32_t)); - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(output, 0, sizeof(uint32_t)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.data_len = 8; admin_cmd.opcode = SN730_NVME_GET_LOG_OPCODE; @@ -3069,23 +3161,24 @@ static int wdc_do_get_sn730_log_len(int fd, uint32_t *len_buf, uint32_t subopcod admin_cmd.cdw10 = SN730_LOG_CHUNK_SIZE / 4; ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); - if (ret == 0) + if (!ret) *len_buf = *output; free(output); return ret; } -static int wdc_do_get_sn730_log(int fd, void * log_buf, uint32_t offset, uint32_t subopcode) +static int wdc_do_get_sn730_log(int fd, void *log_buf, uint32_t offset, uint32_t subopcode) { int ret; uint8_t *output = NULL; struct nvme_passthru_cmd admin_cmd; - if ((output = (uint8_t*)calloc(SN730_LOG_CHUNK_SIZE, sizeof(uint8_t))) == NULL) { - fprintf(stderr, "ERROR : WDC : calloc : %s\n", strerror(errno)); + output = (uint8_t *)calloc(SN730_LOG_CHUNK_SIZE, sizeof(uint8_t)); + if (!output) { + fprintf(stderr, "ERROR: WDC: calloc: %s\n", strerror(errno)); return -1; } - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.data_len = SN730_LOG_CHUNK_SIZE; admin_cmd.opcode = SN730_NVME_GET_LOG_OPCODE; admin_cmd.addr = (uintptr_t)output; @@ -3099,15 +3192,16 @@ static int wdc_do_get_sn730_log(int fd, void * log_buf, uint32_t offset, uint32_ return ret; } -static int get_sn730_log_chunks(int fd, uint8_t* log_buf, uint32_t log_len, uint32_t subopcode) +static int get_sn730_log_chunks(int fd, uint8_t *log_buf, uint32_t log_len, uint32_t subopcode) { int ret = 0; - uint8_t* chunk_buf = NULL; + uint8_t *chunk_buf = NULL; int remaining = log_len; int curr_offset = 0; - if ((chunk_buf = (uint8_t*) malloc(sizeof (uint8_t) * SN730_LOG_CHUNK_SIZE)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + chunk_buf = (uint8_t *)malloc(sizeof(uint8_t) * SN730_LOG_CHUNK_SIZE); + if (!chunk_buf) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); ret = -1; goto out; } @@ -3125,59 +3219,59 @@ static int get_sn730_log_chunks(int fd, uint8_t* log_buf, uint32_t log_len, uint } remaining -= SN730_LOG_CHUNK_SIZE; curr_offset += 1; - } else + } else { goto out; + } } out: free(chunk_buf); return ret; } -static int wdc_do_sn730_get_and_tar(int fd, char * outputName) +static int wdc_do_sn730_get_and_tar(int fd, char *outputName) { int ret = 0; void *retPtr; - uint8_t* full_log_buf = NULL; - uint8_t* key_log_buf = NULL; - uint8_t* core_dump_log_buf = NULL; - uint8_t* extended_log_buf = NULL; + uint8_t *full_log_buf = NULL; + uint8_t *key_log_buf = NULL; + uint8_t *core_dump_log_buf = NULL; + uint8_t *extended_log_buf = NULL; uint32_t full_log_len = 0; uint32_t key_log_len = 0; uint32_t core_dump_log_len = 0; uint32_t extended_log_len = 0; - tarfile_metadata* tarInfo = NULL; + struct tarfile_metadata *tarInfo = NULL; - tarInfo = (struct tarfile_metadata*) malloc(sizeof(tarfile_metadata)); - if (tarInfo == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + tarInfo = (struct tarfile_metadata *)malloc(sizeof(struct tarfile_metadata)); + if (!tarInfo) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); ret = -1; goto free_buf; } - memset(tarInfo, 0, sizeof(tarfile_metadata)); + memset(tarInfo, 0, sizeof(struct tarfile_metadata)); - /* Create Logs directory */ + /* Create Logs directory */ wdc_UtilsGetTime(&tarInfo->timeInfo); memset(tarInfo->timeString, 0, sizeof(tarInfo->timeString)); - wdc_UtilsSnprintf((char*)tarInfo->timeString, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", + wdc_UtilsSnprintf((char *)tarInfo->timeString, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", tarInfo->timeInfo.year, tarInfo->timeInfo.month, tarInfo->timeInfo.dayOfMonth, tarInfo->timeInfo.hour, tarInfo->timeInfo.minute, tarInfo->timeInfo.second); - wdc_UtilsSnprintf((char*)tarInfo->bufferFolderName, MAX_PATH_LEN, "%s", - (char*)outputName); + wdc_UtilsSnprintf((char *)tarInfo->bufferFolderName, MAX_PATH_LEN, "%s", + (char *)outputName); - retPtr = getcwd((char*)tarInfo->currDir, MAX_PATH_LEN); - if (retPtr != NULL) - wdc_UtilsSnprintf((char*)tarInfo->bufferFolderPath, MAX_PATH_LEN, "%s%s%s", + retPtr = getcwd((char *)tarInfo->currDir, MAX_PATH_LEN); + if (retPtr) { + wdc_UtilsSnprintf((char *)tarInfo->bufferFolderPath, MAX_PATH_LEN, "%s%s%s", (char *)tarInfo->currDir, WDC_DE_PATH_SEPARATOR, (char *)tarInfo->bufferFolderName); - else { - fprintf(stderr, "ERROR : WDC : get current working directory failed\n"); + } else { + fprintf(stderr, "ERROR: WDC: get current working directory failed\n"); goto free_buf; } - ret = wdc_UtilsCreateDir((char*)tarInfo->bufferFolderPath); - if (ret) - { - fprintf(stderr, "ERROR : WDC : create directory failed, ret = %d, dir = %s\n", ret, tarInfo->bufferFolderPath); + ret = wdc_UtilsCreateDir((char *)tarInfo->bufferFolderPath); + if (ret) { + fprintf(stderr, "ERROR: WDC: create directory failed, ret = %d, dir = %s\n", ret, tarInfo->bufferFolderPath); goto free_buf; } else { fprintf(stderr, "Stored log files in directory: %s\n", tarInfo->bufferFolderPath); @@ -3204,13 +3298,13 @@ static int wdc_do_sn730_get_and_tar(int fd, char * outputName) goto free_buf; } - full_log_buf = (uint8_t*) calloc(full_log_len, sizeof (uint8_t)); - key_log_buf = (uint8_t*) calloc(key_log_len, sizeof (uint8_t)); - core_dump_log_buf = (uint8_t*) calloc(core_dump_log_len, sizeof (uint8_t)); - extended_log_buf = (uint8_t*) calloc(extended_log_len, sizeof (uint8_t)); + full_log_buf = (uint8_t *) calloc(full_log_len, sizeof(uint8_t)); + key_log_buf = (uint8_t *) calloc(key_log_len, sizeof(uint8_t)); + core_dump_log_buf = (uint8_t *) calloc(core_dump_log_len, sizeof(uint8_t)); + extended_log_buf = (uint8_t *) calloc(extended_log_len, sizeof(uint8_t)); if (!full_log_buf || !key_log_buf || !core_dump_log_buf || !extended_log_buf) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); ret = -1; goto free_buf; } @@ -3244,31 +3338,31 @@ static int wdc_do_sn730_get_and_tar(int fd, char * outputName) } /* Write log files */ - wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char*)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "full_log", (char*)tarInfo->timeString); - wdc_WriteToFile(tarInfo->fileName, (char*)full_log_buf, full_log_len); + wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char *)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "full_log", (char *)tarInfo->timeString); + wdc_WriteToFile(tarInfo->fileName, (char *)full_log_buf, full_log_len); - wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char*)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "key_log", (char*)tarInfo->timeString); - wdc_WriteToFile(tarInfo->fileName, (char*)key_log_buf, key_log_len); + wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char *)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "key_log", (char *)tarInfo->timeString); + wdc_WriteToFile(tarInfo->fileName, (char *)key_log_buf, key_log_len); - wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char*)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "core_dump_log", (char*)tarInfo->timeString); - wdc_WriteToFile(tarInfo->fileName, (char*)core_dump_log_buf, core_dump_log_len); + wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char *)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "core_dump_log", (char *)tarInfo->timeString); + wdc_WriteToFile(tarInfo->fileName, (char *)core_dump_log_buf, core_dump_log_len); - wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char*)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "extended_log", (char*)tarInfo->timeString); - wdc_WriteToFile(tarInfo->fileName, (char*)extended_log_buf, extended_log_len); + wdc_UtilsSnprintf(tarInfo->fileName, MAX_PATH_LEN, "%s%s%s_%s.bin", (char *)tarInfo->bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "extended_log", (char *)tarInfo->timeString); + wdc_WriteToFile(tarInfo->fileName, (char *)extended_log_buf, extended_log_len); /* Tar the log directory */ - wdc_UtilsSnprintf(tarInfo->tarFileName, sizeof(tarInfo->tarFileName), "%s%s", (char*)tarInfo->bufferFolderPath, WDC_DE_TAR_FILE_EXTN); - wdc_UtilsSnprintf(tarInfo->tarFiles, sizeof(tarInfo->tarFiles), "%s%s%s", (char*)tarInfo->bufferFolderName, WDC_DE_PATH_SEPARATOR, WDC_DE_TAR_FILES); - wdc_UtilsSnprintf(tarInfo->tarCmd, sizeof(tarInfo->tarCmd), "%s %s %s", WDC_DE_TAR_CMD, (char*)tarInfo->tarFileName, (char*)tarInfo->tarFiles); + wdc_UtilsSnprintf(tarInfo->tarFileName, sizeof(tarInfo->tarFileName), "%s%s", (char *)tarInfo->bufferFolderPath, WDC_DE_TAR_FILE_EXTN); + wdc_UtilsSnprintf(tarInfo->tarFiles, sizeof(tarInfo->tarFiles), "%s%s%s", (char *)tarInfo->bufferFolderName, WDC_DE_PATH_SEPARATOR, WDC_DE_TAR_FILES); + wdc_UtilsSnprintf(tarInfo->tarCmd, sizeof(tarInfo->tarCmd), "%s %s %s", WDC_DE_TAR_CMD, (char *)tarInfo->tarFileName, (char *)tarInfo->tarFiles); ret = system(tarInfo->tarCmd); if (ret) - fprintf(stderr, "ERROR : WDC : Tar of log data failed, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Tar of log data failed, ret = %d\n", ret); free_buf: free(tarInfo); @@ -3280,7 +3374,7 @@ free_buf: } static int wdc_vs_internal_fw_log(int argc, char **argv, struct command *command, - struct plugin *plugin) + struct plugin *plugin) { char *desc = "Internal Firmware Log."; char *file = "Output file pathname."; @@ -3340,20 +3434,20 @@ static int wdc_vs_internal_fw_log(int argc, char **argv, struct command *command if (!wdc_check_device(r, dev)) goto out; - if (cfg.xfer_size != 0) + if (cfg.xfer_size) { xfer_size = cfg.xfer_size; - else { - fprintf(stderr, "ERROR : WDC : Invalid length\n"); + } else { + fprintf(stderr, "ERROR: WDC: Invalid length\n"); goto out; } - if (cfg.file != NULL) { + if (cfg.file) { int verify_file; /* verify the passed in file name and path is valid before getting the dump data */ verify_file = open(cfg.file, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (verify_file < 0) { - fprintf(stderr, "ERROR : WDC: open : %s\n", strerror(errno)); + fprintf(stderr, "ERROR: WDC: open: %s\n", strerror(errno)); goto out; } close(verify_file); @@ -3361,21 +3455,21 @@ static int wdc_vs_internal_fw_log(int argc, char **argv, struct command *command } else { wdc_UtilsGetTime(&timeInfo); memset(timeStamp, 0, sizeof(timeStamp)); - wdc_UtilsSnprintf((char*)timeStamp, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", + wdc_UtilsSnprintf((char *)timeStamp, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", timeInfo.year, timeInfo.month, timeInfo.dayOfMonth, timeInfo.hour, timeInfo.minute, timeInfo.second); - snprintf(fileSuffix, PATH_MAX, "_internal_fw_log_%s", (char*)timeStamp); + snprintf(fileSuffix, PATH_MAX, "_internal_fw_log_%s", (char *)timeStamp); ret = wdc_get_serial_name(dev, f, PATH_MAX, fileSuffix); if (ret) { - fprintf(stderr, "ERROR : WDC: failed to generate file name\n"); + fprintf(stderr, "ERROR: WDC: failed to generate file name\n"); goto out; } } - if (cfg.file == NULL) { + if (!cfg.file) { if (strlen(f) > PATH_MAX - 5) { - fprintf(stderr, "ERROR : WDC: file name overflow\n"); + fprintf(stderr, "ERROR: WDC: file name overflow\n"); ret = -1; goto out; } @@ -3385,67 +3479,63 @@ static int wdc_vs_internal_fw_log(int argc, char **argv, struct command *command if (cfg.data_area) { if (cfg.data_area > 5 || cfg.data_area < 1) { - fprintf(stderr, "ERROR : WDC: Data area must be 1-5\n"); + fprintf(stderr, "ERROR: WDC: Data area must be 1-5\n"); ret = -1; goto out; } } - if ((cfg.type == NULL) || - (!strcmp(cfg.type, "NONE")) || - (!strcmp(cfg.type, "none"))) { + if (!cfg.type || !strcmp(cfg.type, "NONE") || !strcmp(cfg.type, "none")) { telemetry_type = WDC_TELEMETRY_TYPE_NONE; data_area = 0; - } else if ((!strcmp(cfg.type, "HOST")) || - (!strcmp(cfg.type, "host"))) { + } else if (!strcmp(cfg.type, "HOST") || !strcmp(cfg.type, "host")) { telemetry_type = WDC_TELEMETRY_TYPE_HOST; telemetry_data_area = cfg.data_area; - } else if ((!strcmp(cfg.type, "CONTROLLER")) || - (!strcmp(cfg.type, "controller"))) { + } else if (!strcmp(cfg.type, "CONTROLLER") || !strcmp(cfg.type, "controller")) { telemetry_type = WDC_TELEMETRY_TYPE_CONTROLLER; telemetry_data_area = cfg.data_area; } else { - fprintf(stderr, "ERROR : WDC: Invalid type - Must be NONE, HOST or CONTROLLER\n"); + fprintf(stderr, "ERROR: WDC: Invalid type - Must be NONE, HOST or CONTROLLER\n"); ret = -1; goto out; } capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRIVE_CAP_INTERNAL_LOG) == WDC_DRIVE_CAP_INTERNAL_LOG) { - if (telemetry_data_area == 0) + if (!telemetry_data_area) telemetry_data_area = 3; /* Set the default DA to 3 if not specified */ ret = wdc_do_cap_diag(r, dev, f, xfer_size, - telemetry_type, telemetry_data_area); + telemetry_type, telemetry_data_area); goto out; } if ((capabilities & WDC_DRIVE_CAP_DUI) == WDC_DRIVE_CAP_DUI) { if ((telemetry_type == WDC_TELEMETRY_TYPE_HOST) || (telemetry_type == WDC_TELEMETRY_TYPE_CONTROLLER)) { - if (telemetry_data_area == 0) + if (!telemetry_data_area) telemetry_data_area = 3; /* Set the default DA to 3 if not specified */ /* Get the desired telemetry log page */ ret = wdc_do_cap_telemetry_log(dev, f, xfer_size, telemetry_type, telemetry_data_area); goto out; } else { - if (cfg.data_area == 0) + if (!cfg.data_area) cfg.data_area = 1; /* FW requirement - xfer size must be 256k for data area 4 */ if (cfg.data_area >= 4) xfer_size = 0x40000; ret = wdc_do_cap_dui(dev_fd(dev), f, xfer_size, - cfg.data_area, - cfg.verbose, cfg.file_size, - cfg.offset); + cfg.data_area, + cfg.verbose, cfg.file_size, + cfg.offset); goto out; } } - if ((capabilities & WDC_DRIVE_CAP_DUI_DATA) == WDC_DRIVE_CAP_DUI_DATA){ + if ((capabilities & WDC_DRIVE_CAP_DUI_DATA) == WDC_DRIVE_CAP_DUI_DATA) { if ((telemetry_type == WDC_TELEMETRY_TYPE_HOST) || (telemetry_type == WDC_TELEMETRY_TYPE_CONTROLLER)) { - if (telemetry_data_area == 0) + if (!telemetry_data_area) telemetry_data_area = 3; /* Set the default DA to 3 if not specified */ /* Get the desired telemetry log page */ ret = wdc_do_cap_telemetry_log(dev, f, xfer_size, @@ -3458,10 +3548,10 @@ static int wdc_vs_internal_fw_log(int argc, char **argv, struct command *command goto out; } } - if ((capabilities & WDC_SN730B_CAP_VUC_LOG) == WDC_SN730B_CAP_VUC_LOG) + if ((capabilities & WDC_SN730B_CAP_VUC_LOG) == WDC_SN730B_CAP_VUC_LOG) { ret = wdc_do_sn730_get_and_tar(dev_fd(dev), f); - else { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + } else { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } out: @@ -3515,18 +3605,18 @@ static int wdc_do_crash_dump(struct nvme_dev *dev, char *file, int type) if (ret == -1) { if (type == WDC_NVME_PFAIL_DUMP_TYPE) - fprintf(stderr, "INFO : WDC: Pfail dump get size failed\n"); + fprintf(stderr, "INFO: WDC: Pfail dump get size failed\n"); else - fprintf(stderr, "INFO : WDC: Crash dump get size failed\n"); + fprintf(stderr, "INFO: WDC: Crash dump get size failed\n"); return -1; } - if (crash_dump_length == 0) { + if (!crash_dump_length) { if (type == WDC_NVME_PFAIL_DUMP_TYPE) - fprintf(stderr, "INFO : WDC: Pfail dump is empty\n"); + fprintf(stderr, "INFO: WDC: Pfail dump is empty\n"); else - fprintf(stderr, "INFO : WDC: Crash dump is empty\n"); + fprintf(stderr, "INFO: WDC: Crash dump is empty\n"); } else { ret = wdc_do_dump(dev, opcode, @@ -3535,7 +3625,7 @@ static int wdc_do_crash_dump(struct nvme_dev *dev, char *file, int type) file, crash_dump_length); - if (ret == 0) + if (!ret) ret = wdc_do_clear_dump(dev, WDC_NVME_CLEAR_DUMP_OPCODE, cdw12_clear); } @@ -3548,9 +3638,8 @@ static int wdc_crash_dump(struct nvme_dev *dev, char *file, int type) const char *dump_type; int ret; - if (file != NULL) { + if (file) strncpy(f, file, PATH_MAX - 1); - } if (type == WDC_NVME_PFAIL_DUMP_TYPE) dump_type = "_pfail_dump"; @@ -3559,7 +3648,7 @@ static int wdc_crash_dump(struct nvme_dev *dev, char *file, int type) ret = wdc_get_serial_name(dev, f, PATH_MAX, dump_type); if (ret) - fprintf(stderr, "ERROR : WDC : failed to generate file name\n"); + fprintf(stderr, "ERROR: WDC: failed to generate file name\n"); else ret = wdc_do_crash_dump(dev, f, type); return ret; @@ -3577,18 +3666,17 @@ static int wdc_do_drive_log(struct nvme_dev *dev, char *file) (WDC_NVME_DRIVE_LOG_SIZE_SUBCMD << WDC_NVME_SUBCMD_SHIFT | WDC_NVME_DRIVE_LOG_SIZE_CMD), &drive_log_length); - if (ret == -1) { + if (ret == -1) return -1; - } - drive_log_data = (__u8 *) malloc(sizeof (__u8) * drive_log_length); - if (drive_log_data == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + drive_log_data = (__u8 *)malloc(sizeof(__u8) * drive_log_length); + if (!drive_log_data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(drive_log_data, 0, sizeof (__u8) * drive_log_length); - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(drive_log_data, 0, sizeof(__u8) * drive_log_length); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_DRIVE_LOG_OPCODE; admin_cmd.addr = (__u64)(uintptr_t)drive_log_data; admin_cmd.data_len = drive_log_length; @@ -3598,9 +3686,8 @@ static int wdc_do_drive_log(struct nvme_dev *dev, char *file) ret = nvme_submit_admin_passthru(dev_fd(dev), &admin_cmd, NULL); nvme_show_status(ret); - if (ret == 0) { + if (!ret) ret = wdc_create_log_file(file, drive_log_data, drive_log_length); - } free(drive_log_data); return ret; } @@ -3641,16 +3728,15 @@ static int wdc_drive_log(int argc, char **argv, struct command *command, } capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_DRIVE_LOG) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_DRIVE_LOG)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } else { - if (cfg.file != NULL) { + if (cfg.file) strncpy(f, cfg.file, PATH_MAX - 1); - } ret = wdc_get_serial_name(dev, f, PATH_MAX, "drive_log"); if (ret) - fprintf(stderr, "ERROR : WDC : failed to generate file name\n"); + fprintf(stderr, "ERROR: WDC: failed to generate file name\n"); else ret = wdc_do_drive_log(dev, f); } @@ -3697,14 +3783,13 @@ static int wdc_get_crash_dump(int argc, char **argv, struct command *command, capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_CRASH_DUMP) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_CRASH_DUMP)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } else { ret = wdc_crash_dump(dev, cfg.file, WDC_NVME_CRASH_DUMP_TYPE); - if (ret != 0) { - fprintf(stderr, "ERROR : WDC : failed to read crash dump\n"); - } + if (ret) + fprintf(stderr, "ERROR: WDC: failed to read crash dump\n"); } nvme_free_tree(r); dev_close(dev); @@ -3746,14 +3831,13 @@ static int wdc_get_pfail_dump(int argc, char **argv, struct command *command, } capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_PFAIL_DUMP) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_PFAIL_DUMP)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } else { ret = wdc_crash_dump(dev, cfg.file, WDC_NVME_PFAIL_DUMP_TYPE); - if (ret != 0) { - fprintf(stderr, "ERROR : WDC : failed to read pfail crash dump\n"); - } + if (ret) + fprintf(stderr, "ERROR: WDC: failed to read pfail crash dump\n"); } nvme_free_tree(r); dev_close(dev); @@ -3770,7 +3854,7 @@ static void wdc_do_id_ctrl(__u8 *vs, struct json_object *root) if (root) json_object_add_value_string(root, "wdc vsn", strlen(vsn) > 1 ? vsn : "NULL"); else - printf("wdc vsn : %s\n", strlen(vsn) > 1 ? vsn : "NULL"); + printf("wdc vsn: %s\n", strlen(vsn) > 1 ? vsn : "NULL"); } static int wdc_id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin) @@ -3778,7 +3862,7 @@ static int wdc_id_ctrl(int argc, char **argv, struct command *cmd, struct plugin return __id_ctrl(argc, argv, cmd, plugin, wdc_do_id_ctrl); } -static const char* wdc_purge_mon_status_to_string(__u32 status) +static const char *wdc_purge_mon_status_to_string(__u32 status) { const char *str; @@ -3793,14 +3877,12 @@ static const char* wdc_purge_mon_status_to_string(__u32 status) str = "Purge State Busy."; break; case WDC_NVME_PURGE_STATE_REQ_PWR_CYC: - str = "Purge Operation resulted in an error that requires " - "power cycle."; + str = "Purge Operation resulted in an error that requires power cycle."; break; case WDC_NVME_PURGE_STATE_PWR_CYC_PURGE: - str = "The previous purge operation was interrupted by a power " - "cycle\nor reset interruption. Other commands may be " - "rejected until\nPurge Execute is issued and " - "completed."; + str = "The previous purge operation was interrupted by a power cycle\n" + "or reset interruption. Other commands may be rejected until\n" + "Purge Execute is issued and completed."; break; default: str = "Unknown."; @@ -3836,12 +3918,12 @@ static int wdc_purge(int argc, char **argv, } capabilities = wdc_get_drive_capabilities(r, dev); - if((capabilities & WDC_DRIVE_CAP_PURGE) == 0) { + if (!(capabilities & WDC_DRIVE_CAP_PURGE)) { ret = -1; - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); } else { err_str = ""; - memset(&admin_cmd, 0, sizeof (admin_cmd)); + memset(&admin_cmd, 0, sizeof(admin_cmd)); admin_cmd.opcode = WDC_NVME_PURGE_CMD_OPCODE; ret = nvme_submit_admin_passthru(dev_fd(dev), &admin_cmd, @@ -3849,14 +3931,13 @@ static int wdc_purge(int argc, char **argv, if (ret > 0) { switch (ret) { case WDC_NVME_PURGE_CMD_SEQ_ERR: - err_str = "ERROR : WDC : Cannot execute purge, " - "Purge operation is in progress.\n"; + err_str = "ERROR: WDC: Cannot execute purge, Purge operation is in progress.\n"; break; case WDC_NVME_PURGE_INT_DEV_ERR: - err_str = "ERROR : WDC : Internal Device Error.\n"; + err_str = "ERROR: WDC: Internal Device Error.\n"; break; default: - err_str = "ERROR : WDC\n"; + err_str = "ERROR: WDC\n"; } } @@ -3897,12 +3978,12 @@ static int wdc_purge_monitor(int argc, char **argv, } capabilities = wdc_get_drive_capabilities(r, dev); - if((capabilities & WDC_DRIVE_CAP_PURGE) == 0) { + if (!(capabilities & WDC_DRIVE_CAP_PURGE)) { ret = -1; - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); } else { - memset(output, 0, sizeof (output)); - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(output, 0, sizeof(output)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_PURGE_MONITOR_OPCODE; admin_cmd.addr = (__u64)(uintptr_t)output; admin_cmd.data_len = WDC_NVME_PURGE_MONITOR_DATA_LEN; @@ -3911,7 +3992,7 @@ static int wdc_purge_monitor(int argc, char **argv, ret = nvme_submit_admin_passthru(dev_fd(dev), &admin_cmd, NULL); - if (ret == 0) { + if (!ret) { mon = (struct wdc_nvme_purge_monitor_data *) output; printf("Purge state = 0x%0x\n", admin_cmd.result); printf("%s\n", wdc_purge_mon_status_to_string(admin_cmd.result)); @@ -3932,7 +4013,7 @@ static int wdc_purge_monitor(int argc, char **argv, static void wdc_print_log_normal(struct wdc_ssd_perf_stats *perf) { - printf(" C1 Log Page Performance Statistics :- \n"); + printf(" C1 Log Page Performance Statistics :-\n"); printf(" Host Read Commands %20"PRIu64"\n", le64_to_cpu(perf->hr_cmds)); printf(" Host Read Blocks %20"PRIu64"\n", @@ -3987,9 +4068,8 @@ static void wdc_print_log_normal(struct wdc_ssd_perf_stats *perf) static void wdc_print_log_json(struct wdc_ssd_perf_stats *perf) { - struct json_object *root; + struct json_object *root = json_create_object(); - root = json_create_object(); json_object_add_value_int(root, "Host Read Commands", le64_to_cpu(perf->hr_cmds)); json_object_add_value_int(root, "Host Read Blocks", le64_to_cpu(perf->hr_blks)); json_object_add_value_int(root, "Average Read Size", @@ -4046,7 +4126,7 @@ static void wdc_print_log_json(struct wdc_ssd_perf_stats *perf) static int wdc_print_log(struct wdc_ssd_perf_stats *perf, int fmt) { if (!perf) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read perf stats\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read perf stats\n"); return -1; } switch (fmt) { @@ -4060,104 +4140,83 @@ static int wdc_print_log(struct wdc_ssd_perf_stats *perf, int fmt) return 0; } -static int wdc_convert_ts(time_t time, char *ts_buf) -{ - struct tm gmTimeInfo; - time_t time_Human, time_ms; - char buf[80]; - - time_Human = time/1000; - time_ms = time % 1000; - - gmtime_r((const time_t *)&time_Human, &gmTimeInfo); - - strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &gmTimeInfo); - sprintf(ts_buf, "%s.%03ld GMT", buf, time_ms); - - return 0; -} - static int wdc_print_latency_monitor_log_normal(struct nvme_dev *dev, struct wdc_ssd_latency_monitor_log *log_data) { - printf("Latency Monitor/C3 Log Page Data \n"); + printf("Latency Monitor/C3 Log Page Data\n"); printf(" Controller : %s\n", dev->name); int err = -1, i, j; struct nvme_id_ctrl ctrl; - char ts_buf[128]; + char ts_buf[128]; err = nvme_identify_ctrl(dev_fd(dev), &ctrl); - if (!err) + if (!err) { printf(" Serial Number: %-.*s\n", (int)sizeof(ctrl.sn), ctrl.sn); - else { - fprintf(stderr, "ERROR : WDC : latency monitor read id ctrl failure, err = %d\n", err); + } else { + fprintf(stderr, "ERROR: WDC: latency monitor read id ctrl failure, err = %d\n", err); return err; } - printf(" Feature Status 0x%x \n", log_data->feature_status); - printf(" Active Bucket Timer %d min \n", 5*le16_to_cpu(log_data->active_bucket_timer)); - printf(" Active Bucket Timer Threshold %d min \n", 5*le16_to_cpu(log_data->active_bucket_timer_threshold)); - printf(" Active Threshold A %d ms \n", 5*(le16_to_cpu(log_data->active_threshold_a+1))); - printf(" Active Threshold B %d ms \n", 5*(le16_to_cpu(log_data->active_threshold_b+1))); - printf(" Active Threshold C %d ms \n", 5*(le16_to_cpu(log_data->active_threshold_c+1))); - printf(" Active Threshold D %d ms \n", 5*(le16_to_cpu(log_data->active_threshold_d+1))); - printf(" Active Latency Config 0x%x \n", le16_to_cpu(log_data->active_latency_config)); - printf(" Active Latency Minimum Window %d ms \n", 100*log_data->active_latency_min_window); - printf(" Active Latency Stamp Units %d \n", le16_to_cpu(log_data->active_latency_stamp_units)); - printf(" Static Latency Stamp Units %d \n", le16_to_cpu(log_data->static_latency_stamp_units)); - printf(" Debug Log Trigger Enable %d \n", le16_to_cpu(log_data->debug_log_trigger_enable)); - - printf(" Read Write Deallocate/Trim \n"); - for (i = 0; i <= 3; i++) { - printf(" Active Bucket Counter: Bucket %d %27d %27d %27d \n", - i, le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_READ]), - le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_WRITE]), - le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_TRIM])); - } - - for (i = 3; i >= 0; i--) { - printf(" Active Measured Latency: Bucket %d %27d ms %27d ms %27d ms \n", - 3-i, le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_READ]), - le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_WRITE]), - le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_TRIM])); - } + printf(" Feature Status 0x%x\n", log_data->feature_status); + printf(" Active Bucket Timer %d min\n", 5*le16_to_cpu(log_data->active_bucket_timer)); + printf(" Active Bucket Timer Threshold %d min\n", 5*le16_to_cpu(log_data->active_bucket_timer_threshold)); + printf(" Active Threshold A %d ms\n", 5*(le16_to_cpu(log_data->active_threshold_a+1))); + printf(" Active Threshold B %d ms\n", 5*(le16_to_cpu(log_data->active_threshold_b+1))); + printf(" Active Threshold C %d ms\n", 5*(le16_to_cpu(log_data->active_threshold_c+1))); + printf(" Active Threshold D %d ms\n", 5*(le16_to_cpu(log_data->active_threshold_d+1))); + printf(" Active Latency Config 0x%x\n", le16_to_cpu(log_data->active_latency_config)); + printf(" Active Latency Minimum Window %d ms\n", 100*log_data->active_latency_min_window); + printf(" Active Latency Stamp Units %d\n", le16_to_cpu(log_data->active_latency_stamp_units)); + printf(" Static Latency Stamp Units %d\n", le16_to_cpu(log_data->static_latency_stamp_units)); + printf(" Debug Log Trigger Enable %d\n", le16_to_cpu(log_data->debug_log_trigger_enable)); + + printf(" Read Write Deallocate/Trim\n"); + for (i = 0; i <= 3; i++) + printf(" Active Bucket Counter: Bucket %d %27d %27d %27d\n", + i, le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_READ]), + le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_WRITE]), + le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_TRIM])); + + for (i = 3; i >= 0; i--) + printf(" Active Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n", + 3-i, le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_READ]), + le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_WRITE]), + le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_TRIM])); for (i = 3; i >= 0; i--) { printf(" Active Latency Time Stamp: Bucket %d ", 3-i); for (j = 2; j >= 0; j--) { - if (le64_to_cpu(log_data->active_latency_timestamp[i][j]) == -1) - printf(" N/A "); - else { - wdc_convert_ts(le64_to_cpu(log_data->active_latency_timestamp[i][j]), ts_buf); - printf("%s ", ts_buf); - } + if (le64_to_cpu(log_data->active_latency_timestamp[i][j]) == -1) { + printf(" N/A "); + } else { + convert_ts(le64_to_cpu(log_data->active_latency_timestamp[i][j]), ts_buf); + printf("%s ", ts_buf); + } } printf("\n"); } - for (i = 0; i <= 3; i++) { - printf(" Static Bucket Counter: Bucket %d %27d %27d %27d \n", - i, le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_READ]), - le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_WRITE]), - le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_TRIM])); - } + for (i = 0; i <= 3; i++) + printf(" Static Bucket Counter: Bucket %d %27d %27d %27d\n", + i, le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_READ]), + le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_WRITE]), + le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_TRIM])); - for (i = 3; i >= 0; i--) { - printf(" Static Measured Latency: Bucket %d %27d ms %27d ms %27d ms \n", - 3-i, le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_READ]), - le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_WRITE]), - le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_TRIM])); - } + for (i = 3; i >= 0; i--) + printf(" Static Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n", + 3-i, le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_READ]), + le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_WRITE]), + le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_TRIM])); for (i = 3; i >= 0; i--) { printf(" Static Latency Time Stamp: Bucket %d ", 3-i); for (j = 2; j >= 0; j--) { - if (le64_to_cpu(log_data->static_latency_timestamp[i][j]) == -1) - printf(" N/A "); - else { - wdc_convert_ts(le64_to_cpu(log_data->static_latency_timestamp[i][j]), ts_buf); - printf("%s ", ts_buf); - } + if (le64_to_cpu(log_data->static_latency_timestamp[i][j]) == -1) { + printf(" N/A "); + } else { + convert_ts(le64_to_cpu(log_data->static_latency_timestamp[i][j]), ts_buf); + printf("%s ", ts_buf); + } } printf("\n"); } @@ -4168,10 +4227,9 @@ static int wdc_print_latency_monitor_log_normal(struct nvme_dev *dev, static void wdc_print_latency_monitor_log_json(struct wdc_ssd_latency_monitor_log *log_data) { int i, j; - char buf[128]; - char *operation[3] = {"Read", "Write", "Trim"}; - struct json_object *root; - root = json_create_object(); + char buf[128]; + char *operation[3] = {"Read", "Write", "Trim"}; + struct json_object *root = json_create_object(); json_object_add_value_int(root, "Feature Status", log_data->feature_status); json_object_add_value_int(root, "Active Bucket Timer", 5*le16_to_cpu(log_data->active_bucket_timer)); @@ -4232,33 +4290,32 @@ static void wdc_print_latency_monitor_log_json(struct wdc_ssd_latency_monitor_lo static void wdc_print_error_rec_log_normal(struct wdc_ocp_c1_error_recovery_log *log_data) { int j; - printf("Error Recovery/C1 Log Page Data \n"); - printf(" Panic Reset Wait Time : 0x%x \n", le16_to_cpu(log_data->panic_reset_wait_time)); - printf(" Panic Reset Action : 0x%x \n", log_data->panic_reset_action); - printf(" Device Recovery Action 1 : 0x%x \n", log_data->dev_recovery_action1); + printf("Error Recovery/C1 Log Page Data\n"); + + printf(" Panic Reset Wait Time : 0x%x\n", le16_to_cpu(log_data->panic_reset_wait_time)); + printf(" Panic Reset Action : 0x%x\n", log_data->panic_reset_action); + printf(" Device Recovery Action 1 : 0x%x\n", log_data->dev_recovery_action1); printf(" Panic ID : 0x%" PRIu64 "\n", le64_to_cpu(log_data->panic_id)); - printf(" Device Capabilities : 0x%x \n", le32_to_cpu(log_data->dev_capabilities)); - printf(" Vendor Specific Recovery Opcode : 0x%x \n", log_data->vs_recovery_opc); - printf(" Vendor Specific Command CDW12 : 0x%x \n", le32_to_cpu(log_data->vs_cmd_cdw12)); - printf(" Vendor Specific Command CDW13 : 0x%x \n", le32_to_cpu(log_data->vs_cmd_cdw13)); + printf(" Device Capabilities : 0x%x\n", le32_to_cpu(log_data->dev_capabilities)); + printf(" Vendor Specific Recovery Opcode : 0x%x\n", log_data->vs_recovery_opc); + printf(" Vendor Specific Command CDW12 : 0x%x\n", le32_to_cpu(log_data->vs_cmd_cdw12)); + printf(" Vendor Specific Command CDW13 : 0x%x\n", le32_to_cpu(log_data->vs_cmd_cdw13)); if (le16_to_cpu(log_data->log_page_version) == WDC_ERROR_REC_LOG_VERSION2) { - printf(" Vendor Specific Command Timeout : 0x%x \n", log_data->vs_cmd_to); - printf(" Device Recovery Action 2 : 0x%x \n", log_data->dev_recovery_action2); - printf(" Device Recovery Action 2 Timeout : 0x%x \n", log_data->dev_recovery_action2_to); + printf(" Vendor Specific Command Timeout : 0x%x\n", log_data->vs_cmd_to); + printf(" Device Recovery Action 2 : 0x%x\n", log_data->dev_recovery_action2); + printf(" Device Recovery Action 2 Timeout : 0x%x\n", log_data->dev_recovery_action2_to); } - printf(" Log Page Version : 0x%x \n", le16_to_cpu(log_data->log_page_version)); + printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); printf(" Log page GUID : 0x"); - for (j = 0; j < WDC_OCP_C1_GUID_LENGTH; j++) { + for (j = 0; j < WDC_OCP_C1_GUID_LENGTH; j++) printf("%x", log_data->log_page_guid[j]); - } printf("\n"); } static void wdc_print_error_rec_log_json(struct wdc_ocp_c1_error_recovery_log *log_data) { - struct json_object *root; - root = json_create_object(); + struct json_object *root = json_create_object(); json_object_add_value_int(root, "Panic Reset Wait Time", le16_to_cpu(log_data->panic_reset_wait_time)); json_object_add_value_int(root, "Panic Reset Action", log_data->panic_reset_wait_time); @@ -4276,8 +4333,10 @@ static void wdc_print_error_rec_log_json(struct wdc_ocp_c1_error_recovery_log *l json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version)); char guid[40]; - memset((void*)guid, 0, 40); - sprintf((char*)guid, "0x%"PRIx64"%"PRIx64"",(uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]), + + memset((void *)guid, 0, 40); + sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]), (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0])); json_object_add_value_string(root, "Log page GUID", guid); @@ -4290,34 +4349,32 @@ static void wdc_print_error_rec_log_json(struct wdc_ocp_c1_error_recovery_log *l static void wdc_print_dev_cap_log_normal(struct wdc_ocp_C4_dev_cap_log *log_data) { int j; - printf("Device Capabilities/C4 Log Page Data \n"); - printf(" Number PCIE Ports : 0x%x \n", le16_to_cpu(log_data->num_pcie_ports)); - printf(" Number OOB Management Interfaces : 0x%x \n", le16_to_cpu(log_data->oob_mgmt_support)); - printf(" Write Zeros Command Support : 0x%x \n", le16_to_cpu(log_data->wrt_zeros_support)); - printf(" Sanitize Command Support : 0x%x \n", le16_to_cpu(log_data->sanitize_support)); - printf(" DSM Command Support : 0x%x \n", le16_to_cpu(log_data->dsm_support)); - printf(" Write Uncorr Command Support : 0x%x \n", le16_to_cpu(log_data->wrt_uncor_support)); - printf(" Fused Command Support : 0x%x \n", le16_to_cpu(log_data->fused_support)); - printf(" Minimum DSSD Power State : 0x%x \n", le16_to_cpu(log_data->min_dssd_ps)); + printf("Device Capabilities/C4 Log Page Data\n"); - for (j = 0; j < WDC_OCP_C4_NUM_PS_DESCR; j++) { - printf(" DSSD Power State %d Desriptor : 0x%x \n", j, log_data->dssd_ps_descr[j]); - } + printf(" Number PCIE Ports : 0x%x\n", le16_to_cpu(log_data->num_pcie_ports)); + printf(" Number OOB Management Interfaces : 0x%x\n", le16_to_cpu(log_data->oob_mgmt_support)); + printf(" Write Zeros Command Support : 0x%x\n", le16_to_cpu(log_data->wrt_zeros_support)); + printf(" Sanitize Command Support : 0x%x\n", le16_to_cpu(log_data->sanitize_support)); + printf(" DSM Command Support : 0x%x\n", le16_to_cpu(log_data->dsm_support)); + printf(" Write Uncorr Command Support : 0x%x\n", le16_to_cpu(log_data->wrt_uncor_support)); + printf(" Fused Command Support : 0x%x\n", le16_to_cpu(log_data->fused_support)); + printf(" Minimum DSSD Power State : 0x%x\n", le16_to_cpu(log_data->min_dssd_ps)); - printf(" Log Page Version : 0x%x \n", le16_to_cpu(log_data->log_page_version)); + for (j = 0; j < WDC_OCP_C4_NUM_PS_DESCR; j++) + printf(" DSSD Power State %d Desriptor : 0x%x\n", j, log_data->dssd_ps_descr[j]); + + printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); printf(" Log page GUID : 0x"); - for (j = 0; j < WDC_OCP_C4_GUID_LENGTH; j++) { + for (j = 0; j < WDC_OCP_C4_GUID_LENGTH; j++) printf("%x", log_data->log_page_guid[j]); - } printf("\n"); } static void wdc_print_dev_cap_log_json(struct wdc_ocp_C4_dev_cap_log *log_data) { int j; - struct json_object *root; - root = json_create_object(); + struct json_object *root = json_create_object(); json_object_add_value_int(root, "Number PCIE Ports", le16_to_cpu(log_data->num_pcie_ports)); json_object_add_value_int(root, "Number OOB Management Interfaces", le16_to_cpu(log_data->num_pcie_ports)); @@ -4329,6 +4386,7 @@ static void wdc_print_dev_cap_log_json(struct wdc_ocp_C4_dev_cap_log *log_data) json_object_add_value_int(root, "Minimum DSSD Power State", le16_to_cpu(log_data->num_pcie_ports)); char dssd_descr_str[40]; + memset((void *)dssd_descr_str, 0, 40); for (j = 0; j < WDC_OCP_C4_NUM_PS_DESCR; j++) { sprintf((char *)dssd_descr_str, "DSSD Power State %d Descriptor", j); @@ -4337,8 +4395,10 @@ static void wdc_print_dev_cap_log_json(struct wdc_ocp_C4_dev_cap_log *log_data) json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version)); char guid[40]; - memset((void*)guid, 0, 40); - sprintf((char*)guid, "0x%"PRIx64"%"PRIx64"",(uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]), + + memset((void *)guid, 0, 40); + sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]), (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0])); json_object_add_value_string(root, "Log page GUID", guid); @@ -4351,41 +4411,45 @@ static void wdc_print_dev_cap_log_json(struct wdc_ocp_C4_dev_cap_log *log_data) static void wdc_print_unsupported_reqs_log_normal(struct wdc_ocp_C5_unsupported_reqs *log_data) { int j; - printf("Unsupported Requirements/C5 Log Page Data \n"); - printf(" Number Unsupported Req IDs : 0x%x \n", le16_to_cpu(log_data->unsupported_count)); + printf("Unsupported Requirements/C5 Log Page Data\n"); - for (j = 0; j < le16_to_cpu(log_data->unsupported_count); j++) { - printf(" Unsupported Requirement List %d : %s \n", j, log_data->unsupported_req_list[j]); - } + printf(" Number Unsupported Req IDs : 0x%x\n", + le16_to_cpu(log_data->unsupported_count)); + + for (j = 0; j < le16_to_cpu(log_data->unsupported_count); j++) + printf(" Unsupported Requirement List %d : %s\n", j, + log_data->unsupported_req_list[j]); - printf(" Log Page Version : 0x%x \n", le16_to_cpu(log_data->log_page_version)); + printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); printf(" Log page GUID : 0x"); - for (j = 0; j < WDC_OCP_C5_GUID_LENGTH; j++) { + for (j = 0; j < WDC_OCP_C5_GUID_LENGTH; j++) printf("%x", log_data->log_page_guid[j]); - } printf("\n"); } static void wdc_print_unsupported_reqs_log_json(struct wdc_ocp_C5_unsupported_reqs *log_data) { int j; - struct json_object *root; - root = json_create_object(); + struct json_object *root = json_create_object(); json_object_add_value_int(root, "Number Unsupported Req IDs", le16_to_cpu(log_data->unsupported_count)); char unsup_req_list_str[40]; + memset((void *)unsup_req_list_str, 0, 40); for (j = 0; j < le16_to_cpu(log_data->unsupported_count); j++) { sprintf((char *)unsup_req_list_str, "Unsupported Requirement List %d", j); json_object_add_value_string(root, unsup_req_list_str, (char *)log_data->unsupported_req_list[j]); } - json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version)); + json_object_add_value_int(root, "Log Page Version", + le16_to_cpu(log_data->log_page_version)); char guid[40]; - memset((void*)guid, 0, 40); - sprintf((char*)guid, "0x%"PRIx64"%"PRIx64"",(uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]), + + memset((void *)guid, 0, 40); + sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]), (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0])); json_object_add_value_string(root, "Log page GUID", guid); @@ -4399,7 +4463,7 @@ static void wdc_print_fb_ca_log_normal(struct wdc_ssd_ca_perf_stats *perf) { uint64_t converted = 0; - printf(" CA Log Page Performance Statistics :- \n"); + printf(" CA Log Page Performance Statistics :-\n"); printf(" NAND Bytes Written %20"PRIu64 "%20"PRIu64"\n", le64_to_cpu(perf->nand_bytes_wr_hi), le64_to_cpu(perf->nand_bytes_wr_lo)); printf(" NAND Bytes Read %20"PRIu64 "%20"PRIu64"\n", @@ -4460,10 +4524,9 @@ static void wdc_print_fb_ca_log_normal(struct wdc_ssd_ca_perf_stats *perf) static void wdc_print_fb_ca_log_json(struct wdc_ssd_ca_perf_stats *perf) { - struct json_object *root; + struct json_object *root = json_create_object(); uint64_t converted = 0; - root = json_create_object(); json_object_add_value_int(root, "NAND Bytes Written Hi", le64_to_cpu(perf->nand_bytes_wr_hi)); json_object_add_value_int(root, "NAND Bytes Written Lo", le64_to_cpu(perf->nand_bytes_wr_lo)); json_object_add_value_int(root, "NAND Bytes Read Hi", le64_to_cpu(perf->nand_bytes_rd_hi)); @@ -4528,18 +4591,18 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) __u8 *byte_raw; if (bd_data->field_id == 0x00) { - raw = (__u64*)&bd_data->raw_value[0]; - printf("Additional Smart Log for NVME device:%s namespace-id:%x\n", - dev->name, WDC_DE_GLOBAL_NSID); + raw = (__u64 *)&bd_data->raw_value[0]; + printf("Additional Smart Log for NVME device:%s namespace-id:%x\n", dev->name, + WDC_DE_GLOBAL_NSID); printf("key normalized raw\n"); - printf("program_fail_count : %3"PRIu8"%% %"PRIu64"\n", - bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); + printf("program_fail_count : %3"PRIu8"%% %"PRIu64"\n", + bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x01) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("erase_fail_count : %3"PRIu8"%% %"PRIu64"\n", bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { @@ -4547,9 +4610,9 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) } bd_data++; if (bd_data->field_id == 0x02) { - word_raw1 = (__u16*)&bd_data->raw_value[1]; - word_raw2 = (__u16*)&bd_data->raw_value[3]; - word_raw3 = (__u16*)&bd_data->raw_value[5]; + word_raw1 = (__u16 *)&bd_data->raw_value[1]; + word_raw2 = (__u16 *)&bd_data->raw_value[3]; + word_raw3 = (__u16 *)&bd_data->raw_value[5]; printf("wear_leveling : %3"PRIu8"%% min: %"PRIu16", max: %"PRIu16", avg: %"PRIu16"\n", bd_data->normalized_value, le16_to_cpu(*word_raw1), @@ -4560,7 +4623,7 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) } bd_data++; if (bd_data->field_id == 0x03) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("end_to_end_error_detection_count: %3"PRIu8"%% %"PRIu64"\n", bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { @@ -4568,7 +4631,7 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) } bd_data++; if (bd_data->field_id == 0x04) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("crc_error_count : %3"PRIu8"%% %"PRIu64"\n", bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { @@ -4576,49 +4639,48 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) } bd_data++; if (bd_data->field_id == 0x05) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("timed_workload_media_wear : %3"PRIu8"%% %-.3f%%\n", - bd_data->normalized_value, - safe_div_fp((*raw & 0x00FFFFFFFFFFFFFF), 1024.0)); + bd_data->normalized_value, safe_div_fp((*raw & 0x00FFFFFFFFFFFFFF), 1024.0)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x06) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("timed_workload_host_reads : %3"PRIu8"%% %"PRIu64"%%\n", - bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); + bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x07) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("timed_workload_timer : %3"PRIu8"%% %"PRIu64"\n", - bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); + bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x08) { - byte_raw = (__u8*)&bd_data->raw_value[1]; - dword_raw = (__u32*)&bd_data->raw_value[2]; + byte_raw = (__u8 *)&bd_data->raw_value[1]; + dword_raw = (__u32 *)&bd_data->raw_value[2]; printf("thermal_throttle_status : %3"PRIu8"%% %"PRIu16"%%, cnt: %"PRIu16"\n", - bd_data->normalized_value, *byte_raw, le32_to_cpu(*dword_raw)); + bd_data->normalized_value, *byte_raw, le32_to_cpu(*dword_raw)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x09) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("retry_buffer_overflow_count : %3"PRIu8"%% %"PRIu64"\n", - bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); + bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x0A) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("pll_lock_loss_count : %3"PRIu8"%% %"PRIu64"\n", bd_data->normalized_value, le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { @@ -4626,7 +4688,7 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) } bd_data++; if (bd_data->field_id == 0x0B) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("nand_bytes_written : %3"PRIu8"%% sectors: %.f\n", bd_data->normalized_value, safe_div_fp((*raw & 0x00FFFFFFFFFFFFFF), 0xFFFF)); } else { @@ -4634,7 +4696,7 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) } bd_data++; if (bd_data->field_id == 0x0C) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; printf("host_bytes_written : %3"PRIu8"%% sectors: %.f\n", bd_data->normalized_value, safe_div_fp((*raw & 0x00FFFFFFFFFFFFFF), 0xFFFF)); } else { @@ -4643,11 +4705,11 @@ static void wdc_print_bd_ca_log_normal(struct nvme_dev *dev, void *data) goto done; - invalid_id: - printf(" Invalid Field ID = %d\n", bd_data->field_id); +invalid_id: + printf(" Invalid Field ID = %d\n", bd_data->field_id); - done: - return; +done: + return; } @@ -4658,11 +4720,10 @@ static void wdc_print_bd_ca_log_json(void *data) __u16 *word_raw; __u32 *dword_raw; __u8 *byte_raw; - struct json_object *root; + struct json_object *root = json_create_object(); - root = json_create_object(); if (bd_data->field_id == 0x00) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "program_fail_count normalized", bd_data->normalized_value); json_object_add_value_int(root, "program_fail_count raw", @@ -4672,7 +4733,7 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x01) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "erase_fail_count normalized", bd_data->normalized_value); json_object_add_value_int(root, "erase_fail_count raw", @@ -4682,19 +4743,19 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x02) { - word_raw = (__u16*)&bd_data->raw_value[1]; + word_raw = (__u16 *)&bd_data->raw_value[1]; json_object_add_value_int(root, "wear_leveling normalized", bd_data->normalized_value); json_object_add_value_int(root, "wear_leveling min", le16_to_cpu(*word_raw)); - word_raw = (__u16*)&bd_data->raw_value[3]; + word_raw = (__u16 *)&bd_data->raw_value[3]; json_object_add_value_int(root, "wear_leveling max", le16_to_cpu(*word_raw)); - word_raw = (__u16*)&bd_data->raw_value[5]; + word_raw = (__u16 *)&bd_data->raw_value[5]; json_object_add_value_int(root, "wear_leveling avg", le16_to_cpu(*word_raw)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x03) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "end_to_end_error_detection_count normalized", bd_data->normalized_value); json_object_add_value_int(root, "end_to_end_error_detection_count raw", @@ -4704,7 +4765,7 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x04) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "crc_error_count normalized", bd_data->normalized_value); json_object_add_value_int(root, "crc_error_count raw", @@ -4714,7 +4775,7 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x05) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "timed_workload_media_wear normalized", bd_data->normalized_value); json_object_add_value_double(root, "timed_workload_media_wear raw", @@ -4724,7 +4785,7 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x06) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "timed_workload_host_reads normalized", bd_data->normalized_value); json_object_add_value_int(root, "timed_workload_host_reads raw", @@ -4734,28 +4795,28 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x07) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "timed_workload_timer normalized", - bd_data->normalized_value); + bd_data->normalized_value); json_object_add_value_int(root, "timed_workload_timer", - le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); + le64_to_cpu(*raw & 0x00FFFFFFFFFFFFFF)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x08) { - byte_raw = (__u8*)&bd_data->raw_value[1]; + byte_raw = (__u8 *)&bd_data->raw_value[1]; json_object_add_value_int(root, "thermal_throttle_status normalized", bd_data->normalized_value); json_object_add_value_int(root, "thermal_throttle_status", *byte_raw); - dword_raw = (__u32*)&bd_data->raw_value[2]; + dword_raw = (__u32 *)&bd_data->raw_value[2]; json_object_add_value_int(root, "thermal_throttle_cnt", le32_to_cpu(*dword_raw)); } else { goto invalid_id; } bd_data++; if (bd_data->field_id == 0x09) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "retry_buffer_overflow_count normalized", bd_data->normalized_value); json_object_add_value_int(root, "retry_buffer_overflow_count raw", @@ -4765,7 +4826,7 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x0A) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "pll_lock_loss_count normalized", bd_data->normalized_value); json_object_add_value_int(root, "pll_lock_loss_count raw", @@ -4775,7 +4836,7 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x0B) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "nand_bytes_written normalized", bd_data->normalized_value); json_object_add_value_double(root, "nand_bytes_written raw", @@ -4785,7 +4846,7 @@ static void wdc_print_bd_ca_log_json(void *data) } bd_data++; if (bd_data->field_id == 0x0C) { - raw = (__u64*)&bd_data->raw_value[0]; + raw = (__u64 *)&bd_data->raw_value[0]; json_object_add_value_int(root, "host_bytes_written normalized", bd_data->normalized_value); json_object_add_value_double(root, "host_bytes_written raw", @@ -4796,10 +4857,10 @@ static void wdc_print_bd_ca_log_json(void *data) goto done; - invalid_id: +invalid_id: printf(" Invalid Field ID = %d\n", bd_data->field_id); - done: +done: json_print_object(root, NULL); printf("\n"); json_free_object(root); @@ -4810,7 +4871,7 @@ static void wdc_print_bd_ca_log_json(void *data) static void wdc_print_d0_log_normal(struct wdc_ssd_d0_smart_log *perf) { - printf(" D0 Smart Log Page Statistics :- \n"); + printf(" D0 Smart Log Page Statistics :-\n"); printf(" Lifetime Reallocated Erase Block Count %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->lifetime_realloc_erase_block_count)); printf(" Lifetime Power on Hours %20"PRIu32"\n", @@ -4819,11 +4880,11 @@ static void wdc_print_d0_log_normal(struct wdc_ssd_d0_smart_log *perf) (uint32_t)le32_to_cpu(perf->lifetime_uecc_count)); printf(" Lifetime Write Amplification Factor %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->lifetime_wrt_amp_factor)); - printf(" Trailing Hour Write Amplification Factor %20"PRIu32"\n", + printf(" Trailing Hour Write Amplification Factor %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->trailing_hr_wrt_amp_factor)); printf(" Reserve Erase Block Count %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->reserve_erase_block_count)); - printf(" Lifetime Program Fail Count %20"PRIu32"\n", + printf(" Lifetime Program Fail Count %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->lifetime_program_fail_count)); printf(" Lifetime Block Erase Fail Count %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->lifetime_block_erase_fail_count)); @@ -4835,7 +4896,7 @@ static void wdc_print_d0_log_normal(struct wdc_ssd_d0_smart_log *perf) (uint32_t)le32_to_cpu(perf->lifetime_clean_shutdown_count)); printf(" Lifetime Unclean Shutdowns on Power Loss %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->lifetime_unclean_shutdown_count)); - printf(" Current Temperature %20"PRIu32"\n", + printf(" Current Temperature %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->current_temp)); printf(" Max Recorded Temperature %20"PRIu32"\n", (uint32_t)le32_to_cpu(perf->max_recorded_temp)); @@ -4845,7 +4906,7 @@ static void wdc_print_d0_log_normal(struct wdc_ssd_d0_smart_log *perf) (uint32_t)le32_to_cpu(perf->lifetime_read_disturb_realloc_events)); printf(" Lifetime NAND Writes %20"PRIu64"\n", le64_to_cpu(perf->lifetime_nand_writes)); - printf(" Capacitor Health %20"PRIu32"%%\n", + printf(" Capacitor Health %20"PRIu32"%%\n", (uint32_t)le32_to_cpu(perf->capacitor_health)); printf(" Lifetime User Writes %20"PRIu64"\n", le64_to_cpu(perf->lifetime_user_writes)); @@ -4859,9 +4920,8 @@ static void wdc_print_d0_log_normal(struct wdc_ssd_d0_smart_log *perf) static void wdc_print_d0_log_json(struct wdc_ssd_d0_smart_log *perf) { - struct json_object *root; + struct json_object *root = json_create_object(); - root = json_create_object(); json_object_add_value_int(root, "Lifetime Reallocated Erase Block Count", le32_to_cpu(perf->lifetime_realloc_erase_block_count)); json_object_add_value_int(root, "Lifetime Power on Hours", @@ -4915,32 +4975,31 @@ static void wdc_print_d0_log_json(struct wdc_ssd_d0_smart_log *perf) static void wdc_get_commit_action_bin(__u8 commit_action_type, char *action_bin) { - switch (commit_action_type) - { - case(0): + switch (commit_action_type) { + case 0: strcpy(action_bin, "000b"); break; - case(1): + case 1: strcpy(action_bin, "001b"); - break; - case(2): + break; + case 2: strcpy(action_bin, "010b"); - break; - case(3): + break; + case 3: strcpy(action_bin, "011b"); - break; - case(4): + break; + case 4: strcpy(action_bin, "100b"); - break; - case(5): + break; + case 5: strcpy(action_bin, "101b"); - break; - case(6): + break; + case 6: strcpy(action_bin, "110b"); - break; - case(7): - strcpy(action_bin, "111b"); - break; + break; + case 7: + strcpy(action_bin, "111b"); + break; default: strcpy(action_bin, "INVALID"); } @@ -4956,17 +5015,18 @@ static void wdc_print_fw_act_history_log_normal(__u8 *data, int num_entries, __u char time_str[11]; __u16 oldestEntryIdx = 0, entryIdx = 0; char *null_fw = "--------"; + memset((void *)time_str, 0, 11); if (data[0] == WDC_NVME_GET_FW_ACT_HISTORY_C2_LOG_ID) { - printf(" Firmware Activate History Log \n"); + printf(" Firmware Activate History Log\n"); if (cust_id == WDC_CUSTOMER_ID_0x1005 || vendor_id == WDC_NVME_SNDK_VID) { - printf(" Power on Hour Power Cycle Previous New \n"); - printf(" Entry hh:mm:ss Count Firmware Firmware Slot Action Result \n"); + printf(" Power on Hour Power Cycle Previous New\n"); + printf(" Entry hh:mm:ss Count Firmware Firmware Slot Action Result\n"); printf(" ----- ----------------- ----------------- --------- --------- ----- ------ -------\n"); } else { - printf(" Power Cycle Previous New \n"); - printf(" Entry Timestamp Count Firmware Firmware Slot Action Result \n"); + printf(" Power Cycle Previous New\n"); + printf(" Entry Timestamp Count Firmware Firmware Slot Action Result\n"); printf(" ----- ----------------- ----------------- --------- --------- ----- ------ -------\n"); } @@ -5010,9 +5070,10 @@ static void wdc_print_fw_act_history_log_normal(__u8 *data, int num_entries, __u printf("%s", time_str); printf(" "); - } else if(vendor_id == WDC_NVME_SNDK_VID) { + } else if (vendor_id == WDC_NVME_SNDK_VID) { printf(" "); uint64_t timestamp = (0x0000FFFFFFFFFFFF & le64_to_cpu(fw_act_history_entry->entry[entryIdx].timestamp)); + memset((void *)time_str, 0, 9); sprintf((char *)time_str, "%04d:%02d:%02d", (int)((timestamp/(3600*1000))%24), (int)((timestamp/(1000*60))%60), (int)((timestamp/1000)%60)); @@ -5021,6 +5082,7 @@ static void wdc_print_fw_act_history_log_normal(__u8 *data, int num_entries, __u } else { printf(" "); uint64_t timestamp = (0x0000FFFFFFFFFFFF & le64_to_cpu(fw_act_history_entry->entry[entryIdx].timestamp)); + printf("%16"PRIu64"", timestamp); printf(" "); } @@ -5033,10 +5095,12 @@ static void wdc_print_fw_act_history_log_normal(__u8 *data, int num_entries, __u printf(" "); printf("%2"PRIu8"", (uint8_t)fw_act_history_entry->entry[entryIdx].slot_number); printf(" "); - wdc_get_commit_action_bin(fw_act_history_entry->entry[entryIdx].commit_action_type,(char *)&commit_action_bin); + wdc_get_commit_action_bin( + fw_act_history_entry->entry[entryIdx].commit_action_type, + (char *)&commit_action_bin); printf(" %s", (char *)commit_action_bin); printf(" "); - if (le16_to_cpu(fw_act_history_entry->entry[entryIdx].result) == 0) + if (!le16_to_cpu(fw_act_history_entry->entry[entryIdx].result)) printf("pass"); else printf("fail #%d", (uint16_t)le16_to_cpu(fw_act_history_entry->entry[entryIdx].result)); @@ -5046,12 +5110,10 @@ static void wdc_print_fw_act_history_log_normal(__u8 *data, int num_entries, __u if (entryIdx >= WDC_MAX_NUM_ACT_HIST_ENTRIES) entryIdx = 0; } - } - else - { - printf(" Firmware Activate History Log \n"); - printf(" Power on Hour Power Cycle Previous New \n"); - printf(" Entry hh:mm:ss Count Firmware Firmware Slot Action Result \n"); + } else { + printf(" Firmware Activate History Log\n"); + printf(" Power on Hour Power Cycle Previous New\n"); + printf(" Entry hh:mm:ss Count Firmware Firmware Slot Action Result\n"); printf(" ----- -------------- -------------------- ---------- ---------- ----- ------ -------\n"); struct wdc_fw_act_history_log_entry *fw_act_history_entry = (struct wdc_fw_act_history_log_entry *)(data + sizeof(struct wdc_fw_act_history_log_hdr)); @@ -5097,10 +5159,11 @@ static void wdc_print_fw_act_history_log_normal(__u8 *data, int num_entries, __u printf(" "); printf("%2"PRIu8"", (uint8_t)fw_act_history_entry[entryIdx].slot_number); printf(" "); - wdc_get_commit_action_bin(fw_act_history_entry[entryIdx].commit_action_type,(char *)&commit_action_bin); + wdc_get_commit_action_bin(fw_act_history_entry[entryIdx].commit_action_type, + (char *)&commit_action_bin); printf(" %s", (char *)commit_action_bin); printf(" "); - if (le16_to_cpu(fw_act_history_entry[entryIdx].result) == 0) + if (!le16_to_cpu(fw_act_history_entry[entryIdx].result)) printf("pass"); else printf("fail #%d", (uint16_t)le16_to_cpu(fw_act_history_entry[entryIdx].result)); @@ -5116,13 +5179,14 @@ static void wdc_print_fw_act_history_log_normal(__u8 *data, int num_entries, __u static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 cust_id, __u32 vendor_id) { - struct json_object *root; + struct json_object *root = json_create_object(); int i, j; char previous_fw[9]; char new_fw[9]; char commit_action_bin[8]; char fail_str[32]; char time_str[11]; + memset((void *)previous_fw, 0, 9); memset((void *)new_fw, 0, 9); memset((void *)commit_action_bin, 0, 8); @@ -5131,8 +5195,6 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 char *null_fw = "--------"; __u16 oldestEntryIdx = 0, entryIdx = 0; - root = json_create_object(); - if (data[0] == WDC_NVME_GET_FW_ACT_HISTORY_C2_LOG_ID) { struct wdc_fw_act_history_log_format_c2 *fw_act_history_entry = (struct wdc_fw_act_history_log_format_c2 *)(data); @@ -5154,14 +5216,18 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 entryIdx = oldestEntryIdx; for (i = 0; i < num_entries; i++) { - memcpy(previous_fw, (char *)&(fw_act_history_entry->entry[entryIdx].previous_fw_version), 8); + memcpy(previous_fw, + (char *)&(fw_act_history_entry->entry[entryIdx].previous_fw_version), + 8); if (strlen((char *)&(fw_act_history_entry->entry[entryIdx].current_fw_version)) > 1) - memcpy(new_fw, (char *)&(fw_act_history_entry->entry[entryIdx].current_fw_version), 8); + memcpy(new_fw, + (char *)&(fw_act_history_entry->entry[entryIdx].current_fw_version), + 8); else memcpy(new_fw, null_fw, 8); json_object_add_value_int(root, "Entry", - le16_to_cpu(fw_act_history_entry->entry[entryIdx].fw_act_hist_entries)); + le16_to_cpu(fw_act_history_entry->entry[entryIdx].fw_act_hist_entries)); if (cust_id == WDC_CUSTOMER_ID_0x1005) { sprintf((char *)time_str, "%04d:%02d:%02d", (int)(le64_to_cpu(fw_act_history_entry->entry[entryIdx].timestamp)/3600), @@ -5172,11 +5238,13 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 } else if (vendor_id == WDC_NVME_SNDK_VID) { uint64_t timestamp = (0x0000FFFFFFFFFFFF & le64_to_cpu(fw_act_history_entry->entry[entryIdx].timestamp)); + sprintf((char *)time_str, "%04d:%02d:%02d", (int)((timestamp/(3600*1000))%24), (int)((timestamp/(1000*60))%60), (int)((timestamp/1000)%60)); json_object_add_value_string(root, "Power on Hour", time_str); } else { uint64_t timestamp = (0x0000FFFFFFFFFFFF & le64_to_cpu(fw_act_history_entry->entry[entryIdx].timestamp)); + json_object_add_value_uint64(root, "Timestamp", timestamp); } @@ -5189,12 +5257,14 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 json_object_add_value_int(root, "Slot", fw_act_history_entry->entry[entryIdx].slot_number); - wdc_get_commit_action_bin(fw_act_history_entry->entry[entryIdx].commit_action_type,(char *)&commit_action_bin); + wdc_get_commit_action_bin( + fw_act_history_entry->entry[entryIdx].commit_action_type, + (char *)&commit_action_bin); json_object_add_value_string(root, "Action", commit_action_bin); - if (le16_to_cpu(fw_act_history_entry->entry[entryIdx].result) == 0) + if (!le16_to_cpu(fw_act_history_entry->entry[entryIdx].result)) { json_object_add_value_string(root, "Result", "pass"); - else { + } else { sprintf((char *)fail_str, "fail #%d", (int)(le16_to_cpu(fw_act_history_entry->entry[entryIdx].result))); json_object_add_value_string(root, "Result", fail_str); } @@ -5206,8 +5276,7 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 if (entryIdx >= WDC_MAX_NUM_ACT_HIST_ENTRIES) entryIdx = 0; } - } - else { + } else { struct wdc_fw_act_history_log_entry *fw_act_history_entry = (struct wdc_fw_act_history_log_entry *)(data + sizeof(struct wdc_fw_act_history_log_hdr)); oldestEntryIdx = WDC_MAX_NUM_ACT_HIST_ENTRIES; @@ -5226,9 +5295,11 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 entryIdx = oldestEntryIdx; for (i = 0; i < num_entries; i++) { - memcpy(previous_fw, (char *)&(fw_act_history_entry[entryIdx].previous_fw_version), 8); + memcpy(previous_fw, + (char *)&(fw_act_history_entry[entryIdx].previous_fw_version), 8); if (strlen((char *)&(fw_act_history_entry[entryIdx].new_fw_version)) > 1) - memcpy(new_fw, (char *)&(fw_act_history_entry[entryIdx].new_fw_version), 8); + memcpy(new_fw, + (char *)&(fw_act_history_entry[entryIdx].new_fw_version), 8); else memcpy(new_fw, null_fw, 8); @@ -5249,12 +5320,13 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, __u32 json_object_add_value_int(root, "Slot", fw_act_history_entry[entryIdx].slot_number); - wdc_get_commit_action_bin(fw_act_history_entry[entryIdx].commit_action_type,(char *)&commit_action_bin); + wdc_get_commit_action_bin(fw_act_history_entry[entryIdx].commit_action_type, + (char *)&commit_action_bin); json_object_add_value_string(root, "Action", commit_action_bin); - if (le16_to_cpu(fw_act_history_entry[entryIdx].result) == 0) + if (!le16_to_cpu(fw_act_history_entry[entryIdx].result)) { json_object_add_value_string(root, "Result", "pass"); - else { + } else { sprintf((char *)fail_str, "fail #%d", (int)(le16_to_cpu(fw_act_history_entry[entryIdx].result))); json_object_add_value_string(root, "Result", fail_str); } @@ -5276,8 +5348,9 @@ static int nvme_get_ext_smart_cloud_log(int fd, __u8 **data, int uuid_index, __u int ret, i; __u8 *log_ptr = NULL; - if ((log_ptr = (__u8*) malloc(sizeof (__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + log_ptr = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN); + if (!log_ptr) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } @@ -5301,21 +5374,19 @@ static int nvme_get_ext_smart_cloud_log(int fd, __u8 **data, int uuid_index, __u }; ret = nvme_get_log(&args); - if (ret == 0) { - + if (!ret) { /* Verify GUID matches */ for (i = 0; i < WDC_C0_GUID_LENGTH; i++) { - if (ext_smart_guid[i] != *&log_ptr[SCAO_V1_LPG + i]) { - fprintf(stderr, "ERROR : WDC : Unknown GUID in C0 Log Page V1 data\n"); + if (ext_smart_guid[i] != *&log_ptr[SCAO_V1_LPG + i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in C0 Log Page V1 data\n"); int j; - fprintf(stderr, "ERROR : WDC : Expected GUID: 0x"); - for (j = 0; j < WDC_C0_GUID_LENGTH; j++) { + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < WDC_C0_GUID_LENGTH; j++) fprintf(stderr, "%x", ext_smart_guid[j]); - } - fprintf(stderr, "\nERROR : WDC : Actual GUID: 0x"); - for (j = 0; j < WDC_C0_GUID_LENGTH; j++) { + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < WDC_C0_GUID_LENGTH; j++) fprintf(stderr, "%x", *&log_ptr[SCAO_V1_LPG + j]); - } fprintf(stderr, "\n"); ret = -1; @@ -5333,10 +5404,11 @@ static int nvme_get_ext_smart_cloud_log(int fd, __u8 **data, int uuid_index, __u static int nvme_get_hw_rev_log(int fd, __u8 **data, int uuid_index, __u32 namespace_id) { int ret, i; - wdc_nvme_hw_rev_log *log_ptr = NULL; + struct wdc_nvme_hw_rev_log *log_ptr = NULL; - if ((log_ptr = (wdc_nvme_hw_rev_log *)malloc(sizeof (__u8) * WDC_NVME_HW_REV_LOG_PAGE_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + log_ptr = (struct wdc_nvme_hw_rev_log *)malloc(sizeof(__u8) * WDC_NVME_HW_REV_LOG_PAGE_LEN); + if (!log_ptr) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } @@ -5360,21 +5432,19 @@ static int nvme_get_hw_rev_log(int fd, __u8 **data, int uuid_index, __u32 namesp }; ret = nvme_get_log(&args); - if (ret == 0) { - + if (!ret) { /* Verify GUID matches */ for (i = 0; i < WDC_NVME_C6_GUID_LENGTH; i++) { - if (hw_rev_log_guid[i] != log_ptr->hw_rev_guid[i]) { - fprintf(stderr, "ERROR : WDC : Unknown GUID in HW Revision Log Page data\n"); + if (hw_rev_log_guid[i] != log_ptr->hw_rev_guid[i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in HW Revision Log Page data\n"); int j; - fprintf(stderr, "ERROR : WDC : Expected GUID: 0x"); - for (j = 0; j < WDC_NVME_C6_GUID_LENGTH; j++) { + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < WDC_NVME_C6_GUID_LENGTH; j++) fprintf(stderr, "%x", hw_rev_log_guid[j]); - } - fprintf(stderr, "\nERROR : WDC : Actual GUID: 0x"); - for (j = 0; j < WDC_NVME_C6_GUID_LENGTH; j++) { + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < WDC_NVME_C6_GUID_LENGTH; j++) fprintf(stderr, "%x", log_ptr->hw_rev_guid[j]); - } fprintf(stderr, "\n"); ret = -1; @@ -5392,9 +5462,9 @@ static int nvme_get_hw_rev_log(int fd, __u8 **data, int uuid_index, __u32 namesp static void wdc_print_hw_rev_log_normal(void *data) { int i; - wdc_nvme_hw_rev_log *log_data = (wdc_nvme_hw_rev_log *)data; + struct wdc_nvme_hw_rev_log *log_data = (struct wdc_nvme_hw_rev_log *)data; - printf(" Hardware Revision Log:- \n"); + printf(" Hardware Revision Log:-\n"); printf(" Global Device HW Revision : %d\n", log_data->hw_rev_gdr); @@ -5541,7 +5611,7 @@ static void wdc_print_hw_rev_log_normal(void *data) printf(" 0x"); } printf("\n"); - printf(" Serial Number : 0x"); + printf(" Serial Number : 0x"); for (i = 0; i < 32; i++) { if ((i > 1) & !(i % 8)) printf(" 0x"); @@ -5549,21 +5619,19 @@ static void wdc_print_hw_rev_log_normal(void *data) } printf("\n"); - printf(" Log Page Version : %d\n", - log_data->hw_rev_version); + printf(" Log Page Version : %d\n", log_data->hw_rev_version); printf(" Log page GUID : 0x"); - printf("%"PRIx64"%"PRIx64"\n",le64_to_cpu(*(uint64_t *)&log_data->hw_rev_guid[8]), - le64_to_cpu(*(uint64_t *)&log_data->hw_rev_guid[0])); + printf("%"PRIx64"%"PRIx64"\n", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_guid[8]), + le64_to_cpu(*(uint64_t *)&log_data->hw_rev_guid[0])); printf("\n"); } static void wdc_print_hw_rev_log_json(void *data) { - wdc_nvme_hw_rev_log *log_data = (wdc_nvme_hw_rev_log *)data; - struct json_object *root; + struct wdc_nvme_hw_rev_log *log_data = (struct wdc_nvme_hw_rev_log *)data; + struct json_object *root = json_create_object(); char json_data[80]; - root = json_create_object(); json_object_add_value_uint(root, "Global Device HW Revision", log_data->hw_rev_gdr); json_object_add_value_uint(root, "ASIC HW Revision", @@ -5597,88 +5665,88 @@ static void wdc_print_hw_rev_log_json(void *data) json_object_add_value_uint(root, "Other Component 9 Manf Code", log_data->hw_rev_c9_mc); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_dev_mdi[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_dev_mdi[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_dev_mdi[0])); json_object_add_value_string(root, "Device Manf Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_asic_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_asic_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_asic_di[0])); json_object_add_value_string(root, "ASIC Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pcb_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pcb_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pcb_di[0])); json_object_add_value_string(root, "PCB Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_dram_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_dram_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_dram_di[0])); json_object_add_value_string(root, "DRAM Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_nand_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_nand_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_nand_di[0])); json_object_add_value_string(root, "NAND Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pmic1_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pmic1_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pmic1_di[0])); json_object_add_value_string(root, "PMIC 1 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pmic2_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pmic2_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_pmic2_di[0])); json_object_add_value_string(root, "PMIC 2 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c1_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c1_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c1_di[0])); json_object_add_value_string(root, "Component 1 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c2_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c2_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c2_di[0])); json_object_add_value_string(root, "Component 2 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c3_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c3_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c3_di[0])); json_object_add_value_string(root, "Component 3 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c4_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c4_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c4_di[0])); json_object_add_value_string(root, "Component 4 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c5_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c5_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c5_di[0])); json_object_add_value_string(root, "Component 5 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c6_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c6_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c6_di[0])); json_object_add_value_string(root, "Component 6 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c7_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c7_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c7_di[0])); json_object_add_value_string(root, "Component 7 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c8_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c8_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c8_di[0])); json_object_add_value_string(root, "Component 8 Detailed Info", json_data); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c9_di[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c9_di[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_c9_di[0])); json_object_add_value_string(root, "Component 9 Detailed Info", json_data); - memset((void*)json_data, 0, 80); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"%"PRIx64"%"PRIx64"", + memset((void *)json_data, 0, 80); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_sn[0]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_sn[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_sn[16]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_sn[24])); json_object_add_value_string(root, "Serial Number", json_data); @@ -5686,8 +5754,8 @@ static void wdc_print_hw_rev_log_json(void *data) json_object_add_value_uint(root, "Log Page Version", le16_to_cpu(log_data->hw_rev_version)); - memset((void*)json_data, 0, 40); - sprintf((char*)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_guid[8]), + memset((void *)json_data, 0, 40); + sprintf((char *)json_data, "0x%"PRIx64"%"PRIx64"", le64_to_cpu(*(uint64_t *)&log_data->hw_rev_guid[8]), le64_to_cpu(*(uint64_t *)&log_data->hw_rev_guid[0])); json_object_add_value_string(root, "Log Page GUID", json_data); @@ -5699,17 +5767,17 @@ static void wdc_print_hw_rev_log_json(void *data) static void wdc_print_ext_smart_cloud_log_normal(void *data, int mask) { int i; - wdc_nvme_ext_smart_log *ext_smart_log_ptr = (wdc_nvme_ext_smart_log *)data; + struct __packed wdc_nvme_ext_smart_log * ext_smart_log_ptr = (struct __packed wdc_nvme_ext_smart_log *)data; if (mask == WDC_SCA_V1_NAND_STATS) - printf(" NAND Statistics :- \n"); + printf(" NAND Statistics :-\n"); else - printf(" SMART Cloud Attributes :- \n"); + printf(" SMART Cloud Attributes :-\n"); - printf(" Physical Media Units Written TLC (Bytes) : %s\n", + printf(" Physical Media Units Written TLC (Bytes): %s\n", uint128_t_to_string(le128_to_cpu( ext_smart_log_ptr->ext_smart_pmuwt))); - printf(" Physical Media Units Written SLC (Bytes) : %s\n", + printf(" Physical Media Units Written SLC (Bytes): %s\n", uint128_t_to_string(le128_to_cpu( ext_smart_log_ptr->ext_smart_pmuws))); printf(" Bad User NAND Block Count (Normalized) (Int) : %d\n", @@ -5759,7 +5827,7 @@ static void wdc_print_ext_smart_cloud_log_normal(void *data, int mask) le64_to_cpu(ext_smart_log_ptr->ext_smart_svn)); printf(" %% Free Blocks (System) (Int) : %d %%\n", ext_smart_log_ptr->ext_smart_pfbs); - printf(" NVMe Stats (# Data Set Management/TRIM Commands Completed) (Int) : %s\n", + printf(" NVMe Stats (# Data Set Management/TRIM Commands Completed) (Int): %s\n", uint128_t_to_string(le128_to_cpu( ext_smart_log_ptr->ext_smart_dcc))); printf(" Total Namespace Utilization (nvme0n1 NUSE) (Bytes) : %"PRIu64"\n", @@ -5827,123 +5895,127 @@ static void wdc_print_ext_smart_cloud_log_normal(void *data, int mask) static void wdc_print_ext_smart_cloud_log_json(void *data, int mask) { - wdc_nvme_ext_smart_log *ext_smart_log_ptr = (wdc_nvme_ext_smart_log *)data; - struct json_object *root; + struct __packed wdc_nvme_ext_smart_log * ext_smart_log_ptr = + (struct __packed wdc_nvme_ext_smart_log *)data; + struct json_object *root = json_create_object(); - root = json_create_object(); json_object_add_value_uint128(root, "physical_media_units_bytes_tlc", - le128_to_cpu(ext_smart_log_ptr->ext_smart_pmuwt)); + le128_to_cpu(ext_smart_log_ptr->ext_smart_pmuwt)); json_object_add_value_uint128(root, "physical_media_units_bytes_slc", - le128_to_cpu(ext_smart_log_ptr->ext_smart_pmuws)); + le128_to_cpu(ext_smart_log_ptr->ext_smart_pmuws)); json_object_add_value_uint(root, "bad_user_blocks_normalized", - le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_bunbc)); + le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_bunbc)); json_object_add_value_uint64(root, "bad_user_blocks_raw", - le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_bunbc & 0xFFFFFFFFFFFF0000)); + le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_bunbc & 0xFFFFFFFFFFFF0000)); json_object_add_value_uint64(root, "xor_recovery_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_xrc)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_xrc)); json_object_add_value_uint64(root, "uncorrectable_read_errors", - le64_to_cpu(ext_smart_log_ptr->ext_smart_urec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_urec)); if (mask == WDC_SCA_V1_ALL) { json_object_add_value_uint64(root, "corrected_e2e_errors", - le64_to_cpu(ext_smart_log_ptr->ext_smart_eece)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_eece)); json_object_add_value_uint64(root, "detected_e2e_errors", - le64_to_cpu(ext_smart_log_ptr->ext_smart_eede)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_eede)); json_object_add_value_uint64(root, "uncorrected_e2e_errors", - le64_to_cpu(ext_smart_log_ptr->ext_smart_eeue)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_eeue)); json_object_add_value_uint(root, "system_data_life_used_pct", - (__u8)ext_smart_log_ptr->ext_smart_sdpu); + (__u8)ext_smart_log_ptr->ext_smart_sdpu); } json_object_add_value_uint64(root, "min_slc_user_data_erase_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_mnec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_mnec)); json_object_add_value_uint64(root, "min_tlc_user_data_erase_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_mnudec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_mnudec)); json_object_add_value_uint64(root, "max_slc_user_data_erase_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_mxec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_mxec)); json_object_add_value_uint64(root, "max_tlc_user_data_erase_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_mxudec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_mxudec)); json_object_add_value_uint64(root, "avg_slc_user_data_erase_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_avec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_avec)); json_object_add_value_uint64(root, "avg_tlc_user_data_erase_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_avudec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_avudec)); json_object_add_value_uint(root, "program_fail_count_normalized", - le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_pfc)); + le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_pfc)); json_object_add_value_uint64(root, "program_fail_count_raw", - le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_pfc & 0xFFFFFFFFFFFF0000)); + le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_pfc & 0xFFFFFFFFFFFF0000)); json_object_add_value_uint(root, "erase_fail_count_normalized", - le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_efc)); + le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_efc)); json_object_add_value_uint64(root, "erase_fail_count_raw", - le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_efc & 0xFFFFFFFFFFFF0000)); + le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_efc & 0xFFFFFFFFFFFF0000)); if (mask == WDC_SCA_V1_ALL) { json_object_add_value_uint64(root, "pcie_correctable_errors", - le64_to_cpu(ext_smart_log_ptr->ext_smart_pcec)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_pcec)); json_object_add_value_uint(root, "pct_free_blocks_user", - (__u8)ext_smart_log_ptr->ext_smart_pfbu); + (__u8)ext_smart_log_ptr->ext_smart_pfbu); json_object_add_value_uint64(root, "security_version", - le64_to_cpu(ext_smart_log_ptr->ext_smart_svn)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_svn)); json_object_add_value_uint(root, "pct_free_blocks_system", - (__u8)ext_smart_log_ptr->ext_smart_pfbs); + (__u8)ext_smart_log_ptr->ext_smart_pfbs); json_object_add_value_uint128(root, "num_of_trim_commands", - le128_to_cpu(ext_smart_log_ptr->ext_smart_dcc)); + le128_to_cpu(ext_smart_log_ptr->ext_smart_dcc)); json_object_add_value_uint64(root, "total_nuse_bytes", - le64_to_cpu(ext_smart_log_ptr->ext_smart_tnu)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_tnu)); json_object_add_value_uint(root, "num_of_format_commands", - le16_to_cpu(ext_smart_log_ptr->ext_smart_fcc)); + le16_to_cpu(ext_smart_log_ptr->ext_smart_fcc)); json_object_add_value_uint(root, "background_pressure_gauge", - (__u8)ext_smart_log_ptr->ext_smart_bbpg); + (__u8)ext_smart_log_ptr->ext_smart_bbpg); } json_object_add_value_uint64(root, "soft_ecc_error_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_seec)); - if (mask == WDC_SCA_V1_ALL) { + le64_to_cpu(ext_smart_log_ptr->ext_smart_seec)); + if (mask == WDC_SCA_V1_ALL) json_object_add_value_uint64(root, "read_refresh_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_rfsc)); - } + le64_to_cpu(ext_smart_log_ptr->ext_smart_rfsc)); json_object_add_value_uint(root, "bad_system_block_normalized", - le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_bsnbc)); + le16_to_cpu(*(uint16_t *)ext_smart_log_ptr->ext_smart_bsnbc)); json_object_add_value_uint64(root, "bad_system_block_raw", - le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_bsnbc & 0xFFFFFFFFFFFF0000)); + le64_to_cpu(*(uint64_t *)ext_smart_log_ptr->ext_smart_bsnbc & 0xFFFFFFFFFFFF0000)); json_object_add_value_uint128(root, "endurance_est_bytes", - le128_to_cpu(ext_smart_log_ptr->ext_smart_eest)); + le128_to_cpu(ext_smart_log_ptr->ext_smart_eest)); if (mask == WDC_SCA_V1_ALL) { json_object_add_value_uint(root, "num_throttling_events", - le16_to_cpu(ext_smart_log_ptr->ext_smart_ttc)); + le16_to_cpu(ext_smart_log_ptr->ext_smart_ttc)); json_object_add_value_uint64(root, "total_unaligned_io", - le64_to_cpu(ext_smart_log_ptr->ext_smart_uio)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_uio)); } json_object_add_value_uint128(root, "physical_media_units_read_bytes", - le128_to_cpu(ext_smart_log_ptr->ext_smart_pmur)); + le128_to_cpu(ext_smart_log_ptr->ext_smart_pmur)); if (mask == WDC_SCA_V1_ALL) { json_object_add_value_uint(root, "num_read_timeouts", - le32_to_cpu(ext_smart_log_ptr->ext_smart_rtoc)); + le32_to_cpu(ext_smart_log_ptr->ext_smart_rtoc)); json_object_add_value_uint(root, "num_write_timeouts", - le32_to_cpu(ext_smart_log_ptr->ext_smart_wtoc)); + le32_to_cpu(ext_smart_log_ptr->ext_smart_wtoc)); json_object_add_value_uint(root, "num_trim_timeouts", - le32_to_cpu(ext_smart_log_ptr->ext_smart_ttoc)); + le32_to_cpu(ext_smart_log_ptr->ext_smart_ttoc)); json_object_add_value_uint64(root, "pcie_link_retrain_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_plrc)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_plrc)); json_object_add_value_uint64(root, "active_power_state_change_count", - le64_to_cpu(ext_smart_log_ptr->ext_smart_pscc)); + le64_to_cpu(ext_smart_log_ptr->ext_smart_pscc)); } char vers_str[40]; - memset((void*)vers_str, 0, 40); - sprintf((char*)vers_str, "%d.%d.%d.%d", - le16_to_cpu(ext_smart_log_ptr->ext_smart_maj), le16_to_cpu(ext_smart_log_ptr->ext_smart_min), - le16_to_cpu(ext_smart_log_ptr->ext_smart_pt), le16_to_cpu(ext_smart_log_ptr->ext_smart_err)); + + memset((void *)vers_str, 0, 40); + sprintf((char *)vers_str, "%d.%d.%d.%d", + le16_to_cpu(ext_smart_log_ptr->ext_smart_maj), + le16_to_cpu(ext_smart_log_ptr->ext_smart_min), + le16_to_cpu(ext_smart_log_ptr->ext_smart_pt), + le16_to_cpu(ext_smart_log_ptr->ext_smart_err)); json_object_add_value_string(root, "cloud_boot_ssd_spec_ver", vers_str); - memset((void*)vers_str, 0, 40); - sprintf((char*)vers_str, "%d.%d.%d.%d", 0, 0, 0, 0); + memset((void *)vers_str, 0, 40); + sprintf((char *)vers_str, "%d.%d.%d.%d", 0, 0, 0, 0); json_object_add_value_string(root, "cloud_boot_ssd_hw_ver", vers_str); if (mask == WDC_SCA_V1_ALL) { json_object_add_value_uint(root, "ftl_unit_size", - le32_to_cpu(ext_smart_log_ptr->ext_smart_ftlus)); + le32_to_cpu(ext_smart_log_ptr->ext_smart_ftlus)); json_object_add_value_uint(root, "tcg_ownership_status", - le32_to_cpu(ext_smart_log_ptr->ext_smart_tcgos)); + le32_to_cpu(ext_smart_log_ptr->ext_smart_tcgos)); json_object_add_value_uint(root, "log_page_ver", - le16_to_cpu(ext_smart_log_ptr->ext_smart_lpv)); + le16_to_cpu(ext_smart_log_ptr->ext_smart_lpv)); char guid[40]; - memset((void*)guid, 0, 40); - sprintf((char*)guid, "0x%"PRIx64"%"PRIx64"",le64_to_cpu(*(uint64_t *)&ext_smart_log_ptr->ext_smart_lpg[8]), - le64_to_cpu(*(uint64_t *)&ext_smart_log_ptr->ext_smart_lpg[0])); + + memset((void *)guid, 0, 40); + sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", + le64_to_cpu(*(uint64_t *)&ext_smart_log_ptr->ext_smart_lpg[8]), + le64_to_cpu(*(uint64_t *)&ext_smart_log_ptr->ext_smart_lpg[0])); json_object_add_value_string(root, "log_page_guid", guid); } @@ -5954,92 +6026,92 @@ static void wdc_print_ext_smart_cloud_log_json(void *data, int mask) static void wdc_print_smart_cloud_attr_C0_normal(void *data) { - __u8 *log_data = (__u8*)data; + __u8 *log_data = (__u8 *)data; uint16_t smart_log_ver = 0; - printf(" SMART Cloud Attributes :- \n"); + printf(" SMART Cloud Attributes :-\n"); printf(" Physical media units written : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PMUW]))); + uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PMUW]))); printf(" Physical media units read : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PMUR]))); + uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PMUR]))); printf(" Bad user nand blocks Raw : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF)); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF)); printf(" Bad user nand blocks Normalized : %d\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN])); + (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN])); printf(" Bad system nand blocks Raw : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF)); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF)); printf(" Bad system nand blocks Normalized : %d\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN])); - printf(" XOR recovery count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC])); + (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN])); + printf(" XOR recovery count : %"PRIu64"\n", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC])); printf(" Uncorrectable read error count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC])); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC])); printf(" Soft ecc error count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC])); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC])); printf(" End to end corrected errors : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE])); + (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE])); printf(" End to end detected errors : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC])); + (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC])); printf(" System data percent used : %d\n", (__u8)log_data[SCAO_SDPU]); printf(" Refresh counts : %"PRIu64"\n", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC])& 0x00FFFFFFFFFFFFFF)); + (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); printf(" Max User data erase counts : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); + (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); printf(" Min User data erase counts : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC])); + (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC])); printf(" Number of Thermal throttling events : %d\n", (__u8)log_data[SCAO_NTTE]); printf(" Current throttling status : 0x%x\n", (__u8)log_data[SCAO_CTS]); printf(" PCIe correctable error count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC])); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC])); printf(" Incomplete shutdowns : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS])); + (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS])); printf(" Percent free blocks : %d\n", (__u8)log_data[SCAO_PFB]); printf(" Capacitor health : %"PRIu16"\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); + (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); printf(" Unaligned I/O : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO])); - printf(" Security Version Number : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN])); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO])); + printf(" Securqity Version Number : %"PRIu64"\n", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN])); printf(" NUSE Namespace utilization : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE])); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE])); printf(" PLP start count : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC]))); + uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC]))); printf(" Endurance estimate : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_EEST]))); + uint128_t_to_string(le128_to_cpu(&log_data[SCAO_EEST]))); smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]); - printf(" Log page version : %"PRIu16"\n",smart_log_ver); + printf(" Log page version : %"PRIu16"\n", smart_log_ver); printf(" Log page GUID : 0x"); - printf("%"PRIx64"%"PRIx64"\n",(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]), - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG])); - if(smart_log_ver > 2) { + printf("%"PRIx64"%"PRIx64"\n", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]), + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG])); + if (smart_log_ver > 2) { printf(" Errata Version Field : %d\n", - (__u8)log_data[SCAO_EVF]); + (__u8)log_data[SCAO_EVF]); printf(" Point Version Field : %"PRIu16"\n", - (uint16_t)log_data[SCAO_PVF]); + (uint16_t)log_data[SCAO_PVF]); printf(" Minor Version Field : %"PRIu16"\n", - (uint16_t)log_data[SCAO_MIVF]); + (uint16_t)log_data[SCAO_MIVF]); printf(" Major Version Field : %d\n", - (__u8)log_data[SCAO_MAVF]); + (__u8)log_data[SCAO_MAVF]); printf(" NVMe Errata Version : %d\n", - (__u8)log_data[SCAO_NEV]); + (__u8)log_data[SCAO_NEV]); printf(" PCIe Link Retraining Count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); } if (smart_log_ver > 3) { printf(" Power State Change Count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); } printf("\n"); } static void wdc_print_smart_cloud_attr_C0_json(void *data) { - __u8 *log_data = (__u8*)data; - struct json_object *root; + __u8 *log_data = (__u8 *)data; + struct json_object *root = json_create_object(); uint16_t smart_log_ver = 0; - root = json_create_object(); json_object_add_value_uint128(root, "Physical media units written", le128_to_cpu(&log_data[SCAO_PMUW])); json_object_add_value_uint128(root, "Physical media units read", @@ -6065,7 +6137,7 @@ static void wdc_print_smart_cloud_attr_C0_json(void *data) json_object_add_value_uint(root, "System data percent used", (__u8)log_data[SCAO_SDPU]); json_object_add_value_uint64(root, "Refresh counts", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC])& 0x00FFFFFFFFFFFFFF)); + (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); json_object_add_value_uint(root, "Max User data erase counts", (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); json_object_add_value_uint(root, "Min User data erase counts", @@ -6095,11 +6167,13 @@ static void wdc_print_smart_cloud_attr_C0_json(void *data) smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]); json_object_add_value_uint(root, "Log page version", smart_log_ver); char guid[40]; - memset((void*)guid, 0, 40); - sprintf((char*)guid, "0x%"PRIx64"%"PRIx64"",(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]), + + memset((void *)guid, 0, 40); + sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]), (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG])); json_object_add_value_string(root, "Log page GUID", guid); - if(smart_log_ver > 2){ + if (smart_log_ver > 2) { json_object_add_value_uint(root, "Errata Version Field", (__u8)log_data[SCAO_EVF]); json_object_add_value_uint(root, "Point Version Field", @@ -6113,7 +6187,7 @@ static void wdc_print_smart_cloud_attr_C0_json(void *data) json_object_add_value_uint64(root, "PCIe Link Retraining Count", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); } - if(smart_log_ver > 3) { + if (smart_log_ver > 3) { json_object_add_value_uint64(root, "Power State Change Count", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); } @@ -6125,9 +6199,9 @@ static void wdc_print_smart_cloud_attr_C0_json(void *data) static void wdc_print_eol_c0_normal(void *data) { - __u8 *log_data = (__u8*)data; + __u8 *log_data = (__u8 *)data; - printf(" End of Life Log Page 0xC0 :- \n"); + printf(" End of Life Log Page 0xC0 :-\n"); printf(" Realloc Block Count %"PRIu32"\n", (uint32_t)le32_to_cpu(log_data[EOL_RBC])); @@ -6148,10 +6222,8 @@ static void wdc_print_eol_c0_normal(void *data) static void wdc_print_eol_c0_json(void *data) { - __u8 *log_data = (__u8*)data; - struct json_object *root; - - root = json_create_object(); + __u8 *log_data = (__u8 *)data; + struct json_object *root = json_create_object(); json_object_add_value_uint(root, "Realloc Block Count", (uint32_t)le32_to_cpu(log_data[EOL_RBC])); @@ -6176,7 +6248,7 @@ static void wdc_print_eol_c0_json(void *data) static int wdc_print_ext_smart_cloud_log(void *data, int fmt) { if (!data) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read 0xC0 V1 log\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read 0xC0 V1 log\n"); return -1; } switch (fmt) { @@ -6193,7 +6265,7 @@ static int wdc_print_ext_smart_cloud_log(void *data, int fmt) static int wdc_print_c0_cloud_attr_log(void *data, int fmt) { if (!data) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read 0xC0 log\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read 0xC0 log\n"); return -1; } switch (fmt) { @@ -6210,7 +6282,7 @@ static int wdc_print_c0_cloud_attr_log(void *data, int fmt) static int wdc_print_c0_eol_log(void *data, int fmt) { if (!data) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read 0xC0 log\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read 0xC0 log\n"); return -1; } switch (fmt) { @@ -6224,199 +6296,232 @@ static int wdc_print_c0_eol_log(void *data, int fmt) return 0; } -static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format, - int uuid_index, __u32 namespace_id) +static int wdc_get_c0_log_page_sn_customer_id_0x100X(struct nvme_dev *dev, int uuid_index, + char *format, __u32 namespace_id, int fmt) +{ + int ret; + __u8 *data; + int i; + + if (!uuid_index) { + data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); + return -1; + } + + if (namespace_id == NVME_NSID_ALL) { + ret = nvme_get_nsid(dev_fd(dev), &namespace_id); + if (ret < 0) + namespace_id = NVME_NSID_ALL; + } + + /* Get the 0xC0 log data */ + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, + .nsid = namespace_id, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_index, + .csi = NVME_CSI_NVM, + .ot = false, + .len = WDC_NVME_SMART_CLOUD_ATTR_LEN, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); + + if (strcmp(format, "json")) + nvme_show_status(ret); + + if (!ret) { + /* Verify GUID matches */ + for (i = 0; i < 16; i++) { + if (scao_guid[i] != data[SCAO_LPG + i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in C0 Log Page data\n"); + int j; + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < 16; j++) + fprintf(stderr, "%x", scao_guid[j]); + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < 16; j++) + fprintf(stderr, "%x", data[SCAO_LPG + j]); + fprintf(stderr, "\n"); + + ret = -1; + break; + } + } + + if (!ret) + /* parse the data */ + wdc_print_c0_cloud_attr_log(data, fmt); + } else { + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); + ret = -1; + } + + free(data); + } else if (uuid_index == 1) { + data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_EOL_STATUS_LOG_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); + return -1; + } + + /* Get the 0xC0 log data */ + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .lid = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, + .nsid = NVME_NSID_ALL, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_index, + .csi = NVME_CSI_NVM, + .ot = false, + .len = WDC_NVME_EOL_STATUS_LOG_LEN, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); + + if (strcmp(format, "json")) + nvme_show_status(ret); + + if (!ret) { + /* parse the data */ + wdc_print_c0_eol_log(data, fmt); + } else { + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); + ret = -1; + } + + free(data); + } else { + fprintf(stderr, "ERROR: WDC: Unknown uuid index\n"); + ret = -1; + } + + return ret; +} + +static int wdc_get_c0_log_page_sn(nvme_root_t r, struct nvme_dev *dev, int uuid_index, char *format, + __u32 namespace_id, int fmt) +{ + int ret = 0; + __u32 cust_id; + __u8 *data; + + cust_id = wdc_get_fw_cust_id(r, dev); + if (cust_id == WDC_INVALID_CUSTOMER_ID) { + fprintf(stderr, "%s: ERROR: WDC: invalid customer id\n", __func__); + return -1; + } + + if ((cust_id == WDC_CUSTOMER_ID_0x1004) || (cust_id == WDC_CUSTOMER_ID_0x1008) || + (cust_id == WDC_CUSTOMER_ID_0x1005)) { + ret = wdc_get_c0_log_page_sn_customer_id_0x100X(dev, uuid_index, format, + namespace_id, fmt); + } else { + data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_EOL_STATUS_LOG_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); + return -1; + } + + /* Get the 0xC0 log data */ + ret = nvme_get_log_simple(dev_fd(dev), + WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, + WDC_NVME_EOL_STATUS_LOG_LEN, + data); + + if (strcmp(format, "json")) + nvme_show_status(ret); + + if (!ret) { + /* parse the data */ + wdc_print_c0_eol_log(data, fmt); + } else { + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); + ret = -1; + } + + free(data); + } + + return ret; +} + +static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format, int uuid_index, + __u32 namespace_id) { int ret = 0; int fmt = -1; - int i = 0; __u8 *data; - __u32 cust_id; uint32_t device_id, read_vendor_id; if (!wdc_check_device(r, dev)) return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } ret = wdc_get_pci_ids(r, dev, &device_id, &read_vendor_id); switch (device_id) { - case WDC_NVME_SN640_DEV_ID: + fallthrough; case WDC_NVME_SN640_DEV_ID_1: + fallthrough; case WDC_NVME_SN640_DEV_ID_2: + fallthrough; case WDC_NVME_SN640_DEV_ID_3: + fallthrough; case WDC_NVME_SN840_DEV_ID: + fallthrough; case WDC_NVME_SN840_DEV_ID_1: + fallthrough; case WDC_NVME_SN860_DEV_ID: + fallthrough; case WDC_NVME_SN650_DEV_ID: + fallthrough; case WDC_NVME_SN650_DEV_ID_1: + fallthrough; case WDC_NVME_SN650_DEV_ID_2: + fallthrough; case WDC_NVME_SN650_DEV_ID_3: + fallthrough; case WDC_NVME_SN650_DEV_ID_4: + fallthrough; case WDC_NVME_SN655_DEV_ID: + fallthrough; case WDC_NVME_SN560_DEV_ID_1: + fallthrough; case WDC_NVME_SN560_DEV_ID_2: + fallthrough; case WDC_NVME_SN560_DEV_ID_3: + fallthrough; case WDC_NVME_SN550_DEV_ID: - cust_id = wdc_get_fw_cust_id(r, dev); - if (cust_id == WDC_INVALID_CUSTOMER_ID) { - fprintf(stderr, "%s: ERROR : WDC : invalid customer id\n", __func__); - return -1; - } - - if ((cust_id == WDC_CUSTOMER_ID_0x1004) || (cust_id == WDC_CUSTOMER_ID_0x1008) || (cust_id == WDC_CUSTOMER_ID_0x1005)) - { - if (uuid_index == 0) - { - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); - return -1; - } - - if (namespace_id == NVME_NSID_ALL) { - ret = nvme_get_nsid(dev_fd(dev), - &namespace_id); - if (ret < 0) { - namespace_id = NVME_NSID_ALL; - } - } - - /* Get the 0xC0 log data */ - struct nvme_get_log_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), - .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, - .nsid = namespace_id, - .lpo = 0, - .lsp = NVME_LOG_LSP_NONE, - .lsi = 0, - .rae = false, - .uuidx = uuid_index, - .csi = NVME_CSI_NVM, - .ot = false, - .len = WDC_NVME_SMART_CLOUD_ATTR_LEN, - .log = data, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .result = NULL, - }; - ret = nvme_get_log(&args); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (ret == 0) { - - /* Verify GUID matches */ - for (i=0; i<16; i++) { - if (scao_guid[i] != data[SCAO_LPG + i]) { - fprintf(stderr, "ERROR : WDC : Unknown GUID in C0 Log Page data\n"); - int j; - fprintf(stderr, "ERROR : WDC : Expected GUID: 0x"); - for (j = 0; j<16; j++) { - fprintf(stderr, "%x", scao_guid[j]); - } - fprintf(stderr, "\nERROR : WDC : Actual GUID: 0x"); - for (j = 0; j<16; j++) { - fprintf(stderr, "%x", data[SCAO_LPG + j]); - } - fprintf(stderr, "\n"); - - ret = -1; - break; - } - } - - if (ret == 0) { - - /* parse the data */ - wdc_print_c0_cloud_attr_log(data, fmt); - } - } else { - fprintf(stderr, "ERROR : WDC : Unable to read C0 Log Page data\n"); - ret = -1; - } - - free(data); - } else if (uuid_index == 1) { - - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_NVME_EOL_STATUS_LOG_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); - return -1; - } - - /* Get the 0xC0 log data */ - struct nvme_get_log_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), - .lid = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, - .nsid = NVME_NSID_ALL, - .lpo = 0, - .lsp = NVME_LOG_LSP_NONE, - .lsi = 0, - .rae = false, - .uuidx = uuid_index, - .csi = NVME_CSI_NVM, - .ot = false, - .len = WDC_NVME_EOL_STATUS_LOG_LEN, - .log = data, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .result = NULL, - }; - ret = nvme_get_log(&args); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (ret == 0) { - /* parse the data */ - wdc_print_c0_eol_log(data, fmt); - } else { - fprintf(stderr, "ERROR : WDC : Unable to read C0 Log Page data\n"); - ret = -1; - } - - free(data); - } else { - fprintf(stderr, "ERROR : WDC : Unknown uuid index\n"); - ret = -1; - } - } - else { - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_NVME_EOL_STATUS_LOG_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); - return -1; - } - - /* Get the 0xC0 log data */ - ret = nvme_get_log_simple(dev_fd(dev), - WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, - WDC_NVME_EOL_STATUS_LOG_LEN, - data); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (ret == 0) { - /* parse the data */ - wdc_print_c0_eol_log(data, fmt); - } else { - fprintf(stderr, "ERROR : WDC : Unable to read C0 Log Page data\n"); - ret = -1; - } - - free(data); - } + ret = wdc_get_c0_log_page_sn(r, dev, uuid_index, format, namespace_id, fmt); break; - case WDC_NVME_ZN350_DEV_ID: + fallthrough; case WDC_NVME_ZN350_DEV_ID_1: - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } @@ -6428,17 +6533,16 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ wdc_print_c0_cloud_attr_log(data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read C0 Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); ret = -1; } free(data); break; - case WDC_NVME_SN820CL_DEV_ID: /* Get the 0xC0 Extended Smart Cloud Attribute log data */ data = NULL; @@ -6448,20 +6552,19 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ wdc_print_ext_smart_cloud_log(data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read C0 Log Page V1 data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page V1 data\n"); ret = -1; } if (data) free(data); break; - default: - fprintf(stderr, "ERROR : WDC : Unknown device id - 0x%x\n", device_id); + fprintf(stderr, "ERROR: WDC: Unknown device id - 0x%x\n", device_id); ret = -1; break; @@ -6475,7 +6578,7 @@ static int wdc_print_latency_monitor_log(struct nvme_dev *dev, int fmt) { if (!log_data) { - fprintf(stderr, "ERROR : WDC : Invalid C3 log data buffer\n"); + fprintf(stderr, "ERROR: WDC: Invalid C3 log data buffer\n"); return -1; } switch (fmt) { @@ -6492,7 +6595,7 @@ static int wdc_print_latency_monitor_log(struct nvme_dev *dev, static int wdc_print_error_rec_log(struct wdc_ocp_c1_error_recovery_log *log_data, int fmt) { if (!log_data) { - fprintf(stderr, "ERROR : WDC : Invalid C1 log data buffer\n"); + fprintf(stderr, "ERROR: WDC: Invalid C1 log data buffer\n"); return -1; } switch (fmt) { @@ -6509,7 +6612,7 @@ static int wdc_print_error_rec_log(struct wdc_ocp_c1_error_recovery_log *log_dat static int wdc_print_dev_cap_log(struct wdc_ocp_C4_dev_cap_log *log_data, int fmt) { if (!log_data) { - fprintf(stderr, "ERROR : WDC : Invalid C4 log data buffer\n"); + fprintf(stderr, "ERROR: WDC: Invalid C4 log data buffer\n"); return -1; } switch (fmt) { @@ -6526,7 +6629,7 @@ static int wdc_print_dev_cap_log(struct wdc_ocp_C4_dev_cap_log *log_data, int fm static int wdc_print_unsupported_reqs_log(struct wdc_ocp_C5_unsupported_reqs *log_data, int fmt) { if (!log_data) { - fprintf(stderr, "ERROR : WDC : Invalid C5 log data buffer\n"); + fprintf(stderr, "ERROR: WDC: Invalid C5 log data buffer\n"); return -1; } switch (fmt) { @@ -6543,7 +6646,7 @@ static int wdc_print_unsupported_reqs_log(struct wdc_ocp_C5_unsupported_reqs *lo static int wdc_print_fb_ca_log(struct wdc_ssd_ca_perf_stats *perf, int fmt) { if (!perf) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read perf stats\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read perf stats\n"); return -1; } switch (fmt) { @@ -6560,7 +6663,7 @@ static int wdc_print_fb_ca_log(struct wdc_ssd_ca_perf_stats *perf, int fmt) static int wdc_print_bd_ca_log(struct nvme_dev *dev, void *bd_data, int fmt) { if (!bd_data) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read data\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read data\n"); return -1; } switch (fmt) { @@ -6571,7 +6674,7 @@ static int wdc_print_bd_ca_log(struct nvme_dev *dev, void *bd_data, int fmt) wdc_print_bd_ca_log_json(bd_data); break; default: - fprintf(stderr, "ERROR : WDC : Unknown format - %d\n", fmt); + fprintf(stderr, "ERROR: WDC: Unknown format - %d\n", fmt); return -1; } return 0; @@ -6580,7 +6683,7 @@ static int wdc_print_bd_ca_log(struct nvme_dev *dev, void *bd_data, int fmt) static int wdc_print_d0_log(struct wdc_ssd_d0_smart_log *perf, int fmt) { if (!perf) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read perf stats\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read perf stats\n"); return -1; } switch (fmt) { @@ -6597,7 +6700,7 @@ static int wdc_print_d0_log(struct wdc_ssd_d0_smart_log *perf, int fmt) static int wdc_print_fw_act_history_log(__u8 *data, int num_entries, int fmt, __u32 cust_id, __u32 vendor_id) { if (!data) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read fw activate history entries\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read fw activate history entries\n"); return -1; } @@ -6625,37 +6728,35 @@ static int wdc_get_ca_log_page(nvme_root_t r, struct nvme_dev *dev, char *format return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } /* verify the 0xCA log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE) == false) { - fprintf(stderr, "ERROR : WDC : 0xCA Log Page not supported\n"); + fprintf(stderr, "ERROR: WDC: 0xCA Log Page not supported\n"); return -1; } /* get the FW customer id */ cust_id = wdc_get_fw_cust_id(r, dev); if (cust_id == WDC_INVALID_CUSTOMER_ID) { - fprintf(stderr, "%s: ERROR : WDC : invalid customer id\n", __func__); + fprintf(stderr, "%s: ERROR: WDC: invalid customer id\n", __func__); return -1; } ret = wdc_get_pci_ids(r, dev, &read_device_id, &read_vendor_id); switch (read_device_id) { - case WDC_NVME_SN200_DEV_ID: - if (cust_id == WDC_CUSTOMER_ID_0x1005) { - - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_FB_CA_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_FB_CA_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_FB_CA_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_FB_CA_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE, @@ -6663,36 +6764,41 @@ static int wdc_get_ca_log_page(nvme_root_t r, struct nvme_dev *dev, char *format if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ perf = (struct wdc_ssd_ca_perf_stats *)(data); ret = wdc_print_fb_ca_log(perf, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read CA Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read CA Log Page data\n"); ret = -1; } } else { - fprintf(stderr, "ERROR : WDC : Unsupported Customer id, id = 0x%x\n", cust_id); + fprintf(stderr, "ERROR: WDC: Unsupported Customer id, id = 0x%x\n", cust_id); return -1; } break; - case WDC_NVME_SN640_DEV_ID: + fallthrough; case WDC_NVME_SN640_DEV_ID_1: + fallthrough; case WDC_NVME_SN640_DEV_ID_2: + fallthrough; case WDC_NVME_SN640_DEV_ID_3: + fallthrough; case WDC_NVME_SN840_DEV_ID: + fallthrough; case WDC_NVME_SN840_DEV_ID_1: + fallthrough; case WDC_NVME_SN860_DEV_ID: if (cust_id == WDC_CUSTOMER_ID_0x1005) { - - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_FB_CA_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_FB_CA_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_FB_CA_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_FB_CA_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE, @@ -6700,49 +6806,44 @@ static int wdc_get_ca_log_page(nvme_root_t r, struct nvme_dev *dev, char *format if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ perf = (struct wdc_ssd_ca_perf_stats *)(data); ret = wdc_print_fb_ca_log(perf, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read CA Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read CA Log Page data\n"); ret = -1; } } else if ((cust_id == WDC_CUSTOMER_ID_GN) || (cust_id == WDC_CUSTOMER_ID_GD) || (cust_id == WDC_CUSTOMER_ID_BD)) { - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_BD_CA_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_BD_CA_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_BD_CA_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_BD_CA_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE, WDC_BD_CA_LOG_BUF_LEN, data); if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ ret = wdc_print_bd_ca_log(dev, data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read CA Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read CA Log Page data\n"); ret = -1; } - - break; } else { - - fprintf(stderr, "ERROR : WDC : Unsupported Customer id, id = 0x%x\n", cust_id); + fprintf(stderr, "ERROR: WDC: Unsupported Customer id, id = 0x%x\n", cust_id); return -1; } break; - default: - - fprintf(stderr, "ERROR : WDC : Log page 0xCA not supported for this device\n"); + fprintf(stderr, "ERROR: WDC: Log page 0xCA not supported for this device\n"); return -1; - break; } free(data); @@ -6767,42 +6868,42 @@ static int wdc_get_c1_log_page(nvme_root_t r, struct nvme_dev *dev, return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } if (interval < 1 || interval > 15) { - fprintf(stderr, "ERROR : WDC : interval out of range [1-15]\n"); + fprintf(stderr, "ERROR: WDC: interval out of range [1-15]\n"); return -1; } - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_ADD_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_ADD_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_ADD_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_ADD_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_ADD_LOG_OPCODE, WDC_ADD_LOG_BUF_LEN, data); if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { - l = (struct wdc_log_page_header*)data; + if (!ret) { + l = (struct wdc_log_page_header *)data; total_subpages = l->num_subpages + WDC_NVME_GET_STAT_PERF_INTERVAL_LIFETIME - 1; for (i = 0, p = data + skip_cnt; i < total_subpages; i++, p += skip_cnt) { - sph = (struct wdc_log_page_subpage_header *) p; + sph = (struct wdc_log_page_subpage_header *)p; if (sph->spcode == WDC_GET_LOG_PAGE_SSD_PERFORMANCE) { if (sph->pcset == interval) { - perf = (struct wdc_ssd_perf_stats *) (p + 4); + perf = (struct wdc_ssd_perf_stats *)(p + 4); ret = wdc_print_log(perf, fmt); break; } } skip_cnt = le16_to_cpu(sph->subpage_length) + 4; } - if (ret) { - fprintf(stderr, "ERROR : WDC : Unable to read data from buffer\n"); - } + if (ret) + fprintf(stderr, "ERROR: WDC: Unable to read data from buffer\n"); } free(data); return ret; @@ -6820,15 +6921,16 @@ static int wdc_get_c3_log_page(nvme_root_t r, struct nvme_dev *dev, char *format return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } - if ((data = (__u8 *) malloc(sizeof(__u8) * WDC_LATENCY_MON_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_LATENCY_MON_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_LATENCY_MON_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_LATENCY_MON_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_LATENCY_MON_LOG_ID, WDC_LATENCY_MON_LOG_BUF_LEN, data); @@ -6836,30 +6938,29 @@ static int wdc_get_c3_log_page(nvme_root_t r, struct nvme_dev *dev, char *format if (strcmp(format, "json")) fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret, false), ret); - if (ret == 0) { - log_data = (struct wdc_ssd_latency_monitor_log*)data; + if (!ret) { + log_data = (struct wdc_ssd_latency_monitor_log *)data; /* check log page version */ if (log_data->log_page_version != WDC_LATENCY_MON_VERSION) { - fprintf(stderr, "ERROR : WDC : invalid latency monitor version\n"); + fprintf(stderr, "ERROR: WDC: invalid latency monitor version\n"); ret = -1; - goto out; + goto out; } /* check log page guid */ /* Verify GUID matches */ - for (i=0; i<16; i++) { - if (wdc_lat_mon_guid[i] != log_data->log_page_guid[i]) { - fprintf(stderr, "ERROR : WDC : Unknown GUID in C3 Log Page data\n"); + for (i = 0; i < 16; i++) { + if (wdc_lat_mon_guid[i] != log_data->log_page_guid[i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in C3 Log Page data\n"); int j; - fprintf(stderr, "ERROR : WDC : Expected GUID: 0x"); - for (j = 0; j<16; j++) { + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", wdc_lat_mon_guid[j]); - } - fprintf(stderr, "\nERROR : WDC : Actual GUID: 0x"); - for (j = 0; j<16; j++) { + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", log_data->log_page_guid[j]); - } fprintf(stderr, "\n"); ret = -1; @@ -6870,7 +6971,7 @@ static int wdc_get_c3_log_page(nvme_root_t r, struct nvme_dev *dev, char *format /* parse the data */ wdc_print_latency_monitor_log(dev, log_data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read C3 data from buffer\n"); + fprintf(stderr, "ERROR: WDC: Unable to read C3 data from buffer\n"); } out: @@ -6891,15 +6992,16 @@ static int wdc_get_ocp_c1_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } - if ((data = (__u8 *) malloc(sizeof(__u8) * WDC_ERROR_REC_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_ERROR_REC_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_ERROR_REC_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_ERROR_REC_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_ERROR_REC_LOG_ID, WDC_ERROR_REC_LOG_BUF_LEN, data); @@ -6907,30 +7009,29 @@ static int wdc_get_ocp_c1_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo if (strcmp(format, "json")) fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret, false), ret); - if (ret == 0) { + if (!ret) { log_data = (struct wdc_ocp_c1_error_recovery_log *)data; /* check log page version */ if ((log_data->log_page_version != WDC_ERROR_REC_LOG_VERSION1) && - (log_data->log_page_version != WDC_ERROR_REC_LOG_VERSION2)) { - fprintf(stderr, "ERROR : WDC : invalid error recovery log version - %d\n", log_data->log_page_version); + (log_data->log_page_version != WDC_ERROR_REC_LOG_VERSION2)) { + fprintf(stderr, "ERROR: WDC: invalid error recovery log version - %d\n", log_data->log_page_version); ret = -1; goto out; } /* Verify GUID matches */ - for (i=0; i < WDC_OCP_C1_GUID_LENGTH; i++) { - if (wdc_ocp_c1_guid[i] != log_data->log_page_guid[i]) { - fprintf(stderr, "ERROR : WDC : Unknown GUID in C1 Log Page data\n"); + for (i = 0; i < WDC_OCP_C1_GUID_LENGTH; i++) { + if (wdc_ocp_c1_guid[i] != log_data->log_page_guid[i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in C1 Log Page data\n"); int j; - fprintf(stderr, "ERROR : WDC : Expected GUID: 0x"); - for (j = 0; j<16; j++) { + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", wdc_ocp_c1_guid[j]); - } - fprintf(stderr, "\nERROR : WDC : Actual GUID: 0x"); - for (j = 0; j<16; j++) { + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", log_data->log_page_guid[j]); - } fprintf(stderr, "\n"); ret = -1; @@ -6941,7 +7042,7 @@ static int wdc_get_ocp_c1_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo /* parse the data */ wdc_print_error_rec_log(log_data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read error recovery (C1) data from buffer\n"); + fprintf(stderr, "ERROR: WDC: Unable to read error recovery (C1) data from buffer\n"); } out: @@ -6961,15 +7062,16 @@ static int wdc_get_ocp_c4_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } - if ((data = (__u8 *) malloc(sizeof(__u8) * WDC_DEV_CAP_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_DEV_CAP_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_DEV_CAP_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_DEV_CAP_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_DEV_CAP_LOG_ID, WDC_DEV_CAP_LOG_BUF_LEN, data); @@ -6977,29 +7079,28 @@ static int wdc_get_ocp_c4_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo if (strcmp(format, "json")) fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret, false), ret); - if (ret == 0) { + if (!ret) { log_data = (struct wdc_ocp_C4_dev_cap_log *)data; /* check log page version */ if (log_data->log_page_version != WDC_DEV_CAP_LOG_VERSION) { - fprintf(stderr, "ERROR : WDC : invalid device capabilities log version - %d\n", log_data->log_page_version); + fprintf(stderr, "ERROR: WDC: invalid device capabilities log version - %d\n", log_data->log_page_version); ret = -1; goto out; } /* Verify GUID matches */ - for (i=0; i < WDC_OCP_C4_GUID_LENGTH; i++) { - if (wdc_ocp_c4_guid[i] != log_data->log_page_guid[i]) { - fprintf(stderr, "ERROR : WDC : Unknown GUID in C4 Log Page data\n"); + for (i = 0; i < WDC_OCP_C4_GUID_LENGTH; i++) { + if (wdc_ocp_c4_guid[i] != log_data->log_page_guid[i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in C4 Log Page data\n"); int j; - fprintf(stderr, "ERROR : WDC : Expected GUID: 0x"); - for (j = 0; j<16; j++) { + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", wdc_ocp_c4_guid[j]); - } - fprintf(stderr, "\nERROR : WDC : Actual GUID: 0x"); - for (j = 0; j<16; j++) { + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", log_data->log_page_guid[j]); - } fprintf(stderr, "\n"); ret = -1; @@ -7010,7 +7111,7 @@ static int wdc_get_ocp_c4_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo /* parse the data */ wdc_print_dev_cap_log(log_data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read device capabilities (C4) data from buffer\n"); + fprintf(stderr, "ERROR: WDC: Unable to read device capabilities (C4) data from buffer\n"); } out: @@ -7030,15 +7131,16 @@ static int wdc_get_ocp_c5_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } - if ((data = (__u8 *) malloc(sizeof(__u8) * WDC_UNSUPPORTED_REQS_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_UNSUPPORTED_REQS_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_UNSUPPORTED_REQS_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_UNSUPPORTED_REQS_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_UNSUPPORTED_REQS_LOG_ID, WDC_UNSUPPORTED_REQS_LOG_BUF_LEN, data); @@ -7046,29 +7148,28 @@ static int wdc_get_ocp_c5_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo if (strcmp(format, "json")) fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret, false), ret); - if (ret == 0) { + if (!ret) { log_data = (struct wdc_ocp_C5_unsupported_reqs *)data; /* check log page version */ if (log_data->log_page_version != WDC_UNSUPPORTED_REQS_LOG_VERSION) { - fprintf(stderr, "ERROR : WDC : invalid unsupported requirements log version - %d\n", log_data->log_page_version); + fprintf(stderr, "ERROR: WDC: invalid unsupported requirements log version - %d\n", log_data->log_page_version); ret = -1; goto out; } /* Verify GUID matches */ - for (i=0; i < WDC_OCP_C5_GUID_LENGTH; i++) { - if (wdc_ocp_c5_guid[i] != log_data->log_page_guid[i]) { - fprintf(stderr, "ERROR : WDC : Unknown GUID in C5 Log Page data\n"); + for (i = 0; i < WDC_OCP_C5_GUID_LENGTH; i++) { + if (wdc_ocp_c5_guid[i] != log_data->log_page_guid[i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in C5 Log Page data\n"); int j; - fprintf(stderr, "ERROR : WDC : Expected GUID: 0x"); - for (j = 0; j<16; j++) { + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", wdc_ocp_c5_guid[j]); - } - fprintf(stderr, "\nERROR : WDC : Actual GUID: 0x"); - for (j = 0; j<16; j++) { + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < 16; j++) fprintf(stderr, "%x", log_data->log_page_guid[j]); - } fprintf(stderr, "\n"); ret = -1; @@ -7079,7 +7180,7 @@ static int wdc_get_ocp_c5_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo /* parse the data */ wdc_print_unsupported_reqs_log(log_data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read unsupported requirements (C5) data from buffer\n"); + fprintf(stderr, "ERROR: WDC: Unable to read unsupported requirements (C5) data from buffer\n"); } out: @@ -7098,21 +7199,22 @@ static int wdc_get_d0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format return -1; fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } /* verify the 0xD0 log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_VU_SMART_LOG_OPCODE) == false) { - fprintf(stderr, "ERROR : WDC : 0xD0 Log Page not supported\n"); + fprintf(stderr, "ERROR: WDC: 0xD0 Log Page not supported\n"); return -1; } - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_NVME_VU_SMART_LOG_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_VU_SMART_LOG_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_NVME_VU_SMART_LOG_LEN); + memset(data, 0, sizeof(__u8) * WDC_NVME_VU_SMART_LOG_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_GET_VU_SMART_LOG_OPCODE, @@ -7120,12 +7222,12 @@ static int wdc_get_d0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ perf = (struct wdc_ssd_d0_smart_log *)(data); ret = wdc_print_d0_log(perf, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read D0 Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read D0 Log Page data\n"); ret = -1; } @@ -7179,12 +7281,12 @@ static int wdc_vs_smart_add_log(int argc, char **argv, struct command *command, return ret; r = nvme_scan(NULL); - if (cfg.log_page_version == 0) { + if (!cfg.log_page_version) { uuid_index = 0; } else if (cfg.log_page_version == 1) { uuid_index = 1; } else { - fprintf(stderr, "ERROR : WDC: unsupported log page version for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported log page version for this command\n"); ret = -1; goto out; } @@ -7197,69 +7299,61 @@ static int wdc_vs_smart_add_log(int argc, char **argv, struct command *command, goto out; } - if (num == 0) - { + if (!num) { page_mask |= WDC_ALL_PAGE_MASK; - } - else - { - for (i = 0; i < num; i++) - { - if (log_page_list[i] == 0xc0) { + } else { + for (i = 0; i < num; i++) { + if (log_page_list[i] == 0xc0) page_mask |= WDC_C0_PAGE_MASK; - } - if (log_page_list[i] == 0xc1) { + if (log_page_list[i] == 0xc1) page_mask |= WDC_C1_PAGE_MASK; - } - if (log_page_list[i] == 0xca) { + if (log_page_list[i] == 0xca) page_mask |= WDC_CA_PAGE_MASK; - } - if (log_page_list[i] == 0xd0) { + if (log_page_list[i] == 0xd0) page_mask |= WDC_D0_PAGE_MASK; - } } } - if (page_mask == 0) - fprintf(stderr, "ERROR : WDC: Unknown log page mask - %s\n", cfg.log_page_mask); + if (!page_mask) + fprintf(stderr, "ERROR: WDC: Unknown log page mask - %s\n", cfg.log_page_mask); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_SMART_LOG_MASK) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_SMART_LOG_MASK)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } if (((capabilities & WDC_DRIVE_CAP_C0_LOG_PAGE) == WDC_DRIVE_CAP_C0_LOG_PAGE) && - (page_mask & WDC_C0_PAGE_MASK)) { + (page_mask & WDC_C0_PAGE_MASK)) { /* Get 0xC0 log page if possible. */ ret = wdc_get_c0_log_page(r, dev, cfg.output_format, uuid_index, cfg.namespace_id); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the C0 Log Page, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the C0 Log Page, ret = %d\n", ret); } - if (((capabilities & (WDC_DRIVE_CAP_CA_LOG_PAGE)) == (WDC_DRIVE_CAP_CA_LOG_PAGE)) && - (page_mask & WDC_CA_PAGE_MASK)) { + if (((capabilities & (WDC_DRIVE_CAP_CA_LOG_PAGE)) == (WDC_DRIVE_CAP_CA_LOG_PAGE)) && + (page_mask & WDC_CA_PAGE_MASK)) { /* Get the CA Log Page */ ret = wdc_get_ca_log_page(r, dev, cfg.output_format); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the CA Log Page, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the CA Log Page, ret = %d\n", ret); } if (((capabilities & WDC_DRIVE_CAP_C1_LOG_PAGE) == WDC_DRIVE_CAP_C1_LOG_PAGE) && - (page_mask & WDC_C1_PAGE_MASK)) { + (page_mask & WDC_C1_PAGE_MASK)) { /* Get the C1 Log Page */ ret = wdc_get_c1_log_page(r, dev, cfg.output_format, cfg.interval); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the C1 Log Page, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the C1 Log Page, ret = %d\n", ret); } if (((capabilities & WDC_DRIVE_CAP_D0_LOG_PAGE) == WDC_DRIVE_CAP_D0_LOG_PAGE) && - (page_mask & WDC_D0_PAGE_MASK)) { + (page_mask & WDC_D0_PAGE_MASK)) { /* Get the D0 Log Page */ ret = wdc_get_d0_log_page(r, dev, cfg.output_format); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the D0 Log Page, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the D0 Log Page, ret = %d\n", ret); } out: @@ -7303,8 +7397,8 @@ static int wdc_vs_cloud_log(int argc, char **argv, struct command *command, capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_CLOUD_LOG_PAGE) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_CLOUD_LOG_PAGE)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -7316,17 +7410,17 @@ static int wdc_vs_cloud_log(int argc, char **argv, struct command *command, if (strcmp(cfg.output_format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { fmt = validate_output_format(cfg.output_format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC %s: invalid output format\n", __func__); + fprintf(stderr, "ERROR: WDC %s: invalid output format\n", __func__); ret = fmt; } /* parse the data */ wdc_print_ext_smart_cloud_log(data, fmt); } else { - fprintf(stderr, "ERROR : WDC : Unable to read C0 Log Page V1 data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page V1 data\n"); ret = -1; } @@ -7374,8 +7468,8 @@ static int wdc_vs_hw_rev_log(int argc, char **argv, struct command *command, capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_HW_REV_LOG_PAGE) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_HW_REV_LOG_PAGE)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -7385,16 +7479,16 @@ static int wdc_vs_hw_rev_log(int argc, char **argv, struct command *command, if (strcmp(cfg.output_format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { fmt = validate_output_format(cfg.output_format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC %s: invalid output format\n", __func__); + fprintf(stderr, "ERROR: WDC %s: invalid output format\n", __func__); ret = fmt; goto free_buf; } if (!data) { - fprintf(stderr, "ERROR : WDC : Invalid buffer to read Hardware Revision log\n"); + fprintf(stderr, "ERROR: WDC: Invalid buffer to read Hardware Revision log\n"); ret = -1; goto out; } @@ -7407,7 +7501,7 @@ static int wdc_vs_hw_rev_log(int argc, char **argv, struct command *command, break; } } else { - fprintf(stderr, "ERROR : WDC : Unable to read Hardware Revision Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read Hardware Revision Log Page data\n"); ret = -1; } @@ -7433,7 +7527,7 @@ static int wdc_vs_device_waf(int argc, char **argv, struct command *command, int ret = 0; int fmt = -1; __u64 capabilities = 0; - wdc_nvme_ext_smart_log *ext_smart_log_ptr; + struct __packed wdc_nvme_ext_smart_log * ext_smart_log_ptr; long double data_units_written = 0, phys_media_units_written_tlc = 0, phys_media_units_written_slc = 0; @@ -7465,8 +7559,8 @@ static int wdc_vs_device_waf(int argc, char **argv, struct command *command, capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_DEVICE_WAF) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_DEVICE_WAF)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -7476,8 +7570,7 @@ static int wdc_vs_device_waf(int argc, char **argv, struct command *command, &smart_log); if (!ret) { data_units_written = int128_to_double(smart_log.data_units_written); - } - else if (ret > 0) { + } else if (ret > 0) { nvme_show_status(ret); ret = -1; goto out; @@ -7492,15 +7585,15 @@ static int wdc_vs_device_waf(int argc, char **argv, struct command *command, ret = nvme_get_ext_smart_cloud_log(dev_fd(dev), &data, 0, cfg.namespace_id); - if (ret == 0) { - ext_smart_log_ptr = (wdc_nvme_ext_smart_log *)data; + if (!ret) { + ext_smart_log_ptr = (struct __packed wdc_nvme_ext_smart_log *)data; phys_media_units_written_tlc = int128_to_double(ext_smart_log_ptr->ext_smart_pmuwt); phys_media_units_written_slc = int128_to_double(ext_smart_log_ptr->ext_smart_pmuws); if (data) free(data); } else { - fprintf(stderr, "ERROR : WDC %s: get smart cloud log failure\n", __func__); + fprintf(stderr, "ERROR: WDC %s: get smart cloud log failure\n", __func__); ret = -1; goto out; } @@ -7510,13 +7603,13 @@ static int wdc_vs_device_waf(int argc, char **argv, struct command *command, fmt = validate_output_format(cfg.output_format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC %s: invalid output format\n", __func__); + fprintf(stderr, "ERROR: WDC %s: invalid output format\n", __func__); ret = fmt; goto out; } - if (data_units_written == 0) { - fprintf(stderr, "ERROR : WDC %s: 0 data units written\n", __func__); + if (!data_units_written) { + fprintf(stderr, "ERROR: WDC %s: 0 data units written\n", __func__); ret = -1; goto out; } @@ -7526,11 +7619,10 @@ static int wdc_vs_device_waf(int argc, char **argv, struct command *command, (phys_media_units_written_tlc/data_units_written)); printf("Device Write Amplification Factor SLC : %4.2Lf\n", (phys_media_units_written_slc/data_units_written)); - } - else if (fmt == JSON) { - root = json_create_object(); - sprintf(tlc_waf_str, "%4.2Lf", (phys_media_units_written_tlc/data_units_written)); - sprintf(slc_waf_str, "%4.2Lf", (phys_media_units_written_slc/data_units_written)); + } else if (fmt == JSON) { + root = json_create_object(); + sprintf(tlc_waf_str, "%4.2Lf", (phys_media_units_written_tlc/data_units_written)); + sprintf(slc_waf_str, "%4.2Lf", (phys_media_units_written_slc/data_units_written)); json_object_add_value_string(root, "Device Write Amplification Factor TLC", tlc_waf_str); json_object_add_value_string(root, "Device Write Amplification Factor SLC", slc_waf_str); @@ -7576,15 +7668,15 @@ static int wdc_get_latency_monitor_log(int argc, char **argv, struct command *co r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_C3_LOG_PAGE) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_C3_LOG_PAGE)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } ret = wdc_get_c3_log_page(r, dev, cfg.output_format); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the Latency Monitor (C3) Log Page, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the Latency Monitor (C3) Log Page, ret = %d\n", ret); out: nvme_free_tree(r); @@ -7621,15 +7713,15 @@ static int wdc_get_error_recovery_log(int argc, char **argv, struct command *com r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_OCP_C1_LOG_PAGE) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_OCP_C1_LOG_PAGE)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } ret = wdc_get_ocp_c1_log_page(r, dev, cfg.output_format); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the Error Recovery (C1) Log Page, ret = 0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the Error Recovery (C1) Log Page, ret = 0x%x\n", ret); out: nvme_free_tree(r); @@ -7666,15 +7758,15 @@ static int wdc_get_dev_capabilities_log(int argc, char **argv, struct command *c r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_OCP_C4_LOG_PAGE) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_OCP_C4_LOG_PAGE)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } ret = wdc_get_ocp_c4_log_page(r, dev, cfg.output_format); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the Device Capabilities (C4) Log Page, ret = 0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the Device Capabilities (C4) Log Page, ret = 0x%x\n", ret); out: nvme_free_tree(r); @@ -7711,15 +7803,15 @@ static int wdc_get_unsupported_reqs_log(int argc, char **argv, struct command *c r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_OCP_C5_LOG_PAGE) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_OCP_C5_LOG_PAGE)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } ret = wdc_get_ocp_c5_log_page(r, dev, cfg.output_format); if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the Unsupported Requirements (C5) Log Page, ret = 0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the Unsupported Requirements (C5) Log Page, ret = 0x%x\n", ret); out: nvme_free_tree(r); @@ -7732,7 +7824,7 @@ static int wdc_do_clear_pcie_correctable_errors(int fd) int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (admin_cmd)); + memset(&admin_cmd, 0, sizeof(admin_cmd)); admin_cmd.opcode = WDC_NVME_CLEAR_PCIE_CORR_OPCODE; admin_cmd.cdw12 = ((WDC_NVME_CLEAR_PCIE_CORR_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_CLEAR_PCIE_CORR_CMD); @@ -7747,7 +7839,7 @@ static int wdc_do_clear_pcie_correctable_errors_vuc(int fd) int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (admin_cmd)); + memset(&admin_cmd, 0, sizeof(admin_cmd)); admin_cmd.opcode = WDC_NVME_CLEAR_PCIE_CORR_OPCODE_VUC; ret = nvme_submit_admin_passthru(fd, &admin_cmd, NULL); @@ -7792,21 +7884,18 @@ static int wdc_clear_pcie_correctable_errors(int argc, char **argv, struct comma } capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_CLEAR_PCIE_MASK) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_CLEAR_PCIE_MASK)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } - - if (capabilities & WDC_DRIVE_CAP_CLEAR_PCIE) { + + if (capabilities & WDC_DRIVE_CAP_CLEAR_PCIE) ret = wdc_do_clear_pcie_correctable_errors(dev_fd(dev)); - } - else if (capabilities & WDC_DRIVE_CAP_VUC_CLEAR_PCIE) { + else if (capabilities & WDC_DRIVE_CAP_VUC_CLEAR_PCIE) ret = wdc_do_clear_pcie_correctable_errors_vuc(dev_fd(dev)); - } - else { + else ret = wdc_do_clear_pcie_correctable_errors_fid(dev_fd(dev)); - } out: nvme_free_tree(r); @@ -7840,7 +7929,7 @@ static int wdc_drive_status(int argc, char **argv, struct command *command, r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRIVE_CAP_DRIVE_STATUS) != WDC_DRIVE_CAP_DRIVE_STATUS) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -7848,7 +7937,7 @@ static int wdc_drive_status(int argc, char **argv, struct command *command, /* verify the 0xC2 Device Manageability log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE) == false) { - fprintf(stderr, "ERROR : WDC : 0xC2 Log Page not supported\n"); + fprintf(stderr, "ERROR: WDC: 0xC2 Log Page not supported\n"); ret = -1; goto out; } @@ -7856,51 +7945,52 @@ static int wdc_drive_status(int argc, char **argv, struct command *command, /* Get the assert dump present status */ if (!wdc_nvme_get_dev_status_log_data(r, dev, &assert_status, WDC_C2_ASSERT_DUMP_PRESENT_ID)) - fprintf(stderr, "ERROR : WDC : Get Assert Status Failed\n"); + fprintf(stderr, "ERROR: WDC: Get Assert Status Failed\n"); /* Get the thermal throttling status */ if (!wdc_nvme_get_dev_status_log_data(r, dev, &thermal_status, WDC_C2_THERMAL_THROTTLE_STATUS_ID)) - fprintf(stderr, "ERROR : WDC : Get Thermal Throttling Status Failed\n"); + fprintf(stderr, "ERROR: WDC: Get Thermal Throttling Status Failed\n"); /* Get EOL status */ if (!wdc_nvme_get_dev_status_log_data(r, dev, &eol_status, WDC_C2_USER_EOL_STATUS_ID)) { - fprintf(stderr, "ERROR : WDC : Get User EOL Status Failed\n"); + fprintf(stderr, "ERROR: WDC: Get User EOL Status Failed\n"); eol_status = cpu_to_le32(-1); } /* Get Customer EOL state */ if (!wdc_nvme_get_dev_status_log_data(r, dev, &user_eol_state, WDC_C2_USER_EOL_STATE_ID)) - fprintf(stderr, "ERROR : WDC : Get User EOL State Failed\n"); + fprintf(stderr, "ERROR: WDC: Get User EOL State Failed\n"); /* Get System EOL state*/ if (!wdc_nvme_get_dev_status_log_data(r, dev, &system_eol_state, WDC_C2_SYSTEM_EOL_STATE_ID)) - fprintf(stderr, "ERROR : WDC : Get System EOL State Failed\n"); + fprintf(stderr, "ERROR: WDC: Get System EOL State Failed\n"); /* Get format corrupt reason*/ if (!wdc_nvme_get_dev_status_log_data(r, dev, &format_corrupt_reason, WDC_C2_FORMAT_CORRUPT_REASON_ID)) - fprintf(stderr, "ERROR : WDC : Get Format Corrupt Reason Failed\n"); + fprintf(stderr, "ERROR: WDC: Get Format Corrupt Reason Failed\n"); - printf(" Drive Status :- \n"); - if ((int)le32_to_cpu(eol_status) >= 0) { + printf(" Drive Status :-\n"); + if ((int)le32_to_cpu(eol_status) >= 0) printf(" Percent Used: %"PRIu32"%%\n", - le32_to_cpu(eol_status)); - } + le32_to_cpu(eol_status)); else printf(" Percent Used: Unknown\n"); if (system_eol_state == WDC_EOL_STATUS_NORMAL && user_eol_state == WDC_EOL_STATUS_NORMAL) printf(" Drive Life Status: Normal\n"); - else if (system_eol_state == WDC_EOL_STATUS_END_OF_LIFE || user_eol_state == WDC_EOL_STATUS_END_OF_LIFE) - printf(" Drive Life Status: End Of Life\n"); - else if (system_eol_state == WDC_EOL_STATUS_READ_ONLY || user_eol_state == WDC_EOL_STATUS_READ_ONLY) - printf(" Drive Life Status: Read Only\n"); + else if (system_eol_state == WDC_EOL_STATUS_END_OF_LIFE || + user_eol_state == WDC_EOL_STATUS_END_OF_LIFE) + printf(" Drive Life Status: End Of Life\n"); + else if (system_eol_state == WDC_EOL_STATUS_READ_ONLY || + user_eol_state == WDC_EOL_STATUS_READ_ONLY) + printf(" Drive Life Status: Read Only\n"); else printf(" Drive Life Status: Unknown : 0x%08x/0x%08x\n", - le32_to_cpu(user_eol_state), le32_to_cpu(system_eol_state)); + le32_to_cpu(user_eol_state), le32_to_cpu(system_eol_state)); if (assert_status == WDC_ASSERT_DUMP_PRESENT) printf(" Assert Dump Status: Present\n"); @@ -7955,20 +8045,20 @@ static int wdc_clear_assert_dump(int argc, char **argv, struct command *command, r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRIVE_CAP_CLEAR_ASSERT) != WDC_DRIVE_CAP_CLEAR_ASSERT) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } if (!wdc_nvme_get_dev_status_log_data(r, dev, &assert_status, WDC_C2_ASSERT_DUMP_PRESENT_ID)) { - fprintf(stderr, "ERROR : WDC : Get Assert Status Failed\n"); + fprintf(stderr, "ERROR: WDC: Get Assert Status Failed\n"); ret = -1; goto out; } /* Get the assert dump present status */ if (assert_status == WDC_ASSERT_DUMP_PRESENT) { - memset(&admin_cmd, 0, sizeof (admin_cmd)); + memset(&admin_cmd, 0, sizeof(admin_cmd)); admin_cmd.opcode = WDC_NVME_CLEAR_ASSERT_DUMP_OPCODE; admin_cmd.cdw12 = ((WDC_NVME_CLEAR_ASSERT_DUMP_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_CLEAR_ASSERT_DUMP_CMD); @@ -7977,7 +8067,7 @@ static int wdc_clear_assert_dump(int argc, char **argv, struct command *command, NULL); nvme_show_status(ret); } else - fprintf(stderr, "INFO : WDC : No Assert Dump Present\n"); + fprintf(stderr, "INFO: WDC: No Assert Dump Present\n"); out: nvme_free_tree(r); @@ -7998,22 +8088,24 @@ static int wdc_get_fw_act_history(nvme_root_t r, struct nvme_dev *dev, fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } /* verify the FW Activate History log page is supported */ - if (wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID) == false) { - fprintf(stderr, "ERROR : WDC : %d Log Page not supported\n", WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID); + if (!wdc_nvme_check_supported_log_page(r, dev, WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID)) { + fprintf(stderr, "ERROR: WDC: %d Log Page not supported\n", + WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID); return -1; } - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_FW_ACT_HISTORY_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_FW_ACT_HISTORY_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_FW_ACT_HISTORY_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_FW_ACT_HISTORY_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_GET_FW_ACT_HISTORY_LOG_ID, @@ -8022,22 +8114,25 @@ static int wdc_get_fw_act_history(nvme_root_t r, struct nvme_dev *dev, if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ fw_act_history_hdr = (struct wdc_fw_act_history_log_hdr *)(data); - if ((fw_act_history_hdr->num_entries > 0) && (fw_act_history_hdr->num_entries <= WDC_MAX_NUM_ACT_HIST_ENTRIES)) - ret = wdc_print_fw_act_history_log(data, fw_act_history_hdr->num_entries, fmt, 0, 0); - else if (fw_act_history_hdr->num_entries == 0) { - fprintf(stderr, "INFO : WDC : No FW Activate History entries found.\n"); + if ((fw_act_history_hdr->num_entries > 0) && + (fw_act_history_hdr->num_entries <= WDC_MAX_NUM_ACT_HIST_ENTRIES)) { + ret = wdc_print_fw_act_history_log(data, fw_act_history_hdr->num_entries, + fmt, 0, 0); + } else if (!fw_act_history_hdr->num_entries) { + fprintf(stderr, "INFO: WDC: No FW Activate History entries found.\n"); ret = 0; - } - else { - fprintf(stderr, "ERROR : WDC : Invalid number entries found in FW Activate History Log Page - %d\n", fw_act_history_hdr->num_entries); + } else { + fprintf(stderr, + "ERROR: WDC: Invalid number entries found in FW Activate History Log Page - %d\n", + fw_act_history_hdr->num_entries); ret = -1; } } else { - fprintf(stderr, "ERROR : WDC : Unable to read FW Activate History Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read FW Activate History Log Page data\n"); ret = -1; } @@ -8051,11 +8146,11 @@ static __u32 wdc_get_fw_cust_id(nvme_root_t r, struct nvme_dev *dev) __u32 cust_id = WDC_INVALID_CUSTOMER_ID; __u32 *cust_id_ptr = NULL; - if (!(get_dev_mgment_cbs_data(r, dev, WDC_C2_CUSTOMER_ID_ID, (void*)&cust_id_ptr))) { - fprintf(stderr, "%s: ERROR : WDC : 0xC2 Log Page entry ID 0x%x not found\n", __func__, WDC_C2_CUSTOMER_ID_ID); - } else { + if (!get_dev_mgment_cbs_data(r, dev, WDC_C2_CUSTOMER_ID_ID, (void *)&cust_id_ptr)) + fprintf(stderr, "%s: ERROR: WDC: 0xC2 Log Page entry ID 0x%x not found\n", + __func__, WDC_C2_CUSTOMER_ID_ID); + else cust_id = *cust_id_ptr; - } free(cust_id_ptr); return cust_id; @@ -8077,18 +8172,19 @@ static int wdc_get_fw_act_history_C2(nvme_root_t r, struct nvme_dev *dev, fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); return fmt; } ret = wdc_get_pci_ids(r, dev, &device_id, &vendor_id); - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_FW_ACT_HISTORY_C2_LOG_BUF_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + data = (__u8 *)malloc(sizeof(__u8) * WDC_FW_ACT_HISTORY_C2_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); return -1; } - memset(data, 0, sizeof (__u8) * WDC_FW_ACT_HISTORY_C2_LOG_BUF_LEN); + memset(data, 0, sizeof(__u8) * WDC_FW_ACT_HISTORY_C2_LOG_BUF_LEN); ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_GET_FW_ACT_HISTORY_C2_LOG_ID, @@ -8097,16 +8193,16 @@ static int wdc_get_fw_act_history_C2(nvme_root_t r, struct nvme_dev *dev, if (strcmp(format, "json")) nvme_show_status(ret); - if (ret == 0) { + if (!ret) { /* parse the data */ - fw_act_history_log = (struct wdc_fw_act_history_log_format_c2*)(data); + fw_act_history_log = (struct wdc_fw_act_history_log_format_c2 *)(data); tot_entries = le32_to_cpu(fw_act_history_log->num_entries); if (tot_entries > 0) { /* get the FW customer id */ cust_id = wdc_get_fw_cust_id(r, dev); if (cust_id == WDC_INVALID_CUSTOMER_ID) { - fprintf(stderr, "%s: ERROR : WDC : invalid customer id\n", __func__); + fprintf(stderr, "%s: ERROR: WDC: invalid customer id\n", __func__); ret = -1; goto freeData; } @@ -8114,11 +8210,11 @@ static int wdc_get_fw_act_history_C2(nvme_root_t r, struct nvme_dev *dev, WDC_MAX_NUM_ACT_HIST_ENTRIES; ret = wdc_print_fw_act_history_log(data, num_entries, fmt, cust_id, vendor_id); } else { - fprintf(stderr, "INFO : WDC : No FW Activate History entries found.\n"); + fprintf(stderr, "INFO: WDC: No FW Activate History entries found.\n"); ret = 0; } } else { - fprintf(stderr, "ERROR : WDC : Unable to read FW Activate History Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read FW Activate History Log Page data\n"); ret = -1; } @@ -8155,8 +8251,8 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_MASK) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_MASK)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -8167,10 +8263,13 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com __u8 *data; int i; - /* check for the GUID in the 0xC0 log page to determine which log page to use to */ - /* to retrieve fw activate history data */ - if ((data = (__u8*) malloc(sizeof (__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN)) == NULL) { - fprintf(stderr, "ERROR : WDC : malloc : %s\n", strerror(errno)); + /* + * check for the GUID in the 0xC0 log page to determine which log page to use to + * retrieve fw activate history data + */ + data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); ret = -1; goto out; } @@ -8195,35 +8294,30 @@ static int wdc_vs_fw_activate_history(int argc, char **argv, struct command *com }; ret = nvme_get_log(&args); - if (ret == 0) { + if (!ret) { /* Verify GUID matches */ - for (i=0; i<16; i++) { - if (scao_guid[i] != data[SCAO_LPG + i]) { + for (i = 0; i < 16; i++) { + if (scao_guid[i] != data[SCAO_LPG + i]) { c0GuidMatch = false; break; } } - if (i == 16) { + if (i == 16) c0GuidMatch = true; - } } free(data); - if (c0GuidMatch) { - ret = wdc_get_fw_act_history_C2(r, dev, - cfg.output_format); - } - else { - ret = wdc_get_fw_act_history(r, dev, - cfg.output_format); - } + if (c0GuidMatch) + ret = wdc_get_fw_act_history_C2(r, dev, cfg.output_format); + else + ret = wdc_get_fw_act_history(r, dev, cfg.output_format); } else { ret = wdc_get_fw_act_history_C2(r, dev, cfg.output_format); } if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading the FW Activate History, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading the FW Activate History, ret = %d\n", ret); out: nvme_free_tree(r); dev_close(dev); @@ -8235,7 +8329,7 @@ static int wdc_do_clear_fw_activate_history_vuc(int fd) int ret = -1; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (admin_cmd)); + memset(&admin_cmd, 0, sizeof(admin_cmd)); admin_cmd.opcode = WDC_NVME_CLEAR_FW_ACT_HIST_OPCODE; admin_cmd.cdw12 = ((WDC_NVME_CLEAR_FW_ACT_HIST_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_CLEAR_FW_ACT_HIST_CMD); @@ -8278,8 +8372,8 @@ static int wdc_clear_fw_activate_history(int argc, char **argv, struct command * r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY_MASK) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY_MASK)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -8335,7 +8429,7 @@ static int wdc_vs_telemetry_controller_option(int argc, char **argv, struct comm r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG) != WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -8343,7 +8437,7 @@ static int wdc_vs_telemetry_controller_option(int argc, char **argv, struct comm /* allow only one option at a time */ if ((cfg.disable + cfg.enable + cfg.status) > 1) { - fprintf(stderr, "ERROR : WDC : Invalid option\n"); + fprintf(stderr, "ERROR: WDC: Invalid option\n"); ret = -1; goto out; } @@ -8354,18 +8448,16 @@ static int wdc_vs_telemetry_controller_option(int argc, char **argv, struct comm 0, 1, false, &result); wdc_clear_reason_id(dev); - } - else { - if (cfg.enable) { + } else { + if (cfg.enable) { ret = nvme_set_features_simple(dev_fd(dev), WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, 0, 0, false, &result); - } - else if (cfg.status) { + } else if (cfg.status) { ret = nvme_get_features_simple(dev_fd(dev), WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, 0, &result); - if (ret == 0) { + if (!ret) { if (result) fprintf(stderr, "Controller Option Telemetry Log Page State: Disabled\n"); else @@ -8373,14 +8465,12 @@ static int wdc_vs_telemetry_controller_option(int argc, char **argv, struct comm } else { nvme_show_status(ret); } - } - else { - fprintf(stderr, "ERROR : WDC: unsupported option for this command\n"); + } else { + fprintf(stderr, "ERROR: WDC: unsupported option for this command\n"); fprintf(stderr, "Please provide an option, -d, -e or -s\n"); ret = -1; goto out; - } - + } } out: @@ -8396,14 +8486,13 @@ static int wdc_get_serial_and_fw_rev(struct nvme_dev *dev, char *sn, char *fw_re int ret; struct nvme_id_ctrl ctrl; - i = sizeof (ctrl.sn) - 1; + i = sizeof(ctrl.sn) - 1; memset(sn, 0, WDC_SERIAL_NO_LEN); memset(fw_rev, 0, WDC_NVME_FIRMWARE_REV_LEN); - memset(&ctrl, 0, sizeof (struct nvme_id_ctrl)); + memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed " - "0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed 0x%x\n", ret); return -1; } /* Remove trailing spaces from the name */ @@ -8424,10 +8513,10 @@ static int wdc_get_max_transfer_len(struct nvme_dev *dev, __u32 *maxTransferLen) __u32 maxTransferLenDevice = 0; - memset(&ctrl, 0, sizeof (struct nvme_id_ctrl)); + memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed 0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed 0x%x\n", ret); return -1; } @@ -8437,57 +8526,53 @@ static int wdc_get_max_transfer_len(struct nvme_dev *dev, __u32 *maxTransferLen) return ret; } -static int wdc_de_VU_read_size(struct nvme_dev *dev, __u32 fileId, - __u16 spiDestn, __u32* logSize) +static int wdc_de_VU_read_size(struct nvme_dev *dev, __u32 fileId, __u16 spiDestn, __u32 *logSize) { int ret = WDC_STATUS_FAILURE; struct nvme_passthru_cmd cmd; - if(!dev || !logSize ) - { + if (!dev || !logSize) { ret = WDC_STATUS_INVALID_PARAMETER; goto end; } - memset(&cmd,0,sizeof(struct nvme_passthru_cmd)); + memset(&cmd, 0, sizeof(struct nvme_passthru_cmd)); cmd.opcode = WDC_DE_VU_READ_SIZE_OPCODE; cmd.nsid = WDC_DE_DEFAULT_NAMESPACE_ID; - cmd.cdw13 = fileId<<16; + cmd.cdw13 = fileId << 16; cmd.cdw14 = spiDestn; ret = nvme_submit_admin_passthru(dev_fd(dev), &cmd, NULL); if (!ret && logSize) *logSize = cmd.result; - if( ret != WDC_STATUS_SUCCESS) { - fprintf(stderr, "ERROR : WDC : VUReadSize() failed, "); + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "ERROR: WDC: VUReadSize() failed, "); nvme_show_status(ret); } - end: +end: return ret; } -static int wdc_de_VU_read_buffer(struct nvme_dev *dev, __u32 fileId, - __u16 spiDestn, __u32 offsetInDwords, - __u8* dataBuffer, __u32* bufferSize) +static int wdc_de_VU_read_buffer(struct nvme_dev *dev, __u32 fileId, __u16 spiDestn, + __u32 offsetInDwords, __u8 *dataBuffer, __u32 *bufferSize) { int ret = WDC_STATUS_FAILURE; struct nvme_passthru_cmd cmd; __u32 noOfDwordExpected = 0; - if(!dev || !dataBuffer || !bufferSize) - { + if (!dev || !dataBuffer || !bufferSize) { ret = WDC_STATUS_INVALID_PARAMETER; goto end; } - memset(&cmd,0,sizeof(struct nvme_passthru_cmd)); - noOfDwordExpected = *bufferSize/sizeof(__u32); + memset(&cmd, 0, sizeof(struct nvme_passthru_cmd)); + noOfDwordExpected = *bufferSize / sizeof(__u32); cmd.opcode = WDC_DE_VU_READ_BUFFER_OPCODE; cmd.nsid = WDC_DE_DEFAULT_NAMESPACE_ID; cmd.cdw10 = noOfDwordExpected; - cmd.cdw13 = fileId<<16; + cmd.cdw13 = fileId << 16; cmd.cdw14 = spiDestn; cmd.cdw15 = offsetInDwords; @@ -8496,92 +8581,92 @@ static int wdc_de_VU_read_buffer(struct nvme_dev *dev, __u32 fileId, ret = nvme_submit_admin_passthru(dev_fd(dev), &cmd, NULL); - if( ret != WDC_STATUS_SUCCESS) { - fprintf(stderr, "ERROR : WDC : VUReadBuffer() failed, "); + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "ERROR: WDC: VUReadBuffer() failed, "); nvme_show_status(ret); } - end: +end: return ret; } -static int wdc_get_log_dir_max_entries(struct nvme_dev *dev, __u32* maxNumOfEntries) +static int wdc_get_log_dir_max_entries(struct nvme_dev *dev, __u32 *maxNumOfEntries) { - int ret = WDC_STATUS_FAILURE; - __u32 headerPayloadSize = 0; - __u8* fileIdOffsetsBuffer = NULL; - __u32 fileIdOffsetsBufferSize = 0; - __u32 fileNum = 0; - __u16 fileOffset = 0; + int ret = WDC_STATUS_FAILURE; + __u32 headerPayloadSize = 0; + __u8 *fileIdOffsetsBuffer = NULL; + __u32 fileIdOffsetsBufferSize = 0; + __u32 fileNum = 0; + __u16 fileOffset = 0; - if (!dev || !maxNumOfEntries) - { + if (!dev || !maxNumOfEntries) { ret = WDC_STATUS_INVALID_PARAMETER; return ret; } /* 1.Get log directory first four bytes */ - if (WDC_STATUS_SUCCESS != (ret = wdc_de_VU_read_size(dev, 0, 5, (__u32*)&headerPayloadSize))) - { - fprintf(stderr, "ERROR : WDC : %s: Failed to get headerPayloadSize from file directory 0x%x\n", - __func__, ret); + ret = wdc_de_VU_read_size(dev, 0, 5, (__u32 *)&headerPayloadSize); + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, + "ERROR: WDC: %s: Failed to get headerPayloadSize from file directory 0x%x\n", + __func__, ret); return ret; } - fileIdOffsetsBufferSize = WDC_DE_FILE_HEADER_SIZE + (headerPayloadSize * WDC_DE_FILE_OFFSET_SIZE); - fileIdOffsetsBuffer = (__u8*)calloc(1, fileIdOffsetsBufferSize); + fileIdOffsetsBufferSize = + WDC_DE_FILE_HEADER_SIZE + (headerPayloadSize * WDC_DE_FILE_OFFSET_SIZE); + fileIdOffsetsBuffer = (__u8 *)calloc(1, fileIdOffsetsBufferSize); /* 2.Read to get file offsets */ - if (WDC_STATUS_SUCCESS != (ret = wdc_de_VU_read_buffer(dev, 0, 5, 0, fileIdOffsetsBuffer, &fileIdOffsetsBufferSize))) - { - fprintf(stderr, "ERROR : WDC : %s: Failed to get fileIdOffsets from file directory 0x%x\n", - __func__, ret); + ret = wdc_de_VU_read_buffer(dev, 0, 5, 0, fileIdOffsetsBuffer, &fileIdOffsetsBufferSize); + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, + "ERROR: WDC: %s: Failed to get fileIdOffsets from file directory 0x%x\n", + __func__, ret); goto end; } /* 3.Determine valid entries */ - for (fileNum = 0; fileNum < (headerPayloadSize - WDC_DE_FILE_HEADER_SIZE) / WDC_DE_FILE_OFFSET_SIZE; fileNum++) - { - fileOffset = (fileIdOffsetsBuffer[WDC_DE_FILE_HEADER_SIZE + (fileNum * WDC_DE_FILE_OFFSET_SIZE)] << 8) + - fileIdOffsetsBuffer[WDC_DE_FILE_HEADER_SIZE + (fileNum * WDC_DE_FILE_OFFSET_SIZE) + 1]; + for (fileNum = 0; + fileNum < (headerPayloadSize - WDC_DE_FILE_HEADER_SIZE) / WDC_DE_FILE_OFFSET_SIZE; + fileNum++) { + fileOffset = (fileIdOffsetsBuffer[WDC_DE_FILE_HEADER_SIZE + + (fileNum * WDC_DE_FILE_OFFSET_SIZE)] << 8) + + fileIdOffsetsBuffer[WDC_DE_FILE_HEADER_SIZE + + (fileNum * WDC_DE_FILE_OFFSET_SIZE) + 1]; if (!fileOffset) continue; (*maxNumOfEntries)++; } + end: free(fileIdOffsetsBuffer); return ret; } -static WDC_DRIVE_ESSENTIAL_TYPE wdc_get_essential_type(__u8 fileName[]) +static enum WDC_DRIVE_ESSENTIAL_TYPE wdc_get_essential_type(__u8 fileName[]) { - WDC_DRIVE_ESSENTIAL_TYPE essentialType = WDC_DE_TYPE_NONE; + enum WDC_DRIVE_ESSENTIAL_TYPE essentialType = WDC_DE_TYPE_NONE; - if (wdc_UtilsStrCompare((char*)fileName, WDC_DE_CORE_DUMP_FILE_NAME) == 0) - { + if (!wdc_UtilsStrCompare((char *)fileName, WDC_DE_CORE_DUMP_FILE_NAME)) essentialType = WDC_DE_TYPE_DUMPSNAPSHOT; - } - else if (wdc_UtilsStrCompare((char*)fileName, WDC_DE_EVENT_LOG_FILE_NAME) == 0) - { + else if (!wdc_UtilsStrCompare((char *)fileName, WDC_DE_EVENT_LOG_FILE_NAME)) essentialType = WDC_DE_TYPE_EVENTLOG; - } - else if (wdc_UtilsStrCompare((char*)fileName, WDC_DE_MANUFACTURING_INFO_PAGE_FILE_NAME) == 0) - { + else if (!wdc_UtilsStrCompare((char *)fileName, WDC_DE_MANUFACTURING_INFO_PAGE_FILE_NAME)) essentialType = WDC_DE_TYPE_NVME_MANF_INFO; - } return essentialType; } -static int wdc_fetch_log_directory(struct nvme_dev *dev, PWDC_DE_VU_LOG_DIRECTORY directory) +static int wdc_fetch_log_directory(struct nvme_dev *dev, struct WDC_DE_VU_LOG_DIRECTORY *directory) { - int ret = WDC_STATUS_FAILURE; - __u8 *fileOffset = NULL; - __u8 *fileDirectory = NULL; - __u32 headerSize = 0; - __u32 fileNum = 0, startIdx = 0; - __u16 fileOffsetTemp = 0; - __u32 entryId = 0; - __u32 fileDirectorySize = 0; + int ret = WDC_STATUS_FAILURE; + __u8 *fileOffset = NULL; + __u8 *fileDirectory = NULL; + __u32 headerSize = 0; + __u32 fileNum = 0, startIdx = 0; + __u16 fileOffsetTemp = 0; + __u32 entryId = 0; + __u32 fileDirectorySize = 0; if (!dev || !directory) { ret = WDC_STATUS_INVALID_PARAMETER; @@ -8589,18 +8674,17 @@ static int wdc_fetch_log_directory(struct nvme_dev *dev, PWDC_DE_VU_LOG_DIRECTOR } ret = wdc_de_VU_read_size(dev, 0, 5, &fileDirectorySize); - if (WDC_STATUS_SUCCESS != ret) { + if (ret != WDC_STATUS_SUCCESS) { fprintf(stderr, - "ERROR : WDC : %s: Failed to get filesystem directory size, ret = %d\n", + "ERROR: WDC: %s: Failed to get filesystem directory size, ret = %d\n", __func__, ret); goto end; } - fileDirectory = (__u8*)calloc(1, fileDirectorySize); + fileDirectory = (__u8 *)calloc(1, fileDirectorySize); ret = wdc_de_VU_read_buffer(dev, 0, 5, 0, fileDirectory, &fileDirectorySize); - if (WDC_STATUS_SUCCESS != ret) { - fprintf(stderr, - "ERROR : WDC : %s: Failed to get filesystem directory, ret = %d\n", + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "ERROR: WDC: %s: Failed to get filesystem directory, ret = %d\n", __func__, ret); goto end; } @@ -8609,7 +8693,7 @@ static int wdc_fetch_log_directory(struct nvme_dev *dev, PWDC_DE_VU_LOG_DIRECTOR memcpy(&headerSize, fileDirectory, WDC_DE_FILE_HEADER_SIZE); /* minimum buffer for 1 entry is required */ - if (directory->maxNumLogEntries == 0) { + if (!directory->maxNumLogEntries) { ret = WDC_STATUS_INVALID_PARAMETER; goto end; } @@ -8624,34 +8708,31 @@ static int wdc_fetch_log_directory(struct nvme_dev *dev, PWDC_DE_VU_LOG_DIRECTOR memcpy(&fileOffsetTemp, fileDirectory + startIdx, sizeof(fileOffsetTemp)); fileOffset = fileDirectory + fileOffsetTemp; - if (0 == fileOffsetTemp) + if (!fileOffsetTemp) continue; - memset(&directory->logEntry[entryId], 0, sizeof(WDC_DRIVE_ESSENTIALS)); - memcpy(&directory->logEntry[entryId].metaData, fileOffset, sizeof(WDC_DE_VU_FILE_META_DATA)); + memset(&directory->logEntry[entryId], 0, sizeof(struct WDC_DRIVE_ESSENTIALS)); + memcpy(&directory->logEntry[entryId].metaData, fileOffset, sizeof(struct __packed WDC_DE_VU_FILE_META_DATA)); directory->logEntry[entryId].metaData.fileName[WDC_DE_FILE_NAME_SIZE - 1] = '\0'; - wdc_UtilsDeleteCharFromString((char*)directory->logEntry[entryId].metaData.fileName, + wdc_UtilsDeleteCharFromString((char *)directory->logEntry[entryId].metaData.fileName, WDC_DE_FILE_NAME_SIZE, ' '); - if (0 == directory->logEntry[entryId].metaData.fileID) + if (!directory->logEntry[entryId].metaData.fileID) continue; directory->logEntry[entryId].essentialType = wdc_get_essential_type(directory->logEntry[entryId].metaData.fileName); - /*fprintf(stderr, "WDC : %s: NVMe VU Log Entry %d, fileName = %s, fileSize = 0x%lx, fileId = 0x%x\n", - __func__, entryId, directory->logEntry[entryId].metaData.fileName, - (long unsigned int)directory->logEntry[entryId].metaData.fileSize, directory->logEntry[entryId].metaData.fileID); - */ entryId++; } directory->numOfValidLogEntries = entryId; + end: - if (fileDirectory != NULL) + if (fileDirectory) free(fileDirectory); return ret; } static int wdc_fetch_log_file_from_device(struct nvme_dev *dev, __u32 fileId, - __u16 spiDestn, __u64 fileSize, __u8* dataBuffer) + __u16 spiDestn, __u64 fileSize, __u8 *dataBuffer) { int ret = WDC_STATUS_FAILURE; __u32 chunckSize = WDC_DE_VU_READ_BUFFER_STANDARD_OFFSET; @@ -8659,8 +8740,7 @@ static int wdc_fetch_log_file_from_device(struct nvme_dev *dev, __u32 fileId, __u32 buffSize = 0; __u64 offsetIdx = 0; - if (!dev || !dataBuffer || !fileSize) - { + if (!dev || !dataBuffer || !fileSize) { ret = WDC_STATUS_INVALID_PARAMETER; goto end; } @@ -8671,43 +8751,40 @@ static int wdc_fetch_log_file_from_device(struct nvme_dev *dev, __u32 fileId, } /* Fetch Log File Data */ - if ((fileSize >= maximumTransferLength) || (fileSize > 0xFFFFFFFF)) - { + if ((fileSize >= maximumTransferLength) || (fileSize > 0xFFFFFFFF)) { chunckSize = WDC_DE_VU_READ_BUFFER_STANDARD_OFFSET; if (maximumTransferLength < WDC_DE_VU_READ_BUFFER_STANDARD_OFFSET) chunckSize = maximumTransferLength; buffSize = chunckSize; - for (offsetIdx = 0; (offsetIdx * chunckSize) < fileSize; offsetIdx++) - { + for (offsetIdx = 0; (offsetIdx * chunckSize) < fileSize; offsetIdx++) { if (((offsetIdx * chunckSize) + buffSize) > fileSize) buffSize = (__u32)(fileSize - (offsetIdx * chunckSize)); /* Limitation in VU read buffer - offsetIdx and bufferSize are not greater than u32 */ ret = wdc_de_VU_read_buffer(dev, fileId, spiDestn, (__u32)((offsetIdx * chunckSize) / sizeof(__u32)), dataBuffer + (offsetIdx * chunckSize), &buffSize); - if (ret != WDC_STATUS_SUCCESS) - { - fprintf(stderr, "ERROR : WDC : %s: wdc_de_VU_read_buffer failed with ret = %d, fileId = 0x%x, fileSize = 0x%lx\n", - __func__, ret, fileId, (long unsigned int)fileSize); + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "ERROR: WDC: %s: wdc_de_VU_read_buffer failed with ret = %d, fileId = 0x%x, fileSize = 0x%lx\n", + __func__, ret, fileId, (unsigned long)fileSize); break; } } } else { buffSize = (__u32)fileSize; ret = wdc_de_VU_read_buffer(dev, fileId, spiDestn, - (__u32)((offsetIdx * chunckSize) / sizeof(__u32)), dataBuffer, &buffSize); - if (ret != WDC_STATUS_SUCCESS) - { - fprintf(stderr, "ERROR : WDC : %s: wdc_de_VU_read_buffer failed with ret = %d, fileId = 0x%x, fileSize = 0x%lx\n", - __func__, ret, fileId, (long unsigned int)fileSize); + (__u32)((offsetIdx * chunckSize) / sizeof(__u32)), + dataBuffer, &buffSize); + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "ERROR: WDC: %s: wdc_de_VU_read_buffer failed with ret = %d, fileId = 0x%x, fileSize = 0x%lx\n", + __func__, ret, fileId, (unsigned long)fileSize); } } - end: +end: return ret; } -static int wdc_de_get_dump_trace(struct nvme_dev *dev, char * filePath, __u16 binFileNameLen, char *binFileName) +static int wdc_de_get_dump_trace(struct nvme_dev *dev, char *filePath, __u16 binFileNameLen, char *binFileName) { int ret = WDC_STATUS_FAILURE; __u8 *readBuffer = NULL; @@ -8722,8 +8799,7 @@ static int wdc_de_get_dump_trace(struct nvme_dev *dev, char * filePath, __u16 bi __u16 i = 0; __u32 maximumTransferLength = 0; - if (!dev || !binFileName || !filePath) - { + if (!dev || !binFileName || !filePath) { ret = WDC_STATUS_INVALID_PARAMETER; return ret; } @@ -8731,22 +8807,19 @@ static int wdc_de_get_dump_trace(struct nvme_dev *dev, char * filePath, __u16 bi if (wdc_get_max_transfer_len(dev, &maximumTransferLength) < 0) return WDC_STATUS_FAILURE; - do - { + do { /* Get dumptrace size */ ret = wdc_de_VU_read_size(dev, 0, WDC_DE_DUMPTRACE_DESTINATION, &dumptraceSize); - if (ret != WDC_STATUS_SUCCESS) - { - fprintf(stderr, "ERROR : WDC : %s: wdc_de_VU_read_size failed with ret = %d\n", + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "ERROR: WDC: %s: wdc_de_VU_read_size failed with ret = %d\n", __func__, ret); break; } /* Make sure the size requested is greater than dword */ - if (dumptraceSize < 4) - { + if (dumptraceSize < 4) { ret = WDC_STATUS_FAILURE; - fprintf(stderr, "ERROR : WDC : %s: wdc_de_VU_read_size failed, read size is less than 4 bytes, dumptraceSize = 0x%x\n", + fprintf(stderr, "ERROR: WDC: %s: wdc_de_VU_read_size failed, read size is less than 4 bytes, dumptraceSize = 0x%x\n", __func__, dumptraceSize); break; } @@ -8766,162 +8839,232 @@ static int wdc_de_get_dump_trace(struct nvme_dev *dev, char * filePath, __u16 bi readBufferLen = chunkSize; lastPktReadBufferLen = (dumptraceSize % maxTransferLen) ? (dumptraceSize % maxTransferLen) : chunkSize; - if (readBuffer == NULL) - { - fprintf(stderr, "ERROR : WDC : %s: readBuffer calloc failed\n", __func__); + if (!readBuffer) { + fprintf(stderr, "ERROR: WDC: %s: readBuffer calloc failed\n", __func__); ret = WDC_STATUS_INSUFFICIENT_MEMORY; break; } - for (i = 0; i < chunks; i++) - { + for (i = 0; i < chunks; i++) { offset = ((i*chunkSize) / 4); /* Last loop call, Assign readBufferLen to read only left over bytes */ if (i == (chunks - 1)) - { readBufferLen = lastPktReadBufferLen; - } - ret = wdc_de_VU_read_buffer(dev, 0, WDC_DE_DUMPTRACE_DESTINATION, 0, readBuffer + offset, &readBufferLen); - if (ret != WDC_STATUS_SUCCESS) - { - fprintf(stderr, "ERROR : WDC : %s: wdc_de_VU_read_buffer failed, ret = %d on offset 0x%x\n", - __func__, ret, offset); + ret = wdc_de_VU_read_buffer(dev, 0, WDC_DE_DUMPTRACE_DESTINATION, 0, + readBuffer + offset, &readBufferLen); + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, + "ERROR: WDC: %s: wdc_de_VU_read_buffer failed, ret = %d on offset 0x%x\n", + __func__, ret, offset); break; } } } while (loop); - if (ret == WDC_STATUS_SUCCESS) - { - ret = wdc_WriteToFile(binFileName, (char*)readBuffer, dumptraceSize); + if (ret == WDC_STATUS_SUCCESS) { + ret = wdc_WriteToFile(binFileName, (char *)readBuffer, dumptraceSize); if (ret != WDC_STATUS_SUCCESS) - fprintf(stderr, "ERROR : WDC : %s: wdc_WriteToFile failed, ret = %d\n", __func__, ret); + fprintf(stderr, "ERROR: WDC: %s: wdc_WriteToFile failed, ret = %d\n", + __func__, ret); } else { - fprintf(stderr, "ERROR : WDC : %s: Read Buffer Loop failed, ret = %d\n", __func__, ret); + fprintf(stderr, "ERROR: WDC: %s: Read Buffer Loop failed, ret = %d\n", __func__, + ret); } if (readBuffer) - { free(readBuffer); + + return ret; +} + +int wdc_fetch_vu_file_directory(struct nvme_dev *dev, + struct WDC_DE_VU_LOG_DIRECTORY deEssentialsList, + __s8 *bufferFolderPath, __u8 *serialNo, __u8 *timeString) +{ + int ret = wdc_fetch_log_directory(dev, &deEssentialsList); + __u32 listIdx; + char *dataBuffer; + char fileName[MAX_PATH_LEN]; + + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "WDC: wdc_fetch_log_directory failed, ret = %d\n", ret); + return ret; + } + + /* Get Debug Data Files */ + for (listIdx = 0; listIdx < deEssentialsList.numOfValidLogEntries; listIdx++) { + if (!deEssentialsList.logEntry[listIdx].metaData.fileSize) { + fprintf(stderr, "ERROR: WDC: File Size for %s is 0\n", + deEssentialsList.logEntry[listIdx].metaData.fileName); + ret = WDC_STATUS_FILE_SIZE_ZERO; + } else { + /* Fetch Log File Data */ + dataBuffer = (char *)calloc(1, (size_t)deEssentialsList.logEntry[listIdx].metaData.fileSize); + ret = wdc_fetch_log_file_from_device(dev, + deEssentialsList.logEntry[listIdx].metaData.fileID, + WDC_DE_DESTN_SPI, + deEssentialsList.logEntry[listIdx].metaData.fileSize, + (__u8 *)dataBuffer); + + /* Write databuffer to file */ + if (ret == WDC_STATUS_SUCCESS) { + memset(fileName, 0, sizeof(fileName)); + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", bufferFolderPath, WDC_DE_PATH_SEPARATOR, + deEssentialsList.logEntry[listIdx].metaData.fileName, serialNo, timeString); + if (deEssentialsList.logEntry[listIdx].metaData.fileSize > 0xFFFFFFFF) { + wdc_WriteToFile(fileName, dataBuffer, 0xFFFFFFFF); + wdc_WriteToFile(fileName, dataBuffer + 0xFFFFFFFF, (__u32)(deEssentialsList.logEntry[listIdx].metaData.fileSize - 0xFFFFFFFF)); + } else { + wdc_WriteToFile(fileName, dataBuffer, (__u32)deEssentialsList.logEntry[listIdx].metaData.fileSize); + } + } else { + fprintf(stderr, "ERROR: WDC: wdc_fetch_log_file_from_device: %s failed, ret = %d\n", + deEssentialsList.logEntry[listIdx].metaData.fileName, ret); + } + free(dataBuffer); + } } return ret; } +int wdc_read_debug_directory(struct nvme_dev *dev, __s8 *bufferFolderPath, __u8 *serialNo, + __u8 *timeString) +{ + __u32 maxNumOfVUFiles = 0; + int ret = wdc_get_log_dir_max_entries(dev, &maxNumOfVUFiles); + struct WDC_DE_VU_LOG_DIRECTORY deEssentialsList; + + if (ret != WDC_STATUS_SUCCESS) { + fprintf(stderr, "WDC: wdc_get_log_dir_max_entries failed, ret = %d\n", ret); + return ret; + } + + memset(&deEssentialsList, 0, sizeof(deEssentialsList)); + deEssentialsList.logEntry = + (struct WDC_DRIVE_ESSENTIALS *)calloc(1, sizeof(struct WDC_DRIVE_ESSENTIALS) * maxNumOfVUFiles); + deEssentialsList.maxNumLogEntries = maxNumOfVUFiles; + + ret = wdc_fetch_vu_file_directory(dev, deEssentialsList, bufferFolderPath, serialNo, + timeString); + + free(deEssentialsList.logEntry); + deEssentialsList.logEntry = NULL; + + return ret; +} + static int wdc_do_drive_essentials(nvme_root_t r, struct nvme_dev *dev, char *dir, char *key) { int ret = 0; void *retPtr; - char fileName[MAX_PATH_LEN]; - __s8 bufferFolderPath[MAX_PATH_LEN]; - char bufferFolderName[MAX_PATH_LEN]; - char tarFileName[MAX_PATH_LEN]; - char tarFiles[MAX_PATH_LEN]; - char tarCmd[MAX_PATH_LEN+MAX_PATH_LEN]; - UtilsTimeInfo timeInfo; - __u8 timeString[MAX_PATH_LEN]; - __u8 serialNo[WDC_SERIAL_NO_LEN]; - __u8 firmwareRevision[WDC_NVME_FIRMWARE_REV_LEN]; - __u8 idSerialNo[WDC_SERIAL_NO_LEN]; - __u8 idFwRev[WDC_NVME_FIRMWARE_REV_LEN]; - __u8 featureIdBuff[4]; - char currDir[MAX_PATH_LEN]; - char *dataBuffer = NULL; - __u32 elogNumEntries, elogBufferSize; - __u32 dataBufferSize; - __u32 listIdx = 0; - __u32 vuLogIdx = 0; - __u32 result; - __u32 maxNumOfVUFiles = 0; + char fileName[MAX_PATH_LEN]; + __s8 bufferFolderPath[MAX_PATH_LEN]; + char bufferFolderName[MAX_PATH_LEN]; + char tarFileName[MAX_PATH_LEN]; + char tarFiles[MAX_PATH_LEN]; + char tarCmd[MAX_PATH_LEN+MAX_PATH_LEN]; + UtilsTimeInfo timeInfo; + __u8 timeString[MAX_PATH_LEN]; + __u8 serialNo[WDC_SERIAL_NO_LEN]; + __u8 firmwareRevision[WDC_NVME_FIRMWARE_REV_LEN]; + __u8 idSerialNo[WDC_SERIAL_NO_LEN]; + __u8 idFwRev[WDC_NVME_FIRMWARE_REV_LEN]; + __u8 featureIdBuff[4]; + char currDir[MAX_PATH_LEN]; + char *dataBuffer = NULL; + __u32 elogNumEntries, elogBufferSize; + __u32 dataBufferSize; + __u32 listIdx = 0; + __u32 vuLogIdx = 0; + __u32 result; struct nvme_id_ctrl ctrl; struct nvme_id_ns ns; struct nvme_error_log_page *elogBuffer; struct nvme_smart_log smart_log; struct nvme_firmware_slot fw_log; - PWDC_NVME_DE_VU_LOGPAGES vuLogInput = NULL; - WDC_DE_VU_LOG_DIRECTORY deEssentialsList; - - memset(bufferFolderPath,0,sizeof(bufferFolderPath)); - memset(bufferFolderName,0,sizeof(bufferFolderName)); - memset(tarFileName,0,sizeof(tarFileName)); - memset(tarFiles,0,sizeof(tarFiles)); - memset(tarCmd,0,sizeof(tarCmd)); - memset(&timeInfo,0,sizeof(timeInfo)); - - if (wdc_get_serial_and_fw_rev(dev, (char *)idSerialNo, (char *)idFwRev)) - { - fprintf(stderr, "ERROR : WDC : get serial # and fw revision failed\n"); + struct WDC_NVME_DE_VU_LOGPAGES *vuLogInput = NULL; + + memset(bufferFolderPath, 0, sizeof(bufferFolderPath)); + memset(bufferFolderName, 0, sizeof(bufferFolderName)); + memset(tarFileName, 0, sizeof(tarFileName)); + memset(tarFiles, 0, sizeof(tarFiles)); + memset(tarCmd, 0, sizeof(tarCmd)); + memset(&timeInfo, 0, sizeof(timeInfo)); + + if (wdc_get_serial_and_fw_rev(dev, (char *)idSerialNo, (char *)idFwRev)) { + fprintf(stderr, "ERROR: WDC: get serial # and fw revision failed\n"); return -1; - } else { - fprintf(stderr, "Get Drive Essentials Data for device serial #: %s and fw revision: %s\n", - idSerialNo, idFwRev); } - /* Create Drive Essentials directory */ + fprintf(stderr, "Get Drive Essentials Data for device serial #: %s and fw revision: %s\n", + idSerialNo, idFwRev); + + /* Create Drive Essentials directory */ wdc_UtilsGetTime(&timeInfo); memset(timeString, 0, sizeof(timeString)); - wdc_UtilsSnprintf((char*)timeString, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", + wdc_UtilsSnprintf((char *)timeString, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", timeInfo.year, timeInfo.month, timeInfo.dayOfMonth, timeInfo.hour, timeInfo.minute, timeInfo.second); - wdc_UtilsSnprintf((char*)serialNo,WDC_SERIAL_NO_LEN,(char*)idSerialNo); + wdc_UtilsSnprintf((char *)serialNo, WDC_SERIAL_NO_LEN, (char *)idSerialNo); /* Remove any space form serialNo */ - wdc_UtilsDeleteCharFromString((char*)serialNo, WDC_SERIAL_NO_LEN, ' '); + wdc_UtilsDeleteCharFromString((char *)serialNo, WDC_SERIAL_NO_LEN, ' '); memset(firmwareRevision, 0, sizeof(firmwareRevision)); - wdc_UtilsSnprintf((char*)firmwareRevision, WDC_NVME_FIRMWARE_REV_LEN, (char*)idFwRev); + wdc_UtilsSnprintf((char *)firmwareRevision, WDC_NVME_FIRMWARE_REV_LEN, (char *)idFwRev); /* Remove any space form FirmwareRevision */ - wdc_UtilsDeleteCharFromString((char*)firmwareRevision, WDC_NVME_FIRMWARE_REV_LEN, ' '); + wdc_UtilsDeleteCharFromString((char *)firmwareRevision, WDC_NVME_FIRMWARE_REV_LEN, ' '); - wdc_UtilsSnprintf((char*)bufferFolderName, MAX_PATH_LEN, "%s_%s_%s_%s", - "DRIVE_ESSENTIALS", (char*)serialNo, (char*)firmwareRevision, (char*)timeString); + wdc_UtilsSnprintf((char *)bufferFolderName, MAX_PATH_LEN, "%s_%s_%s_%s", + "DRIVE_ESSENTIALS", (char *)serialNo, (char *)firmwareRevision, (char *)timeString); - if (dir != NULL) { - wdc_UtilsSnprintf((char*)bufferFolderPath, MAX_PATH_LEN, "%s%s%s", + if (dir) { + wdc_UtilsSnprintf((char *)bufferFolderPath, MAX_PATH_LEN, "%s%s%s", (char *)dir, WDC_DE_PATH_SEPARATOR, (char *)bufferFolderName); } else { - retPtr = getcwd((char*)currDir, MAX_PATH_LEN); - if (retPtr != NULL) - wdc_UtilsSnprintf((char*)bufferFolderPath, MAX_PATH_LEN, "%s%s%s", + retPtr = getcwd((char *)currDir, MAX_PATH_LEN); + if (retPtr) { + wdc_UtilsSnprintf((char *)bufferFolderPath, MAX_PATH_LEN, "%s%s%s", (char *)currDir, WDC_DE_PATH_SEPARATOR, (char *)bufferFolderName); - else { - fprintf(stderr, "ERROR : WDC : get current working directory failed\n"); + } else { + fprintf(stderr, "ERROR: WDC: get current working directory failed\n"); return -1; } } - ret = wdc_UtilsCreateDir((char*)bufferFolderPath); - if (ret != 0) - { - fprintf(stderr, "ERROR : WDC : create directory failed, ret = %d, dir = %s\n", ret, bufferFolderPath); + ret = wdc_UtilsCreateDir((char *)bufferFolderPath); + if (ret) { + fprintf(stderr, "ERROR: WDC: create directory failed, ret = %d, dir = %s\n", ret, bufferFolderPath); return -1; - } else { - fprintf(stderr, "Store Drive Essentials bin files in directory: %s\n", bufferFolderPath); } + fprintf(stderr, "Store Drive Essentials bin files in directory: %s\n", bufferFolderPath); + /* Get Identify Controller Data */ - memset(&ctrl, 0, sizeof (struct nvme_id_ctrl)); + memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed, ret = %d\n", ret); return -1; - } else { - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "IdentifyController", (char*)serialNo, (char*)timeString); - wdc_WriteToFile(fileName, (char*)&ctrl, sizeof (struct nvme_id_ctrl)); } - memset(&ns, 0, sizeof (struct nvme_id_ns)); + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char *)bufferFolderPath, + WDC_DE_PATH_SEPARATOR, "IdentifyController", (char *)serialNo, + (char *)timeString); + wdc_WriteToFile(fileName, (char *)&ctrl, sizeof(struct nvme_id_ctrl)); + + memset(&ns, 0, sizeof(struct nvme_id_ns)); ret = nvme_identify_ns(dev_fd(dev), 1, &ns); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ns() failed, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ns() failed, ret = %d\n", ret); } else { - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "IdentifyNamespace", (char*)serialNo, (char*)timeString); - wdc_WriteToFile(fileName, (char*)&ns, sizeof (struct nvme_id_ns)); + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char *)bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "IdentifyNamespace", (char *)serialNo, (char *)timeString); + wdc_WriteToFile(fileName, (char *)&ns, sizeof(struct nvme_id_ns)); } /* Get Log Pages (0x01, 0x02, 0x03, 0xC0 and 0xE3) */ @@ -8933,46 +9076,45 @@ static int wdc_do_drive_essentials(nvme_root_t r, struct nvme_dev *dev, ret = nvme_get_log_error(dev_fd(dev), elogNumEntries, false, elogBuffer); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_error_log() failed, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_error_log() failed, ret = %d\n", ret); } else { - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "ErrorLog", (char*)serialNo, (char*)timeString); - wdc_WriteToFile(fileName, (char*)elogBuffer, elogBufferSize); + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char *)bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "ErrorLog", (char *)serialNo, (char *)timeString); + wdc_WriteToFile(fileName, (char *)elogBuffer, elogBufferSize); } free(dataBuffer); dataBuffer = NULL; - /* Get Smart log page */ - memset(&smart_log, 0, sizeof (struct nvme_smart_log)); + /* Get Smart log page */ + memset(&smart_log, 0, sizeof(struct nvme_smart_log)); ret = nvme_get_log_smart(dev_fd(dev), NVME_NSID_ALL, false, &smart_log); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_smart_log() failed, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_smart_log() failed, ret = %d\n", ret); } else { - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "SmartLog", (char*)serialNo, (char*)timeString); - wdc_WriteToFile(fileName, (char*)&smart_log, sizeof(struct nvme_smart_log)); + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char *)bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "SmartLog", (char *)serialNo, (char *)timeString); + wdc_WriteToFile(fileName, (char *)&smart_log, sizeof(struct nvme_smart_log)); } - /* Get FW Slot log page */ - memset(&fw_log, 0, sizeof (struct nvme_firmware_slot)); + /* Get FW Slot log page */ + memset(&fw_log, 0, sizeof(struct nvme_firmware_slot)); ret = nvme_get_log_fw_slot(dev_fd(dev), false, &fw_log); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_fw_log() failed, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_fw_log() failed, ret = %d\n", ret); } else { - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "FwSLotLog", (char*)serialNo, (char*)timeString); - wdc_WriteToFile(fileName, (char*)&fw_log, sizeof(struct nvme_firmware_slot)); + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char *)bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "FwSLotLog", (char *)serialNo, (char *)timeString); + wdc_WriteToFile(fileName, (char *)&fw_log, sizeof(struct nvme_firmware_slot)); } - /* Get VU log pages */ + /* Get VU log pages */ /* define inputs for vendor unique log pages */ - vuLogInput = (PWDC_NVME_DE_VU_LOGPAGES)calloc(1, sizeof(WDC_NVME_DE_VU_LOGPAGES)); - vuLogInput->numOfVULogPages = sizeof(deVULogPagesList) / sizeof(deVULogPagesList[0]); + vuLogInput = (struct WDC_NVME_DE_VU_LOGPAGES *)calloc(1, sizeof(struct WDC_NVME_DE_VU_LOGPAGES)); + vuLogInput->numOfVULogPages = ARRAY_SIZE(deVULogPagesList); - for (vuLogIdx = 0; vuLogIdx < vuLogInput->numOfVULogPages; vuLogIdx++) - { + for (vuLogIdx = 0; vuLogIdx < vuLogInput->numOfVULogPages; vuLogIdx++) { dataBufferSize = deVULogPagesList[vuLogIdx].logPageLen; dataBuffer = calloc(1, dataBufferSize); memset(dataBuffer, 0, dataBufferSize); @@ -8981,13 +9123,13 @@ static int wdc_do_drive_essentials(nvme_root_t r, struct nvme_dev *dev, deVULogPagesList[vuLogIdx].logPageId, dataBufferSize, dataBuffer); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_get_log() for log page 0x%x failed, ret = %d\n", + fprintf(stderr, "ERROR: WDC: nvme_get_log() for log page 0x%x failed, ret = %d\n", deVULogPagesList[vuLogIdx].logPageId, ret); } else { - wdc_UtilsDeleteCharFromString((char*)deVULogPagesList[vuLogIdx].logPageIdStr, 4, ' '); - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, - "LogPage", (char*)&deVULogPagesList[vuLogIdx].logPageIdStr, (char*)serialNo, (char*)timeString); - wdc_WriteToFile(fileName, (char*)dataBuffer, dataBufferSize); + wdc_UtilsDeleteCharFromString((char *)deVULogPagesList[vuLogIdx].logPageIdStr, 4, ' '); + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s_%s.bin", (char *)bufferFolderPath, WDC_DE_PATH_SEPARATOR, + "LogPage", (char *)&deVULogPagesList[vuLogIdx].logPageIdStr, (char *)serialNo, (char *)timeString); + wdc_WriteToFile(fileName, (char *)dataBuffer, dataBufferSize); } free(dataBuffer); @@ -8997,8 +9139,7 @@ static int wdc_do_drive_essentials(nvme_root_t r, struct nvme_dev *dev, free(vuLogInput); /* Get NVMe Features (0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C) */ - for (listIdx = 1; listIdx < (sizeof(deFeatureIdList) / sizeof(deFeatureIdList[0])); listIdx++) - { + for (listIdx = 1; listIdx < ARRAY_SIZE(deFeatureIdList); listIdx++) { memset(featureIdBuff, 0, sizeof(featureIdBuff)); /* skipping LbaRangeType as it is an optional nvme command and not supported */ if (deFeatureIdList[listIdx].featureId == FID_LBA_RANGE_TYPE) @@ -9010,95 +9151,40 @@ static int wdc_do_drive_essentials(nvme_root_t r, struct nvme_dev *dev, &featureIdBuff, &result); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_get_feature id 0x%x failed, ret = %d\n", + fprintf(stderr, "ERROR: WDC: nvme_get_feature id 0x%x failed, ret = %d\n", deFeatureIdList[listIdx].featureId, ret); } else { - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s0x%x_%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s0x%x_%s_%s_%s.bin", (char *)bufferFolderPath, WDC_DE_PATH_SEPARATOR, "FEATURE_ID_", deFeatureIdList[listIdx].featureId, deFeatureIdList[listIdx].featureName, serialNo, timeString); - wdc_WriteToFile(fileName, (char*)featureIdBuff, sizeof(featureIdBuff)); + wdc_WriteToFile(fileName, (char *)featureIdBuff, sizeof(featureIdBuff)); } } - /* Read Debug Directory */ - ret = wdc_get_log_dir_max_entries(dev, &maxNumOfVUFiles); - if (ret == WDC_STATUS_SUCCESS) - { - memset(&deEssentialsList, 0, sizeof(deEssentialsList)); - deEssentialsList.logEntry = (WDC_DRIVE_ESSENTIALS*)calloc(1, sizeof(WDC_DRIVE_ESSENTIALS)*maxNumOfVUFiles); - deEssentialsList.maxNumLogEntries = maxNumOfVUFiles; - - /* Fetch VU File Directory */ - ret = wdc_fetch_log_directory(dev, &deEssentialsList); - if (ret == WDC_STATUS_SUCCESS) - { - /* Get Debug Data Files */ - for (listIdx = 0; listIdx < deEssentialsList.numOfValidLogEntries; listIdx++) - { - if (0 == deEssentialsList.logEntry[listIdx].metaData.fileSize) - { - fprintf(stderr, "ERROR : WDC : File Size for %s is 0\n", - deEssentialsList.logEntry[listIdx].metaData.fileName); - ret = WDC_STATUS_FILE_SIZE_ZERO; - } else { - /* Fetch Log File Data */ - dataBuffer = (char *)calloc(1, (size_t)deEssentialsList.logEntry[listIdx].metaData.fileSize); - ret = wdc_fetch_log_file_from_device(dev, deEssentialsList.logEntry[listIdx].metaData.fileID, WDC_DE_DESTN_SPI, deEssentialsList.logEntry[listIdx].metaData.fileSize, - (__u8 *)dataBuffer); - - /* Write databuffer to file */ - if (ret == WDC_STATUS_SUCCESS) - { - memset(fileName, 0, sizeof(fileName)); - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", bufferFolderPath, WDC_DE_PATH_SEPARATOR, - deEssentialsList.logEntry[listIdx].metaData.fileName, serialNo, timeString); - if (deEssentialsList.logEntry[listIdx].metaData.fileSize > 0xFFFFFFFF) - { - wdc_WriteToFile(fileName, dataBuffer, 0xFFFFFFFF); - wdc_WriteToFile(fileName, dataBuffer + 0xFFFFFFFF, (__u32)(deEssentialsList.logEntry[listIdx].metaData.fileSize - 0xFFFFFFFF)); - } else { - wdc_WriteToFile(fileName, dataBuffer, (__u32)deEssentialsList.logEntry[listIdx].metaData.fileSize); - } - } else { - fprintf(stderr, "ERROR : WDC : wdc_fetch_log_file_from_device: %s failed, ret = %d\n", - deEssentialsList.logEntry[listIdx].metaData.fileName, ret); - } - free(dataBuffer); - dataBuffer = NULL; - } - } - } else { - fprintf(stderr, "WDC : wdc_fetch_log_directory failed, ret = %d\n", ret); - } - - free(deEssentialsList.logEntry); - deEssentialsList.logEntry = NULL; - } else { - fprintf(stderr, "WDC : wdc_get_log_dir_max_entries failed, ret = %d\n", ret); - } + ret = wdc_read_debug_directory(dev, bufferFolderPath, serialNo, timeString); /* Get Dump Trace Data */ - wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char*)bufferFolderPath, WDC_DE_PATH_SEPARATOR, "dumptrace", serialNo, timeString); - if (WDC_STATUS_SUCCESS != (ret = wdc_de_get_dump_trace(dev, (char*)bufferFolderPath, 0, fileName))) - { - fprintf(stderr, "ERROR : WDC : wdc_de_get_dump_trace failed, ret = %d\n", ret); - } + wdc_UtilsSnprintf(fileName, MAX_PATH_LEN, "%s%s%s_%s_%s.bin", (char *)bufferFolderPath, WDC_DE_PATH_SEPARATOR, "dumptrace", serialNo, timeString); + ret = wdc_de_get_dump_trace(dev, (char *)bufferFolderPath, 0, fileName); + if (ret != WDC_STATUS_SUCCESS) + fprintf(stderr, "ERROR: WDC: wdc_de_get_dump_trace failed, ret = %d\n", ret); /* Tar the Drive Essentials directory */ - wdc_UtilsSnprintf(tarFileName, sizeof(tarFileName), "%s%s", (char*)bufferFolderPath, WDC_DE_TAR_FILE_EXTN); - if (dir != NULL) { - wdc_UtilsSnprintf(tarFiles, sizeof(tarFiles), "%s%s%s%s%s", - (char*)dir, WDC_DE_PATH_SEPARATOR, (char*)bufferFolderName, WDC_DE_PATH_SEPARATOR, WDC_DE_TAR_FILES); - } else { - wdc_UtilsSnprintf(tarFiles, sizeof(tarFiles), "%s%s%s", (char*)bufferFolderName, WDC_DE_PATH_SEPARATOR, WDC_DE_TAR_FILES); - } - wdc_UtilsSnprintf(tarCmd, sizeof(tarCmd), "%s %s %s", WDC_DE_TAR_CMD, (char*)tarFileName, (char*)tarFiles); + wdc_UtilsSnprintf(tarFileName, sizeof(tarFileName), "%s%s", (char *)bufferFolderPath, WDC_DE_TAR_FILE_EXTN); + if (dir) + wdc_UtilsSnprintf(tarFiles, sizeof(tarFiles), "%s%s%s%s%s", (char *)dir, + WDC_DE_PATH_SEPARATOR, (char *)bufferFolderName, + WDC_DE_PATH_SEPARATOR, WDC_DE_TAR_FILES); + else + wdc_UtilsSnprintf(tarFiles, sizeof(tarFiles), "%s%s%s", (char *)bufferFolderName, + WDC_DE_PATH_SEPARATOR, WDC_DE_TAR_FILES); + wdc_UtilsSnprintf(tarCmd, sizeof(tarCmd), "%s %s %s", WDC_DE_TAR_CMD, (char *)tarFileName, (char *)tarFiles); ret = system(tarCmd); - if (ret) { - fprintf(stderr, "ERROR : WDC : Tar of Drive Essentials data failed, ret = %d\n", ret); - } + if (ret) + fprintf(stderr, "ERROR: WDC: Tar of Drive Essentials data failed, ret = %d\n", + ret); fprintf(stderr, "Get of Drive Essentials data successful\n"); nvme_free_tree(r); @@ -9139,12 +9225,12 @@ static int wdc_drive_essentials(int argc, char **argv, struct command *command, r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRIVE_CAP_DRIVE_ESSENTIALS) != WDC_DRIVE_CAP_DRIVE_ESSENTIALS) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } - if (cfg.dirName != NULL) { + if (cfg.dirName) { strncpy(d, cfg.dirName, PATH_MAX - 1); d_ptr = d; } else { @@ -9163,7 +9249,7 @@ static int wdc_do_drive_resize(struct nvme_dev *dev, uint64_t new_size) int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_DRIVE_RESIZE_OPCODE; admin_cmd.cdw12 = ((WDC_NVME_DRIVE_RESIZE_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_DRIVE_RESIZE_CMD); @@ -9178,7 +9264,7 @@ static int wdc_do_namespace_resize(struct nvme_dev *dev, __u32 nsid, __u32 op_op int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_NAMESPACE_RESIZE_OPCODE; admin_cmd.nsid = nsid; admin_cmd.cdw10 = op_option; @@ -9192,7 +9278,7 @@ static int wdc_do_drive_info(struct nvme_dev *dev, __u32 *result) int ret; struct nvme_passthru_cmd admin_cmd; - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_DRIVE_INFO_OPCODE; admin_cmd.cdw12 = ((WDC_NVME_DRIVE_INFO_SUBCMD << WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_DRIVE_INFO_CMD); @@ -9238,7 +9324,7 @@ static int wdc_drive_resize(int argc, char **argv, if ((capabilities & WDC_DRIVE_CAP_RESIZE) == WDC_DRIVE_CAP_RESIZE) { ret = wdc_do_drive_resize(dev, cfg.size); } else { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } @@ -9282,12 +9368,9 @@ static int wdc_namespace_resize(int argc, char **argv, if (ret) return ret; - if ((cfg.op_option != 0x1) && - (cfg.op_option != 0x2) && - (cfg.op_option != 0x3) && - (cfg.op_option != 0xF)) - { - fprintf(stderr, "ERROR : WDC: unsupported OP option parameter\n"); + if ((cfg.op_option != 0x1) && (cfg.op_option != 0x2) && (cfg.op_option != 0x3) && + (cfg.op_option != 0xF)) { + fprintf(stderr, "ERROR: WDC: unsupported OP option parameter\n"); dev_close(dev); return -1; } @@ -9299,10 +9382,10 @@ static int wdc_namespace_resize(int argc, char **argv, ret = wdc_do_namespace_resize(dev, cfg.namespace_id, cfg.op_option); - if (ret != 0) - printf("ERROR : WDC: Namespace Resize of namespace id 0x%x, op option 0x%x failed\n", cfg.namespace_id, cfg.op_option); + if (ret) + printf("ERROR: WDC: Namespace Resize of namespace id 0x%x, op option 0x%x failed\n", cfg.namespace_id, cfg.op_option); } else { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } @@ -9350,19 +9433,20 @@ static int wdc_reason_identifier(int argc, char **argv, r = nvme_scan(NULL); - if (cfg.log_id != NVME_LOG_LID_TELEMETRY_HOST&& cfg.log_id != NVME_LOG_LID_TELEMETRY_CTRL) { - fprintf(stderr, "ERROR : WDC: Invalid Log ID. It must be 7 (Host) or 8 (Controller)\n"); + if (cfg.log_id != NVME_LOG_LID_TELEMETRY_HOST && + cfg.log_id != NVME_LOG_LID_TELEMETRY_CTRL) { + fprintf(stderr, "ERROR: WDC: Invalid Log ID. It must be 7 (Host) or 8 (Controller)\n"); ret = -1; goto close_fd; } - if (cfg.file != NULL) { + if (cfg.file) { int verify_file; /* verify the passed in file name and path is valid before getting the dump data */ verify_file = open(cfg.file, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (verify_file < 0) { - fprintf(stderr, "ERROR : WDC: open : %s\n", strerror(errno)); + fprintf(stderr, "ERROR: WDC: open: %s\n", strerror(errno)); ret = -1; goto close_fd; } @@ -9371,21 +9455,21 @@ static int wdc_reason_identifier(int argc, char **argv, } else { wdc_UtilsGetTime(&timeInfo); memset(timeStamp, 0, sizeof(timeStamp)); - wdc_UtilsSnprintf((char*)timeStamp, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", + wdc_UtilsSnprintf((char *)timeStamp, MAX_PATH_LEN, "%02u%02u%02u_%02u%02u%02u", timeInfo.year, timeInfo.month, timeInfo.dayOfMonth, timeInfo.hour, timeInfo.minute, timeInfo.second); if (cfg.log_id == NVME_LOG_LID_TELEMETRY_CTRL) - snprintf(fileSuffix, PATH_MAX, "_error_reason_identifier_ctlr_%s", (char*)timeStamp); + snprintf(fileSuffix, PATH_MAX, "_error_reason_identifier_ctlr_%s", (char *)timeStamp); else - snprintf(fileSuffix, PATH_MAX, "_error_reason_identifier_host_%s", (char*)timeStamp); + snprintf(fileSuffix, PATH_MAX, "_error_reason_identifier_host_%s", (char *)timeStamp); if (wdc_get_serial_name(dev, f, PATH_MAX, fileSuffix) == -1) { - fprintf(stderr, "ERROR : WDC: failed to generate file name\n"); + fprintf(stderr, "ERROR: WDC: failed to generate file name\n"); ret = -1; goto close_fd; } if (strlen(f) > PATH_MAX - 5) { - fprintf(stderr, "ERROR : WDC: file name overflow\n"); + fprintf(stderr, "ERROR: WDC: file name overflow\n"); ret = -1; goto close_fd; } @@ -9398,13 +9482,13 @@ static int wdc_reason_identifier(int argc, char **argv, if ((capabilities & WDC_DRIVE_CAP_REASON_ID) == WDC_DRIVE_CAP_REASON_ID) { ret = wdc_do_get_reason_id(dev, f, cfg.log_id); } else { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC:unsupported device for this command\n"); ret = -1; } nvme_show_status(ret); - close_fd: +close_fd: dev_close(dev); nvme_free_tree(r); return ret; @@ -9413,43 +9497,76 @@ static int wdc_reason_identifier(int argc, char **argv, static const char *nvme_log_id_to_string(__u8 log_id) { switch (log_id) { - case NVME_LOG_LID_ERROR: return "Error Information Log ID"; - case NVME_LOG_LID_SMART: return "Smart/Health Information Log ID"; - case NVME_LOG_LID_FW_SLOT: return "Firmware Slot Information Log ID"; - case NVME_LOG_LID_CHANGED_NS: return "Namespace Changed Log ID"; - case NVME_LOG_LID_CMD_EFFECTS: return "Commamds Supported and Effects Log ID"; - case NVME_LOG_LID_DEVICE_SELF_TEST: return "Device Self Test Log ID"; - case NVME_LOG_LID_TELEMETRY_HOST: return "Telemetry Host Initiated Log ID"; - case NVME_LOG_LID_TELEMETRY_CTRL: return "Telemetry Controller Generated Log ID"; - case NVME_LOG_LID_ENDURANCE_GROUP: return "Endurance Group Log ID"; - case NVME_LOG_LID_ANA: return "ANA Log ID"; - case NVME_LOG_LID_PERSISTENT_EVENT: return "Persistent Event Log ID"; - case NVME_LOG_LID_DISCOVER: return "Discovery Log ID"; - case NVME_LOG_LID_RESERVATION: return "Reservation Notification Log ID"; - case NVME_LOG_LID_SANITIZE: return "Sanitize Status Log ID"; - - case WDC_LOG_ID_C0: return "WDC Vendor Unique Log ID C0"; - case WDC_LOG_ID_C1: return "WDC Vendor Unique Log ID C1"; - case WDC_LOG_ID_C2: return "WDC Vendor Unique Log ID C2"; - case WDC_LOG_ID_C3: return "WDC Vendor Unique Log ID C3"; - case WDC_LOG_ID_C4: return "WDC Vendor Unique Log ID C4"; - case WDC_LOG_ID_C5: return "WDC Vendor Unique Log ID C5"; - case WDC_LOG_ID_C6: return "WDC Vendor Unique Log ID C6"; - case WDC_LOG_ID_C8: return "WDC Vendor Unique Log ID C8"; - case WDC_LOG_ID_CA: return "WDC Vendor Unique Log ID CA"; - case WDC_LOG_ID_CB: return "WDC Vendor Unique Log ID CB"; - case WDC_LOG_ID_D0: return "WDC Vendor Unique Log ID D0"; - case WDC_LOG_ID_D1: return "WDC Vendor Unique Log ID D1"; - case WDC_LOG_ID_D6: return "WDC Vendor Unique Log ID D6"; - case WDC_LOG_ID_D7: return "WDC Vendor Unique Log ID D7"; - case WDC_LOG_ID_D8: return "WDC Vendor Unique Log ID D8"; - case WDC_LOG_ID_DE: return "WDC Vendor Unique Log ID DE"; - case WDC_LOG_ID_F0: return "WDC Vendor Unique Log ID F0"; - case WDC_LOG_ID_F1: return "WDC Vendor Unique Log ID F1"; - case WDC_LOG_ID_F2: return "WDC Vendor Unique Log ID F2"; - case WDC_LOG_ID_FA: return "WDC Vendor Unique Log ID FA"; - - default: return "Unknown Log ID"; + case NVME_LOG_LID_ERROR: + return "Error Information Log ID"; + case NVME_LOG_LID_SMART: + return "Smart/Health Information Log ID"; + case NVME_LOG_LID_FW_SLOT: + return "Firmware Slot Information Log ID"; + case NVME_LOG_LID_CHANGED_NS: + return "Namespace Changed Log ID"; + case NVME_LOG_LID_CMD_EFFECTS: + return "Commamds Supported and Effects Log ID"; + case NVME_LOG_LID_DEVICE_SELF_TEST: + return "Device Self Test Log ID"; + case NVME_LOG_LID_TELEMETRY_HOST: + return "Telemetry Host Initiated Log ID"; + case NVME_LOG_LID_TELEMETRY_CTRL: + return "Telemetry Controller Generated Log ID"; + case NVME_LOG_LID_ENDURANCE_GROUP: + return "Endurance Group Log ID"; + case NVME_LOG_LID_ANA: + return "ANA Log ID"; + case NVME_LOG_LID_PERSISTENT_EVENT: + return "Persistent Event Log ID"; + case NVME_LOG_LID_DISCOVER: + return "Discovery Log ID"; + case NVME_LOG_LID_RESERVATION: + return "Reservation Notification Log ID"; + case NVME_LOG_LID_SANITIZE: + return "Sanitize Status Log ID"; + case WDC_LOG_ID_C0: + return "WDC Vendor Unique Log ID C0"; + case WDC_LOG_ID_C1: + return "WDC Vendor Unique Log ID C1"; + case WDC_LOG_ID_C2: + return "WDC Vendor Unique Log ID C2"; + case WDC_LOG_ID_C3: + return "WDC Vendor Unique Log ID C3"; + case WDC_LOG_ID_C4: + return "WDC Vendor Unique Log ID C4"; + case WDC_LOG_ID_C5: + return "WDC Vendor Unique Log ID C5"; + case WDC_LOG_ID_C6: + return "WDC Vendor Unique Log ID C6"; + case WDC_LOG_ID_C8: + return "WDC Vendor Unique Log ID C8"; + case WDC_LOG_ID_CA: + return "WDC Vendor Unique Log ID CA"; + case WDC_LOG_ID_CB: + return "WDC Vendor Unique Log ID CB"; + case WDC_LOG_ID_D0: + return "WDC Vendor Unique Log ID D0"; + case WDC_LOG_ID_D1: + return "WDC Vendor Unique Log ID D1"; + case WDC_LOG_ID_D6: + return "WDC Vendor Unique Log ID D6"; + case WDC_LOG_ID_D7: + return "WDC Vendor Unique Log ID D7"; + case WDC_LOG_ID_D8: + return "WDC Vendor Unique Log ID D8"; + case WDC_LOG_ID_DE: + return "WDC Vendor Unique Log ID DE"; + case WDC_LOG_ID_F0: + return "WDC Vendor Unique Log ID F0"; + case WDC_LOG_ID_F1: + return "WDC Vendor Unique Log ID F1"; + case WDC_LOG_ID_F2: + return "WDC Vendor Unique Log ID F2"; + case WDC_LOG_ID_FA: + return "WDC Vendor Unique Log ID FA"; + default: + return "Unknown Log ID"; } } @@ -9462,7 +9579,7 @@ static int wdc_log_page_directory(int argc, char **argv, struct command *command nvme_root_t r; __u64 capabilities = 0; struct wdc_c2_cbs_data *cbs_data = NULL; - int i; + int i; __u8 log_id = 0; __u32 device_id, read_vendor_id; @@ -9485,7 +9602,7 @@ static int wdc_log_page_directory(int argc, char **argv, struct command *command ret = validate_output_format(cfg.output_format); if (ret < 0) { - fprintf(stderr, "%s: ERROR : WDC : invalid output format\n", __func__); + fprintf(stderr, "%s: ERROR: WDC: invalid output format\n", __func__); dev_close(dev); return ret; } @@ -9494,8 +9611,8 @@ static int wdc_log_page_directory(int argc, char **argv, struct command *command r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_LOG_PAGE_DIR) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_LOG_PAGE_DIR)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } else { ret = wdc_get_pci_ids(r, dev, &device_id, &read_vendor_id); @@ -9503,47 +9620,52 @@ static int wdc_log_page_directory(int argc, char **argv, struct command *command WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE_C8 : WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_OPCODE; /* verify the 0xC2 Device Manageability log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, log_id) == false) { - fprintf(stderr, "%s: ERROR : WDC : 0x%x Log Page not supported\n", __func__, log_id); + fprintf(stderr, "%s: ERROR: WDC: 0x%x Log Page not supported\n", __func__, log_id); ret = -1; goto out; } if (get_dev_mgment_cbs_data(r, dev, WDC_C2_LOG_PAGES_SUPPORTED_ID, (void *)&cbs_data)) { - if (cbs_data != NULL) { + if (cbs_data) { printf("Log Page Directory\n"); /* print the supported pages */ if (!strcmp(cfg.output_format, "normal")) { - for (i = 0; i < le32_to_cpu(cbs_data->length); i++) { + for (i = 0; i < le32_to_cpu(cbs_data->length); i++) printf("0x%x - %s\n", cbs_data->data[i], - nvme_log_id_to_string(cbs_data->data[i])); - } + nvme_log_id_to_string(cbs_data->data[i])); } else if (!strcmp(cfg.output_format, "binary")) { - d((__u8 *)cbs_data->data, le32_to_cpu(cbs_data->length), 16, 1); + d((__u8 *)cbs_data->data, le32_to_cpu(cbs_data->length), 16, + 1); } else if (!strcmp(cfg.output_format, "json")) { - struct json_object *root; - root = json_create_object(); + struct json_object *root = json_create_object(); - for (i = 0; i < le32_to_cpu(cbs_data->length); i++) { - json_object_add_value_int(root, nvme_log_id_to_string(cbs_data->data[i]), - cbs_data->data[i]); - } + for (i = 0; i < le32_to_cpu(cbs_data->length); i++) + json_object_add_value_int(root, + nvme_log_id_to_string(cbs_data->data[i]), + cbs_data->data[i]); json_print_object(root, NULL); printf("\n"); json_free_object(root); - } else - fprintf(stderr, "%s: ERROR : WDC : Invalid format, format = %s\n", __func__, cfg.output_format); + } else { + fprintf(stderr, + "%s: ERROR: WDC: Invalid format, format = %s\n", + __func__, cfg.output_format); + } free(cbs_data); - } else - fprintf(stderr, "%s: ERROR : WDC : NULL_data ptr\n", __func__); - } else - fprintf(stderr, "%s: ERROR : WDC : 0xC2 Log Page entry ID 0x%x not found\n", __func__, WDC_C2_LOG_PAGES_SUPPORTED_ID); + } else { + fprintf(stderr, "%s: ERROR: WDC: NULL_data ptr\n", __func__); + } + } else { + fprintf(stderr, "%s: ERROR: WDC: 0xC2 Log Page entry ID 0x%x not found\n", + __func__, WDC_C2_LOG_PAGES_SUPPORTED_ID); + } } - out: +out: nvme_free_tree(r); dev_close(dev); return ret; @@ -9557,14 +9679,13 @@ static int wdc_get_drive_reason_id(struct nvme_dev *dev, char *drive_reason_id, struct nvme_id_ctrl ctrl; char *reason_id_str = "reason_id"; - i = sizeof (ctrl.sn) - 1; - j = sizeof (ctrl.mn) - 1; + i = sizeof(ctrl.sn) - 1; + j = sizeof(ctrl.mn) - 1; memset(drive_reason_id, 0, len); - memset(&ctrl, 0, sizeof (struct nvme_id_ctrl)); + memset(&ctrl, 0, sizeof(struct nvme_id_ctrl)); ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC : nvme_identify_ctrl() failed " - "0x%x\n", ret); + fprintf(stderr, "ERROR: WDC: nvme_identify_ctrl() failed 0x%x\n", ret); return -1; } /* Remove trailing spaces from the sn and mn */ @@ -9580,8 +9701,8 @@ static int wdc_get_drive_reason_id(struct nvme_dev *dev, char *drive_reason_id, res_len = snprintf(drive_reason_id, len, "%s_%s_%s", ctrl.sn, ctrl.mn, reason_id_str); if (len <= res_len) { - fprintf(stderr, "ERROR : WDC : cannot format serial number due to data " - "of unexpected length\n"); + fprintf(stderr, + "ERROR: WDC: cannot format serial number due to data of unexpected length\n"); return -1; } @@ -9597,14 +9718,14 @@ static int wdc_save_reason_id(struct nvme_dev *dev, __u8 *rsn_ident, int size) struct stat st = {0}; if (wdc_get_drive_reason_id(dev, drive_reason_id, PATH_MAX) == -1) { - fprintf(stderr, "%s: ERROR : failed to get drive reason id\n", __func__); + fprintf(stderr, "%s: ERROR: failed to get drive reason id\n", __func__); return -1; } /* make the nvmecli dir in /usr/local if it doesn't already exist */ if (stat(reason_id_path, &st) == -1) { if (mkdir(reason_id_path, 0700) < 0) { - fprintf(stderr, "%s: ERROR : failed to mkdir %s : %s\n", + fprintf(stderr, "%s: ERROR: failed to mkdir %s: %s\n", __func__, reason_id_path, strerror(errno)); return -1; } @@ -9616,7 +9737,7 @@ static int wdc_save_reason_id(struct nvme_dev *dev, __u8 *rsn_ident, int size) fprintf(stderr, "%s: reason id file = %s\n", __func__, reason_id_file); - /* save off the error reason identifier to a file in /usr/local/nvmecli */ + /* save off the error reason identifier to a file in /usr/local/nvmecli */ ret = wdc_create_log_file(reason_id_file, rsn_ident, WDC_REASON_ID_ENTRY_LEN); free(reason_id_file); @@ -9631,7 +9752,7 @@ static int wdc_clear_reason_id(struct nvme_dev *dev) char drive_reason_id[PATH_MAX] = {0}; if (wdc_get_drive_reason_id(dev, drive_reason_id, PATH_MAX) == -1) { - fprintf(stderr, "%s: ERROR : failed to get drive reason id\n", __func__); + fprintf(stderr, "%s: ERROR: failed to get drive reason id\n", __func__); return -1; } @@ -9650,7 +9771,7 @@ static int wdc_clear_reason_id(struct nvme_dev *dev) /* remove the reason id file */ ret = remove(reason_id_file); - free: +free: free(reason_id_file); return ret; @@ -9666,11 +9787,11 @@ static int wdc_dump_telemetry_hdr(struct nvme_dev *dev, int log_id, struct nvme_ ret = nvme_get_log_telemetry_ctrl(dev_fd(dev), false, 0, 512, (void *)log_hdr); - if (ret < 0) + if (ret < 0) { perror("get-telemetry-log"); - else if (ret > 0) { + } else if (ret > 0) { nvme_show_status(ret); - fprintf(stderr, "%s: ERROR : Failed to acquire telemetry header, ret = %d!\n", __func__, ret); + fprintf(stderr, "%s: ERROR: Failed to acquire telemetry header, ret = %d!\n", __func__, ret); } return ret; @@ -9683,17 +9804,17 @@ static int wdc_do_get_reason_id(struct nvme_dev *dev, char *file, int log_id) __u32 log_hdr_size = sizeof(struct nvme_telemetry_log); __u32 reason_id_size = 0; - log_hdr = (struct nvme_telemetry_log *) malloc(log_hdr_size); - if (log_hdr == NULL) { - fprintf(stderr, "%s: ERROR : malloc failed, size : 0x%x, status : %s\n", __func__, log_hdr_size, strerror(errno)); + log_hdr = (struct nvme_telemetry_log *)malloc(log_hdr_size); + if (!log_hdr) { + fprintf(stderr, "%s: ERROR: malloc failed, size : 0x%x, status: %s\n", __func__, log_hdr_size, strerror(errno)); ret = -1; goto out; } memset(log_hdr, 0, log_hdr_size); ret = wdc_dump_telemetry_hdr(dev, log_id, log_hdr); - if (ret != 0) { - fprintf(stderr, "%s: ERROR : get telemetry header failed, ret : %d\n", __func__, ret); + if (ret) { + fprintf(stderr, "%s: ERROR: get telemetry header failed, ret : %d\n", __func__, ret); ret = -1; goto out; } @@ -9718,17 +9839,16 @@ static void wdc_print_nand_stats_normal(__u16 version, void *data) __u16 temp_norm; __u64 *temp_ptr = NULL; - switch (version) - { + switch (version) { case 0: - printf(" NAND Statistics :- \n"); + printf(" NAND Statistics :-\n"); printf(" NAND Writes TLC (Bytes) %s\n", uint128_t_to_string( le128_to_cpu(nand_stats->nand_write_tlc))); printf(" NAND Writes SLC (Bytes) %s\n", uint128_t_to_string( le128_to_cpu(nand_stats->nand_write_slc))); - printf(" NAND Program Failures %"PRIu32"\n", + printf(" NAND Program Failures %"PRIu32"\n", (uint32_t)le32_to_cpu(nand_stats->nand_prog_failure)); printf(" NAND Erase Failures %"PRIu32"\n", (uint32_t)le32_to_cpu(nand_stats->nand_erase_failure)); @@ -9736,7 +9856,7 @@ static void wdc_print_nand_stats_normal(__u16 version, void *data) (uint32_t)le32_to_cpu(nand_stats->bad_block_count)); printf(" NAND XOR/RAID Recovery Trigger Events %"PRIu64"\n", le64_to_cpu(nand_stats->nand_rec_trigger_event)); - printf(" E2E Error Counter %"PRIu64"\n", + printf(" E2E Error Counter %"PRIu64"\n", le64_to_cpu(nand_stats->e2e_error_counter)); printf(" Number Successful NS Resizing Events %"PRIu64"\n", le64_to_cpu(nand_stats->successful_ns_resize_event)); @@ -9744,19 +9864,19 @@ static void wdc_print_nand_stats_normal(__u16 version, void *data) le16_to_cpu(nand_stats->log_page_version)); break; case 3: - printf(" NAND Statistics V3:- \n"); + printf(" NAND Statistics V3:-\n"); printf(" TLC Units Written %s\n", uint128_t_to_string( le128_to_cpu(nand_stats_v3->nand_write_tlc))); - printf(" SLC Units Written %s\n", + printf(" SLC Units Written %s\n", uint128_t_to_string( le128_to_cpu(nand_stats_v3->nand_write_slc))); temp_ptr = (__u64 *)nand_stats_v3->bad_nand_block_count; temp_norm = (__u16)(*temp_ptr & 0x000000000000FFFF); temp_raw = ((*temp_ptr & 0xFFFFFFFFFFFF0000) >> 16); - printf(" Bad NAND Blocks Count - Normalized %"PRIu16"\n", + printf(" Bad NAND Blocks Count - Normalized %"PRIu16"\n", le16_to_cpu(temp_norm)); - printf(" Bad NAND Blocks Count - Raw %"PRIu64"\n", + printf(" Bad NAND Blocks Count - Raw %"PRIu64"\n", le64_to_cpu(temp_raw)); printf(" NAND XOR Recovery count %"PRIu64"\n", le64_to_cpu(nand_stats_v3->xor_recovery_count)); @@ -9781,14 +9901,14 @@ static void wdc_print_nand_stats_normal(__u16 version, void *data) temp_ptr = (__u64 *)nand_stats_v3->program_fail_count; temp_norm = (__u16)(*temp_ptr & 0x000000000000FFFF); temp_raw = ((*temp_ptr & 0xFFFFFFFFFFFF0000) >> 16); - printf(" Program Fail Count - Normalized %"PRIu16"\n", + printf(" Program Fail Count - Normalized %"PRIu16"\n", le16_to_cpu(temp_norm)); - printf(" Program Fail Count - Raw %"PRIu64"\n", + printf(" Program Fail Count - Raw %"PRIu64"\n", le64_to_cpu(temp_raw)); temp_ptr = (__u64 *)nand_stats_v3->erase_fail_count; temp_norm = (__u16)(*temp_ptr & 0x000000000000FFFF); temp_raw = ((*temp_ptr & 0xFFFFFFFFFFFF0000) >> 16); - printf(" Erase Fail Count - Normalized %"PRIu16"\n", + printf(" Erase Fail Count - Normalized %"PRIu16"\n", le16_to_cpu(temp_norm)); printf(" Erase Fail Count - Raw %"PRIu64"\n", le64_to_cpu(temp_raw)); @@ -9837,7 +9957,7 @@ static void wdc_print_nand_stats_normal(__u16 version, void *data) break; default: - fprintf(stderr, "WDC: Nand Stats ERROR : Invalid version\n"); + fprintf(stderr, "WDC: Nand Stats ERROR: Invalid version\n"); break; } @@ -9847,17 +9967,13 @@ static void wdc_print_nand_stats_json(__u16 version, void *data) { struct wdc_nand_stats *nand_stats = (struct wdc_nand_stats *)(data); struct wdc_nand_stats_V3 *nand_stats_v3 = (struct wdc_nand_stats_V3 *)(data); - struct json_object *root; - root = json_create_object(); + struct json_object *root = json_create_object(); __u64 temp_raw; __u16 temp_norm; __u64 *temp_ptr = NULL; - switch (version) - { - + switch (version) { case 0: - json_object_add_value_uint128(root, "NAND Writes TLC (Bytes)", le128_to_cpu(nand_stats->nand_write_tlc)); json_object_add_value_uint128(root, "NAND Writes SLC (Bytes)", @@ -9878,9 +9994,7 @@ static void wdc_print_nand_stats_json(__u16 version, void *data) json_print_object(root, NULL); printf("\n"); break; - case 3: - json_object_add_value_uint128(root, "NAND Writes TLC (Bytes)", le128_to_cpu(nand_stats_v3->nand_write_tlc)); json_object_add_value_uint128(root, "NAND Writes SLC (Bytes)", @@ -9969,11 +10083,9 @@ static void wdc_print_nand_stats_json(__u16 version, void *data) json_print_object(root, NULL); printf("\n"); break; - default: printf("%s: Invalid Stats Version = %d\n", __func__, version); break; - } json_free_object(root); @@ -9982,7 +10094,7 @@ static void wdc_print_nand_stats_json(__u16 version, void *data) static void wdc_print_pcie_stats_normal(struct wdc_vs_pcie_stats *pcie_stats) { - printf(" PCIE Statistics :- \n"); + printf(" PCIE Statistics :-\n"); printf(" Unsupported Request Error Counter %20"PRIu64"\n", le64_to_cpu(pcie_stats->unsupportedRequestErrorCount)); printf(" ECRC Error Status Counter %20"PRIu64"\n", @@ -10020,8 +10132,7 @@ static void wdc_print_pcie_stats_normal(struct wdc_vs_pcie_stats *pcie_stats) static void wdc_print_pcie_stats_json(struct wdc_vs_pcie_stats *pcie_stats) { - struct json_object *root; - root = json_create_object(); + struct json_object *root = json_create_object(); json_object_add_value_uint64(root, "Unsupported Request Error Counter", le64_to_cpu(pcie_stats->unsupportedRequestErrorCount)); @@ -10074,12 +10185,12 @@ static int wdc_do_vs_nand_stats_sn810_2(struct nvme_dev *dev, char *format) NVME_NSID_ALL); if (ret) { - fprintf(stderr, "ERROR : WDC : %s : Failed to retreive NAND stats\n", __func__); + fprintf(stderr, "ERROR: WDC: %s : Failed to retreive NAND stats\n", __func__); goto out; } else { fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : %s : invalid output format\n", __func__); + fprintf(stderr, "ERROR: WDC: %s : invalid output format\n", __func__); ret = fmt; goto out; } @@ -10108,21 +10219,22 @@ static int wdc_do_vs_nand_stats(struct nvme_dev *dev, char *format) uint8_t *output = NULL; __u16 version = 0; - if ((output = (uint8_t*)calloc(WDC_NVME_NAND_STATS_SIZE, sizeof(uint8_t))) == NULL) { - fprintf(stderr, "ERROR : WDC : calloc : %s\n", strerror(errno)); + output = (uint8_t *)calloc(WDC_NVME_NAND_STATS_SIZE, sizeof(uint8_t)); + if (!output) { + fprintf(stderr, "ERROR: WDC: calloc: %s\n", strerror(errno)); ret = -1; goto out; } ret = nvme_get_log_simple(dev_fd(dev), WDC_NVME_NAND_STATS_LOG_ID, - WDC_NVME_NAND_STATS_SIZE, (void*)output); + WDC_NVME_NAND_STATS_SIZE, (void *)output); if (ret) { - fprintf(stderr, "ERROR : WDC : %s : Failed to retreive NAND stats\n", __func__); + fprintf(stderr, "ERROR: WDC: %s : Failed to retreive NAND stats\n", __func__); goto out; } else { fmt = validate_output_format(format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); ret = fmt; goto out; } @@ -10175,14 +10287,13 @@ static int wdc_vs_nand_stats(int argc, char **argv, struct command *command, r = nvme_scan(NULL); capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_NAND_STATS) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_NAND_STATS)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } else { ret = wdc_get_pci_ids(r, dev, &read_device_id, &read_vendor_id); - if (ret < 0) - { - fprintf(stderr, "ERROR : WDC: %s: failure to get pci ids, ret = %d\n", __func__, ret); + if (ret < 0) { + fprintf(stderr, "ERROR: WDC: %s: failure to get pci ids, ret = %d\n", __func__, ret); return -1; } @@ -10198,7 +10309,7 @@ static int wdc_vs_nand_stats(int argc, char **argv, struct command *command, } if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading NAND statistics, ret = %d\n", ret); + fprintf(stderr, "ERROR: WDC: Failure reading NAND statistics, ret = %d\n", ret); nvme_free_tree(r); dev_close(dev); @@ -10212,7 +10323,7 @@ static int wdc_do_vs_pcie_stats(struct nvme_dev *dev, struct nvme_passthru_cmd admin_cmd; int pcie_stats_size = sizeof(struct wdc_vs_pcie_stats); - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); admin_cmd.opcode = WDC_NVME_PCIE_STATS_OPCODE; admin_cmd.addr = (__u64)(uintptr_t)pcieStatsPtr; admin_cmd.data_len = pcie_stats_size; @@ -10256,14 +10367,14 @@ static int wdc_vs_pcie_stats(int argc, char **argv, struct command *command, r = nvme_scan(NULL); fmt = validate_output_format(cfg.output_format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); ret = fmt; goto out; } pcieStatsPtr = nvme_alloc(pcie_stats_size, &huge); - if (pcieStatsPtr == NULL) { - fprintf(stderr, "ERROR : WDC : PCIE Stats alloc : %s\n", strerror(errno)); + if (!pcieStatsPtr) { + fprintf(stderr, "ERROR: WDC: PCIE Stats alloc: %s\n", strerror(errno)); ret = -1; goto out; } @@ -10272,14 +10383,14 @@ static int wdc_vs_pcie_stats(int argc, char **argv, struct command *command, capabilities = wdc_get_drive_capabilities(r, dev); - if ((capabilities & WDC_DRIVE_CAP_PCIE_STATS) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_PCIE_STATS)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; } else { ret = wdc_do_vs_pcie_stats(dev, pcieStatsPtr); - if (ret) - fprintf(stderr, "ERROR : WDC : Failure reading PCIE statistics, ret = 0x%x\n", ret); - else { + if (ret) { + fprintf(stderr, "ERROR: WDC: Failure reading PCIE statistics, ret = 0x%x\n", ret); + } else { /* parse the data */ switch (fmt) { case NORMAL: @@ -10322,7 +10433,7 @@ static int wdc_vs_drive_info(int argc, char **argv, char formatter[41] = { 0 }; char rev_str[16] = { 0 }; uint32_t read_device_id = -1, read_vendor_id = -1; - wdc_nvme_ext_smart_log *ext_smart_log_ptr = NULL; + struct __packed wdc_nvme_ext_smart_log * ext_smart_log_ptr = NULL; struct config { char *output_format; @@ -10343,7 +10454,7 @@ static int wdc_vs_drive_info(int argc, char **argv, fmt = validate_output_format(cfg.output_format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC %s invalid output format\n", __func__); + fprintf(stderr, "ERROR: WDC %s invalid output format\n", __func__); dev_close(dev); return fmt; } @@ -10352,7 +10463,7 @@ static int wdc_vs_drive_info(int argc, char **argv, ret = nvme_identify_ctrl(dev_fd(dev), &ctrl); if (ret) { - fprintf(stderr, "ERROR : WDC %s: Identify Controller failed\n", __func__); + fprintf(stderr, "ERROR: WDC %s: Identify Controller failed\n", __func__); dev_close(dev); return ret; } @@ -10362,9 +10473,8 @@ static int wdc_vs_drive_info(int argc, char **argv, capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRIVE_CAP_INFO) == WDC_DRIVE_CAP_INFO) { ret = wdc_get_pci_ids(r, dev, &read_device_id, &read_vendor_id); - if (ret < 0) - { - fprintf(stderr, "ERROR : WDC: %s: failure to get pci ids, ret = %d\n", __func__, ret); + if (ret < 0) { + fprintf(stderr, "ERROR: WDC: %s: failure to get pci ids, ret = %d\n", __func__, ret); goto out; } @@ -10395,10 +10505,9 @@ static int wdc_vs_drive_info(int argc, char **argv, printf("Drive HW Revison: %4.1f\n", (.1 * rev)); printf("FTL Unit Size: 0x%x KB\n", size); printf("Customer SN: %-.*s\n", (int)sizeof(ctrl.sn), &ctrl.sn[0]); - } - else if (fmt == JSON) { - root = json_create_object(); - sprintf(rev_str, "%4.1f", (.1 * rev)); + } else if (fmt == JSON) { + root = json_create_object(); + sprintf(rev_str, "%4.1f", (.1 * rev)); json_object_add_value_string(root, "Drive HW Revison", rev_str); json_object_add_value_int(root, "FTL Unit Size", le16_to_cpu(size)); @@ -10419,12 +10528,11 @@ static int wdc_vs_drive_info(int argc, char **argv, minor_rev = ctrl.sn[13]; if (fmt == NORMAL) { - printf("Drive HW Revision: %c.%c \n", major_rev, minor_rev); + printf("Drive HW Revision: %c.%c\n", major_rev, minor_rev); printf("Customer SN: %-.*s\n", 14, &ctrl.sn[0]); - } - else if (fmt == JSON) { - root = json_create_object(); - sprintf(rev_str, "%c.%c", major_rev, minor_rev); + } else if (fmt == JSON) { + root = json_create_object(); + sprintf(rev_str, "%c.%c", major_rev, minor_rev); json_object_add_value_string(root, "Drive HW Revison", rev_str); wdc_StrFormat(formatter, sizeof(formatter), &ctrl.sn[0], 14); json_object_add_value_string(root, "Customer SN", formatter); @@ -10439,21 +10547,22 @@ static int wdc_vs_drive_info(int argc, char **argv, /* Get the Drive HW Rev from the C6 Log page */ ret = nvme_get_hw_rev_log(dev_fd(dev), &data, 0, NVME_NSID_ALL); - if (ret == 0) { - wdc_nvme_hw_rev_log *log_data = (wdc_nvme_hw_rev_log *)data; + if (!ret) { + struct wdc_nvme_hw_rev_log *log_data = (struct wdc_nvme_hw_rev_log *)data; + major_rev = log_data->hw_rev_gdr; free(data); data = NULL; } else { - fprintf(stderr, "ERROR : WDC: %s: failure to get hw revision log\n", __func__); + fprintf(stderr, "ERROR: WDC: %s: failure to get hw revision log\n", __func__); ret = -1; goto out; } /* Get the Smart C0 log page */ - if ((capabilities & WDC_DRIVE_CAP_CLOUD_LOG_PAGE) == 0) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + if (!(capabilities & WDC_DRIVE_CAP_CLOUD_LOG_PAGE)) { + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; } @@ -10461,8 +10570,8 @@ static int wdc_vs_drive_info(int argc, char **argv, ret = nvme_get_ext_smart_cloud_log(dev_fd(dev), &data, 0, NVME_NSID_ALL); - if (ret == 0) { - ext_smart_log_ptr = (wdc_nvme_ext_smart_log *)data; + if (!ret) { + ext_smart_log_ptr = (struct __packed wdc_nvme_ext_smart_log *)data; /* Set the FTL Unit size */ ftl_unit_size = le32_to_cpu(ext_smart_log_ptr->ext_smart_ftlus); @@ -10475,7 +10584,7 @@ static int wdc_vs_drive_info(int argc, char **argv, tcg_dev_ownership = le32_to_cpu(ext_smart_log_ptr->ext_smart_tcgos); free(data); } else { - fprintf(stderr, "ERROR : WDC: %s: failure to get extended smart cloud log\n", __func__); + fprintf(stderr, "ERROR: WDC: %s: failure to get extended smart cloud log\n", __func__); ret = -1; goto out; } @@ -10486,13 +10595,12 @@ static int wdc_vs_drive_info(int argc, char **argv, printf("HyperScale Boot Version Spec: %d.%d\n", boot_spec_major, boot_spec_minor); printf("TCG Device Ownership Status: %2d\n", tcg_dev_ownership); - } - else if (fmt == JSON) { - root = json_create_object(); + } else if (fmt == JSON) { + root = json_create_object(); json_object_add_value_int(root, "Drive HW Revison", major_rev); json_object_add_value_int(root, "FTL Unit Size", ftl_unit_size); - sprintf(rev_str, "%d.%d", boot_spec_major, boot_spec_minor); + sprintf(rev_str, "%d.%d", boot_spec_major, boot_spec_minor); json_object_add_value_string(root, "HyperScale Boot Version Spec", rev_str); json_object_add_value_int(root, "TCG Device Ownership Status", tcg_dev_ownership); @@ -10504,12 +10612,12 @@ static int wdc_vs_drive_info(int argc, char **argv, break; default: - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; break; } } else { - fprintf(stderr, "ERROR : WDC: capability not supported by this device\n"); + fprintf(stderr, "ERROR: WDC: capability not supported by this device\n"); ret = -1; } @@ -10529,7 +10637,7 @@ static int wdc_vs_temperature_stats(int argc, char **argv, struct nvme_dev *dev; nvme_root_t r; uint64_t capabilities = 0; - __u32 hctm_tmt; + __u32 hctm_tmt; int temperature, temp_tmt1, temp_tmt2; int ret, fmt = -1; @@ -10553,7 +10661,7 @@ static int wdc_vs_temperature_stats(int argc, char **argv, r = nvme_scan(NULL); fmt = validate_output_format(cfg.output_format); if (fmt < 0) { - fprintf(stderr, "ERROR : WDC : invalid output format\n"); + fprintf(stderr, "ERROR: WDC: invalid output format\n"); ret = fmt; goto out; } @@ -10562,18 +10670,18 @@ static int wdc_vs_temperature_stats(int argc, char **argv, wdc_check_device(r, dev); capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRIVE_CAP_TEMP_STATS) != WDC_DRIVE_CAP_TEMP_STATS) { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); ret = -1; goto out; - } + } - /* get the temperature stats or report errors */ + /* get the temperature stats or report errors */ ret = nvme_identify_ctrl(dev_fd(dev), &id_ctrl); - if (ret != 0) + if (ret) goto out; ret = nvme_get_log_smart(dev_fd(dev), NVME_NSID_ALL, false, &smart_log); - if (ret != 0) + if (ret) goto out; /* convert from kelvins to degrees Celsius */ @@ -10581,10 +10689,10 @@ static int wdc_vs_temperature_stats(int argc, char **argv, /* retrieve HCTM Thermal Management Temperatures */ nvme_get_features_simple(dev_fd(dev), 0x10, 0, &hctm_tmt); - temp_tmt1 = ((hctm_tmt >> 16) & 0xffff) ? ((hctm_tmt >> 16) & 0xffff) - 273 : 0; - temp_tmt2 = (hctm_tmt & 0xffff) ? (hctm_tmt & 0xffff) - 273 : 0; + temp_tmt1 = ((hctm_tmt >> 16) & 0xffff) ? ((hctm_tmt >> 16) & 0xffff) - 273 : 0; + temp_tmt2 = (hctm_tmt & 0xffff) ? (hctm_tmt & 0xffff) - 273 : 0; - if (fmt == NORMAL) { + if (fmt == NORMAL) { /* print the temperature stats */ printf("Temperature Stats for NVME device:%s namespace-id:%x\n", dev->name, WDC_DE_GLOBAL_NSID); @@ -10603,10 +10711,10 @@ static int wdc_vs_temperature_stats(int argc, char **argv, printf("TMT2 Transition Counter : %"PRIu32"\n", smart_log.thm_temp2_trans_count); printf("TMT2 Total Time : %"PRIu32"\n", smart_log.thm_temp2_total_time); printf("Thermal Shutdown Threshold : 95 °C\n"); - } - else if (fmt == JSON) { - struct json_object *root; - root = json_create_object(); + } else if (fmt == JSON) { + struct json_object *root; + + root = json_create_object(); json_object_add_value_int(root, "Current Composite Temperature", le32_to_cpu(temperature)); json_object_add_value_int(root, "WCTEMP", le16_to_cpu(id_ctrl.wctemp - 273)); @@ -10627,9 +10735,9 @@ static int wdc_vs_temperature_stats(int argc, char **argv, printf("\n"); json_free_object(root); - } - else - printf("%s: Invalid format\n", __func__); + } else { + printf("%s: Invalid format\n", __func__); + } out: nvme_show_status(ret); @@ -10638,114 +10746,112 @@ out: return ret; } -static int wdc_capabilities(int argc, char **argv, - struct command *command, struct plugin *plugin) -{ - const char *desc = "Send a capabilities command."; - uint64_t capabilities = 0; - struct nvme_dev *dev; - nvme_root_t r; - int ret; - - OPT_ARGS(opts) = - { - OPT_END() - }; - - ret = parse_and_open(&dev, argc, argv, desc, opts); - if (ret) - return ret; - - /* get capabilities */ - r = nvme_scan(NULL); - wdc_check_device(r, dev); - capabilities = wdc_get_drive_capabilities(r, dev); - - /* print command and supported status */ - printf("WDC Plugin Capabilities for NVME device:%s\n", dev->name); - printf("cap-diag : %s\n", - capabilities & WDC_DRIVE_CAP_CAP_DIAG ? "Supported" : "Not Supported"); - printf("drive-log : %s\n", - capabilities & WDC_DRIVE_CAP_DRIVE_LOG ? "Supported" : "Not Supported"); - printf("get-crash-dump : %s\n", - capabilities & WDC_DRIVE_CAP_CRASH_DUMP ? "Supported" : "Not Supported"); - printf("get-pfail-dump : %s\n", - capabilities & WDC_DRIVE_CAP_PFAIL_DUMP ? "Supported" : "Not Supported"); - printf("id-ctrl : Supported\n"); - printf("purge : %s\n", - capabilities & WDC_DRIVE_CAP_PURGE ? "Supported" : "Not Supported"); - printf("purge-monitor : %s\n", - capabilities & WDC_DRIVE_CAP_PURGE ? "Supported" : "Not Supported"); - printf("vs-internal-log : %s\n", - capabilities & WDC_DRIVE_CAP_INTERNAL_LOG_MASK ? "Supported" : "Not Supported"); - printf("vs-nand-stats : %s\n", - capabilities & WDC_DRIVE_CAP_NAND_STATS ? "Supported" : "Not Supported"); - printf("vs-smart-add-log : %s\n", - capabilities & WDC_DRIVE_CAP_SMART_LOG_MASK ? "Supported" : "Not Supported"); - printf("--C0 Log Page : %s\n", - capabilities & WDC_DRIVE_CAP_C0_LOG_PAGE ? "Supported" : "Not Supported"); - printf("--C1 Log Page : %s\n", - capabilities & WDC_DRIVE_CAP_C1_LOG_PAGE ? "Supported" : "Not Supported"); - printf("--C3 Log Page : %s\n", - capabilities & WDC_DRIVE_CAP_C3_LOG_PAGE ? "Supported" : "Not Supported"); - printf("--CA Log Page : %s\n", - capabilities & WDC_DRIVE_CAP_CA_LOG_PAGE ? "Supported" : "Not Supported"); - printf("--D0 Log Page : %s\n", - capabilities & WDC_DRIVE_CAP_D0_LOG_PAGE ? "Supported" : "Not Supported"); - printf("clear-pcie-correctable-errors : %s\n", - capabilities & WDC_DRIVE_CAP_CLEAR_PCIE_MASK ? "Supported" : "Not Supported"); - printf("drive-essentials : %s\n", - capabilities & WDC_DRIVE_CAP_DRIVE_ESSENTIALS ? "Supported" : "Not Supported"); - printf("get-drive-status : %s\n", - capabilities & WDC_DRIVE_CAP_DRIVE_STATUS ? "Supported" : "Not Supported"); - printf("clear-assert-dump : %s\n", - capabilities & WDC_DRIVE_CAP_CLEAR_ASSERT ? "Supported" : "Not Supported"); - printf("drive-resize : %s\n", - capabilities & WDC_DRIVE_CAP_RESIZE ? "Supported" : "Not Supported"); - printf("vs-fw-activate-history : %s\n", - capabilities & WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_MASK ? "Supported" : "Not Supported"); - printf("clear-fw-activate-history : %s\n", - capabilities & WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY_MASK ? "Supported" : "Not Supported"); - printf("vs-telemetry-controller-option: %s\n", - capabilities & WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG ? "Supported" : "Not Supported"); - printf("vs-error-reason-identifier : %s\n", - capabilities & WDC_DRIVE_CAP_REASON_ID ? "Supported" : "Not Supported"); - printf("log-page-directory : %s\n", - capabilities & WDC_DRIVE_CAP_LOG_PAGE_DIR ? "Supported" : "Not Supported"); - printf("namespace-resize : %s\n", - capabilities & WDC_DRIVE_CAP_NS_RESIZE ? "Supported" : "Not Supported"); - printf("vs-drive-info : %s\n", - capabilities & WDC_DRIVE_CAP_INFO ? "Supported" : "Not Supported"); - printf("vs-temperature-stats : %s\n", - capabilities & WDC_DRIVE_CAP_TEMP_STATS ? "Supported" : "Not Supported"); - printf("cloud-SSD-plugin-version : %s\n", - capabilities & WDC_DRIVE_CAP_CLOUD_SSD_VERSION ? "Supported" : "Not Supported"); - printf("vs-pcie-stats : %s\n", - capabilities & WDC_DRIVE_CAP_PCIE_STATS ? "Supported" : "Not Supported"); - printf("get-error-recovery-log : %s\n", - capabilities & WDC_DRIVE_CAP_OCP_C1_LOG_PAGE ? "Supported" : "Not Supported"); - printf("get-dev-capabilities-log : %s\n", - capabilities & WDC_DRIVE_CAP_OCP_C4_LOG_PAGE ? "Supported" : "Not Supported"); - printf("get-unsupported-reqs-log : %s\n", - capabilities & WDC_DRIVE_CAP_OCP_C5_LOG_PAGE ? "Supported" : "Not Supported"); - printf("get-latency-monitor-log : %s\n", - capabilities & WDC_DRIVE_CAP_C3_LOG_PAGE ? "Supported" : "Not Supported"); - printf("cloud-boot-SSD-version : %s\n", - capabilities & WDC_DRIVE_CAP_CLOUD_BOOT_SSD_VERSION ? "Supported" : "Not Supported"); - printf("vs-cloud-log : %s\n", - capabilities & WDC_DRIVE_CAP_CLOUD_LOG_PAGE ? "Supported" : "Not Supported"); - printf("vs-hw-rev-log : %s\n", - capabilities & WDC_DRIVE_CAP_HW_REV_LOG_PAGE ? "Supported" : "Not Supported"); - printf("vs-device_waf : %s\n", - capabilities & WDC_DRIVE_CAP_DEVICE_WAF ? "Supported" : "Not Supported"); - printf("capabilities : Supported\n"); - nvme_free_tree(r); - dev_close(dev); - return 0; -} - -static int wdc_cloud_ssd_plugin_version(int argc, char **argv, - struct command *command, struct plugin *plugin) +static int wdc_capabilities(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "Send a capabilities command."; + uint64_t capabilities = 0; + struct nvme_dev *dev; + nvme_root_t r; + int ret; + + OPT_ARGS(opts) = { + OPT_END() + }; + + ret = parse_and_open(&dev, argc, argv, desc, opts); + if (ret) + return ret; + + /* get capabilities */ + r = nvme_scan(NULL); + wdc_check_device(r, dev); + capabilities = wdc_get_drive_capabilities(r, dev); + + /* print command and supported status */ + printf("WDC Plugin Capabilities for NVME device:%s\n", dev->name); + printf("cap-diag : %s\n", + capabilities & WDC_DRIVE_CAP_CAP_DIAG ? "Supported" : "Not Supported"); + printf("drive-log : %s\n", + capabilities & WDC_DRIVE_CAP_DRIVE_LOG ? "Supported" : "Not Supported"); + printf("get-crash-dump : %s\n", + capabilities & WDC_DRIVE_CAP_CRASH_DUMP ? "Supported" : "Not Supported"); + printf("get-pfail-dump : %s\n", + capabilities & WDC_DRIVE_CAP_PFAIL_DUMP ? "Supported" : "Not Supported"); + printf("id-ctrl : Supported\n"); + printf("purge : %s\n", + capabilities & WDC_DRIVE_CAP_PURGE ? "Supported" : "Not Supported"); + printf("purge-monitor : %s\n", + capabilities & WDC_DRIVE_CAP_PURGE ? "Supported" : "Not Supported"); + printf("vs-internal-log : %s\n", + capabilities & WDC_DRIVE_CAP_INTERNAL_LOG_MASK ? "Supported" : "Not Supported"); + printf("vs-nand-stats : %s\n", + capabilities & WDC_DRIVE_CAP_NAND_STATS ? "Supported" : "Not Supported"); + printf("vs-smart-add-log : %s\n", + capabilities & WDC_DRIVE_CAP_SMART_LOG_MASK ? "Supported" : "Not Supported"); + printf("--C0 Log Page : %s\n", + capabilities & WDC_DRIVE_CAP_C0_LOG_PAGE ? "Supported" : "Not Supported"); + printf("--C1 Log Page : %s\n", + capabilities & WDC_DRIVE_CAP_C1_LOG_PAGE ? "Supported" : "Not Supported"); + printf("--C3 Log Page : %s\n", + capabilities & WDC_DRIVE_CAP_C3_LOG_PAGE ? "Supported" : "Not Supported"); + printf("--CA Log Page : %s\n", + capabilities & WDC_DRIVE_CAP_CA_LOG_PAGE ? "Supported" : "Not Supported"); + printf("--D0 Log Page : %s\n", + capabilities & WDC_DRIVE_CAP_D0_LOG_PAGE ? "Supported" : "Not Supported"); + printf("clear-pcie-correctable-errors : %s\n", + capabilities & WDC_DRIVE_CAP_CLEAR_PCIE_MASK ? "Supported" : "Not Supported"); + printf("drive-essentials : %s\n", + capabilities & WDC_DRIVE_CAP_DRIVE_ESSENTIALS ? "Supported" : "Not Supported"); + printf("get-drive-status : %s\n", + capabilities & WDC_DRIVE_CAP_DRIVE_STATUS ? "Supported" : "Not Supported"); + printf("clear-assert-dump : %s\n", + capabilities & WDC_DRIVE_CAP_CLEAR_ASSERT ? "Supported" : "Not Supported"); + printf("drive-resize : %s\n", + capabilities & WDC_DRIVE_CAP_RESIZE ? "Supported" : "Not Supported"); + printf("vs-fw-activate-history : %s\n", + capabilities & WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_MASK ? "Supported" : "Not Supported"); + printf("clear-fw-activate-history : %s\n", + capabilities & WDC_DRIVE_CAP_CLEAR_FW_ACT_HISTORY_MASK ? "Supported" : "Not Supported"); + printf("vs-telemetry-controller-option: %s\n", + capabilities & WDC_DRVIE_CAP_DISABLE_CTLR_TELE_LOG ? "Supported" : "Not Supported"); + printf("vs-error-reason-identifier : %s\n", + capabilities & WDC_DRIVE_CAP_REASON_ID ? "Supported" : "Not Supported"); + printf("log-page-directory : %s\n", + capabilities & WDC_DRIVE_CAP_LOG_PAGE_DIR ? "Supported" : "Not Supported"); + printf("namespace-resize : %s\n", + capabilities & WDC_DRIVE_CAP_NS_RESIZE ? "Supported" : "Not Supported"); + printf("vs-drive-info : %s\n", + capabilities & WDC_DRIVE_CAP_INFO ? "Supported" : "Not Supported"); + printf("vs-temperature-stats : %s\n", + capabilities & WDC_DRIVE_CAP_TEMP_STATS ? "Supported" : "Not Supported"); + printf("cloud-SSD-plugin-version : %s\n", + capabilities & WDC_DRIVE_CAP_CLOUD_SSD_VERSION ? "Supported" : "Not Supported"); + printf("vs-pcie-stats : %s\n", + capabilities & WDC_DRIVE_CAP_PCIE_STATS ? "Supported" : "Not Supported"); + printf("get-error-recovery-log : %s\n", + capabilities & WDC_DRIVE_CAP_OCP_C1_LOG_PAGE ? "Supported" : "Not Supported"); + printf("get-dev-capabilities-log : %s\n", + capabilities & WDC_DRIVE_CAP_OCP_C4_LOG_PAGE ? "Supported" : "Not Supported"); + printf("get-unsupported-reqs-log : %s\n", + capabilities & WDC_DRIVE_CAP_OCP_C5_LOG_PAGE ? "Supported" : "Not Supported"); + printf("get-latency-monitor-log : %s\n", + capabilities & WDC_DRIVE_CAP_C3_LOG_PAGE ? "Supported" : "Not Supported"); + printf("cloud-boot-SSD-version : %s\n", + capabilities & WDC_DRIVE_CAP_CLOUD_BOOT_SSD_VERSION ? "Supported" : "Not Supported"); + printf("vs-cloud-log : %s\n", + capabilities & WDC_DRIVE_CAP_CLOUD_LOG_PAGE ? "Supported" : "Not Supported"); + printf("vs-hw-rev-log : %s\n", + capabilities & WDC_DRIVE_CAP_HW_REV_LOG_PAGE ? "Supported" : "Not Supported"); + printf("vs-device_waf : %s\n", + capabilities & WDC_DRIVE_CAP_DEVICE_WAF ? "Supported" : "Not Supported"); + printf("capabilities : Supported\n"); + nvme_free_tree(r); + dev_close(dev); + return 0; +} + +static int wdc_cloud_ssd_plugin_version(int argc, char **argv, struct command *command, + struct plugin *plugin) { const char *desc = "Get Cloud SSD Plugin Version command."; uint64_t capabilities = 0; @@ -10767,10 +10873,10 @@ static int wdc_cloud_ssd_plugin_version(int argc, char **argv, capabilities = wdc_get_drive_capabilities(r, dev); if ((capabilities & WDC_DRIVE_CAP_CLOUD_SSD_VERSION) == WDC_DRIVE_CAP_CLOUD_SSD_VERSION) { - /* print command and supported status */ - printf("WDC Cloud SSD Plugin Version: 1.0\n"); + /* print command and supported status */ + printf("WDC Cloud SSD Plugin Version: 1.0\n"); } else { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); } nvme_free_tree(r); @@ -10778,8 +10884,8 @@ static int wdc_cloud_ssd_plugin_version(int argc, char **argv, return 0; } -static int wdc_cloud_boot_SSD_version(int argc, char **argv, - struct command *command, struct plugin *plugin) +static int wdc_cloud_boot_SSD_version(int argc, char **argv, struct command *command, + struct plugin *plugin) { const char *desc = "Get Cloud Boot SSD Version command."; const char *namespace_id = "desired namespace id"; @@ -10789,7 +10895,7 @@ static int wdc_cloud_boot_SSD_version(int argc, char **argv, int ret; int major = 0, minor = 0; __u8 *data = NULL; - wdc_nvme_ext_smart_log *ext_smart_log_ptr = NULL; + struct __packed wdc_nvme_ext_smart_log * ext_smart_log_ptr = NULL; struct config { __u32 namespace_id; @@ -10818,23 +10924,22 @@ static int wdc_cloud_boot_SSD_version(int argc, char **argv, ret = nvme_get_ext_smart_cloud_log(dev_fd(dev), &data, 0, cfg.namespace_id); - ext_smart_log_ptr = (wdc_nvme_ext_smart_log *)data; - if (ret == 0) { + ext_smart_log_ptr = (struct __packed wdc_nvme_ext_smart_log *)data; + if (!ret) { major = le16_to_cpu(ext_smart_log_ptr->ext_smart_maj); minor = le16_to_cpu(ext_smart_log_ptr->ext_smart_min); - /* print the version returned from the log page */ - printf("HyperScale Boot Version: %d.%d\n", major, minor); - + /* print the version returned from the log page */ + printf("HyperScale Boot Version: %d.%d\n", major, minor); } else { - fprintf(stderr, "ERROR : WDC : Unable to read Extended Smart/C0 Log Page data\n"); + fprintf(stderr, "ERROR: WDC: Unable to read Extended Smart/C0 Log Page data\n"); ret = -1; } if (data) free(data); } else { - fprintf(stderr, "ERROR : WDC: unsupported device for this command\n"); + fprintf(stderr, "ERROR: WDC: unsupported device for this command\n"); } nvme_free_tree(r); @@ -10842,8 +10947,7 @@ static int wdc_cloud_boot_SSD_version(int argc, char **argv, return ret; } -static int wdc_enc_get_log(int argc, char **argv, struct command *command, - struct plugin *plugin) +static int wdc_enc_get_log(int argc, char **argv, struct command *command, struct plugin *plugin) { char *desc = "Get Enclosure Log."; char *file = "Output file pathname."; @@ -10884,14 +10988,17 @@ static int wdc_enc_get_log(int argc, char **argv, struct command *command, } if (cfg.log_id > 0xff) { - fprintf(stderr, "Invalid log identifier: %d. Valid 0xd1, 0xd2, 0xd3, 0xd4, 0xe2, 0xe4\n", cfg.log_id); + fprintf(stderr, + "Invalid log identifier: %d. Valid 0xd1, 0xd2, 0xd3, 0xd4, 0xe2, 0xe4\n", + cfg.log_id); goto closed_fd; } - if (cfg.xfer_size != 0) { + if (cfg.xfer_size) { xfer_size = cfg.xfer_size; if (!wdc_check_power_of_2(cfg.xfer_size)) { - fprintf(stderr, "%s: ERROR : xfer-size (%d) must be a power of 2\n", __func__, cfg.xfer_size); + fprintf(stderr, "%s: ERROR: xfer-size (%d) must be a power of 2\n", + __func__, cfg.xfer_size); err = -EINVAL; goto closed_fd; } @@ -10900,28 +11007,30 @@ static int wdc_enc_get_log(int argc, char **argv, struct command *command, /* Log IDs are only for specific enclosures */ if (cfg.log_id) { xfer_size = (xfer_size) ? xfer_size : WDC_NVME_ENC_LOG_SIZE_CHUNK; - len = cfg.file==NULL?0:strlen(cfg.file); + len = !cfg.file ? 0 : strlen(cfg.file); if (len > 0) { - output_fd = fopen(cfg.file,"wb"); - if (output_fd == 0) { - fprintf(stderr, "%s: ERROR : opening:%s : %s\n", __func__,cfg.file, strerror(errno)); + output_fd = fopen(cfg.file, "wb"); + if (!output_fd) { + fprintf(stderr, "%s: ERROR: opening:%s: %s\n", __func__, cfg.file, + strerror(errno)); err = -EINVAL; goto closed_fd; } } else { output_fd = stdout; } - if (cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_1 || cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_2 - || cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_3 || cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_4) { - fprintf(stderr, "args - sz:%x logid:%x of:%s\n",xfer_size,cfg.log_id,cfg.file); - err = wdc_enc_get_nic_log(dev, cfg.log_id, - xfer_size, - WDC_NVME_ENC_NIC_LOG_SIZE, - output_fd); + if (cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_1 || + cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_2 || + cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_3 || + cfg.log_id == WDC_ENC_NIC_CRASH_DUMP_ID_SLOT_4) { + fprintf(stderr, "args - sz:%x logid:%x of:%s\n", xfer_size, cfg.log_id, + cfg.file); + err = wdc_enc_get_nic_log(dev, cfg.log_id, xfer_size, + WDC_NVME_ENC_NIC_LOG_SIZE, output_fd); } else { - fprintf(stderr, "args - sz:%x logid:%x of:%s\n",xfer_size,cfg.log_id,cfg.file); - err = wdc_enc_submit_move_data(dev, NULL, 0, - xfer_size, output_fd, + fprintf(stderr, "args - sz:%x logid:%x of:%s\n", xfer_size, cfg.log_id, + cfg.file); + err = wdc_enc_submit_move_data(dev, NULL, 0, xfer_size, output_fd, cfg.log_id, 0, 0); } @@ -10929,7 +11038,8 @@ static int wdc_enc_get_log(int argc, char **argv, struct command *command, fprintf(stderr, "No Log/Crashdump available\n"); err = 0; } else if (err) { - fprintf(stderr, "ERROR:0x%x Failed to collect log-id:%x \n",err, cfg.log_id); + fprintf(stderr, "ERROR: 0x%x Failed to collect log-id:%x\n", err, + cfg.log_id); } } closed_fd: @@ -10950,8 +11060,8 @@ static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, char *buf; buf = (char *)malloc(sizeof(__u8) * xfer_size); - if (buf == NULL) { - fprintf(stderr, "%s: ERROR : malloc : %s\n", __func__, strerror(errno)); + if (!buf) { + fprintf(stderr, "%s: ERROR: malloc: %s\n", __func__, strerror(errno)); return -1; } /* send something no matter what */ @@ -10962,7 +11072,7 @@ static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, .opcode = WDC_NVME_ADMIN_ENC_MGMT_SND, .nsid = 0, .addr = (__u64)(uintptr_t) cmd, - .data_len = ((len + sizeof(uint32_t) - 1)/sizeof(uint32_t)) * sizeof(uint32_t), + .data_len = ((len + sizeof(uint32_t) - 1) / sizeof(uint32_t)) * sizeof(uint32_t), .cdw10 = len, .cdw12 = log_id, .cdw13 = 0, @@ -10972,36 +11082,32 @@ static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, clock_gettime(CLOCK_REALTIME, &time); srand(time.tv_nsec); - handle = random(); /* Handle to associate send request with receive request */ + handle = random(); /* Handle to associate send request with receive request */ nvme_cmd.cdw11 = handle; #ifdef WDC_NVME_CLI_DEBUG - unsigned char *d = (unsigned char*) nvme_cmd.addr; - unsigned char *md = (unsigned char*) nvme_cmd.metadata; - printf("NVME_ADMIN_COMMAND:\n" \ - "opcode: 0x%02x, flags: 0x%02x, rsvd: 0x%04x, nsid: 0x%08x, cdw2: 0x%08x, cdw3: 0x%08x, " \ - "metadata_len: 0x%08x, data_len: 0x%08x, cdw10: 0x%08x, cdw11: 0x%08x, cdw12: 0x%08x, " \ - "cdw13: 0x%08x, cdw14: 0x%08x, cdw15: 0x%08x, timeout_ms: 0x%08x, result: 0x%08x, " \ - "metadata: %s, " \ - "data: %s\n", \ - nvme_cmd.opcode, nvme_cmd.flags, nvme_cmd.rsvd1, nvme_cmd.nsid, nvme_cmd.cdw2, nvme_cmd.cdw3, \ - nvme_cmd.metadata_len, nvme_cmd.data_len, nvme_cmd.cdw10, nvme_cmd.cdw11, nvme_cmd.cdw12, \ - nvme_cmd.cdw13, nvme_cmd.cdw14, nvme_cmd.cdw15, nvme_cmd.timeout_ms, nvme_cmd.result, - md, \ - d); + unsigned char *d = (unsigned char *)nvme_cmd.addr; + unsigned char *md = (unsigned char *)nvme_cmd.metadata; + + printf("NVME_ADMIN_COMMAND:\n"); + printf("opcode: 0x%02x, flags: 0x%02x, rsvd: 0x%04x, nsid: 0x%08x, cdw2: 0x%08x, ", + nvme_cmd.opcode, nvme_cmd.flags, nvme_cmd.rsvd1, nvme_cmd.nsid, nvme_cmd.cdw2); + printf("cdw3: 0x%08x, metadata_len: 0x%08x, data_len: 0x%08x, cdw10: 0x%08x, " + nvme_cmd.cdw3, nvme_cmd.metadata_len, nvme_cmd.data_len, nvme_cmd.cdw10); + printf("cdw11: 0x%08x, cdw12: 0x%08x, cdw13: 0x%08x, cdw14: 0x%08x, cdw15: 0x%08x, " + nvme_cmd.cdw11, nvme_cmd.cdw12, nvme_cmd.cdw13, nvme_cmd.cdw14, nvme_cmd.cdw15); + printf("timeout_ms: 0x%08x, result: 0x%08x, metadata: %s, data: %s\n", + nvme_cmd.timeout_ms, nvme_cmd.result, md, d); #endif nvme_cmd.result = 0; err = nvme_submit_admin_passthru(dev_fd(dev), &nvme_cmd, NULL); if (nvme_status_equals(err, NVME_STATUS_TYPE_NVME, NVME_SC_INTERNAL)) { - fprintf(stderr, "%s: WARNING : WDC : No log ID:x%x available\n", - __func__, log_id); - } - else if (err != 0) { - fprintf(stderr, "%s: ERROR : WDC : NVMe Snd Mgmt\n", __func__); + fprintf(stderr, "%s: WARNING : WDC: No log ID:x%x available\n", __func__, log_id); + } else if (err) { + fprintf(stderr, "%s: ERROR: WDC: NVMe Snd Mgmt\n", __func__); nvme_show_status(err); } else { - if (nvme_cmd.result == WDC_RESULT_NOT_AVAILABLE) - { + if (nvme_cmd.result == WDC_RESULT_NOT_AVAILABLE) { free(buf); return WDC_RESULT_NOT_AVAILABLE; } @@ -11021,9 +11127,9 @@ static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, nvme_cmd.result = 0; /* returned result !=0 indicates more data available */ err = nvme_submit_admin_passthru(dev_fd(dev), &nvme_cmd, NULL); - if (err != 0) { + if (err) { more = 0; - fprintf(stderr, "%s: ERROR : WDC : NVMe Rcv Mgmt ", __func__); + fprintf(stderr, "%s: ERROR: WDC: NVMe Rcv Mgmt ", __func__); nvme_show_status(err); } else { more = nvme_cmd.result & WDC_RESULT_MORE_DATA; @@ -11031,7 +11137,7 @@ static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, fwrite(buf, response_size, 1, out); offset += response_size; if (more && (response_size & (sizeof(uint32_t)-1))) { - fprintf(stderr, "%s: ERROR : WDC : NVMe Rcv Mgmt response size:x%x not LW aligned\n", + fprintf(stderr, "%s: ERROR: WDC: NVMe Rcv Mgmt response size:x%x not LW aligned\n", __func__, response_size); } } @@ -11052,13 +11158,13 @@ static int wdc_enc_get_nic_log(struct nvme_dev *dev, __u8 log_id, __u32 xfer_siz __u32 numd; __u16 numdu, numdl; - dump_data = (__u8 *) malloc(sizeof (__u8) * dump_length); - if (dump_data == NULL) { - fprintf(stderr, "%s: ERROR : malloc : %s\n",__func__, strerror(errno)); + dump_data = (__u8 *)malloc(sizeof(__u8) * dump_length); + if (!dump_data) { + fprintf(stderr, "%s: ERROR: malloc: %s\n", __func__, strerror(errno)); return -1; } - memset(dump_data, 0, sizeof (__u8) * dump_length); - memset(&admin_cmd, 0, sizeof (struct nvme_passthru_cmd)); + memset(dump_data, 0, sizeof(__u8) * dump_length); + memset(&admin_cmd, 0, sizeof(struct nvme_passthru_cmd)); curr_data_offset = 0; curr_data_len = xfer_size; i = 0; @@ -11075,14 +11181,16 @@ static int wdc_enc_get_nic_log(struct nvme_dev *dev, __u8 log_id, __u32 xfer_siz while (curr_data_offset < data_len) { #ifdef WDC_NVME_CLI_DEBUG - fprintf(stderr, "nsid 0x%08x addr 0x%08llx, data_len 0x%08x, cdw10 0x%08x, cdw11 0x%08x, cdw12 0x%08x, cdw13 0x%08x, cdw14 0x%08x \n", admin_cmd.nsid, admin_cmd.addr, admin_cmd.data_len, admin_cmd.cdw10, admin_cmd.cdw11, admin_cmd.cdw12, admin_cmd.cdw13, admin_cmd.cdw14); + fprintf(stderr, + "nsid 0x%08x addr 0x%08llx, data_len 0x%08x, cdw10 0x%08x, cdw11 0x%08x, cdw12 0x%08x, cdw13 0x%08x, cdw14 0x%08x\n", + admin_cmd.nsid, admin_cmd.addr, admin_cmd.data_len, admin_cmd.cdw10, + admin_cmd.cdw11, admin_cmd.cdw12, admin_cmd.cdw13, admin_cmd.cdw14); #endif - ret = nvme_submit_admin_passthru(dev_fd(dev), &admin_cmd, - NULL); - if (ret != 0) { + ret = nvme_submit_admin_passthru(dev_fd(dev), &admin_cmd, NULL); + if (ret) { nvme_show_status(ret); - fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n", - __func__, i, admin_cmd.data_len, curr_data_offset, (long unsigned int)admin_cmd.addr); + fprintf(stderr, "%s: ERROR: WDC: Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n", + __func__, i, admin_cmd.data_len, curr_data_offset, (unsigned long)admin_cmd.addr); break; } diff --git a/plugins/wdc/wdc-utils.c b/plugins/wdc/wdc-utils.c index 38e61ed..3b60772 100644 --- a/plugins/wdc/wdc-utils.c +++ b/plugins/wdc/wdc-utils.c @@ -38,7 +38,7 @@ int wdc_UtilsSnprintf(char *buffer, unsigned int sizeOfBuffer, const char *forma return res; } -void wdc_UtilsDeleteCharFromString(char* buffer, int buffSize, char charToRemove) +void wdc_UtilsDeleteCharFromString(char *buffer, int buffSize, char charToRemove) { int i = 0; int count = 0; @@ -62,7 +62,7 @@ int wdc_UtilsGetTime(PUtilsTimeInfo timeInfo) time_t currTime; struct tm currTimeInfo; - if(!timeInfo) + if (!timeInfo) return WDC_STATUS_INVALID_PARAMETER; tzset(); @@ -81,7 +81,7 @@ int wdc_UtilsGetTime(PUtilsTimeInfo timeInfo) #if defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__) timeInfo->zone = -currTimeInfo.tm_gmtoff / 60; #else - timeInfo->zone = -1 * (timezone / SECONDS_IN_MIN); + timeInfo->zone = -1 * (timezone / SECONDS_IN_MIN); #endif return WDC_STATUS_SUCCESS; @@ -92,7 +92,7 @@ int wdc_UtilsCreateDir(char *path) int retStatus; int status = WDC_STATUS_SUCCESS; - if (!path ) + if (!path) return WDC_STATUS_INVALID_PARAMETER; retStatus = mkdir(path, 0x999); @@ -125,7 +125,7 @@ int wdc_WriteToFile(char *fileName, char *buffer, unsigned int bufferLen) status = WDC_STATUS_UNABLE_TO_WRITE_ALL_DATA; end: - if(file) + if (file) fclose(file); return status; } @@ -151,9 +151,7 @@ int wdc_UtilsStrCompare(char *pcSrc, char *pcDst) void wdc_StrFormat(char *formatter, size_t fmt_sz, char *tofmt, size_t tofmtsz) { - - fmt_sz = snprintf(formatter,fmt_sz, "%-*.*s", - (int)tofmtsz, (int)tofmtsz, tofmt); + fmt_sz = snprintf(formatter, fmt_sz, "%-*.*s", (int)tofmtsz, (int)tofmtsz, tofmt); /* trim() the obnoxious trailing white lines */ while (fmt_sz) { if (formatter[fmt_sz - 1] != ' ' && formatter[fmt_sz - 1] != '\0') { |