aboutsummaryrefslogtreecommitdiff
path: root/sys/cam
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cam')
-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
-rw-r--r--sys/cam/scsi/scsi_all.h9
4 files changed, 63 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];
};
diff --git a/sys/cam/scsi/scsi_all.h b/sys/cam/scsi/scsi_all.h
index ae9c691986f4..5c679049f0a8 100644
--- a/sys/cam/scsi/scsi_all.h
+++ b/sys/cam/scsi/scsi_all.h
@@ -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;