Blob Blame History Raw
#ifndef iprconfig_h
#define iprconfig_h
/**
 * IBM IPR adapter configuration utility
 *
 * (C) Copyright 2004
 * International Business Machines Corporation and others.
 * All Rights Reserved. This program and the accompanying
 * materials are made available under the terms of the
 * Common Public License v1.0 which accompanies this distribution.
 *
 **/

#define _(string) (string)
#define __(string) (string)
#define EXIT_FLAG		0x8000	/* stops at given screen on exit call */
#define CANCEL_FLAG		0x4000	/* stops at given screen on quit call */
#define REFRESH_FLAG		0x2000	/* refreshes screen on quit or exit */
#define TOGGLE_FLAG		0x1000
#define FWD_FLAG		0x0800
#define CONFIRM_FLAG		0x0400
#define CONFIRM_REC_FLAG	0x0200
#define MENU_FLAG		0x0100
#define ENTER_FLAG		0x0080

#define NUM_OPTS(x) (sizeof(x)/sizeof(struct screen_opts))

#define REFRESH_SCREEN		-13
#define TOGGLE_SCREEN		-14

#define INVALID_OPTION_STATUS	2
#define PGUP_STATUS		3
#define TOP_STATUS		4
#define PGDN_STATUS		5
#define BTM_STATUS		6

#define MAX_FIELD_SIZE		39

typedef struct info_container i_container;

struct info_container {
	i_container *next_item;	/* reference to next info_container */
	char field_data[MAX_FIELD_SIZE + 1]; /* stores characters entered into a user-entry field */
	void *data;		/* stores a field pointer */
	int y;			/* cursor y position of user selection */
	int x;			/* cursor x position of user selection */
};

#define for_each_icon(icon) for (icon = i_con_head; icon; icon = icon->next_item)

struct screen_output {
	int rc;
	i_container *i_con;
};

typedef struct function_output fn_out;

struct function_output {
	fn_out *next;		/* reference to next fn_out if >1 */
	int index;		/* used to plop text into # spots on text.msg */
	int cat_offset;		/* varies text set used in text.msg -> esp dif platforms */
	char *text;		/* holds "special" data to be passed back to the screen */
};

int main_menu(i_container * i_con);
int config_menu(i_container *i_con);

int disk_status(i_container * i_con);
int device_details(i_container * i_con);
int path_details(i_container * i_con);
int raid_screen(i_container * i_con);
int raid_status(i_container * i_con);
int raid_stop(i_container * i_con);
int confirm_raid_stop(i_container * i_con);
int do_confirm_raid_stop(i_container * i_con);
int raid_start(i_container * i_con);
int raid_start_loop(i_container * i_con);
int configure_raid_start(i_container * i_con);
int configure_raid_parameters(i_container * i_con);
int confirm_raid_start(i_container * i_con);
int raid_start_complete();
int raid_include(i_container * i_con);
int configure_raid_include(i_container * i_con);
int confirm_raid_include(i_container * i_con);
int confirm_raid_include_device(i_container * i_con);
int disk_unit_recovery(i_container * i_con);

int concurrent_add_device(i_container *i_con);
int concurrent_remove_device(i_container *i_con);
int verify_conc_maint(i_container * i_con);

int path_status(i_container * i_con);
int init_device(i_container * i_con);
int confirm_init_device(i_container * i_con);
int send_dev_inits(i_container * i_con);
int reclaim_cache(i_container * i_con);
int confirm_reclaim(i_container * i_con);
int reclaim_warning(i_container * i_con);
int reclaim_result(i_container * i_con);
int af_include(i_container * i_con);
int af_remove(i_container * i_con);
int hot_spare_screen(i_container *i_con);
int add_hot_spare(i_container * i_con);
int remove_hot_spare(i_container * i_con);
int hot_spare(i_container * i_con, int action);

int select_hot_spare(i_container * i_con, int action);
int confirm_hot_spare(int action);
int hot_spare_complete(int action);

int raid_migrate(i_container * i_con);
int asym_access(i_container *i_con);
int asym_access_menu(i_container * i_con);

int raid_rebuild(i_container * i_con);
int confirm_raid_rebuild(i_container * i_con);
int raid_resync(i_container * i_con);
int confirm_raid_resync(i_container * i_con);

int battery_maint(i_container * i_con);
int enclosures_maint(i_container * i_con);
int battery_fork(i_container * i_con);
int enclosures_fork(i_container * i_con);
int force_battery_error(i_container *i_con);
int enable_battery(i_container *i_con);
int ipr_suspend_disk_enclosure(i_container *i_con);
int ipr_resume_disk_enclosure(i_container *i_con);
int bus_config(i_container * i_con);
int change_bus_attr(i_container * i_con);
int confirm_change_bus_attr(i_container *i_con);
int driver_config(i_container * i_con);
int change_driver_config(i_container *i_con);
int disk_config(i_container * i_con);
int ioa_config(i_container * i_con);
int change_disk_config(i_container *);
int change_ioa_config(i_container *);
int ucode_screen(i_container *i_con);
int download_ucode(i_container *);
int download_all_ucode(i_container *);
int choose_ucode(i_container *);
int log_menu(i_container *);
int ibm_storage_log_tail(i_container *);
int ibm_storage_log(i_container *);
int kernel_log(i_container *);
int iprconfig_log(i_container *);
int kernel_root(i_container *);
int confirm_kernel_root(i_container *);
int confirm_kernel_root_change(i_container *);
int confirm_kernel_root_change2(i_container *);
int set_default_editor(i_container *);
int confirm_set_default_editor(i_container *);
int confirm_set_default_editor_change(i_container *);
int confirm_set_default_editor_change2(i_container *);
int restore_log_defaults(i_container *);
int ibm_boot_log(i_container *);
int exit_confirmed(i_container *);

int statistics_menu(i_container *);
int device_stats(i_container *);

static int raid_create_check_num_devs(struct ipr_array_cap_entry *, int, int);

/* constant strings */
const char *no_dev_found = __("No devices found");
const char *wait_for_next_screen = __("Please wait for the next screen.");

/* others */
int menu_test(i_container * i_con);
ITEM **menu_test_menu(int field_index);

typedef struct screen_node s_node;

struct screen_opts {
	int (*screen_function) (i_container *);
	char *key;
	char *list_str;
};

struct screen_node {
	int rc_flags;
	int f_flags;
	int num_opts;
	struct screen_opts *options;
	char *title;
	char *body;
	char *header[10];
};

