aboutsummaryrefslogtreecommitdiff
path: root/sys/cam/ctl
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2019-07-26 03:49:16 +0000
committerAlexander Motin <mav@FreeBSD.org>2019-07-26 03:49:16 +0000
commitae8828bad15eb79115271a76fdfb8253435abb77 (patch)
tree58a7f7a5d3ef2ffca5d84b40e968b17961cc8968 /sys/cam/ctl
parent0ea67e70196581258e50c635edf7b2fd2aecb22b (diff)
downloadsrc-ae8828bad15eb79115271a76fdfb8253435abb77.tar.gz
src-ae8828bad15eb79115271a76fdfb8253435abb77.zip
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
Notes
Notes: svn path=/head/; revision=350346
Diffstat (limited to 'sys/cam/ctl')
-rw-r--r--sys/cam/ctl/ctl.c55
-rw-r--r--sys/cam/ctl/ctl.h3
-rw-r--r--sys/cam/ctl/ctl_private.h3
3 files changed, 54 insertions, 7 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c
index ab66bd94f8e6..dfd777d61e93 100644
--- a/sys/cam/ctl/ctl.c
+++ b/sys/cam/ctl/ctl.c
@@ -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);
}
@@ -6679,6 +6681,40 @@ ctl_mode_sense(struct ctl_scsiio *ctsio)
}
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,
int pc)
@@ -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);
}
diff --git a/sys/cam/ctl/ctl.h b/sys/cam/ctl/ctl.h
index 9f8fd32e72f1..56dd5313b4cb 100644
--- a/sys/cam/ctl/ctl.h
+++ b/sys/cam/ctl/ctl.h
@@ -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);
diff --git a/sys/cam/ctl/ctl_private.h b/sys/cam/ctl/ctl_private.h
index 34d4209ea7f2..6f3848dc0faa 100644
--- a/sys/cam/ctl/ctl_private.h
+++ b/sys/cam/ctl/ctl_private.h
@@ -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];
};