"Guilherme G. Piccoli" <gpicc...@linux.vnet.ibm.com> writes:

>> +    printf ("%s(%s)\n", ctime(&timestamp), origin_str[origin]);
>> +}
>
> Just curious here: the function is declared as int, so shouldn't it
> return an int value in case it succeeds?
>

Thanks for your review!

yes, you are correct.  I added a return value for this function and
changed the return type for init_ses_dev, as you suggested.


>> +int ipr_ses_get_time(struct ipr_dev *dev, u64* timestamp, int *origin);
>> +int ipr_ses_set_time(struct ipr_dev *dev, u64 timestamp);
>
> Indentation seems weird here, but it's possibly my email client heheh

hmm, indentation looks correct here.

Please check the re-spin below.

Thanks,

-- >8 --
Subject: [PATCH v2] 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, and allow users to fetch and override this configuration
in iprconfig.

Signed-off-by: Gabriel Krisman Bertazi <kris...@linux.vnet.ibm.com>
---
 iprconfig.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 iprlib.c    | 42 ++++++++++++++++++++++++++++++++++++++++++
 iprlib.h    | 21 +++++++++++++++++++++
 3 files changed, 115 insertions(+), 1 deletion(-)

diff --git a/iprconfig.c b/iprconfig.c
index a6b1372..e335bb7 100644
--- a/iprconfig.c
+++ b/iprconfig.c
@@ -27,7 +27,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
-
+#include <time.h>
 #include <math.h>
 
 char *tool_name = "iprconfig";
@@ -19149,6 +19149,55 @@ static int ssd_report(char **args, int num_args)
        return 0;
 }
 
+static int get_ses_time(char **args, int num_args)
+{
+       struct ipr_dev *dev = find_dev(args[0]);
+
+       time_t timestamp;
+       int origin;
+       char* origin_str[] = { "Not Configured",
+                            "Configured" };
+       if (!dev) {
+               fprintf(stderr, "Cannot find %s\n", args[0]);
+               return -EINVAL;
+       }
+
+       if (ipr_ses_get_time(dev, &timestamp, &origin))
+               scsi_err(dev, "%s, Can't read enclosure time\n", dev->gen_name);
+
+       /* ipr_ses_get_time returns its value in miliseconds, while epoch is
+          measured in seconds.  */
+       timestamp = timestamp/1000;
+
+       printf ("%s(%s)\n", ctime(&timestamp), origin_str[origin]);
+       return 0;
+}
+
+static int set_ses_time(char **args, int num_args)
+{
+       struct ipr_dev *dev = find_dev(args[0]);
+       struct tm tm;
+       time_t timestamp;
+
+
+       if (!dev) {
+               fprintf(stderr, "Cannot find %s\n", args[0]);
+               return -EINVAL;
+       }
+
+       if (!strptime (args[1], "%F", &tm) || !strptime (args[2], "%T", &tm)) {
+               fprintf(stderr, "Date in the wrong format. Use \"YYYY-MM-DD 
HH:MM:SS\"\n");
+               return -EINVAL;
+       }
+
+       timestamp = mktime(&tm) * 1000;
+       if (ipr_ses_set_time(dev, timestamp)) {
+               scsi_err(dev, "%s, Can't set enclosure time\n", dev->gen_name);
+               return -EIO;
+       }
+       return 0;
+}
+
 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"},
 };
 
 /**
diff --git a/iprlib.c b/iprlib.c
index 70e2924..5fa5359 100644
--- a/iprlib.c
+++ b/iprlib.c
@@ -9535,6 +9535,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
@@ -9561,6 +9570,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;
        };
@@ -10076,3 +10088,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 b2a46c9..eccd116 100644
--- a/iprlib.h
+++ b/iprlib.h
@@ -2646,6 +2646,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;
@@ -2909,6 +2928,8 @@ int ipr_improper_device_type(struct ipr_dev *);
 int ipr_get_fw_version(struct ipr_dev *, u8 release_level[4]);
 int ipr_get_live_dump(struct ipr_ioa *);
 int ipr_jbod_sysfs_bind(struct ipr_dev *, u8);
+int ipr_ses_get_time(struct ipr_dev *dev, u64* timestamp, int *origin);
+int ipr_ses_set_time(struct ipr_dev *dev, u64 timestamp);
 
 static inline u32 ipr_get_dev_res_handle(struct ipr_ioa *ioa, struct 
ipr_dev_record *dev_rcd)
 {
-- 
2.1.0



------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Iprdd-devel mailing list
Iprdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iprdd-devel

Reply via email to