struct screen_opts null_opt[] = {
	{NULL, "\n"}
};

struct screen_opts main_menu_opt[] = {
	{disk_status,        "1", __("Display hardware status")},
	{raid_screen,        "2", __("Work with disk arrays")},
	{disk_unit_recovery, "3", __("Work with disk unit recovery")},
	{config_menu,        "4", __("Work with configuration options")},
	{ucode_screen,	     "5", __("Work with microcode updates")},
	{statistics_menu,    "6", __("Devices Statistics")},
	{log_menu,           "7", __("Analyze log")}
};

s_node n_main_menu = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG),
	.num_opts = NUM_OPTS(main_menu_opt),
	.options  = &main_menu_opt[0],
	.title    =  __("IBM Power RAID Configuration Utility")
};

struct screen_opts exit_confirm_opt[] = {
	{main_menu,        "1", __("Return to main menu")},
	{exit_confirmed,     "2", __("Exit iprconfig")},
};

s_node n_exit_confirm = {
	.num_opts = NUM_OPTS(exit_confirm_opt),
	.options  = &exit_confirm_opt[0],
	.title    =  __("Confirm Exit"),
	.header   = {
		__("One or more disks is currently known to be zeroed. Exiting now "
		   "will cause this state to be lost, resulting in longer array creation times\n\n"),
		"" }
};


struct screen_opts config_menu_opt[] = {
	{bus_config,         "1", __("Work with SCSI bus configuration")},
	{driver_config,      "2", __("Work with driver configuration")},
	{disk_config,        "3", __("Work with disk configuration")},
	{ioa_config,         "4", __("Work with adapter configuration")},
};

s_node n_config_menu = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(config_menu_opt),
	.options  = &config_menu_opt[0],
	.title    =  __("IBM Power RAID Configuration Utility")
};

struct screen_opts disk_status_opt[] = {
	{device_details, "\n"}
};

s_node n_disk_status = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(disk_status_opt),
	.options  = &disk_status_opt[0],
	.title    = __("Display Hardware Status"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Display hardware resource information details\n\n"),
		"" }
};

struct screen_opts device_stats_opt[] = {
	{device_stats, "\n"}
};

s_node n_device_stats = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(device_stats_opt),
	.options  = &device_stats_opt[0],
	.title    = __("Display Device Statistics"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Display device statistics\n\n"),
		"" }
};

s_node n_adapter_details = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG),
	.title    = __("IOA Hardware Resource Information Details")
};

s_node n_device_details = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG),
	.title    = __("Disk Unit Hardware Resource Information Details")
};

s_node n_vset_details = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG),
	.title    = __("Disk Array Information Details")
};

s_node n_ses_details = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG),
	.title    = __("Disk Enclosure Information Details")
};

struct screen_opts raid_screen_opt[] = {
	{raid_status,      "1", __("Display disk array status")},
	{raid_start,       "2", __("Create a disk array")},
	{raid_stop,        "3", __("Delete a disk array")},
	{raid_include,     "4", __("Add a device to a disk array")},
	{af_include,       "5", __("Format device for RAID function")},
	{af_remove,        "6", __("Format device for JBOD function")},
	{hot_spare_screen, "7", __("Work with hot spares")},
	{asym_access,      "8", __("Work with asymmetric access")},
	{raid_resync,      "9", __("Force RAID Consistency Check")},
	{raid_migrate,     "0", __("Migrate disk array protection")},
};

struct screen_opts hot_spare_opt[] = {
	{add_hot_spare,    "1", __("Create a hot spare")},
	{remove_hot_spare, "2", __("Delete a hot spare")},
};


s_node n_asym_access = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Array Asymmetric Access"),
	.header   = {
		__("Select the disk array path.\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=change asymmetric access for a disk array\n\n"),
 		"" }
};

s_node n_asym_access_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Setting Array Asymmetric Access Failed"),
	.header   = {
		__("There are no arrays eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o Active/Active mode is not enabled on the IOAs.\n"),
		__("o An IOA needs updated microcode in order to support "
		   "active/active configurations.\n"),
		__("o None of the disk arrays in the system are capable of "
		   "changing asymmetric access attributes.\n"),
		__("o There are no disk arrays in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference "
		   "code to correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		"" }
};

struct screen_opts change_array_asym_access_opt[] = {
	{asym_access_menu, "c"},
	{NULL, "\n"}
};

s_node n_change_array_asym_access = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG | MENU_FLAG),
	.num_opts = NUM_OPTS(change_array_asym_access_opt),
	.options  = &change_array_asym_access_opt[0],
	.title    = __("Change Asymmetric Access Configuration of Array"),
	.header   = {
		__("Current array asymmetric access configuration is shown. To "
		   "change setting hit 'c' for options menu. Highlight "
		   "desired option then hit Enter.\n"),
		__("  c=Change Setting\n\n"),
		"" }
};

s_node n_raid_migrate_complete = {
	.title    = __("Migrate Disk Array Status"),
	.body     = __("You selected to migrate a disk array")
};

s_node n_confirm_raid_migrate = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Migrate a Disk Array"),
	.header   = {
		__("ATTENTION: Disk array will be migrated.\n\n"),
		__("Press Enter to continue.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

s_node n_raid_migrate = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG ),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Migrate Disk Array Protection"),
	.header   = {
		__("Select only one disk array for migration.\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=migrate protection for a disk array\n\n"),
 		"" }
};

s_node n_raid_migrate_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Disk Array Migration Failed"),
	.header   = {
		__("There are no arrays eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no disk arrays in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference "
		   "code to correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		__("o There are not enough unused AF disks for the migration.\n"),
		"" }
};

s_node n_raid_migrate_add_disks = {
	.rc_flags = (CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Select Disk Units for Migration"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_hot_spare_screen = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(hot_spare_opt),
	.options  = &hot_spare_opt[0],
	.title    = __("Work with Hot Spares")
};

s_node n_raid_screen = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(raid_screen_opt),
	.options  = &raid_screen_opt[0],
	.title    = __("Work with Disk Arrays")
};

s_node n_raid_status = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(disk_status_opt),
	.options  = &disk_status_opt[0],
	.title    = __("Display Disk Array Status"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Display hardware resource information details\n\n"),
		"" }
};

struct screen_opts raid_stop_opt[] = {
	{confirm_raid_stop, "\n"}
};

