1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* 27 * Generic Fibre Channel Library definitions 28 */ 29 30 /* 31 * I18N message number ranges 32 * This file: 19500 - 19999 33 * Shared common messages: 1 - 1999 34 */ 35 36 #ifndef _GFC_H 37 #define _GFC_H 38 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 /* 45 * Put your include files here 46 */ 47 #include <sys/types.h> 48 #include <sys/fibre-channel/fcio.h> 49 #include <sys/sunmdi.h> 50 #include <sys/scsi/generic/inquiry.h> 51 /* 52 * sys/fc4/fcio.h includes sys/fc4/fcal_linkapp.h. The following #define 53 * keeps from actually including the contents of sys/fc4/fcal_linkapp.h 54 * since that file contains the same structure definitions as sys/fc4/fcio.h. 55 */ 56 #define _SYS_FC4_FCAL_LINKAPP_H 57 #include <sys/fc4/fcio.h> 58 59 60 /* Defines */ 61 #define WWN_S_LEN 17 /* NULL terminated string */ 62 #define WWN_SIZE 8 63 #define MAX_HBA_PORT 256 64 65 /* Constants used by g_wwn_in_dev_list() */ 66 #define MATCH_NODE_WWN 0 67 #define MATCH_PORT_WWN 1 68 69 /* 70 * The masks defined below are for the Fibre channel transport and FCAs. 71 * Mask names starting with FC4 are for the non-fabric fibre channel driver 72 * stack and those starting with FC are for the fabric fibre channel driver 73 * stack. 74 * 75 * The transport values are represented in the low order 16 bits and FCA 76 * values represented in the high order 16 bits. 77 * 78 * The notation used is as shown below : 79 * (starting from the low order byte) 80 * Byte 1 - holds the non-fabric FC transport driver defines 81 * Byte 2 - holds the fabric FC transport driver defines 82 * Byte 3 - holds the non-fabric FC FCA defines 83 * Byte 4 - holds the fabric FC FCA defines 84 */ 85 /* Recognized Transport categories */ 86 #define FC4_SF_XPORT 0x00000001 87 #define FC4_IFP_XPORT 0x00000002 88 #define FC_GEN_XPORT 0x00000100 89 90 /* Transport masks */ 91 #define FC4_XPORT_MASK 0x000000FF 92 #define FC_XPORT_MASK 0x0000FF00 93 #define XPORT_MASK (FC_XPORT_MASK | FC4_XPORT_MASK) 94 95 /* Recognized Fibre Channel Adapters */ 96 #define FC4_SOCAL_FCA 0x00010000 97 #define FC4_PCI_FCA 0x00020000 98 #define FC_PCI_FCA 0x02000000 99 100 /* FCA masks */ 101 #define FC4_FCA_MASK 0x00FF0000 102 #define FC_FCA_MASK 0xFF000000 103 #define FCA_MASK (FC_FCA_MASK | FC4_FCA_MASK) 104 105 /* 106 * Disk ports 107 */ 108 #define PORT_B 0x00 109 #define PORT_A 0x01 110 #define FC_PORT_A 0x00 111 #define FC_PORT_B 0x01 112 #define PORT_A_B 0x02 113 114 /* Constants used by g_set_port_state() */ 115 #define PORT_OFFLINE 0 116 #define PORT_ONLINE 1 117 118 /* Constants used by g_loopback_mode() */ 119 #define NO_LPBACK 0x00 120 #define EXT_LPBACK 0x01 121 #define INT_LPBACK 0x02 122 123 /* Constants for port state */ 124 #define PORT_CONNECTED 0x00 125 #define PORT_NOTCONNECTED 0x01 126 127 /* Extended pathinfo node states */ 128 #define MDI_PATHINFO_STATE_TRANSIENT 0x00010000 129 #define MDI_PATHINFO_STATE_USER_DISABLE 0x00100000 130 #define MDI_PATHINFO_STATE_DRV_DISABLE 0x00200000 131 #define MDI_PATHINFO_STATE_DRV_DISABLE_TRANSIENT 0x00400000 132 #define MDI_PATHINFO_STATE_MASK 0x0000FFFF 133 #define MDI_PATHINFO_EXT_STATE_MASK 0xFFF00000 134 135 /* 136 * Error inq dtype for g_get_dev_list partial failure. 137 * choose E0 since Solaris has #define DTYPE_MASK 0x1F. 138 */ 139 #define GFC_ERR_INQ_DTYPE (0xFF & ~DTYPE_MASK) 140 141 /* Exported Variables */ 142 extern uchar_t g_switch_to_alpa[]; 143 extern uchar_t g_sf_alpa_to_switch[]; 144 145 146 /* Exported Structures */ 147 148 /* Device Map */ 149 typedef struct al_rls { 150 char driver_path[MAXNAMELEN]; 151 uint_t al_ha; 152 struct rls_payload payload; 153 struct al_rls *next; 154 } AL_rls; 155 156 157 /* Multi path list */ 158 struct dlist { 159 char *dev_path; 160 char *logical_path; 161 struct dlist *multipath; 162 struct dlist *next; 163 struct dlist *prev; 164 }; 165 166 167 /* Individual drive state */ 168 typedef struct g_disk_state_struct { 169 uint_t num_blocks; /* Capacity */ 170 char physical_path[MAXNAMELEN]; /* First one found */ 171 struct dlist *multipath_list; 172 char node_wwn_s[WWN_S_LEN]; /* NULL terminated str */ 173 int persistent_reserv_flag; 174 int persistent_active, persistent_registered; 175 int d_state_flags[2]; /* Disk state */ 176 int port_a_valid; /* If disk state is valid */ 177 int port_b_valid; /* If disk state is valid */ 178 char port_a_wwn_s[WWN_S_LEN]; /* NULL terminated string */ 179 char port_b_wwn_s[WWN_S_LEN]; /* NULL terminated string */ 180 } G_disk_state; 181 182 183 typedef struct hotplug_disk_list { 184 struct dlist *seslist; 185 struct dlist *dlhead; 186 char box_name[33]; 187 char dev_name[MAXPATHLEN]; 188 char node_wwn_s[17]; 189 int tid; 190 int slot; 191 int f_flag; /* Front flag */ 192 int dev_type; 193 int dev_location; /* device in A5000 or not */ 194 int busy_flag; 195 int reserve_flag; 196 struct hotplug_disk_list *next; 197 struct hotplug_disk_list *prev; 198 } Hotplug_Devlist; 199 200 typedef struct l_inquiry_inq_2 { 201 uchar_t inq_2_reladdr : 1, /* relative addressing */ 202 inq_wbus32 : 1, /* 32 bit wide data xfers */ 203 inq_wbus16 : 1, /* 16 bit wide data xfers */ 204 inq_sync : 1, /* synchronous data xfers */ 205 inq_linked : 1, /* linked commands */ 206 inq_res1 : 1, /* reserved */ 207 inq_cmdque : 1, /* command queueing */ 208 inq_sftre : 1; /* Soft Reset option */ 209 } L_inq_2; 210 typedef struct l_inquiry_inq_3 { 211 uchar_t inq_3_reladdr : 1, /* relative addressing */ 212 inq_SIP_2 : 3, /* Interlocked Protocol */ 213 inq_3_linked : 1, /* linked commands */ 214 inq_trandis : 1, /* Transfer Disable */ 215 inq_3_cmdque : 1, /* command queueing */ 216 inq_SIP_3 : 1; /* Interlocked Protocol */ 217 } L_inq_3; 218 219 typedef struct l_inquiry_struct { 220 /* 221 * byte 0 222 * 223 * Bits 7-5 are the Peripheral Device Qualifier 224 * Bits 4-0 are the Peripheral Device Type 225 * 226 */ 227 uchar_t inq_dtype; 228 /* byte 1 */ 229 uchar_t inq_rmb : 1, /* removable media */ 230 inq_qual : 7; /* device type qualifier */ 231 232 /* byte 2 */ 233 uchar_t inq_iso : 2, /* ISO version */ 234 inq_ecma : 3, /* ECMA version */ 235 inq_ansi : 3; /* ANSI version */ 236 237 /* byte 3 */ 238 #define inq_aerc inq_aenc /* SCSI-3 */ 239 uchar_t inq_aenc : 1, /* async event notification cap. */ 240 inq_trmiop : 1, /* supports TERMINATE I/O PROC msg */ 241 inq_normaca : 1, /* Normal ACA Supported */ 242 : 1, /* reserved */ 243 inq_rdf : 4; /* response data format */ 244 245 /* bytes 4-7 */ 246 uchar_t inq_len; /* additional length */ 247 uchar_t : 8; /* reserved */ 248 uchar_t : 2, /* reserved */ 249 inq_port : 1, /* Only defined when dual_p set */ 250 inq_dual_p : 1, /* Dual Port */ 251 inq_mchngr : 1, /* Medium Changer */ 252 inq_SIP_1 : 3; /* Interlocked Protocol */ 253 254 union { 255 L_inq_2 inq_2; 256 L_inq_3 inq_3; 257 } ui; 258 259 260 /* bytes 8-35 */ 261 262 uchar_t inq_vid[8]; /* vendor ID */ 263 264 uchar_t inq_pid[16]; /* product ID */ 265 266 uchar_t inq_revision[4]; /* product revision level */ 267 268 /* 269 * Bytes 36-55 are vendor-specific parameter bytes 270 */ 271 272 /* SSA specific definitions */ 273 /* bytes 36 - 39 */ 274 #define inq_ven_specific_1 inq_firmware_rev 275 uchar_t inq_firmware_rev[4]; /* firmware revision level */ 276 277 /* bytes 40 - 51 */ 278 uchar_t inq_serial[12]; /* serial number, not used any more */ 279 280 /* bytes 52-53 */ 281 uchar_t inq_res2[2]; 282 283 /* byte 54, 55 */ 284 uchar_t inq_ssa_ports; /* number of ports */ 285 uchar_t inq_ssa_tgts; /* number of targets */ 286 287 /* 288 * Bytes 56-95 are reserved. 289 */ 290 uchar_t inq_res3[40]; 291 /* 292 * 96 to 'n' are vendor-specific parameter bytes 293 */ 294 uchar_t inq_box_name[32]; 295 uchar_t inq_avu[256]; 296 } L_inquiry; 297 298 299 typedef struct wwn_list_struct { 300 char *logical_path; 301 char *physical_path; 302 char node_wwn_s[WWN_S_LEN]; /* NULL terminated string */ 303 uchar_t w_node_wwn[WWN_SIZE]; 304 char port_wwn_s[WWN_S_LEN]; /* NULL terminated string */ 305 uchar_t device_type; /* disk or tape (Peripheral Device Type) */ 306 struct wwn_list_struct *wwn_prev; 307 struct wwn_list_struct *wwn_next; 308 } WWN_list; 309 310 311 /* HBA port list */ 312 typedef struct portlist { 313 int hbacnt; 314 char *physpath[MAX_HBA_PORT]; 315 } portlist_t; 316 /* union for capturing sf and fp strucures */ 317 typedef union gfc_port_dev_u { 318 sf_al_addr_pair_t priv_port; /* private loop */ 319 fc_port_dev_t pub_port; /* fabric/public loop */ 320 } gfc_port_dev_ut; 321 322 323 /* FC device sturcure with topology */ 324 typedef struct gfc_port_dev_info { 325 uint32_t port_topology; 326 gfc_port_dev_ut gfc_port_dev; 327 } gfc_port_dev_info_t; 328 329 330 /* strucure for FC map */ 331 typedef struct gfc_map { 332 int count; 333 gfc_port_dev_info_t *dev_addr; 334 gfc_port_dev_info_t hba_addr; 335 } gfc_map_t; 336 337 /* g_dev_map_init related declaration */ 338 339 typedef void *gfc_dev_t; /* opaque type for map device */ 340 typedef void *gfc_prop_t; /* opaque type for map device property */ 341 342 #define MAP_FORMAT_STANDARD 0 343 #define MAP_FORMAT_LILP 0x00000001 344 #define MAP_XPORT_PROP_ONLY 0x00000010 345 346 /* property name for g_dev_prop_lookup */ 347 #define PORT_WWN_PROP "port-wwn" 348 #define NODE_WWN_PROP "node-wwn" 349 #define INQ_DTYPE_PROP "inq-dtype" 350 #define PORT_ADDR_PROP "port-addr" 351 #define HARD_ADDR_PROP "hard-addr" 352 353 /* property type for g_dev_prop_next */ 354 #define GFC_PROP_TYPE_BOOLEAN 0 355 #define GFC_PROP_TYPE_INT 1 356 #define GFC_PROP_TYPE_STRING 2 357 #define GFC_PROP_TYPE_BYTES 3 358 #define GFC_PROP_TYPE_UNKNOWN 4 359 360 typedef struct mp_pathinfo { 361 mdi_pathinfo_state_t path_state; 362 char path_class[MAXNAMELEN]; 363 char path_hba[MAXPATHLEN]; 364 char path_dev[MAXPATHLEN]; 365 char path_addr[MAXNAMELEN]; 366 } mp_pathinfo_t; 367 368 /* structure for mpxio pathlist */ 369 typedef struct mp_pathlist { 370 uint_t path_count; 371 mp_pathinfo_t *path_info; 372 } mp_pathlist_t; 373 374 /* 375 * Prototypes of Exported functions which are defined in libg_fc 376 * They are all CONTRACT PRIVATE 377 */ 378 379 #if defined(__STDC__) 380 381 extern int g_dev_start(char *, int); 382 extern int g_dev_stop(char *, struct wwn_list_struct *, int); 383 extern int g_force_lip(char *, int); 384 extern int g_forcelip_all(struct hotplug_disk_list *); 385 extern void g_free_multipath(struct dlist *); 386 extern void g_free_wwn_list(struct wwn_list_struct **); 387 extern int g_get_dev_map(char *, gfc_map_t *, int); 388 extern int g_get_lilp_map(char *, gfc_map_t *, int); 389 extern int g_get_inq_dtype(char *, la_wwn_t, uchar_t *); 390 extern int g_get_dev_list(char *, fc_port_dev_t **, int *); 391 extern int g_wwn_in_dev_list(char *, la_wwn_t, int); 392 extern char *g_get_dev_or_bus_phys_name(char *); 393 extern char *g_get_errString(int); 394 extern int g_get_inquiry(char *, L_inquiry *); 395 extern int g_get_serial_number(char *, uchar_t *, size_t *); 396 extern int g_get_limited_map(char *, struct lilpmap *, int); 397 extern int g_get_multipath(char *, struct dlist **, 398 struct wwn_list_struct *, int); 399 extern int g_get_nexus_path(char *, char **); 400 extern char *g_get_physical_name_from_link(char *); 401 extern char *g_get_physical_name(char *); 402 extern int g_get_wwn(char *, uchar_t *, uchar_t *, int *, int); 403 extern int g_get_wwn_list(struct wwn_list_struct **, int); 404 extern int g_i18n_catopen(void); 405 extern int g_offline_drive(struct dlist *, int); 406 extern void g_online_drive(struct dlist *, int); 407 extern int g_rdls(char *, struct al_rls **, int); 408 extern uint_t g_get_path_type(char *); 409 extern int g_get_host_params(char *, fc_port_dev_t *, int); 410 extern int g_port_offline(char *); 411 extern int g_port_online(char *); 412 extern int g_get_port_path(char *, portlist_t *); 413 extern void g_free_portlist(portlist_t *); 414 extern int g_loopback_mode(char *, int); 415 extern int g_get_port_state(char *, int *, int); 416 extern int g_get_fca_port_topology(char *, uint32_t *, int); 417 extern int g_dev_login(char *, la_wwn_t); 418 extern int g_dev_logout(char *, la_wwn_t); 419 extern int g_get_pathlist(char *, struct mp_pathlist *); 420 extern int g_failover(char *, char *); 421 422 /* g_dev_map_init related routines. */ 423 extern gfc_dev_t g_dev_map_init(char *, int *, int); 424 extern void g_dev_map_fini(gfc_dev_t); 425 extern int g_get_map_topology(gfc_dev_t, uint_t *); 426 extern gfc_dev_t g_get_first_dev(gfc_dev_t, int *); 427 extern gfc_dev_t g_get_next_dev(gfc_dev_t, int *); 428 extern int g_dev_prop_lookup_bytes(gfc_dev_t, const char *, int *, 429 uchar_t **); 430 extern int g_dev_prop_lookup_ints(gfc_dev_t, const char *, int **); 431 extern int g_dev_prop_lookup_strings(gfc_dev_t, const char *, char **); 432 extern gfc_prop_t g_get_first_dev_prop(gfc_dev_t, int *); 433 extern gfc_prop_t g_get_next_dev_prop(gfc_prop_t, int *); 434 extern char *g_get_dev_prop_name(gfc_prop_t, int *); 435 extern int g_get_dev_prop_type(gfc_prop_t, int *); 436 extern int g_get_dev_prop_bytes(gfc_prop_t, int *, uchar_t **); 437 extern int g_get_dev_prop_ints(gfc_prop_t, int **); 438 extern int g_get_dev_prop_strings(gfc_prop_t, char **); 439 extern int g_stms_path_disable(char *, char *); 440 extern int g_stms_path_enable(char *, char *); 441 extern int g_stms_path_disable_all(char *); 442 extern int g_stms_path_enable_all(char *); 443 extern int g_stms_get_path_state(char *, char *, int *, int *); 444 445 446 #else /* __STDC__ */ 447 448 extern int g_dev_start(); 449 extern int g_dev_stop(); 450 extern int g_force_lip(); 451 extern int g_forcelip_all(); 452 extern void g_free_multipath(); 453 extern void g_free_wwn_list(); 454 extern int g_get_inq_dtype(); 455 extern int g_get_dev_list(); 456 extern int g_wwn_in_dev_list(); 457 extern int g_get_dev_map(); 458 extern int g_get_lilp_map(); 459 extern char *g_get_dev_or_bus_phys_name(); 460 extern char *g_get_errString(); 461 extern int g_get_inquiry(); 462 extern int g_get_serial_number(); 463 extern int g_get_limited_map(); 464 extern int g_get_multipath(); 465 extern int g_get_nexus_path(); 466 extern int g_get_wwn_list(); 467 extern int g_offline_drive(); 468 extern void g_online_drive(); 469 extern char *g_get_physical_name(); 470 extern char *g_get_physical_name_from_link(); 471 extern int g_get_wwn(); 472 extern int g_i18n_catopen(); 473 extern int g_rdls(); 474 extern uint_t g_get_path_type(); 475 extern int g_get_host_params(); 476 extern int g_port_offline(); 477 extern int g_port_online(); 478 extern int g_get_port_path(); 479 extern void g_free_portlist(); 480 extern int g_loopback_mode(); 481 extern int g_get_port_state(); 482 extern int g_get_fca_port_topology(); 483 extern int g_dev_login(); 484 extern int g_dev_logout(); 485 extern int g_get_pathlist(); 486 extern int g_failover(); 487 488 /* g_dev_map_init related routines. */ 489 extern gfc_dev_t g_dev_map_init(); 490 extern void g_dev_map_fini(); 491 extern int g_get_map_topology(); 492 extern gfc_dev_t g_get_first_dev(); 493 extern gfc_dev_t g_get_next_dev(); 494 extern int g_dev_prop_lookup_bytes(); 495 extern int g_dev_prop_lookup_ints(); 496 extern int g_dev_prop_lookup_strings(); 497 extern gfc_prop_t g_get_first_dev_prop(); 498 extern gfc_prop_t g_get_next_dev_prop(); 499 extern char *g_get_dev_prop_name(); 500 extern int g_get_dev_prop_type(); 501 extern int g_get_dev_prop_bytes(); 502 extern int g_get_dev_prop_ints(); 503 extern int g_get_dev_prop_strings(); 504 extern int g_stms_path_disable(); 505 extern int g_stms_path_enable(); 506 extern int g_stms_path_disable_all(); 507 extern int g_stms_path_enable_all(); 508 extern int g_stms_get_path_state(); 509 510 #endif /* __STDC__ */ 511 512 #ifdef __cplusplus 513 } 514 #endif 515 516 #endif /* _GFC_H */ 517