Brian King <brk...@linux.vnet.ibm.com> writes: > On 03/29/2016 10:38 AM, Gabriel Krisman Bertazi wrote: >> + >> static const struct { >> char *cmd; >> int min_args; >> @@ -19270,6 +19319,8 @@ static const struct { >> { "resume-disk-enclosure", 1, 0, 1, resume_disk_enclosure, >> "sg8 "}, >> { "show-perf", 1, 0, 1, show_perf, "sg8"}, >> { "dump", 0, 0, 0, dump, "" }, >> + { "get-ses-time", 1, 0, 1, get_ses_time, "sg8"}, >> + { "set-ses-time", 3, 0, 3, set_ses_time, "sg8 >> YYYY-MM-DD HH:MM:SS"}, > > Given that we are setting this from iprinit, do we still want to expose an > option in > iprconfig for the user to manually read / modify this? Could be useful for > debugging, > but doesn't seem like something we'd typically want a user to do. I think I'd > prefer to > keep things simple and not expose this in iprconfig, unless you can think of > a good > use case.
Hehehe. A very fancy clock? alias date='iprconfig -c get-ses-time sg8' So, I removed the getter/setter in iprconfig in the version below. We no longer export this interface via iprlib.h since it's only used internally. On the other hand, I did not remove the function ipr_get_set_time in iprlib, even though it's not used anywhere else anymore, because I see future use for it when collecting the drawer dumps. ipr_get_set_time is not accessible via iprconfig anymore. Please see v2 below. -- >8 -- Subject: [PATCH] iprutils: Enable time configuration for SES enclosures. Some new external drawers like ESLS have an internal clock, used by the internal microcode. This patch enables iprinit to configure the clock at boot time. Signed-off-by: Gabriel Krisman Bertazi <kris...@linux.vnet.ibm.com> --- iprlib.c | 42 ++++++++++++++++++++++++++++++++++++++++++ iprlib.h | 19 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/iprlib.c b/iprlib.c index bcd8862..019ec9d 100644 --- a/iprlib.c +++ b/iprlib.c @@ -9553,6 +9553,15 @@ static void init_ioa_dev(struct ipr_dev *dev) return; } +static void init_ses_dev(struct ipr_dev *dev) +{ + time_t t = time(NULL); + if (t != ((time_t) -1)) { + t *= 1000; + ipr_ses_set_time(dev, t); + } +} + /** * ipr_init_dev - * @dev: ipr dev struct @@ -9579,6 +9588,9 @@ int ipr_init_dev(struct ipr_dev *dev) if (&dev->ioa->ioa == dev) init_ioa_dev(dev); break; + case TYPE_ENCLOSURE: + init_ses_dev(dev); + break; default: break; }; @@ -10094,3 +10106,33 @@ int ipr_jbod_sysfs_bind(struct ipr_dev *dev, u8 op) close(fd); return 0; } + +int ipr_ses_get_time(struct ipr_dev *dev, u64* timestamp, int *origin) +{ + struct ipr_ses_diag_page12 get_time; + int err; + + err = ipr_receive_diagnostics(dev, 0x12, &get_time, sizeof(get_time)); + if (err) + return -EIO; + + *origin = !!get_time.timestamp_origin; + *timestamp = be64toh(*((u64*) get_time.timestamp)) >> 16; + return 0; +} + +int ipr_ses_set_time(struct ipr_dev *dev, u64 timestamp) +{ + struct ipr_ses_diag_ctrl_page13 set_time; + + memset(&set_time, '\0', sizeof(set_time)); + + set_time.page_code = 0x13; + set_time.page_length[1] = 8; + + timestamp = htobe64(timestamp << 16); + memcpy(set_time.timestamp, (char*) & + timestamp, 6); + + return ipr_send_diagnostics(dev, &set_time, sizeof(set_time)); +} diff --git a/iprlib.h b/iprlib.h index 81d8eef..273e156 100644 --- a/iprlib.h +++ b/iprlib.h @@ -2648,6 +2648,25 @@ struct ipr_ses_inquiry_pageC3 { u8 reserved2; }; +/* Page 12h - Get Time */ +struct ipr_ses_diag_page12 { + u8 page_code; + u8 reserved1; + u8 page_length[2]; + u8 timestamp_origin; + u8 reserved2; + u8 timestamp[6]; +}; + +/* Page 13h - Set Time */ +struct ipr_ses_diag_ctrl_page13 { + u8 page_code; + u8 reserved1; + u8 page_length[2]; + u8 timestamp[6]; + u8 reserved[2]; +}; + struct ipr_sas_inquiry_pageC4 { u8 peri_qual_dev_type; u8 page_code; -- 2.1.0 ------------------------------------------------------------------------------ _______________________________________________ Iprdd-devel mailing list Iprdd-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/iprdd-devel