s_node n_raid_stop = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG ),
	.num_opts = NUM_OPTS(raid_stop_opt),
	.options  = &raid_stop_opt[0],
	.title    = __("Delete a Disk Array"),
	.header   = {
		__("Select the disk array(s) to delete.\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=delete a disk array\n\n"),
		"" }
};

s_node n_raid_stop_fail = {
	.title    = __("Delete a Disk Array Failed"),
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.header   = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no disk arrays in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference code to "
		   "correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		__("o The disks are missing.\n"),
		"" }
};

struct screen_opts confirm_raid_stop_opt[] = {
	{do_confirm_raid_stop, "\n"}
};

s_node n_confirm_raid_stop = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_raid_stop_opt),
	.options  = &confirm_raid_stop_opt[0],
	.title    = __("Confirm Delete a Disk Array"),
	.header   = {
		__("ATTENTION: Disk array will be deleted.\n\n"),
		__("Press Enter to continue.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

struct screen_opts raid_start_opt[] = {
	{raid_start_loop, "\n"}
};

s_node n_raid_start = {
	.rc_flags = (CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(raid_start_opt),
	.options  = &raid_start_opt[0],
	.title    = __("Create a Disk Array"),
	.header   = {
		__("Select the adapter.\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=create a disk array\n\n"),
		"" }
};

s_node n_raid_start_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Create a Disk Array Failed"),
	.header   = {
		__("There are no disks eligible for the selected operation due "
		   "to one or more of the following reasons:\n\n"),
		__("o There are not enough advanced function disks in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference code to "
		   "correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		__("o The disks are missing.\n"),
		"" }
};

s_node n_configure_raid_start = {
	.rc_flags = (CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Select Disk Units for Disk Array"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_confirm_raid_start = {
	.f_flags  = (CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Create Disk Array"),
	.header   = {
		__("Press Enter to continue.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

s_node n_raid_start_complete = {
	.title    = __("Create Disk Array Status"),
	.body     = __("You selected to create a disk array")
};

struct screen_opts raid_include_opt[] = {
	{configure_raid_include, "\n"}
};

s_node n_raid_include = {
	.rc_flags = (CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(raid_include_opt),
	.options  = &raid_include_opt[0],
	.title    = __("Add Devices to a Disk Array"),
	.header   = {
		__("Select the disk array.\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=Select disk array\n\n"),
		"" }
};

s_node n_raid_include_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Add Devices to a Disk Array Failed"),
	.header   = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no disk arrays in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference "
		   "code to correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have"
		   "reported to the system. Retry the operation.\n"),
		__("o The disks are missing.\n"),
		__("o IO adapter does not support add function.\n"),
		"" }
};

s_node n_configure_raid_include = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options = &null_opt[0],
	.title   = __("Add Devices to a Disk Array"),
	.header  = {
		__("Select the devices to be included in the disk array\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=Add a Device to a Disk Array\n\n"),
		   "" }
};

s_node n_configure_raid_include_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Add Devices to a Disk Array Failed"),
	.header = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are not enough disks available to be included.\n"),
		__("o Not all disks attached to an IOA have reported to the "
		   "system. Retry the operation.\n"),
		__("o The disk to be included must be the same or greater "
		   "capacity than the smallest device in the disk array and "
		   "be formatted correctly\n"),
		__("o The disk is not supported for the requested operation\n"),
		"" }
};

s_node n_confirm_raid_include = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Devices to Add to a Disk Array"),
	.header   = {
		__("All listed disks will be added to the disk array.\n"),
		__("ATTENTION: Disks that have not been zeroed with be formatted first.\n"),
		__("Press Enter to confirm your choice to have the system "
		   "include the selected disks in the disk array\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

s_node n_dev_include_complete = {
	.title    = __("Add Devices to a Disk Array Status"),
	.header   = {
		__("The operation to add disks to the disk array "
		   "will be done in two phases. The disks will first be "
		   "formatted, then added to the disk array."),
		__("You selected to add disks to a disk array"),
		""
	}
};

s_node n_af_include_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Format Device for RAID Function Failed"),
	.header = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no eligible disks in the system.\n"),
		__("o All disks are already formatted for RAID Function.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference code to "
		   "correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		__("o The disks are missing.\n"),
		"" }
};

s_node n_af_remove_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Format Device for JBOD Function (512) Failed"),
	.header   = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no eligible disks in the system.\n"),
		__("o All disks are already formatted for JBOD function.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference code to "
		   "correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		__("o The disks are missing.\n"),
		"" }
};

s_node n_add_hot_spare_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Create Hot Spare Failed"),
	.header = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no eligible disks in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference code to "
		   "correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		__("o The disks are missing.\n"),
		"" }
};

s_node n_remove_hot_spare_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Delete Hot Spare Failed"),
	.header = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no eligible disks in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference code to "
		   "correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system.  Retry the operation.\n"),
		__("o The disks are missing.\n"),
		"" }
};

s_node n_add_hot_spare = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Create a Hot Spare Device"),
	.header   = {
		__("Select the adapter on which disks will be "
		   "configured as hot spares\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=Select adapter\n\n"),
		"" },
};

s_node n_remove_hot_spare = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Delete a Hot Spare Device"),
	.header   = {
		__("Select the adapter on which hot spares will be deleted\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=Select adapter\n\n"),
		"" },
};/* xxx search for subsystem and disk unit and replace all */

