Fixes up iprconfig -c dump to show more details about the IOA. Also
fixes an issue where we could end up treating a RAID array as an
adapter resource which resulted in strange looking iprconfig menus
and possible iprinit failures.

Signed-off-by: Brian King <brk...@linux.vnet.ibm.com>
---

 iprconfig.c |   68 ++++++++++++++++++++++++++++++------------------------------
 iprlib.c    |   18 +++++++--------
 iprlib.h    |   10 ++++++++
 3 files changed, 53 insertions(+), 43 deletions(-)

diff -puN iprconfig.c~iprutils_dump_ioa_fixup iprconfig.c
--- iprutils.patched/iprconfig.c~iprutils_dump_ioa_fixup        2016-10-25 
13:48:50.292996424 -0500
+++ iprutils.patched-bjking1/iprconfig.c        2016-10-25 13:48:50.307996362 
-0500
@@ -1804,7 +1804,7 @@ int main_menu(i_container *i_con)
        for_each_ioa(ioa) {
                for (j = 0; j < ioa->num_devices; j++) {
                        scsi_dev_data = ioa->dev[j].scsi_dev_data;
-                       if (!scsi_dev_data || scsi_dev_data->type == 
IPR_TYPE_ADAPTER)
+                       if (ipr_is_ioa(&ioa->dev[j]))
                                continue;
                        verify_device(&ioa->dev[j]);
                }
@@ -2820,7 +2820,7 @@ int device_details(i_container *i_con)
        if ((rc = device_details_get_device(i_con, &dev)))
                return rc;
 
-       if (dev->scsi_dev_data && dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) 
{
+       if (ipr_is_ioa(dev)) {
                n_screen = &n_adapter_details;
                body = ioa_details(body, dev);
        } else if (ipr_is_volume_set(dev)) {
@@ -11775,7 +11775,7 @@ static int update_ucode(struct ipr_dev *
                        time_screen_driver(&n_download_ucode_in_progress, time, 
0);
                } while (done == 0);                    
        } else {
-               if (dev->scsi_dev_data && dev->scsi_dev_data->type == 
IPR_TYPE_ADAPTER)
+               if (ipr_is_ioa(dev))
                        ipr_update_ioa_fw(dev->ioa, fw_image, 1);
                else
                        ipr_update_disk_fw(dev, fw_image, 1);
@@ -11909,7 +11909,7 @@ int process_choose_ucode(struct ipr_dev
 
        if (!dev->scsi_dev_data)
                return 67 | EXIT_FLAG;
-       if (dev->scsi_dev_data->type == IPR_TYPE_ADAPTER)
+       if (ipr_is_ioa(dev))
                rc = get_ioa_firmware_image_list(dev->ioa, &list);
        else if (dev->scsi_dev_data->type == TYPE_ENCLOSURE || 
dev->scsi_dev_data->type == TYPE_PROCESSOR)
                rc = get_ses_firmware_image_list(dev, &list);
@@ -11923,8 +11923,7 @@ int process_choose_ucode(struct ipr_dev
 
        ipr_get_fw_version(dev, release_level);
 
-       if (dev->scsi_dev_data &&
-           dev->scsi_dev_data->type == IPR_TYPE_ADAPTER) {
+       if (ipr_is_ioa(dev)) {
                sprintf(buffer, _("Adapter to download: %-8s %-16s\n"),
                        dev->scsi_dev_data->vendor_id,
                        dev->scsi_dev_data->product_id);
@@ -12899,7 +12898,7 @@ static void get_status(struct ipr_dev *d
        int initialization_in_progress = 0;
        struct ipr_res_redundancy_info info;
 
-       if (scsi_dev_data && scsi_dev_data->type == IPR_TYPE_ADAPTER && dev == 
&ioa->ioa) {
+       if (ipr_is_ioa(dev)) {
                if (!scsi_dev_data->online)
                        sprintf(buf, "Offline");
                else if (ioa->ioa_dead)
@@ -13456,7 +13455,7 @@ char *__print_device(struct ipr_dev *dev
                if (res_path) {
                        if (ioa->sis64)
                                if (serial_num == 1) {
-                                       if (scsi_dev_data && 
scsi_dev_data->type == IPR_TYPE_ADAPTER)
+                                       if (ipr_is_ioa(dev))
                                                loc_len = sprintf(body + len, 
"%s/%-28d", ioa->pci_address, ioa->host_num);
                                        else {
                                                
ipr_format_res_path(dev->res_path[ra].res_path_bytes, res_path_name, 
IPR_MAX_RES_PATH_LEN);
@@ -13471,7 +13470,7 @@ char *__print_device(struct ipr_dev *dev
                                        scsi_dev_data->res_path : "<unknown>");
                        else /*32bit*/
                                if (serial_num == 1) {
-                                       if (scsi_dev_data && 
scsi_dev_data->type == IPR_TYPE_ADAPTER)
+                                       if (ipr_is_ioa(dev))
                                                loc_len = sprintf(body + len, 
"%s/%-29d:", ioa->pci_address, ioa->host_num);
                                        else
                                                loc_len = sprintf(body + len, 
"%s/%d", ioa->pci_address, ioa->host_num);
@@ -13490,7 +13489,7 @@ char *__print_device(struct ipr_dev *dev
                }
        }
 
-       if (scsi_dev_data && scsi_dev_data->type == IPR_TYPE_ADAPTER && dev == 
&ioa->ioa) {
+       if (ipr_is_ioa(dev)) {
                if (serial_num == 1 ) {
                        if (!res_path || !ioa->sis64) {
                                for (i = 0; i < 28-loc_len; i++)
@@ -14632,7 +14631,7 @@ static int query_raid_create(char **args
                return -EINVAL;
        }
 
-       if (&dev->ioa->ioa != dev) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "Device is not an IOA\n");
                return -EINVAL;
        }
@@ -14680,7 +14679,7 @@ static int query_raid_delete(char **args
                return -EINVAL;
        }
 
-       if (&dev->ioa->ioa != dev) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "Device is not an IOA\n");
                return -EINVAL;
        }
@@ -15410,7 +15409,7 @@ static int set_log_level_cmd(char **args
                return -EINVAL;
        }
 
-       if (&dev->ioa->ioa != dev) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "Device is not an IOA\n");
                return -EINVAL;
        }
@@ -15709,7 +15708,7 @@ static int update_ucode_cmd(char **args,
                return -EINVAL;
        }
 
-       if (&dev->ioa->ioa == dev)
+       if (ipr_is_ioa(dev))
                return update_ioa_ucode(dev->ioa, args[1]);
        else
                return update_dev_ucode(dev, args[1]);
@@ -15742,7 +15741,7 @@ static int update_all_ucodes(char **args
                        if (!lfw || lfw->version <= get_fw_version(dev))
                                continue;
 
-                       if (&dev->ioa->ioa == dev)
+                       if (ipr_is_ioa(dev))
                                rc = update_ioa_ucode(dev->ioa, lfw->file);
                        else
                                rc = update_dev_ucode(dev, lfw->file);
@@ -16001,7 +16000,7 @@ static int query_path_status(char **args
 
        printf("%s\n%s\n", status_hdr[2], status_sep[2]);
 
-       if (&dev->ioa->ioa == dev)
+       if (ipr_is_ioa(dev))
                printf_ioa_path_status(dev->ioa);
        else
                printf_path_status(dev);
@@ -16432,7 +16431,7 @@ static int query_log_level(char **args,
                return -EINVAL;
        }
 
-       if (&dev->ioa->ioa != dev) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "Device is not an IOA\n");
                return -EINVAL;
        }
@@ -16549,7 +16548,7 @@ static int query_ucode_level(char **args
                return -EINVAL;
        }
 
-       if (&dev->ioa->ioa == dev)
+       if (ipr_is_ioa(dev))
                printf("%08X\n", get_fw_version(dev));
        else {
                level = get_fw_version(dev);
@@ -17130,7 +17129,7 @@ static int query_ioa_asym_access_mode(ch
                fprintf(stderr, "Cannot find %s\n", args[0]);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", args[0]);
                return -EINVAL;
        }
@@ -17229,9 +17228,7 @@ static void show_dev_details(struct ipr_
 {
        char *body = NULL;
 
-       if (dev->scsi_dev_data &&
-           dev->scsi_dev_data->type == IPR_TYPE_ADAPTER &&
-           dev == &dev->ioa->ioa)
+       if (ipr_is_ioa(dev))
                body = ioa_details(body, dev);
        else if (ipr_is_volume_set(dev) || ipr_is_array(dev))
                body = vset_array_details(body, dev);
@@ -17698,7 +17695,7 @@ static int check_and_set_active_active(c
                fprintf(stderr, "Cannot find %s\n", dev_name);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", dev_name);
                return -EINVAL;
        }
@@ -18053,7 +18050,7 @@ static int query_location(char **args, i
        get_drive_phy_loc(dev->ioa);
 
        if (!ipr_is_volume_set(dev)){
-               if (&dev->ioa->ioa == dev)
+               if (ipr_is_ioa(dev))
                        fprintf(stdout, "%s\n", dev->ioa->physical_location);
                else
                        fprintf(stdout, "%s\n", dev->physical_location);
@@ -18091,7 +18088,7 @@ static int query_ioa_caching(char **args
                fprintf(stderr, "Cannot find %s\n", args[0]);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", args[0]);
                return -EINVAL;
        }
@@ -18138,7 +18135,7 @@ static int set_ioa_caching(char **args,
                fprintf(stderr, "Cannot find %s\n", args[0]);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", args[0]);
                return -EINVAL;
        }
@@ -18189,7 +18186,7 @@ static int set_array_rebuild_verify(char
                fprintf(stderr, "Cannot find %s\n", args[0]);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", args[0]);
                return -EINVAL;
        }
@@ -18248,7 +18245,7 @@ static int query_array_rebuild_verify(ch
                fprintf(stderr, "Cannot find %s\n", args[0]);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", args[0]);
                return -EINVAL;
        }
@@ -18285,7 +18282,7 @@ static int set_array_rebuild_rate(char**
                fprintf(stderr, "Cannot find %s\n", args[0]);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", args[0]);
                return -EINVAL;
        }
@@ -18349,7 +18346,7 @@ static int query_array_rebuild_rate(char
                fprintf(stderr, "Cannot find %s\n", args[0]);
                return -EINVAL;
        }
-       if (dev != &dev->ioa->ioa) {
+       if (!ipr_is_ioa(dev)) {
                fprintf(stderr, "%s is not an IOA.\n", args[0]);
                return -EINVAL;
        }
@@ -18650,7 +18647,7 @@ int enclosures_fork(i_container *i_con)
                input = temp_i_con->field_data;
 
                if (strcmp(input, "3") == 0) {
-                               if (ses->scsi_dev_data && 
ses->scsi_dev_data->type == IPR_TYPE_ADAPTER && ses == &ses->ioa->ioa) 
+                       if (ipr_is_ioa(ses))
                                return RC_89_Invalid_Dev_For_Resume;
 
                        if (ses->active_suspend == IOA_DEV_PORT_UNKNOWN)        
@@ -18662,7 +18659,7 @@ int enclosures_fork(i_container *i_con)
                        ses->is_resume_cand = 1;
                        resume_flag = 1;
                } else if (strcmp(input, "2") == 0) {
-                               if (ses->scsi_dev_data && 
ses->scsi_dev_data->type == IPR_TYPE_ADAPTER && ses == &ses->ioa->ioa) 
+                               if (ipr_is_ioa(ses))
                                        return RC_88_Invalid_Dev_For_Suspend;
 
                                if (ses->active_suspend == 
IOA_DEV_PORT_UNKNOWN)        
@@ -18779,7 +18776,7 @@ static int suspend_disk_enclosure(char *
        ses = find_dev(args[0]);
        get_ses_ioport_status(ses);
 
-       if (ses->scsi_dev_data && ses->scsi_dev_data->type == IPR_TYPE_ADAPTER 
&& ses == &ses->ioa->ioa)  {
+       if (ipr_is_ioa(ses))  {
                fprintf(stderr,"Incorrect device type specified. Please specify 
a valid SAS device to suspend.\n");
                return 1;
        }
@@ -18832,7 +18829,7 @@ static int resume_disk_enclosure(char **
        ses = find_dev(args[0]);
        get_ses_ioport_status(ses);
 
-       if (ses->scsi_dev_data && ses->scsi_dev_data->type == IPR_TYPE_ADAPTER 
&& ses == &ses->ioa->ioa) {
+       if (ipr_is_ioa(ses)) {
                fprintf(stderr,"Incorrect device type specified. Please specify 
a valid SAS device to resume.\n");
                return 1;
        }
@@ -19037,6 +19034,9 @@ static int dump (char **args, int num_ar
 
        printf("\n === Running show-details ===\n");
        for_each_ioa(ioa){
+               printf("IOA %s:\n", ioa->ioa.gen_name);
+               show_dev_details(&ioa->ioa);
+
                for_each_dev(ioa, dev){
                        printf("Device %s:\n", dev->gen_name);
                        show_dev_details(dev);
diff -puN iprlib.c~iprutils_dump_ioa_fixup iprlib.c
--- iprutils.patched/iprlib.c~iprutils_dump_ioa_fixup   2016-10-25 
13:48:50.295996412 -0500
+++ iprutils.patched-bjking1/iprlib.c   2016-10-25 13:48:50.310996349 -0500
@@ -6627,9 +6627,12 @@ void check_current_config(bool allow_reb
                        if (scsi_dev_data->host != ioa->host_num)
                                continue;
 
+                       if (ioa->ioa.scsi_dev_data == scsi_dev_data)
+                               continue;
+
                        if (scsi_dev_data->type == TYPE_DISK ||
                            scsi_dev_data->type == IPR_TYPE_AF_DISK ||
-                           scsi_dev_data->type == IPR_TYPE_ADAPTER ||
+                           scsi_dev_data->type == IPR_TYPE_ARRAY ||
                            scsi_dev_data->type == TYPE_ENCLOSURE ||
                            scsi_dev_data->type == TYPE_ROM ||
                            scsi_dev_data->type == TYPE_TAPE ||
@@ -6703,9 +6706,6 @@ void check_current_config(bool allow_reb
                                        
__ipr_test_unit_ready(&ioa->dev[device_count], &sense_data);
 
                                device_count++;
-                       } else if (scsi_dev_data->type == IPR_TYPE_ADAPTER) {
-                               ioa->ioa.ioa = ioa;
-                               ioa->ioa.scsi_dev_data = scsi_dev_data;
                        }
                }
 
@@ -8586,7 +8586,7 @@ u32 get_fw_version(struct ipr_dev *dev)
                return 0;
        }
 
-       if (&dev->ioa->ioa == dev)
+       if (ipr_is_ioa(dev))
                return get_ioa_fw_version(dev->ioa);
 
        return get_dev_fw_version(dev);
@@ -8939,7 +8939,7 @@ struct ipr_fw_images *get_latest_fw_imag
        if (!dev)
                return NULL;
 
-       if (dev->scsi_dev_data->type == IPR_TYPE_ADAPTER)
+       if (ipr_is_ioa(dev))
                get_ioa_firmware_image_list(dev->ioa, &fw);
        else if (ipr_is_ses(dev))
                get_ses_firmware_image_list(dev, &fw);
@@ -8969,7 +8969,7 @@ int get_latest_fw_image_version(struct i
        if (!dev)
                return -ENODEV;
 
-       if (dev->scsi_dev_data->type == IPR_TYPE_ADAPTER)
+       if (ipr_is_ioa(dev))
                get_ioa_firmware_image_list(dev->ioa, &fw);
        else if (ipr_is_ses(dev))
                get_ses_firmware_image_list(dev, &fw);
@@ -9845,7 +9845,7 @@ int ipr_init_dev(struct ipr_dev *dev)
                init_af_dev(dev);
                break;
        case IPR_TYPE_ADAPTER:
-               if (&dev->ioa->ioa == dev)
+               if (ipr_is_ioa(dev))
                        init_ioa_dev(dev);
                break;
        case TYPE_ENCLOSURE:
@@ -9877,7 +9877,7 @@ int ipr_init_new_dev(struct ipr_dev *dev
                wait_for_dev(dev->dev_name);
                break;
        case IPR_TYPE_ADAPTER:
-               if (&dev->ioa->ioa != dev)
+               if (!ipr_is_ioa(dev))
                        break;
        case IPR_TYPE_AF_DISK:
                wait_for_dev(dev->gen_name);
diff -puN iprlib.h~iprutils_dump_ioa_fixup iprlib.h
--- iprutils.patched/iprlib.h~iprutils_dump_ioa_fixup   2016-10-25 
13:48:50.299996395 -0500
+++ iprutils.patched-bjking1/iprlib.h   2016-10-25 13:48:50.312996341 -0500
@@ -203,6 +203,7 @@ typedef uint64_t u64;
 #define IPR_XLATE_DEV_FMT_RC(rc)       ((((rc) & 127) == 51) ? -EIO : 0)
 #define IPR_TYPE_AF_DISK                     0xC
 #define IPR_TYPE_ADAPTER                     0x1f
+#define IPR_TYPE_ARRAY                            0x1f
 #define IPR_TYPE_EMPTY_SLOT                  0xff
 
 #define IPR_ACTIVE_OPTIMIZED                 0x0
@@ -3003,6 +3004,15 @@ static inline int ipr_is_array_record(in
                return 1;
        else
                return 0;
+}
+
+static inline int ipr_is_ioa(struct ipr_dev *device)
+{
+       if (device->ioa && device->ioa->ioa.scsi_dev_data &&
+           device->scsi_dev_data == device->ioa->ioa.scsi_dev_data)
+               return 1;
+       else
+               return 0;
 }
 
 static inline int ipr_is_af_dasd_device(struct ipr_dev *device)
_


------------------------------------------------------------------------------
The Command Line: Reinvented for Modern Developers
Did the resurgence of CLI tooling catch you by surprise?
Reconnect with the command line and become more productive. 
Learn the new .NET and ASP.NET CLI. Get your free copy!
http://sdm.link/telerik
_______________________________________________
Iprdd-devel mailing list
Iprdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iprdd-devel

Reply via email to