#ifndef _GFC_H
#define _GFC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/fibre-channel/fcio.h>
#include <sys/sunmdi.h>
#include <sys/scsi/generic/inquiry.h>
#define _SYS_FC4_FCAL_LINKAPP_H
#include <sys/fc4/fcio.h>
#define WWN_S_LEN 17
#define WWN_SIZE 8
#define MAX_HBA_PORT 256
#define MATCH_NODE_WWN 0
#define MATCH_PORT_WWN 1
#define FC4_SF_XPORT 0x00000001
#define FC4_IFP_XPORT 0x00000002
#define FC_GEN_XPORT 0x00000100
#define FC4_XPORT_MASK 0x000000FF
#define FC_XPORT_MASK 0x0000FF00
#define XPORT_MASK (FC_XPORT_MASK | FC4_XPORT_MASK)
#define FC4_SOCAL_FCA 0x00010000
#define FC4_PCI_FCA 0x00020000
#define FC_PCI_FCA 0x02000000
#define FC4_FCA_MASK 0x00FF0000
#define FC_FCA_MASK 0xFF000000
#define FCA_MASK (FC_FCA_MASK | FC4_FCA_MASK)
#define PORT_B 0x00
#define PORT_A 0x01
#define FC_PORT_A 0x00
#define FC_PORT_B 0x01
#define PORT_A_B 0x02
#define PORT_OFFLINE 0
#define PORT_ONLINE 1
#define NO_LPBACK 0x00
#define EXT_LPBACK 0x01
#define INT_LPBACK 0x02
#define PORT_CONNECTED 0x00
#define PORT_NOTCONNECTED 0x01
#define MDI_PATHINFO_STATE_TRANSIENT 0x00010000
#define MDI_PATHINFO_STATE_USER_DISABLE 0x00100000
#define MDI_PATHINFO_STATE_DRV_DISABLE 0x00200000
#define MDI_PATHINFO_STATE_DRV_DISABLE_TRANSIENT 0x00400000
#define MDI_PATHINFO_STATE_MASK 0x0000FFFF
#define MDI_PATHINFO_EXT_STATE_MASK 0xFFF00000
#define GFC_ERR_INQ_DTYPE (0xFF & ~DTYPE_MASK)
extern uchar_t g_switch_to_alpa[];
extern uchar_t g_sf_alpa_to_switch[];
typedef struct al_rls {
char driver_path[MAXNAMELEN];
uint_t al_ha;
struct rls_payload payload;
struct al_rls *next;
} AL_rls;
struct dlist {
char *dev_path;
char *logical_path;
struct dlist *multipath;
struct dlist *next;
struct dlist *prev;
};
typedef struct g_disk_state_struct {
uint_t num_blocks;
char physical_path[MAXNAMELEN];
struct dlist *multipath_list;
char node_wwn_s[WWN_S_LEN];
int persistent_reserv_flag;
int persistent_active, persistent_registered;
int d_state_flags[2];
int port_a_valid;
int port_b_valid;
char port_a_wwn_s[WWN_S_LEN];
char port_b_wwn_s[WWN_S_LEN];
} G_disk_state;
typedef struct hotplug_disk_list {
struct dlist *seslist;
struct dlist *dlhead;
char box_name[33];
char dev_name[MAXPATHLEN];
char node_wwn_s[17];
int tid;
int slot;
int f_flag;
int dev_type;
int dev_location;
int busy_flag;
int reserve_flag;
struct hotplug_disk_list *next;
struct hotplug_disk_list *prev;
} Hotplug_Devlist;
typedef struct l_inquiry_inq_2 {
uchar_t inq_2_reladdr : 1,
inq_wbus32 : 1,
inq_wbus16 : 1,
inq_sync : 1,
inq_linked : 1,
inq_res1 : 1,
inq_cmdque : 1,
inq_sftre : 1;
} L_inq_2;
typedef struct l_inquiry_inq_3 {
uchar_t inq_3_reladdr : 1,
inq_SIP_2 : 3,
inq_3_linked : 1,
inq_trandis : 1,
inq_3_cmdque : 1,
inq_SIP_3 : 1;
} L_inq_3;
typedef struct l_inquiry_struct {
uchar_t inq_dtype;
uchar_t inq_rmb : 1,
inq_qual : 7;
uchar_t inq_iso : 2,
inq_ecma : 3,
inq_ansi : 3;
#define inq_aerc inq_aenc
uchar_t inq_aenc : 1,
inq_trmiop : 1,
inq_normaca : 1,
: 1,
inq_rdf : 4;
uchar_t inq_len;
uchar_t : 8;
uchar_t : 2,
inq_port : 1,
inq_dual_p : 1,
inq_mchngr : 1,
inq_SIP_1 : 3;
union {
L_inq_2 inq_2;
L_inq_3 inq_3;
} ui;
uchar_t inq_vid[8];
uchar_t inq_pid[16];
uchar_t inq_revision[4];
#define inq_ven_specific_1 inq_firmware_rev
uchar_t inq_firmware_rev[4];
uchar_t inq_serial[12];
uchar_t inq_res2[2];
uchar_t inq_ssa_ports;
uchar_t inq_ssa_tgts;
uchar_t inq_res3[40];
uchar_t inq_box_name[32];
uchar_t inq_avu[256];
} L_inquiry;
typedef struct wwn_list_struct {
char *logical_path;
char *physical_path;
char node_wwn_s[WWN_S_LEN];
uchar_t w_node_wwn[WWN_SIZE];
char port_wwn_s[WWN_S_LEN];
uchar_t device_type;
struct wwn_list_struct *wwn_prev;
struct wwn_list_struct *wwn_next;
} WWN_list;
typedef struct portlist {
int hbacnt;
char *physpath[MAX_HBA_PORT];
} portlist_t;
typedef union gfc_port_dev_u {
sf_al_addr_pair_t priv_port;
fc_port_dev_t pub_port;
} gfc_port_dev_ut;
typedef struct gfc_port_dev_info {
uint32_t port_topology;
gfc_port_dev_ut gfc_port_dev;
} gfc_port_dev_info_t;
typedef struct gfc_map {
int count;
gfc_port_dev_info_t *dev_addr;
gfc_port_dev_info_t hba_addr;
} gfc_map_t;
typedef void *gfc_dev_t;
typedef void *gfc_prop_t;
#define MAP_FORMAT_STANDARD 0
#define MAP_FORMAT_LILP 0x00000001
#define MAP_XPORT_PROP_ONLY 0x00000010
#define PORT_WWN_PROP "port-wwn"
#define NODE_WWN_PROP "node-wwn"
#define INQ_DTYPE_PROP "inq-dtype"
#define PORT_ADDR_PROP "port-addr"
#define HARD_ADDR_PROP "hard-addr"
#define GFC_PROP_TYPE_BOOLEAN 0
#define GFC_PROP_TYPE_INT 1
#define GFC_PROP_TYPE_STRING 2
#define GFC_PROP_TYPE_BYTES 3
#define GFC_PROP_TYPE_UNKNOWN 4
typedef struct mp_pathinfo {
mdi_pathinfo_state_t path_state;
char path_class[MAXNAMELEN];
char path_hba[MAXPATHLEN];
char path_dev[MAXPATHLEN];
char path_addr[MAXNAMELEN];
} mp_pathinfo_t;
typedef struct mp_pathlist {
uint_t path_count;
mp_pathinfo_t *path_info;
} mp_pathlist_t;
#if defined(__STDC__)
extern int g_dev_start(char *, int);
extern int g_dev_stop(char *, struct wwn_list_struct *, int);
extern int g_force_lip(char *, int);
extern int g_forcelip_all(struct hotplug_disk_list *);
extern void g_free_multipath(struct dlist *);
extern void g_free_wwn_list(struct wwn_list_struct **);
extern int g_get_dev_map(char *, gfc_map_t *, int);
extern int g_get_lilp_map(char *, gfc_map_t *, int);
extern int g_get_inq_dtype(char *, la_wwn_t, uchar_t *);
extern int g_get_dev_list(char *, fc_port_dev_t **, int *);
extern int g_wwn_in_dev_list(char *, la_wwn_t, int);
extern char *g_get_dev_or_bus_phys_name(char *);
extern char *g_get_errString(int);
extern int g_get_inquiry(char *, L_inquiry *);
extern int g_get_serial_number(char *, uchar_t *, size_t *);
extern int g_get_limited_map(char *, struct lilpmap *, int);
extern int g_get_multipath(char *, struct dlist **,
struct wwn_list_struct *, int);
extern int g_get_nexus_path(char *, char **);
extern char *g_get_physical_name_from_link(char *);
extern char *g_get_physical_name(char *);
extern int g_get_wwn(char *, uchar_t *, uchar_t *, int *, int);
extern int g_get_wwn_list(struct wwn_list_struct **, int);
extern int g_i18n_catopen(void);
extern int g_offline_drive(struct dlist *, int);
extern void g_online_drive(struct dlist *, int);
extern int g_rdls(char *, struct al_rls **, int);
extern uint_t g_get_path_type(char *);
extern int g_get_host_params(char *, fc_port_dev_t *, int);
extern int g_port_offline(char *);
extern int g_port_online(char *);
extern int g_get_port_path(char *, portlist_t *);
extern void g_free_portlist(portlist_t *);
extern int g_loopback_mode(char *, int);
extern int g_get_port_state(char *, int *, int);
extern int g_get_fca_port_topology(char *, uint32_t *, int);
extern int g_dev_login(char *, la_wwn_t);
extern int g_dev_logout(char *, la_wwn_t);
extern int g_get_pathlist(char *, struct mp_pathlist *);
extern int g_failover(char *, char *);
extern gfc_dev_t g_dev_map_init(char *, int *, int);
extern void g_dev_map_fini(gfc_dev_t);
extern int g_get_map_topology(gfc_dev_t, uint_t *);
extern gfc_dev_t g_get_first_dev(gfc_dev_t, int *);
extern gfc_dev_t g_get_next_dev(gfc_dev_t, int *);
extern int g_dev_prop_lookup_bytes(gfc_dev_t, const char *, int *,
uchar_t **);
extern int g_dev_prop_lookup_ints(gfc_dev_t, const char *, int **);
extern int g_dev_prop_lookup_strings(gfc_dev_t, const char *, char **);
extern gfc_prop_t g_get_first_dev_prop(gfc_dev_t, int *);
extern gfc_prop_t g_get_next_dev_prop(gfc_prop_t, int *);
extern char *g_get_dev_prop_name(gfc_prop_t, int *);
extern int g_get_dev_prop_type(gfc_prop_t, int *);
extern int g_get_dev_prop_bytes(gfc_prop_t, int *, uchar_t **);
extern int g_get_dev_prop_ints(gfc_prop_t, int **);
extern int g_get_dev_prop_strings(gfc_prop_t, char **);
extern int g_stms_path_disable(char *, char *);
extern int g_stms_path_enable(char *, char *);
extern int g_stms_path_disable_all(char *);
extern int g_stms_path_enable_all(char *);
extern int g_stms_get_path_state(char *, char *, int *, int *);
#else
extern int g_dev_start();
extern int g_dev_stop();
extern int g_force_lip();
extern int g_forcelip_all();
extern void g_free_multipath();
extern void g_free_wwn_list();
extern int g_get_inq_dtype();
extern int g_get_dev_list();
extern int g_wwn_in_dev_list();
extern int g_get_dev_map();
extern int g_get_lilp_map();
extern char *g_get_dev_or_bus_phys_name();
extern char *g_get_errString();
extern int g_get_inquiry();
extern int g_get_serial_number();
extern int g_get_limited_map();
extern int g_get_multipath();
extern int g_get_nexus_path();
extern int g_get_wwn_list();
extern int g_offline_drive();
extern void g_online_drive();
extern char *g_get_physical_name();
extern char *g_get_physical_name_from_link();
extern int g_get_wwn();
extern int g_i18n_catopen();
extern int g_rdls();
extern uint_t g_get_path_type();
extern int g_get_host_params();
extern int g_port_offline();
extern int g_port_online();
extern int g_get_port_path();
extern void g_free_portlist();
extern int g_loopback_mode();
extern int g_get_port_state();
extern int g_get_fca_port_topology();
extern int g_dev_login();
extern int g_dev_logout();
extern int g_get_pathlist();
extern int g_failover();
extern gfc_dev_t g_dev_map_init();
extern void g_dev_map_fini();
extern int g_get_map_topology();
extern gfc_dev_t g_get_first_dev();
extern gfc_dev_t g_get_next_dev();
extern int g_dev_prop_lookup_bytes();
extern int g_dev_prop_lookup_ints();
extern int g_dev_prop_lookup_strings();
extern gfc_prop_t g_get_first_dev_prop();
extern gfc_prop_t g_get_next_dev_prop();
extern char *g_get_dev_prop_name();
extern int g_get_dev_prop_type();
extern int g_get_dev_prop_bytes();
extern int g_get_dev_prop_ints();
extern int g_get_dev_prop_strings();
extern int g_stms_path_disable();
extern int g_stms_path_enable();
extern int g_stms_path_disable_all();
extern int g_stms_path_enable_all();
extern int g_stms_get_path_state();
#endif
#ifdef __cplusplus
}
#endif
#endif