s_node n_select_add_hot_spare = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Select Disks to Create Hot Spares"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_select_remove_hot_spare = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Select Hot Spares to Delete"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_confirm_add_hot_spare = {
	.f_flags  = (CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Create Hot Spare"),
	.header   = {
		__("ATTENTION: Existing data on these disks "
		   "will not be preserved.\n\n"),
		__("Press Enter to continue.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" },
};

s_node n_confirm_remove_hot_spare = {
	.f_flags  = (CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Delete Hot Spare"),
	.header   = {
		__("ATTENTION: Selected disks will no longer be available "
		   "as hot spare devices.\n\n"),
		__("Press Enter to continue.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

struct screen_opts disk_unit_recovery_opt[] = {
	{concurrent_add_device,    "1", __("Concurrent add device")},
	{concurrent_remove_device, "2", __("Concurrent remove device")},
	{init_device,              "3", __("Initialize and format disk")},
	{reclaim_cache,            "4", __("Reclaim IOA cache storage")},
	{raid_rebuild,             "5", __("Rebuild disk unit data")},
	{raid_resync,              "6", __("Force RAID Consistency Check")},
	{battery_maint,            "7", __("Work with resources containing cache battery packs")},
	{path_status,              "8", __("Display SAS path status")},
	{enclosures_maint,              "9", __("Work with disk enclosures")}
};

s_node n_disk_unit_recovery = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(disk_unit_recovery_opt),
	.options  = &disk_unit_recovery_opt[0],
	.title    = __("Work with Disk Unit Recovery")
};

#define IPR_CONC_REMOVE        1
#define IPR_CONC_ADD           2
#define IPR_VERIFY_CONC_REMOVE 3
#define IPR_VERIFY_CONC_ADD    4
#define IPR_WAIT_CONC_REMOVE   5
#define IPR_WAIT_CONC_ADD      6
#define IPR_CONC_IDENTIFY      7
s_node n_concurrent_remove_device = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Concurrent Device Remove"),
	.header   = {
		__("Choose a single location for remove operations\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_concurrent_add_device = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Concurrent Device Add"),
	.header   = {
		__("Choose a single location for add operations\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_verify_conc_remove = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Verify Device Concurrent Remove"),
	.header   =  {
		__("Verify the selected device for concurrent remove operations\n\n"),
		__("Press Enter when verification complete and ready to continue\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

s_node n_verify_conc_add = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Verify Device Concurrent Add"),
	.header   =  {
		__("Verify the selected device for concurrent add operations\n\n"),
		__("Press Enter when verification complete and ready to continue\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

s_node n_wait_conc_remove = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Complete Device Concurrent Remove"),
	.header   =  {
		__("Remove selected device\n\n"),
		__("Press Enter when selected device has been removed\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

s_node n_wait_conc_add = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Complete Device Concurrent Add"),
	.header   =  {
		__("Add selected device\n\n"),
		__("Press Enter when selected device has been installed\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" }
};

struct screen_opts init_device_opt[] = {
	{confirm_init_device, "\n"}
};

s_node n_af_init_device = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(init_device_opt),
	.options  = &init_device_opt[0],
	.title    = __("Select Disks to format for RAID Function"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_jbod_init_device = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(init_device_opt),
	.options  = &init_device_opt[0],
	.title    = __("Select Disks to format for JBOD Function (512)"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Select\n\n"),
		"" }
};

s_node n_init_device = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(init_device_opt),
	.options  = &init_device_opt[0],
	.title    = __("Select Disks for Initialize and Format"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Select\n\n"),
		"" }
};

struct screen_opts confirm_inits_opt[] = {
	{send_dev_inits, "c"}
};

s_node n_confirm_init_device = {
	.f_flags  = (CONFIRM_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_inits_opt),
	.options  = &confirm_inits_opt[0],
	.title    = __("Confirm Initialize and Format Disks"),
	.header   = {
		__("Press 'c' to confirm your choice for 1=Initialize and format.\n"),
		__("  q=Return to change your choice.\n\n"),
		"" }
};

s_node n_dev_init_complete = {
	.title    = __("Initialize and Format Status"),
	.body     = __("You selected to initialize and format a disk")
};

struct screen_opts reclaim_cache_opts[] = {
	{confirm_reclaim, "\n"}
};

s_node n_reclaim_cache = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG),
	.num_opts = NUM_OPTS(reclaim_cache_opts),
	.options  = &reclaim_cache_opts[0],
	.title    = __("Reclaim IOA Cache Storage"),
	.header   = {
		__("Select the IOA to reclaim IOA cache storage.\n"),
		__("ATTENTION: Proceed with this function only if directed "
		   "to from a service procedure.  Data in the IOA cache "
		   "will be discarded.\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=Reclaim IOA cache storage.\n\n"),
		"" }
};

struct screen_opts confirm_reclaim_opt[] = {
	{reclaim_warning, "c"}
};

s_node n_confirm_reclaim = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_reclaim_opt),
	.options  = &confirm_reclaim_opt[0],
	.title    = __("Confirm Reclaim IOA Cache Storage"),
	.header   = {
		__("The disks that may be affected by the function are displayed.\n"),
		__("ATTENTION: Proceed with this function only if directed to from a "
		   "service procedure. Data in the IOA cache will be discarded. "
		   "Filesystem corruption may result on the system.\n\n"),
		__("Press c=Confirm to reclaim cache storage.\n"),
		__("  q=Cancel to return to change your choice.\n\n"),
		"" }
};

struct screen_opts confirm_reclaim_warning_opt[] = {
	{reclaim_result, "s"}
};

s_node n_confirm_reclaim_warning = {
	.f_flags  = (CONFIRM_REC_FLAG | CANCEL_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_reclaim_warning_opt),
	.options  = &confirm_reclaim_warning_opt[0],
	.title    = __("Confirm Reclaim IOA Cache Storage"),
	.header   = {
		__("ATTENTION!!!   ATTENTION!!!   ATTENTION!!!   ATTENTION!!!\n"),
		__("ATTENTION: Proceed with this function only if directed to from a "
		   "service procedure. Data in the IOA cache will be discarded. "
		   "This data loss may or may not be detected by the host operating "
		   "system. Filesystem corruption may result on the system.\n\n"),
		__("Press 's' to continue.\n\n"),
		"" }
};

s_node n_reclaim_result = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Reclaim IOA Cache Storage Results")
};

struct screen_opts raid_rebuild_opt[] = {
	{confirm_raid_rebuild, "\n"}
};

s_node n_raid_rebuild = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(raid_rebuild_opt),
	.options  = &raid_rebuild_opt[0],
	.title    = __("Rebuild Disk Unit Data"),
	.header   = {
		__("Select the disks to be rebuilt\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=Rebuild\n\n"),
		"" }
};

s_node n_raid_rebuild_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Rebuild Disk Unit Data Failed"),
	.header   = {
		__("There are no disks eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no disks that need to be rebuilt.\n"),
		__("o The disk that needs to be rebuilt is not at the right "
		   "location. Examine the 'message log' for the exposed unit "
		   "and make sure that the replacement unit is at the correct "
		   "location.\n"),
		__("o Not all disks attached to an IOA have reported to the "
		   "system. Retry the operation.\n"),
		__("o The disk is not supported for the requested operation.\n"),
		"" }
};

s_node n_confirm_raid_rebuild = {
	.f_flags  = (CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Rebuild Disk Unit Data"),
	.header   = {
		__("Rebuilding the disk unit data may take several "
		   "minutes for each disk selected.\n\n"),
		__("Press Enter to confirm having the data rebuilt.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" },
};

s_node n_raid_resync_complete = {
	.title    = __("Force RAID Consistency Check Status"),
	.body     = __("You selected to force a RAID consistency check")
};

struct screen_opts raid_resync_opt[] = {
	{confirm_raid_resync, "\n"}
};

s_node n_raid_resync = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(raid_resync_opt),
	.options  = &raid_resync_opt[0],
	.title    = __("Force RAID Consistency Check"),
	.header   = {
		__("Select the arrays to be checked\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=Check\n\n"),
		"" }
};

s_node n_raid_resync_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Force RAID Consistency Check Failed"),
	.header   = {
		__("There are no arrays eligible for the selected operation "
		   "due to one or more of the following reasons:\n\n"),
		__("o There are no disk arrays in the system.\n"),
		__("o An IOA is in a condition that makes the disks attached to "
		   "it read/write protected. Examine the kernel messages log "
		   "for any errors that are logged for the IO subsystem "
		   "and follow the appropriate procedure for the reference code to "
		   "correct the problem, if necessary.\n"),
		__("o Not all disks attached to an advanced function IOA have "
		   "reported to the system. Retry the operation.\n"),
		__("o The disks are missing.\n"),
		"" }
};

s_node n_confirm_raid_resync = {
	.f_flags  = (CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Force RAID Consistency Check"),
	.header   = {
		__("Forcing a consistency check on a RAID array may take "
		   "a long time, depending on current system activity.\n\n"),
		__("Press Enter to confirm.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"" },
};

struct screen_opts configure_af_device_opt[] = {
	{confirm_init_device, "\n"}
};

struct screen_opts battery_maint_opt[] = {
	{battery_fork, "\n"}
};

s_node n_battery_maint = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG),
	.num_opts = NUM_OPTS(battery_maint_opt),
	.options  = &battery_maint_opt[0],
	.title    = __("Work with Resources Containing Cache Battery Packs"),
	.header   = {
		__("Type options, press Enter\n"),
		__("  1=Display battery information\n"),
		__("  2=Force battery pack into error state\n"),
		__("  3=Start IOA cache\n\n"),
		"" }
};

struct screen_opts confirm_force_battery_error_opt[] = {
	{force_battery_error, "c"}
};

s_node n_confirm_force_battery_error = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_force_battery_error_opt),
	.options  = &confirm_force_battery_error_opt[0],
	.title    = __("Force Battery Packs Into Error State"),
	.header   = {
		__("ATTENTION: This service function should be run only "
		   "under the direction of the IBM Hardware Service Support\n\n"),
		__("You have selected to force a cache batter error on an IOA\n\n"),
		__("You will have to replace the Cache Battery Pack in each selected "
		   "IOA to resume normal operations.\n\n"),
		__("System performance could be significantly degraded until the cache "
		   "battery packs are replaced on the selected IOAs.\n\n"),
		__("  c=Continue to force the following battery packs into an error state\n\n"),
		"" },
};

struct screen_opts confirm_start_cache_opt[] = {
	{enable_battery, "c"}
};

s_node n_confirm_start_cache = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_start_cache_opt),
	.options  = &confirm_start_cache_opt[0],
	.title    = __("Start IOA cache after concurrently replacing battery pack"),
	.header   = {
		__("ATTENTION: This service function should be run only "
		   "under the direction of the IBM Hardware Service Support\n\n"),
		__("You have selected to start the IOA cache after concurrently replacing the battery pack\n\n"),
		__("  c=Continue to start IOA cache\n\n"),
		"" },
};

s_node n_show_battery_info = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Battery Information")
};

struct screen_opts enclosures_maint_opt[] = {
	{enclosures_fork, "\n"}
};

s_node n_enclosures_maint = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(enclosures_maint_opt),
	.options  = &enclosures_maint_opt[0],
	.title    = __("Work with disk enclosures"),
	.header   = {
		__("Type options, press Enter\n"),
		__("  1=Display disk enclosure details\n"),
		__("  2=Suspend disk enclosure path\n"),
		__("  3=Resume disk enclosure path\n\n"),
		"" }
};

