Add device temperature reporting into CTL.

The values to report can be set via LUN options.  It can be useful for
testing, and also required for Drive Maintenance 2016 feature set.

MFC after:	2 weeks
This commit is contained in:
Alexander Motin 2019-07-26 03:49:16 +00:00
parent 0ea67e7019
commit ae8828bad1
5 changed files with 67 additions and 8 deletions

View File

@ -4450,12 +4450,14 @@ ctl_init_log_page_index(struct ctl_lun *lun)
lun->log_pages.index[0].page_len = j;
lun->log_pages.index[1].page_data = &lun->log_pages.subpages_page[0];
lun->log_pages.index[1].page_len = k * 2;
lun->log_pages.index[2].page_data = &lun->log_pages.lbp_page[0];
lun->log_pages.index[2].page_len = 12*CTL_NUM_LBP_PARAMS;
lun->log_pages.index[3].page_data = (uint8_t *)&lun->log_pages.stat_page;
lun->log_pages.index[3].page_len = sizeof(lun->log_pages.stat_page);
lun->log_pages.index[4].page_data = (uint8_t *)&lun->log_pages.ie_page;
lun->log_pages.index[4].page_len = sizeof(lun->log_pages.ie_page);
lun->log_pages.index[2].page_data = (uint8_t *)&lun->log_pages.temp_page;
lun->log_pages.index[2].page_len = sizeof(lun->log_pages.temp_page);
lun->log_pages.index[3].page_data = &lun->log_pages.lbp_page[0];
lun->log_pages.index[3].page_len = 12*CTL_NUM_LBP_PARAMS;
lun->log_pages.index[4].page_data = (uint8_t *)&lun->log_pages.stat_page;
lun->log_pages.index[4].page_len = sizeof(lun->log_pages.stat_page);
lun->log_pages.index[5].page_data = (uint8_t *)&lun->log_pages.ie_page;
lun->log_pages.index[5].page_len = sizeof(lun->log_pages.ie_page);
return (CTL_RETVAL_COMPLETE);
}
@ -6678,6 +6680,40 @@ ctl_mode_sense(struct ctl_scsiio *ctsio)
return (CTL_RETVAL_COMPLETE);
}
int
ctl_temp_log_sense_handler(struct ctl_scsiio *ctsio,
struct ctl_page_index *page_index,
int pc)
{
struct ctl_lun *lun = CTL_LUN(ctsio);
struct scsi_log_temperature *data;
const char *value;
data = (struct scsi_log_temperature *)page_index->page_data;
scsi_ulto2b(SLP_TEMPERATURE, data->hdr.param_code);
data->hdr.param_control = SLP_LBIN;
data->hdr.param_len = sizeof(struct scsi_log_temperature) -
sizeof(struct scsi_log_param_header);
if ((value = dnvlist_get_string(lun->be_lun->options, "temperature",
NULL)) != NULL)
data->temperature = strtol(value, NULL, 0);
else
data->temperature = 0xff;
data++;
scsi_ulto2b(SLP_REFTEMPERATURE, data->hdr.param_code);
data->hdr.param_control = SLP_LBIN;
data->hdr.param_len = sizeof(struct scsi_log_temperature) -
sizeof(struct scsi_log_param_header);
if ((value = dnvlist_get_string(lun->be_lun->options, "reftemperature",
NULL)) != NULL)
data->temperature = strtol(value, NULL, 0);
else
data->temperature = 0xff;
return (0);
}
int
ctl_lbp_log_sense_handler(struct ctl_scsiio *ctsio,
struct ctl_page_index *page_index,
@ -6802,6 +6838,7 @@ ctl_ie_log_sense_handler(struct ctl_scsiio *ctsio,
{
struct ctl_lun *lun = CTL_LUN(ctsio);
struct scsi_log_informational_exceptions *data;
const char *value;
data = (struct scsi_log_informational_exceptions *)page_index->page_data;
@ -6811,7 +6848,11 @@ ctl_ie_log_sense_handler(struct ctl_scsiio *ctsio,
sizeof(struct scsi_log_param_header);
data->ie_asc = lun->ie_asc;
data->ie_ascq = lun->ie_ascq;
data->temperature = 0xff;
if ((value = dnvlist_get_string(lun->be_lun->options, "temperature",
NULL)) != NULL)
data->temperature = strtol(value, NULL, 0);
else
data->temperature = 0xff;
return (0);
}

View File

@ -158,6 +158,9 @@ int ctl_default_page_handler(struct ctl_scsiio *ctsio,
int ctl_ie_page_handler(struct ctl_scsiio *ctsio,
struct ctl_page_index *page_index,
uint8_t *page_ptr);
int ctl_temp_log_sense_handler(struct ctl_scsiio *ctsio,
struct ctl_page_index *page_index,
int pc);
int ctl_lbp_log_sense_handler(struct ctl_scsiio *ctsio,
struct ctl_page_index *page_index,
int pc);

View File

@ -331,6 +331,8 @@ static const struct ctl_page_index log_page_index_template[] = {
CTL_PAGE_FLAG_ALL, NULL, NULL},
{SLS_SUPPORTED_PAGES_PAGE, SLS_SUPPORTED_SUBPAGES_SUBPAGE, 0, NULL,
CTL_PAGE_FLAG_ALL, NULL, NULL},
{SLS_TEMPERATURE, 0, 0, NULL,
CTL_PAGE_FLAG_DIRECT, ctl_temp_log_sense_handler, NULL},
{SLS_LOGICAL_BLOCK_PROVISIONING, 0, 0, NULL,
CTL_PAGE_FLAG_DIRECT, ctl_lbp_log_sense_handler, NULL},
{SLS_STAT_AND_PERF, 0, 0, NULL,
@ -351,6 +353,7 @@ struct ctl_log_pages {
struct scsi_log_idle_time it;
struct scsi_log_time_interval ti;
} stat_page;
struct scsi_log_temperature temp_page[2];
struct scsi_log_informational_exceptions ie_page;
struct ctl_page_index index[CTL_NUM_LOG_PAGES];
};

View File

@ -568,6 +568,7 @@ struct scsi_log_sense
#define SLS_ERROR_NONMEDIUM_PAGE 0x06
#define SLS_ERROR_LASTN_PAGE 0x07
#define SLS_LOGICAL_BLOCK_PROVISIONING 0x0c
#define SLS_TEMPERATURE 0x0d
#define SLS_SELF_TEST_PAGE 0x10
#define SLS_SOLID_STATE_MEDIA 0x11
#define SLS_STAT_AND_PERF 0x19
@ -683,6 +684,14 @@ struct scsi_log_informational_exceptions {
uint8_t temperature;
};
struct scsi_log_temperature {
struct scsi_log_param_header hdr;
#define SLP_TEMPERATURE 0x0000
#define SLP_REFTEMPERATURE 0x0001
uint8_t reserved;
uint8_t temperature;
};
struct scsi_control_page {
u_int8_t page_code;
u_int8_t page_length;

View File

@ -36,7 +36,7 @@
.\" $Id: //depot/users/kenm/FreeBSD-test2/usr.sbin/ctladm/ctladm.8#3 $
.\" $FreeBSD$
.\"
.Dd May 10, 2018
.Dd July 25, 2019
.Dt CTLADM 8
.Os
.Sh NAME
@ -918,6 +918,9 @@ Specifies medium rotation rate of the device: 0 -- not reported,
.It Va formfactor
Specifies nominal form factor of the device: 0 -- not reported, 1 -- 5.25",
2 -- 3.5", 3 -- 2.5", 4 -- 1.8", 5 -- less then 1.8".
.It Va temperature
.It Va reftemperature
Specify current and reference (maximum) temperatures of the device.
.It Va provisioning_type
When UNMAP support is enabled, this option specifies provisioning type:
"resource", "thin" or "unknown".