nvmecontrol: fix wrong temperature unit for INTEL SSDs.
Although intel's specification did not tell which unit for Temperature Statistics (Log Identifier C5h), I believe it is based on Celsius instead of Kelvin. here is my P3700 SSDs result(before): Intel Temperature Log ===================== Current: 30 K, -243.15 C, -405.67 F Overtemp Last Flags 0 Overtemp Lifetime Flags 0 Max Temperature 53 K, -220.15 C, -364.27 F Min Temperature 17 K, -256.15 C, -429.07 F Max Operating Temperature 63 K, -210.15 C, -346.27 F Min Operating Temperature 0 K, -273.15 C, -459.67 F Estimated Temperature Offset: 0 C/K after apply the patch, result is Intel Temperature Log ===================== Current: 303.15 K, 30 C, 86.00 F Overtemp Last Flags 0 Overtemp Lifetime Flags 0 Max Temperature 326.15 K, 53 C, 127.40 F Min Temperature 290.15 K, 17 C, 62.60 F Max Operating Temperature 336.15 K, 63 C, 145.40 F Min Operating Temperature 273.15 K, 0 C, 32.00 F Estimated Temperature Offset: 0 C/K I also compare to smartctl's report. it match very well. also tested on Intel P3600, it fixed the problem. Signed-off-by: Wanpeng Qian <wanpengqian@gmail.com> Reviewed by: imp (added tweak to samsung.c so it still compiles) Differential Revision: https://reviews.freebsd.org/D32845
This commit is contained in:
parent
03d6764b38
commit
3a194eac3c
@ -319,11 +319,16 @@ print_log_error(const struct nvme_controller_data *cdata __unused, void *buf, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
print_temp(uint16_t t)
|
print_temp_K(uint16_t t)
|
||||||
{
|
{
|
||||||
printf("%u K, %2.2f C, %3.2f F\n", t, (float)t - 273.15, (float)t * 9 / 5 - 459.67);
|
printf("%u K, %2.2f C, %3.2f F\n", t, (float)t - 273.15, (float)t * 9 / 5 - 459.67);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_temp_C(uint16_t t)
|
||||||
|
{
|
||||||
|
printf("%2.2f K, %u C, %3.2f F\n", (float)t + 273.15, t, (float)t * 9 / 5 + 32);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_log_health(const struct nvme_controller_data *cdata __unused, void *buf, uint32_t size __unused)
|
print_log_health(const struct nvme_controller_data *cdata __unused, void *buf, uint32_t size __unused)
|
||||||
@ -350,7 +355,7 @@ print_log_health(const struct nvme_controller_data *cdata __unused, void *buf, u
|
|||||||
printf(" Volatile memory backup: %d\n",
|
printf(" Volatile memory backup: %d\n",
|
||||||
!!(warning & NVME_CRIT_WARN_ST_VOLATILE_MEMORY_BACKUP));
|
!!(warning & NVME_CRIT_WARN_ST_VOLATILE_MEMORY_BACKUP));
|
||||||
printf("Temperature: ");
|
printf("Temperature: ");
|
||||||
print_temp(health->temperature);
|
print_temp_K(health->temperature);
|
||||||
printf("Available spare: %u\n",
|
printf("Available spare: %u\n",
|
||||||
health->available_spare);
|
health->available_spare);
|
||||||
printf("Available spare threshold: %u\n",
|
printf("Available spare threshold: %u\n",
|
||||||
@ -385,7 +390,7 @@ print_log_health(const struct nvme_controller_data *cdata __unused, void *buf, u
|
|||||||
if (health->temp_sensor[i] == 0)
|
if (health->temp_sensor[i] == 0)
|
||||||
continue;
|
continue;
|
||||||
printf("Temperature Sensor %d: ", i + 1);
|
printf("Temperature Sensor %d: ", i + 1);
|
||||||
print_temp(health->temp_sensor[i]);
|
print_temp_K(health->temp_sensor[i]);
|
||||||
}
|
}
|
||||||
printf("Temperature 1 Transition Count: %d\n", health->tmt1tc);
|
printf("Temperature 1 Transition Count: %d\n", health->tmt1tc);
|
||||||
printf("Temperature 2 Transition Count: %d\n", health->tmt2tc);
|
printf("Temperature 2 Transition Count: %d\n", health->tmt2tc);
|
||||||
|
@ -64,17 +64,17 @@ print_intel_temp_stats(const struct nvme_controller_data *cdata __unused, void *
|
|||||||
printf("=====================\n");
|
printf("=====================\n");
|
||||||
|
|
||||||
printf("Current: ");
|
printf("Current: ");
|
||||||
print_temp(temp->current);
|
print_temp_C(temp->current);
|
||||||
printf("Overtemp Last Flags %#jx\n", (uintmax_t)temp->overtemp_flag_last);
|
printf("Overtemp Last Flags %#jx\n", (uintmax_t)temp->overtemp_flag_last);
|
||||||
printf("Overtemp Lifetime Flags %#jx\n", (uintmax_t)temp->overtemp_flag_life);
|
printf("Overtemp Lifetime Flags %#jx\n", (uintmax_t)temp->overtemp_flag_life);
|
||||||
printf("Max Temperature ");
|
printf("Max Temperature ");
|
||||||
print_temp(temp->max_temp);
|
print_temp_C(temp->max_temp);
|
||||||
printf("Min Temperature ");
|
printf("Min Temperature ");
|
||||||
print_temp(temp->min_temp);
|
print_temp_C(temp->min_temp);
|
||||||
printf("Max Operating Temperature ");
|
printf("Max Operating Temperature ");
|
||||||
print_temp(temp->max_oper_temp);
|
print_temp_C(temp->max_oper_temp);
|
||||||
printf("Min Operating Temperature ");
|
printf("Min Operating Temperature ");
|
||||||
print_temp(temp->min_oper_temp);
|
print_temp_C(temp->min_oper_temp);
|
||||||
printf("Estimated Temperature Offset: %ju C/K\n", (uintmax_t)temp->est_offset);
|
printf("Estimated Temperature Offset: %ju C/K\n", (uintmax_t)temp->est_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ print_samsung_extended_smart(const struct nvme_controller_data *cdata __unused,
|
|||||||
uint128_to_str(to128(temp->lur), cbuf, sizeof(cbuf)));
|
uint128_to_str(to128(temp->lur), cbuf, sizeof(cbuf)));
|
||||||
printf(" Lifetime Retired Block Count : %u\n", le32dec(&temp->lrbc));
|
printf(" Lifetime Retired Block Count : %u\n", le32dec(&temp->lrbc));
|
||||||
printf(" Current Temperature : ");
|
printf(" Current Temperature : ");
|
||||||
print_temp(le16dec(&temp->ct));
|
print_temp_K(le16dec(&temp->ct));
|
||||||
printf(" Capacitor Health : %u\n", le16dec(&temp->ch));
|
printf(" Capacitor Health : %u\n", le16dec(&temp->ch));
|
||||||
printf(" Reserved Erase Block Count : %u\n", le32dec(&temp->luurb));
|
printf(" Reserved Erase Block Count : %u\n", le32dec(&temp->luurb));
|
||||||
printf(" Read Reclaim Count : %ju\n", (uintmax_t) le64dec(&temp->rrc));
|
printf(" Read Reclaim Count : %ju\n", (uintmax_t) le64dec(&temp->rrc));
|
||||||
|
@ -76,7 +76,8 @@ void print_hex(void *data, uint32_t length);
|
|||||||
void print_namespace(struct nvme_namespace_data *nsdata);
|
void print_namespace(struct nvme_namespace_data *nsdata);
|
||||||
void read_logpage(int fd, uint8_t log_page, uint32_t nsid, uint8_t lsp,
|
void read_logpage(int fd, uint8_t log_page, uint32_t nsid, uint8_t lsp,
|
||||||
uint16_t lsi, uint8_t rae, void *payload, uint32_t payload_size);
|
uint16_t lsi, uint8_t rae, void *payload, uint32_t payload_size);
|
||||||
void print_temp(uint16_t t);
|
void print_temp_C(uint16_t t);
|
||||||
|
void print_temp_K(uint16_t t);
|
||||||
void print_intel_add_smart(const struct nvme_controller_data *cdata __unused, void *buf, uint32_t size __unused);
|
void print_intel_add_smart(const struct nvme_controller_data *cdata __unused, void *buf, uint32_t size __unused);
|
||||||
|
|
||||||
/* Utility Routines */
|
/* Utility Routines */
|
||||||
|
Loading…
Reference in New Issue
Block a user