struct screen_opts confirm_suspend_disk_enclosure_opt[] = {
	{ipr_suspend_disk_enclosure, "c"}
};

s_node n_confirm_suspend_disk_enclosure = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_suspend_disk_enclosure_opt),
	.options  = &confirm_suspend_disk_enclosure_opt[0],
	.title    = __("Suspend Disk Enclosure"),
	.header   = {
		__("ATTENTION: This service function should be run only "
		   "under the direction of the IBM Hardware Service Support\n\n"),
		__("  c=Continue to issue suspend enclosure command\n\n"),
		"" },
};

struct screen_opts confirm_resume_disk_enclosure_opt[] = {
	{ipr_resume_disk_enclosure, "c"}
};

s_node n_confirm_resume_disk_enclosure = {
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_resume_disk_enclosure_opt),
	.options  = &confirm_resume_disk_enclosure_opt[0],
	.title    = __("Resume Disk Enclosure"),
	.header   = {
		__("ATTENTION: This service function should be run only "
		   "under the direction of the IBM Hardware Service Support\n\n"),
		__("  c=Continue to issue resume enclosure command\n\n"),
		"" },
};

s_node n_show_enclosure_info = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title    = __("Hardware detail Information")
};

struct screen_opts path_status_opt[] = {
	{path_details, "\n"}
};

s_node n_path_status = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(path_status_opt),
	.options  = &path_status_opt[0],
	.title    = __("Display SAS Path Status"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Display SAS Path routing details\n\n"),
		"" }
};

s_node n_path_details = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | FWD_FLAG),
	.title    = __("Display SAS Path Details"),
	.header   = {__("\n\n"), ""}
};

struct screen_opts bus_config_opt[] = {
	{change_bus_attr, "\n"}
};

s_node n_bus_config = {
	.rc_flags = (CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(bus_config_opt),
	.options  = &bus_config_opt[0],
	.title    = __("Work with SCSI Bus Configuration"),
	.header   = {
		__("Select the adapter to change scsi bus attribute.\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=change scsi bus attribute\n\n"),
		"" }
};

s_node n_bus_config_fail = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
	.title  = __("Work with SCSI Bus Configuration Failed"),
	.header = {
		__("There are no SCSI Buses eligible for the selected operation. "
		   "None of the installed adapters support the requested "
		   "operation.\n"),
		"" }
};

struct screen_opts change_bus_attr_opt[] = {
	{NULL, "c"},
	{confirm_change_bus_attr, "\n"}
};

