/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* A5X00 Library definitions
*/
/*
* I18N message number ranges
* This file: 16000 - 16499
* Shared common messages: 1 - 1999
*/
#ifndef _A5K_H
#define _A5K_H
#ifdef __cplusplus
extern "C" {
#endif
/* Defines */
#define ENCLOSURE_PROD_ID "SENA"
#define ENCLOSURE_PROD_NAME "Network Array"
#define MAX_DRIVES_PER_BOX 22
#define MAX_DRIVES_DAK 12
#define L_WWN_LENGTH 16
#define BOX_ID_MASK 0x60
#define BOX_ID 0x0d
#define ALT_BOX_ID 0x10
#define MAX_IB_ELEMENTS 50
#define MAX_VEND_SPECIFIC_ENC 216
#define MAX_POSSIBLE_ELEMENTS 255
#define SET_RQST_INSRT 0
#define SET_RQST_RMV 1
#define OVERALL_STATUS 2
#define SET_FAULT 3
#define SET_DRV_ON 4
#define INSERT_DEVICE 106
#define REMOVE_DEVICE 114
/* device specific identification for display, etc */
#define DAK_OFF_NAME "Daktari official" /* inq response, prod ident */
#define DAK_PROD_STR "SUNWGS INT FCBPL"
#define UNDEF_ENC_TYPE 2
#define DAK_ENC_TYPE 1
#define SENA_ENC_TYPE 0
/* Page defines */
#define L_PAGE_PAGE_LIST 0x00 /* Supported pages page */
#define L_PAGE_CONFIG 0x01 /* Configuration page */
#define L_PAGE_1 L_PAGE_CONFIG
#define L_PAGE_ENCL_CTL 0x02 /* Enclosure Control page */
#define L_PAGE_ENCL_STATUS 0x02 /* Enclosure status page */
#define L_PAGE_2 L_PAGE_ENCL_STATUS
#define L_PAGE_STRING 0x04
#define L_PAGE_4 L_PAGE_STRING
#define L_PAGE_7 0x07 /* Element Descriptor Page */
#define L_MAX_POSSIBLE_PAGES 255
#define L_MAX_SENAIB_PAGES 8
/*
* FRU types internal and external (host SES type)
*/
#define ELM_TYP_NONE 0x0 /* Unspecified */
#define ELM_TYP_DD 0x01 /* Disk Drive - device */
#define ELM_TYP_PS 0x02 /* Power Supply */
#define ELM_TYP_FT 0x03 /* Fan Tray - cooling element */
#define ELM_TYP_TS 0x04 /* Temperature Sensors */
#define ELM_TYP_FP 0x0c /* FPM screen - display */
#define ELM_TYP_KP 0x0d /* keypad on FPM - keypad device */
#define ELM_TYP_FL 0x0f /* Fibre Link module - SCSI port/trancvr */
#define ELM_TYP_LN 0x10 /* Language */
#define ELM_TYP_SP 0x11 /* Serial Port - communicaion port */
#define ELM_TYP_MB 0x80 /* Motherboard/Centerplane */
#define ELM_TYP_IB 0x81 /* IB(ESI) - controller electronics */
#define ELM_TYP_BP 0x82 /* BackPlane */
#define ELM_TYP_LO 0xa0 /* Loop Configuration */
#define ELM_TYP_OR 0xa2 /* Orientation */
#define S_HI_SPEED 0x5
/* code (status code) definitions */
#define S_OK 0x01
#define S_CRITICAL 0x02
#define S_NONCRITICAL 0x03
#define S_NOT_INSTALLED 0x05
#define S_NOT_AVAILABLE 0x07
/* String codes. */
#define L_WWN 0x01
#define L_PASSWORD 0x02
#define L_ENCL_NAME 0x03
#define L_BOX_ID 0x04
#define L_AUTO_LIP 0x05
/* Loop states */
#define L_NO_LOOP 0x80 /* drive not accessable */
#define L_INVALID_WWN 0x100
#define L_INVALID_MAP 0x200
#define L_NO_PATH_FOUND 0x400
/* d_state_flags definitions */
#define L_OK 0x00 /* NOTE: Must be zero. */
#define L_NOT_READY 0x01
#define L_NOT_READABLE 0x02
#define L_SPUN_DWN_D 0x04
#define L_RESERVED 0x08
#define L_OPEN_FAIL 0x10
#define L_NO_LABEL 0x20
#define L_SCSI_ERR 0x40
/* Values used by the l_led function */
#define L_LED_STATUS 0x00
#define L_LED_RQST_IDENTIFY 0x01
#define L_LED_ON 0x02
#define L_LED_OFF 0x04
/* Structure definitions */
typedef struct box_list_struct {
uchar_t prod_id_s[17]; /* NULL terminated string */
uchar_t b_name[33]; /* NULL terminated string */
char logical_path[MAXNAMELEN];
char b_physical_path[MAXNAMELEN];
char b_node_wwn_s[17]; /* NULL terminated string */
uchar_t b_node_wwn[8];
char b_port_wwn_s[17]; /* NULL terminated string */
uchar_t b_port_wwn[8];
struct box_list_struct *box_prev;
struct box_list_struct *box_next;
} Box_list;
typedef struct path_struct {
char *p_physical_path;
char *argv;
int slot_valid; /* Slot valid flag. */
int slot;
int f_flag; /* Front/rear flag. 1 = front */
int ib_path_flag;
} Path_struct;
/*
* Page 0
*/
typedef struct ib_page_0 {
uchar_t page_code;
uchar_t sub_enclosures;
ushort_t page_len;
uchar_t sup_page_codes[0x100];
} IB_page_0;
/*
* Page 1
* Configuration page
*/
typedef struct type_desc_hdr {
uchar_t type;
uchar_t num;
uchar_t sub_id;
uchar_t text_len;
} Type_desc_hdr;
typedef struct type_desc_text {
uchar_t text_element[256];
} Type_desc_text;
typedef struct ib_page_config {
uchar_t page_code;
uchar_t sub_enclosures;
ushort_t page_len;
uint_t gen_code;
/* Enclosure descriptor header */
uchar_t enc_res;
uchar_t enc_sub_id;
uchar_t enc_num_elem;
uchar_t enc_len;
/* Enclosure descriptor */
uchar_t enc_node_wwn[8];
uchar_t vend_id[8];
uchar_t prod_id[16];
uchar_t prod_revision[4];
uchar_t res[MAX_VEND_SPECIFIC_ENC];
Type_desc_hdr type_hdr[MAX_IB_ELEMENTS];
Type_desc_text text[MAX_IB_ELEMENTS];
} IB_page_config;
/*
* Page 2
* Enclosure status/control page
*/
/*
* Loop Configuration.
*/
typedef struct loop_element_status {
uchar_t : 1, /* reserved */
prd_fail : 1,
: 2, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
uchar_t : 8; /* reserved */
uchar_t : 7, /* reserved */
split : 1;
} Loop_elem_st;
/*
* Language
*/
typedef struct language_element_status {
uchar_t : 1, /* reserved */
prd_fail : 1,
: 2, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
ushort_t language_code;
} Lang_elem_st;
/*
* Tranceiver status
*/
typedef struct trans_element_status {
uchar_t : 1, /* reserved */
prd_fail : 1,
: 2, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
uchar_t : 7,
report : 1;
uchar_t : 3, /* reserved */
disabled : 1,
: 2,
lol : 1,
lsr_fail : 1;
} Trans_elem_st;
/*
* ESI Controller status
*/
typedef struct ctlr_element_status {
uchar_t : 1, /* reserved */
prd_fail : 1,
: 2, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
uchar_t : 7, /* reserved */
report : 1;
uchar_t : 4, /* reserved */
overtemp_alart : 1,
: 1, /* reserved */
ib_loop_1_fail : 1,
ib_loop_0_fail : 1;
} Ctlr_elem_st;
/*
* Backplane status
*/
typedef struct bp_element_status {
uchar_t select : 1,
prd_fail : 1,
: 2, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
uchar_t : 8; /* reserved */
uchar_t : 3, /* reserved */
disabled : 1,
en_bypass_a : 1, /* Not in Spec. */
en_bypass_b : 1, /* Not in Spec. */
byp_a_enabled : 1,
byp_b_enabled : 1;
} Bp_elem_st;
/*
* Temperature sensor status
*/
typedef struct temp_element_status {
uchar_t : 1, /* reserved */
prd_fail : 1,
: 2, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
char degrees;
uchar_t : 4, /* reserved */
ot_fail : 1,
ot_warn : 1,
ut_fail : 1,
ut_warn : 1;
} Temp_elem_st;
typedef struct fan_element_status {
uchar_t : 1, /* reserved */
prd_fail : 1,
: 2, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
uchar_t : 8; /* reserved */
uchar_t : 1, /* reserved */
fail : 1,
rqsted_on : 1,
: 2,
speed : 3;
} Fan_elem_st;
typedef struct ps_element_status {
uchar_t : 1, /* reserved */
prd_fail : 1,
: 1, /* reserved */
swap : 1,
code : 4;
uchar_t : 8; /* reserved */
uchar_t : 4, /* reserved */
dc_over : 1,
dc_under : 1,
dc_over_i : 1,
: 1; /* reserved */
uchar_t : 1, /* reserved */
fail : 1,
rqsted_on : 1,
: 1,
ovrtmp_fail : 1,
temp_warn : 1,
ac_fail : 1,
dc_fail : 1;
} Ps_elem_st;
typedef struct device_element {
uchar_t select : 1,
prd_fail : 1,
disable : 1,
swap : 1,
code : 4;
uchar_t sel_id; /* Hard address */
uchar_t : 1,
dont_remove : 1,
: 2,
rdy_to_ins : 1,
rmv : 1,
ident : 1,
report : 1;
uchar_t : 1, /* reserved */
fault : 1,
fault_req : 1,
dev_off : 1,
en_bypass_a : 1,
en_bypass_b : 1,
bypass_a_en : 1,
bypass_b_en : 1;
} Dev_elem_st;
typedef struct interconnect_assem_status {
uchar_t : 4, /* reserved */
code : 4;
uchar_t : 8; /* reserved */
uchar_t : 8; /* reserved */
uchar_t : 7, /* reserved */
eprom_fail : 1;
} Interconnect_st;
typedef struct ib_page_2 {
uchar_t page_code;
union {
uchar_t res : 3, /* Reserved */
invop : 1,
info : 1,
non_crit : 1,
crit : 1,
unrec : 1;
uchar_t ab_cond;
} ui;
ushort_t page_len;
uint_t gen_code;
uint_t element[MAX_POSSIBLE_ELEMENTS];
} IB_page_2;
/*
* Page 4
*
* String page.
*/
typedef struct page4_name {
uchar_t page_code;
uchar_t : 8; /* reserved */
ushort_t page_len;
uchar_t string_code;
uchar_t : 7,
enable : 1;
uchar_t : 8; /* reserved */
uchar_t : 8; /* reserved */
uchar_t name[32];
} Page4_name;
typedef struct element_descriptor {
uchar_t : 8; /* reserved */
uchar_t : 8; /* reserved */
ushort_t desc_len;
uchar_t desc_string[0xff];
} Elem_desc;
typedef struct ib_page_7 {
uchar_t page_code;
uchar_t : 8; /* reserved */
ushort_t page_len;
uint_t gen_code;
Elem_desc element_desc[MAX_POSSIBLE_ELEMENTS];
} IB_page_7;
/* structure for IB */
typedef struct ib_state_struct {
uchar_t enclosure_name[33]; /* extra character is NULL */
IB_page_0 p0;
IB_page_config config; /* Enclosure configuration page */
IB_page_2 p2_s; /* Enclosure status page */
IB_page_7 p7_s; /* Element descriptor page */
int res;
int box_id;
struct dlist *ib_multipath_list;
} Ib_state;
/* Individual SENA drive state */
typedef struct l_disk_state_struct {
Dev_elem_st ib_status;
int l_state_flag; /* Loop State */
struct g_disk_state_struct g_disk_state;
} L_disk_state;
/*
* State of the Photon
*/
typedef struct l_state_struct {
Ib_state ib_tbl; /* state of controller */
int total_num_drv;
struct l_disk_state_struct drv_front[MAX_DRIVES_PER_BOX/2];
struct l_disk_state_struct drv_rear[MAX_DRIVES_PER_BOX/2];
} L_state;
/*
* Function Prototypes for the functions defined in libg_fc
* These are the functions that will be visible to an end user
* They are all CONTRACT PRIVATE
*/
#if defined(__STDC__)
extern int l_chk_null_wwn(Path_struct *, char *, L_state *, int);
extern int l_convert_name(char *, char **, struct path_struct **, int);
extern int l_dev_pwr_up_down(char *, struct path_struct *, int, int, int);
extern int l_device_present(char *, int, gfc_map_t *, int, char **);
extern int l_download(char *, char *, int, int);
extern int l_duplicate_names(Box_list *, char *, char *, int);
extern int l_encl_status_page_funcs(int, char *, int, char *,
struct l_state_struct *, int, int, int);
extern int l_format_ifp_status_msg(char *, int, int);
extern int l_format_fc_status_msg(char *, int, int);
extern void l_free_box_list(struct box_list_struct **);
extern int l_free_lstate(L_state **);
extern int l_get_allses(char *, struct box_list_struct *, struct dlist **,
int);
extern int l_get_box_list(struct box_list_struct **, int);
extern int l_get_disk_element_index(struct l_state_struct *, int *, int *);
extern int l_get_disk_port_status(char *, struct l_disk_state_struct *,
int, int);
extern int l_get_disk_status(char *, struct l_disk_state_struct *,
WWN_list *, int);
extern void l_get_drive_name(char *, int, int, char *);
extern int l_get_envsen(char *, uchar_t *, int, int);
extern int l_get_envsen_page(int, uchar_t *, int, uchar_t, int);
extern int l_get_ib_status(char *, struct l_state_struct *, int);
extern int l_get_individual_state(char *, struct l_disk_state_struct *,
Ib_state *, int, struct box_list_struct *,
struct wwn_list_struct *, int);
extern int l_get_port(char *, int *, int);
extern int l_get_ses_path(char *, char *, gfc_map_t *, int);
extern int l_get_slot(struct path_struct *, L_state *, int);
extern int l_get_status(char *, struct l_state_struct *, int);
extern int l_led(struct path_struct *, int, struct device_element *, int);
extern int l_make_node(char *, int, char *, gfc_map_t *, int);
extern int l_new_name(char *, char *);
extern int l_offline_photon(struct hotplug_disk_list *,
struct wwn_list_struct *, int, int);
extern int l_get_enc_type(L_inquiry inq);
extern int l_pho_pwr_up_down(char *, char *, int, int, int);
#else /* __STDC__ */
extern int l_chk_null_wwn();
extern int l_convert_name();
extern int l_dev_pwr_up_down();
extern int l_device_present();
extern int l_download();
extern int l_duplicate_names();
extern int l_encl_status_page_funcs();
extern int l_format_fc_status_msg();
extern int l_format_ifp_status_msg();
extern void l_free_box_list();
extern int l_free_lstate();
extern int l_get_allses();
extern int l_get_box_list();
extern int l_get_disk_element_index();
extern int l_get_disk_port_status();
extern int l_get_disk_status();
extern void l_get_drive_name();
extern int l_get_envsen();
extern int l_get_envsen_page();
extern int l_get_ib_status();
extern int l_get_individual_state();
extern int l_get_port();
extern int l_get_ses_path();
extern int l_get_slot();
extern int l_get_status();
extern int l_led();
extern int l_make_node();
extern int l_new_name();
extern int l_offline_photon();
extern int l_pho_pwr_up_down();
extern int l_get_enc_type();
#endif /* __STDC__ */
#ifdef __cplusplus
}
#endif
#endif /* _A5K_H */