Provide a common interface in iprlib for code looking for the microcode
version of an ipr_dev.  This also make the functions get_ioa_fw_version
and get_dev_fw_version internal to iprlib.c and update callers to use
the generic get_fw_version function.

Signed-off-by: Gabriel Krisman Bertazi <kris...@linux.vnet.ibm.com>
---
 iprconfig.c | 10 +++++-----
 iprlib.c    | 27 ++++++++++++++++++++++++++-
 iprlib.h    |  3 +--
 iprupdate.c |  2 +-
 4 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/iprconfig.c b/iprconfig.c
index bb65904..ee7bb9d 100644
--- a/iprconfig.c
+++ b/iprconfig.c
@@ -2056,7 +2056,7 @@ static char *ioa_details(char *body, struct ipr_dev *dev)
 
        ipr_inquiry(dev, 2, &dram_vpd, sizeof(dram_vpd));
 
-       fw_level = get_ioa_fw_version(dev->ioa);
+       fw_level = get_fw_version(&dev->ioa->ioa);
 
        body = add_line_to_body(body,"", NULL);
        ipr_strncpy_0(buffer, scsi_dev_data->vendor_id, IPR_VENDOR_ID_LEN);
@@ -15057,7 +15057,7 @@ static int update_ioa_ucode(struct ipr_ioa *ioa, char 
*file)
 
        rc = ipr_update_ioa_fw(ioa, &image, 1);
 
-       if (image.version != get_ioa_fw_version(ioa))
+       if (image.version != get_fw_version(&ioa->ioa))
                return -EIO;
        return rc;
 }
@@ -15087,7 +15087,7 @@ static int update_dev_ucode(struct ipr_dev *dev, char 
*file)
 
        rc = ipr_update_disk_fw(dev, &image, 1);
 
-       if (image.version != get_dev_fw_version(dev))
+       if (image.version != get_fw_version(dev))
                return -EIO;
        return rc;
 }
@@ -15880,9 +15880,9 @@ static int query_ucode_level(char **args, int num_args)
        }
 
        if (&dev->ioa->ioa == dev)
-               printf("%08X\n", get_ioa_fw_version(dev->ioa));
+               printf("%08X\n", get_fw_version(dev));
        else {
-               level = get_dev_fw_version(dev);
+               level = get_fw_version(dev);
                level_sw = htonl(level);
                asc = (char *)&level_sw;
                if (isprint(asc[0]) && isprint(asc[1]) &&
diff --git a/iprlib.c b/iprlib.c
index 141034a..9b0b4a4 100644
--- a/iprlib.c
+++ b/iprlib.c
@@ -8253,7 +8253,7 @@ u32 get_dev_fw_version(struct ipr_dev *dev)
  * Returns:
  *   ioa firmware version
  **/
-u32 get_ioa_fw_version(struct ipr_ioa *ioa)
+static u32 get_ioa_fw_version(struct ipr_ioa *ioa)
 {
        char devpath[PATH_MAX];
        char value[16];
@@ -8270,6 +8270,31 @@ u32 get_ioa_fw_version(struct ipr_ioa *ioa)
 }
 
 /**
+ * get_fw_version - Get microcode version of device.
+ *
+ * @dev:               Device
+ *
+ * Returns:
+ *   ucode version if success / 0 on failure
+ **/
+u32 get_fw_version(struct ipr_dev *dev)
+{
+       if (!dev) {
+               /* FIXME: We should return -ENODEV here but old API
+               returns 0 on failure and any uint > 0 can be a firmware
+               level. A viable option would be writting the fw level to
+               a pointer received as argument, but lets hold to the
+               current API for now. */
+               return 0;
+       }
+
+       if (&dev->ioa->ioa == dev)
+               return get_ioa_fw_version(dev->ioa);
+
+       return get_dev_fw_version(dev);
+}
+
+/**
  * get_ioa_image_type -
  * @ioa:               ipr ioa struct
  *
diff --git a/iprlib.h b/iprlib.h
index 8ba2a00..e66ea47 100644
--- a/iprlib.h
+++ b/iprlib.h
@@ -2721,8 +2721,7 @@ void ipr_del_zeroed_dev(struct ipr_dev *);
 int ipr_device_is_zeroed(struct ipr_dev *);
 struct ipr_array_cap_entry *get_raid_cap_entry(struct ipr_supported_arrays *, 
u8 );
 char *get_prot_level_str(struct ipr_supported_arrays *, int);
-u32 get_dev_fw_version(struct ipr_dev *);
-u32 get_ioa_fw_version(struct ipr_ioa *);
+u32 get_fw_version(struct ipr_dev *);
 int ipr_disable_qerr(struct ipr_dev *);
 void ipr_log_ucode_error(struct ipr_ioa *);
 u32 get_dasd_ucode_version(char *, int);
diff --git a/iprupdate.c b/iprupdate.c
index 3a4c5ad..5c64828 100644
--- a/iprupdate.c
+++ b/iprupdate.c
@@ -31,7 +31,7 @@ static int force_ioas;
 
 static int ioa_needs_update(struct ipr_ioa *ioa, int silent)
 {
-       u32 fw_version = get_ioa_fw_version(ioa);
+       u32 fw_version = get_fw_version(&ioa->ioa);
 
        if (fw_version >= ioa->msl)
                return 0;
-- 
2.1.0


------------------------------------------------------------------------------
_______________________________________________
Iprdd-devel mailing list
Iprdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iprdd-devel

Reply via email to