s_node n_change_bus_attr = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG | MENU_FLAG),
	.num_opts = NUM_OPTS(change_bus_attr_opt),
	.options  = &change_bus_attr_opt[0],
	.title    = __("Change SCSI Bus Configuration"),
	.header   = {
		__("Current bus configurations are shown. To change "
		   "setting hit 'c' for options menu. Highlight "
		   "desired option then hit Enter.\n"),
		__("  c=Change Setting\n\n"),
		"" }
};

struct screen_opts confirm_change_bus_attr_opt[] = {
	{NULL, "c"}
};

s_node n_confirm_change_bus_attr = {
	.f_flags  = (CONFIRM_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(confirm_change_bus_attr_opt),
	.options  = &confirm_change_bus_attr_opt[0],
	.title    = __("Confirm Change SCSI Bus Configuration"),
	.header   = {
		__("Confirming this action will result in the following"
		   "configuration to become active.\n"),
		__("  c=Confirm Change SCSI Bus Configration\n\n"),
		"" }
};

struct screen_opts driver_config_opt[] = {
	{change_driver_config, "\n"}
};

s_node n_driver_config = {
	.rc_flags = (CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(driver_config_opt),
	.options  = &driver_config_opt[0],
	.title    = __("Adapter Driver Configuration"),
	.header   = {
		__("Select adapter to change driver configuration\n\n"),
		__("Type choice, press Enter\n"),
		__("  1=change driver configuration\n\n"),
		"" }
};

s_node n_change_driver_config = {
	.f_flags  = (ENTER_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Change Driver Configuration"),
	.header   = {
		__("Current Driver configurations "
		   "are shown. To change setting, type in new "
		   "value then hit Enter\n\n"),
		"" }
};

struct screen_opts disk_config_opt[] = {
	{change_disk_config, "\n"}
};

s_node n_disk_config = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(disk_config_opt),
	.options  = &disk_config_opt[0],
	.title    = __("Change Disk Configuration"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Change Disk Configuration\n\n"),
		"" }
};

struct screen_opts change_disk_attr_opt[] = {
	{NULL, "c"},
	{NULL, "\n"}
};

s_node n_change_disk_config = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG | MENU_FLAG),
	.num_opts = NUM_OPTS(change_disk_attr_opt),
	.options  = &change_disk_attr_opt[0],
	.title    = __("Change Configuration of Disk"),
	.header   = {
		__("Current Disk configurations are shown. To change "
		   "setting hit 'c' for options menu. Highlight "
		   "desired option then hit Enter.\n"),
		__("  c=Change Setting\n\n"),
		"" }
};

struct screen_opts ioa_config_opt[] = {
	{change_ioa_config, "\n"}
};

s_node n_ioa_config = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | TOGGLE_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(ioa_config_opt),
	.options  = &ioa_config_opt[0],
	.title    = __("Change Adapter Configuration"),
	.header   = {
		__("Type option, press Enter.\n"),
		__("  1=Change Adapter Configuration\n\n"),
		"" }
};

struct screen_opts change_ioa_attr_opt[] = {
	{NULL, "c"},
	{NULL, "\n"}
};

s_node n_change_ioa_config = {
	.f_flags  = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG | FWD_FLAG | MENU_FLAG),
	.num_opts = NUM_OPTS(change_ioa_attr_opt),
	.options  = &change_ioa_attr_opt[0],
	.title    = __("Change Configuration of Adapter"),
	.header   = {
		__("Current Adapter configurations are shown. To change "
		   "setting hit 'c' for options menu. Highlight "
		   "desired option then hit Enter.\n"),
		__("  c=Change Setting\n\n"),
		"" }
};

struct screen_opts download_ucode_opt[] = {
	{choose_ucode, "\n"}
};

s_node n_download_ucode = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG | FWD_FLAG | TOGGLE_FLAG),
	.num_opts = NUM_OPTS(download_ucode_opt),
	.options  = &download_ucode_opt[0],
	.title    = __("Download Microcode"),
	.header   = {
		__("Select the device(s) to download microcode\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=device to download microcode\n\n"),
		"" }
};

s_node n_choose_ucode = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (CANCEL_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Choose Microcode Image"),
	.header   = {
		__("Select the microcode image to download\n\n"),
		__("Type choice, press Enter.\n"),
		__("  1=download microcode\n\n"),
		"OPT  Version         Date     Image File\n",
		"---  --------------- -------- --------------------------\n",
		"" }
};

s_node n_confirm_download_ucode = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (CANCEL_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Microcode Download"),
	.header   = {
		__("ATTENTION:  System performance may be affected during "
		   "the microcode download process\n\n"),
		__("Press Enter to continue.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"OPT  Version         Date     Image File\n",
		"---  --------------- -------- --------------------------\n",
		"" }
};

s_node n_confirm_download_all_ucode = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (CANCEL_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Microcode Download"),
	.header   = {
		__("The following devices are going to be updated.\n\n"
		   "ATTENTION:  System performance may be affected during "
		   "the microcode download process. "
		   "Download may take some time.\n\n"),
		__("Press Enter to continue.\n"),
		__("  q=Cancel to return and change your choice.\n\n"),
		"Name   Version    Date       Image File\n",
		"------ ---------  ---------  -----------------------------\n",
		"" }
};

s_node n_download_ucode_in_progress = {
	.rc_flags = (CANCEL_FLAG),
	.f_flags  = (CANCEL_FLAG | FWD_FLAG),
	.num_opts = NUM_OPTS(null_opt),
	.options  = &null_opt[0],
	.title    = __("Microcode Download In Progress"),
	.header   = {
		__("Please wait for the microcode update to complete\n"),
		__("This process may take several minutes\n"),
		"" }
};

struct screen_opts log_menu_opt[] = {
	{ibm_storage_log_tail, "1", __("View most recent ipr error messages")},
	{ibm_storage_log,      "2", __("View ipr error messages")},
	{kernel_log,           "3", __("View all kernel error messages")},
	{iprconfig_log,        "4", __("View iprconfig error messages")},
	{kernel_root,          "5", __("Set root kernel message log directory")},
	{set_default_editor,   "6", __("Set default editor")},
	{restore_log_defaults, "7", __("Restore defaults")},
	{ibm_boot_log,         "8", __("View ipr boot time messages")}
};

s_node n_log_menu = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(log_menu_opt),
	.options  = &log_menu_opt[0],
	.title    = __("Kernel Messages Log"),
	.header   = {
		__("ATTENTION: Devices listed below are currently known to be zeroed. "
		   "By exiting now, this information will be lost, resulting in potentially "
		   "longer array creation times.\n\n"),
		__("  q=Cancel to return to iprconfig.\n"),
		__("  e=Exit iprconfig\n")
	}
};

s_node n_exit_menu = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(log_menu_opt),
	.options  = &null_opt[0],
	.title    = __("Confirm Exit")
};

struct screen_opts kernel_root_opt[] = {
	{confirm_kernel_root, "\n"}
};

s_node n_kernel_root = {
	.f_flags  = (ENTER_FLAG),
	.num_opts = NUM_OPTS(kernel_root_opt),
	.options  = &kernel_root_opt[0],
	.title    = __("Kernel Messages Log Root Directory"),
	.header   = {
		__("Enter new directory and press Enter\n\n"),
		"" }
};

struct screen_opts confirm_kernel_root_opt[] = {
	{NULL, "c"},
};

s_node n_confirm_kernel_root = {
	.f_flags  = (CONFIRM_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(confirm_kernel_root_opt),
	.options  = &confirm_kernel_root_opt[0],
	.title    = __("Confirm Root Directory Change"),
	.header   = {
		__("Press 'c' to confirm your new "
		   "kernel root directory choice.\n\n"),
		__("To return to the log menu without "
		   "changing the root directory, choose 'q'.\n\n"),
		"" }
};

struct screen_opts set_default_editor_opt[] = {
	{confirm_set_default_editor, "\n"}
};

s_node n_set_default_editor = {
	.f_flags  = (ENTER_FLAG),
	.num_opts = NUM_OPTS(set_default_editor_opt),
	.options  = &set_default_editor_opt[0],
	.title    = __("Kernel Messages Editor"),
	.header   = {
		__("Enter new editor command and press Enter\n\n"),
		"" }
};

struct screen_opts confirm_set_default_editor_opt[] = {
	{NULL, "c"}
};

s_node n_confirm_set_default_editor = {
	.f_flags  = (CONFIRM_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(confirm_set_default_editor_opt),
	.options  = &confirm_set_default_editor_opt[0],
	.title    = __("Confirm Editor Change"),
	.header   = {
		__("Press 'c' to confirm your editor choice\n\n"),
		__("To return to the log menu without "
		   "changing the editor, choose 'q'.\n\n"),
		"" }
};


struct screen_opts ucode_screen_opt[] = {
	{download_ucode,      "1", __("Download microcode")},
	{download_all_ucode,  "2", __("Download latest microcode to all devices")},
};

s_node n_ucode_screen = {
	.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
	.f_flags  = (EXIT_FLAG | CANCEL_FLAG),
	.num_opts = NUM_OPTS(ucode_screen_opt),
	.options  = &ucode_screen_opt[0],
	.title    = __("Work with microcode updates")
};

const char *screen_status[] = {
	/*  0 */ "",
	/*  1 */ "",
	/*  2 */ __("Invalid option specified"),
	/*  3 */ __("Screen paged up"),
	/*  4 */ __("Already at top"),
	/*  5 */ __("Screen paged down"),
	/*  6 */ __("Already at bottom"),
	/*  7 */ "",
	/*  8 */ "",
	/*  9 */ "",
	/* 10 */ __("No devices to show details for"),
	/* 11 */ "",
	/* 12 */ "",
	/* 13 */ "",
	/* 14 */ "",
	/* 15 */ __("The selection is not valid."),
	/* 16 */ __("Error.  More than one device was selected."),
	/* 17 */ __("Invalid option.  No devices selected."),
	/* 18 */ __("Disk array successfully created."),
	/* 19 */ __("Create disk array failed."),
	/* 20 */ __("Delete disk array failed."),
	/* 21 */ __("Disk array successfully deleted."),
	/* 22 */ __("Create disk array failed - can not mix SSDs and HDDs."),
	/* 23 */ "",
	/* 24 */ "",
	/* 25 */ __("Error:  number of devices selected must be a multiple of %d"),
	/* 26 */ __("Add device failed"),
	/* 27 */ __("Add device completed successfully"),
	/* 28 */ __("Rebuild started, view Disk Array Status Window for rebuild progress"),
	/* 29 */ __("Rebuild failed"),
	/* 30 */ __("Device concurrent maintenance failed"),
	/* 31 */ __("Device concurrent maintenance failed, device in use"),
	/* 32 */ __("Device concurrent maintenance completed successfully"),
	/* 33 */ __("No units available for initialize and format"),
	/* 34 */ __("Initialize and format completed successfully"),
	/* 35 */ __("Initialize and format failed"),
	/* 36 */ __("Reclaim IOA Cache Storage completed successfully"),
	/* 37 */ __("Reclaim IOA Cache Storage failed"),
	/* 38 */ __("No Reclaim IOA Cache Storage is necessary"),
	/* 39 */ __("No Reclaim IOA Cache Storage performed"),
	/* 40 */ __("Rebuild started, view Disk Array Status Window for rebuild progress"),
	/* 41 */ __("Rebuild failed"),
	/* 42 */ __("The selected battery packs have successfully been placed into an error state."),
	/* 43 */ __("Failed to force the selected battery packs into an error state."),
	/* 44 */ __("No configured resources contain a cache battery pack."),
	/* 45 */ __("Change SCSI Bus configurations completed successfully"),
	/* 46 */ __("Change SCSI Bus configurations failed"),
	/* 47 */ __("Change device driver configurations completed successfully"),
	/* 48 */ __("Change device driver configurations failed"),
	/* 49 */ __("No units available for initialize and format"),
	/* 50 */ __("Initialize and format completed successfully"),
	/* 51 */ __("Initialize and format failed"),
	/* 52 */ __("No devices available for the selected hot spare operation"),
	/* 53 */ __("Hot spare successfully created"),
	/* 54 */ __("Hot spare successfully deleted"),
	/* 55 */ __("Failed to create hot spare"),
	/* 56 */ __("Failed to delete hot spare"),
	/* 57 */ __("Successfully changed device driver configuration"),
	/* 58 */ __("Failed to change device driver configuration"),
	/* 59 */ __("Invalid directory"),
	/* 60 */ __("Root directory changed to %s"),
	/* 61 */ __("Root directory unchanged"),
	/* 62 */ __("Editor changed to %s"),
	/* 63 */ __("Editor unchanged"),
	/* 64 */ __("Default log values restored"),
	/* 65 */ __("Editor returned %d. Try setting the default editor."),
	/* 66 */ __("Failed to change disk configuration."),
	/* 67 */ __("Microcode Download failed."),
	/* 68 */ __("Failed to enable IOA cache."),
	/* 69 */ __("Invalid number of devices selected."),
	/* 70 */ __("Failed to start IOA cache."),
	/* 71 */ __("IOA cache started successfully."),
	/* 72 */ __("Selected battery packs successfully forced into an error state."),
	/* 73 */ __("Force RAID Consistency check failed"),
	/* 74 */ __("RAID Consistency check successful"),
	/* 75 */ __("Failed to read error log. Try setting root kernel message log directory."),
	/* 76 */ __("No SAS disks available"),
	/* 77 */ __("Too many disks were selected.  The maximum is %d."),
	/* 78 */ __("Too few disks were selected.  The minimum is %d."),
	/* 79 */ __("Migrate Array Protection completed successfully."),
	/* 80 */ __("Migrate Array Protection failed."),
	/* 81 */ __("Selected disk enclosure was suspended successfully."),
	/* 82 */ __("Failed to suspend disk enclosure"),
	/* 83 */ __("Disk enclosure is already in suspend state"),
	/* 84 */ __("Disk enclosure is already in active state"),
	/* 85 */ __("Selected disk enclosure was resumed successfully."),
	/* 86 */ __("Failed to resume disk enclosure"),
	/* 87 */ __("Can not suspend an expander from the RAID controller with the same serial number"),
	/* 88 */ __("Incorrect device type specified. Please specify a valid disk enclosure to suspend"),
	/* 89 */ __("Incorrect device type specified. Please specify a valid disk enclosure to resume"),
	/* 90 */ __("Selected disk enclosure is in Unknown state. Please check your hardware support"),
	/* 91 */ __("Create disk array failed - can not mix 5XX and 4K disks."),
	/* 92 */ __("Create disk array failed - can not build with read intensive disks only."),
	/* 93 */ __("All devices up to date"),
	/* 94 */ __("Temporary log file creation failed: %s"),
	/* 95 */ __("Create disk array failed - can not mix SSDs and RI SSDs."),

      /* NOTE:  127 maximum limit */
};

/* TODO - replace constants in iprconfig.c with the following enums/defines */
enum {
	RC_0_Success = 0,
	RC_1_Blank,
	RC_2_Invalid_Option,
	RC_3_Screen_Up,
	RC_4_At_Top,
	RC_5_Screen_Down,
	RC_6_At_Bottom,
	RC_7_Blank,
	RC_8_Blank,
	RC_9_Blank,
	RC_10_No_Devices,
	RC_11_Blank,
	RC_12_Blank,
	RC_13_Blank,
	RC_14_Blank,
	RC_15_Invalid_Selection,
	RC_16_More_Than_One_Dev,
	RC_17_Invalid_Option,
	RC_18_Array_Created,
	RC_19_Create_Fail,
	RC_20_Delete_Fail,
	RC_21_Delete_Success,
	RC_22_Mixed_Block_Dev_Classes,
	RC_23_Blank,
	RC_24_Blank,
	RC_25_Devices_Multiple,
	RC_26_Include_Fail,
	RC_27_Include_Success,
	RC_28_Rebuild_Started,
	RC_29_Rebuild_Fail,
	RC_30_Maint_Fail,
	RC_31_Maint_Fail_In_Use,
	RC_32_Maint_Success,
	RC_33_No_Units,
	RC_34_Init_Format_Success,
	RC_35_Init_Format_Fail,
	RC_36_Reclaim_Cache_Success,
	RC_37_Reclaim_Cache_Fail,
	RC_38_No_Reclaim_Needed,
	RC_39_No_Reclaim_Performed,
	RC_40_Rebuild_Started,
	RC_41_Rebuild_Failed,
	RC_42_Battery_Err_State_Success,
	RC_43_Battery_Err_State_Fail,
	RC_44_No_Battery_Pack,
	RC_45_Change_Bus_Conf_Success,
	RC_46_Change_Bus_Conf_Fail,
	RC_47_Change_Driver_Conf_Success,
	RC_48_Change_Driver_Conf_Fail,
	RC_49_No_Units_Available,
	RC_50_Init_Format_Success,
	RC_51_Init_Format_Fail,
	RC_52_No_Devices_Available,
	RC_53_Hot_Spare_Created,
	RC_54_Hot_Spare_Deleted,
	RC_55_Failed_Create,
	RC_56_Failed_Delete,
	RC_57_Change_Driver_Conf_Success,
	RC_58_Change_Driver_Conf_Fail,
	RC_59_Invalid_Dir,
	RC_60_Root_Changed,
	RC_61_Root_Unchanged,
	RC_62_Editor_Changed,
	RC_63_Editor_Unchanged,
	RC_64_Log_Restored,
	RC_65_Set_Default_Editor,
	RC_66_Disk_Conf_Fail,
	RC_67_uCode_Download_Fail,
	RC_68_Cache_Enable_Fail,
	RC_69_Invalid_Number_Devs,
	RC_70_Cache_Start_Fail,
	RC_71_Cache_Start_Success,
	RC_72_Battery_Err_State,
	RC_73_Force_Check_Fail,
	RC_74_Check_Success,
	RC_75_Failed_Read_Err_Log,
	RC_76_No_SAS_Disks,
	RC_77_Too_Many_Disks,
	RC_78_Too_Few_Disks,
	RC_79_Migrate_Prot_Success,
	RC_80_Migrate_Prot_Fail,
	RC_81_Suspended_Success,
	RC_82_Suspended_Fail,
	RC_83_Enclosure_Is_Suspend,
	RC_84_Enclosure_Is_Active,
	RC_85_Enclosure_Resume_Success,
	RC_86_Enclosure_Resume_Fail,
	RC_87_No_Suspend_Same_Seri_Num,
	RC_88_Invalid_Dev_For_Suspend,
	RC_89_Invalid_Dev_For_Resume,
	RC_90_Enclosure_Is_Unknown,
	RC_91_Mixed_Logical_Blk_Size,
	RC_92_UNSUPT_REQ_BLK_DEV_CLASS,
	RC_93_All_Up_To_Date,
	RC_94_Tmp_Log_Fail,
	RC_95_Mixed_RISSD_SSDs,

	/* NOTE:  127 maximum limit */
};

#endif /* iprconfig_h */