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 * PHOTON CONFIGURATION MANAGER 28 * Common definitions 29 */ 30 31/* 32 * I18N message number ranges 33 * This file: 12500 - 12999 34 * Shared common messages: 1 - 1999 35 */ 36 37#ifndef _COMMON_H 38#define _COMMON_H 39 40 41 42 43/* 44 * Include any headers you depend on. 45 */ 46#include <sys/types.h> 47#include <sys/scsi/adapters/scsi_vhci.h> 48 49#ifdef __cplusplus 50extern "C" { 51#endif 52 53/*#ifdef _BIG_ENDIAN 54#define htonll(x) (x) 55#define ntohll(x) (x) 56#else 57#define htonll(x) ((((unsigned long long)htonl(x)) << 32) + htonl(x >> 32)) 58#define ntohll(x) ((((unsigned long long)ntohl(x)) << 32) + ntohl(x >> 32)) 59#endif*/ 60 61 62extern char *p_error_msg_ptr; 63 64#ifdef __x86 65#include <nl_types.h> 66extern nl_catd l_catd; 67#define L_SET1 1 /* catalog set number */ 68#define MSGSTR(Num, Str) catgets(l_catd, L_SET1, Num, Str) 69#endif 70 71 72/* Defines */ 73#define USEAGE() {(void) fprintf(stderr, MSGSTR(12500, \ 74 "Usage: %s [-v] subcommand [option...]" \ 75 " {enclosure[,dev]... | pathname...}\n"), \ 76 whoami); \ 77 (void) fflush(stderr); } 78 79#define E_USEAGE() {(void) fprintf(stderr, MSGSTR(12501, \ 80 "Usage: %s [-v] -e subcommand [option...]" \ 81 " {enclosure[,dev]... | pathname...}\n"), \ 82 whoami); \ 83 (void) fflush(stderr); } 84 85#define VERBPRINT if (Options & PVERBOSE) (void) printf 86 87#define L_ERR_PRINT \ 88 if (p_error_msg_ptr == NULL) { \ 89 perror(MSGSTR(12502, "Error")); \ 90 } else { \ 91 (void) fprintf(stderr, MSGSTR(12503, "Error: %s"), p_error_msg_ptr); \ 92 } \ 93 p_error_msg_ptr = NULL; 94 95#define P_ERR_PRINT if (p_error_msg_ptr == NULL) { \ 96 perror(whoami); \ 97 } else { \ 98 (void) fprintf(stderr, MSGSTR(12504, "Error: %s"), p_error_msg_ptr); \ 99 } \ 100 p_error_msg_ptr = NULL; 101 102 103/* Display extended mode page information. */ 104#ifndef MODEPAGE_CACHING 105#undef MODEPAGE_CACHING 106#define MODEPAGE_CACHING 0x08 107#endif 108 109 110/* Primary commands */ 111#define ENCLOSURE_NAMES 100 112#define DISPLAY 101 113#define DOWNLOAD 102 114#define FAST_WRITE 400 /* SSA */ 115#define FAILOVER 500 116#define FC_UPDATE 401 /* SSA */ 117#define FCAL_UPDATE 103 /* Update the Fcode on Sbus soc card */ 118#define FCODE_UPDATE 117 /* Update the Fcode on all cards */ 119#define QLGC_UPDATE 116 /* Update the Fcode on PCI card(s) */ 120#define INQUIRY 105 121#define LED 107 122#define LED_ON 108 123#define LED_OFF 109 124#define LED_BLINK 110 125#define NVRAM_DATA 402 /* SSA */ 126#define POWER_OFF 403 /* SSA */ 127#define POWER_ON 111 128#define PASSWORD 112 129#define PURGE 404 /* SSA */ 130#define PERF_STATISTICS 405 /* SSA */ 131#define PROBE 113 132#define RELEASE 210 133#define RESERVE 211 134#define START 213 135#define STOP 214 136#define SYNC_CACHE 406 /* SSA */ 137#define SET_BOOT_DEV 115 /* Set the boot-device variable in nvram */ 138#define INSERT_DEVICE 106 /* Hot plug */ 139#define REMOVE_DEVICE 114 /* hot plug */ 140 141/* Device hotplugging */ 142#define REPLACE_DEVICE 150 143#define DEV_ONLINE 155 144#define DEV_OFFLINE 156 145#define DEV_GETSTATE 157 146#define DEV_RESET 158 147#define BUS_QUIESCE 160 148#define BUS_UNQUIESCE 161 149#define BUS_GETSTATE 162 150#define BUS_RESET 163 151#define BUS_RESETALL 164 152 153#define SKIP 111 154#define QUIT 222 155 156#define L_LED_STATUS 0x00 157#define L_LED_RQST_IDENTIFY 0x01 158#define L_LED_ON 0x02 159#define L_LED_OFF 0x04 160 161 162/* Enclosure Specific */ 163#define ALARM 407 /* SSA */ 164#define ALARM_OFF 408 /* SSA */ 165#define ALARM_ON 409 /* SSA */ 166#define ALARM_SET 410 /* SSA */ 167#define ENV_DISPLAY 411 /* SSA */ 168 169/* Expert commands */ 170#define RDLS 215 171#define P_BYPASS 218 172#define P_ENABLE 219 173#define BYPASS 220 174#define ENABLE 221 175#define FORCELIP 222 176#define LUX_P_OFFLINE 223 177#define LUX_P_ONLINE 224 178#define EXT_LOOPBACK 225 179#define INT_LOOPBACK 226 180#define NO_LOOPBACK 227 181#define CREATE_FAB 228 182 183/* Undocumented commands */ 184#define DUMP 300 185#define CHECK_FILE 301 /* Undocumented - Check download file */ 186#define DUMP_MAP 302 /* Dump map of loop */ 187#define VERSION 303 /* undocumented */ 188#define AU 304 /* undocumented */ 189#define PORT 305 /* undocumented */ 190 191/* Undocumented diagnostic subcommands */ 192#define SYSDUMP 350 193 194 195/* SSA - for adm_download */ 196/* #define SSAFIRMWARE_FILE "/usr/lib/firmware/ssa/ssafirmware" */ 197 198/* Global variables */ 199extern char *whoami; 200extern int Options; 201extern const int OPTION_A; 202extern const int OPTION_B; 203extern const int OPTION_C; 204extern const int OPTION_D; 205extern const int OPTION_E; 206extern const int OPTION_F; 207extern const int OPTION_L; 208extern const int OPTION_P; 209extern const int OPTION_R; 210extern const int OPTION_T; 211extern const int OPTION_V; 212extern const int OPTION_Z; 213extern const int OPTION_Y; 214extern const int OPTION_CAPF; 215extern const int PVERBOSE; 216extern const int SAVE; 217extern const int EXPERT; 218 219#define TARGET_ID(box_id, f_r, slot) \ 220 ((box_id | ((f_r == 'f' ? 0 : 1) << 4)) | (slot + 2)) 221 222#define NEWER(time1, time2) (time1.tv_sec > time2.tv_sec) 223 224/* used to set the behavior of get_slash_devices_from_osDevName. */ 225#define STANDARD_DEVNAME_HANDLING 1 226#define NOT_IGNORE_DANGLING_LINK 2 227 228#include <hbaapi.h> 229#ifndef __x86 230#include <sys/scsi/generic/mode.h> 231#include <sys/scsi/generic/sense.h> 232#include <sys/scsi/impl/uscsi.h> 233#include <g_state.h> 234#include <stgcom.h> 235#include <l_common.h> 236#else 237typedef struct l_inquiry_inq_2 { 238#if defined(_BIT_FIELDS_HTOL) 239 uchar_t inq_2_reladdr : 1, /* relative addressing */ 240 inq_wbus32 : 1, /* 32 bit wide data xfers */ 241 inq_wbus16 : 1, /* 16 bit wide data xfers */ 242 inq_sync : 1, /* synchronous data xfers */ 243 inq_linked : 1, /* linked commands */ 244 inq_res1 : 1, /* reserved */ 245 inq_cmdque : 1, /* command queueing */ 246 inq_sftre : 1; /* Soft Reset option */ 247#else 248 uchar_t inq_sftre : 1, /* Soft Reset option */ 249 inq_cmdque : 1, /* command queueing */ 250 inq_res1 : 1, /* reserved */ 251 inq_linked : 1, /* linked commands */ 252 inq_sync : 1, /* synchronous data xfers */ 253 inq_wbus16 : 1, /* 16 bit wide data xfers */ 254 inq_wbus32 : 1, /* 32 bit wide data xfers */ 255 inq_2_reladdr : 1; /* relative addressing */ 256#endif /* _BIT_FIELDS_HTOL */ 257} L_inq_2; 258 259typedef struct l_inquiry_inq_3 { 260#if defined(_BIT_FIELDS_HTOL) 261 uchar_t inq_3_reladdr : 1, /* relative addressing */ 262 inq_SIP_2 : 3, /* Interlocked Protocol */ 263 inq_3_linked : 1, /* linked commands */ 264 inq_trandis : 1, /* Transfer Disable */ 265 inq_3_cmdque : 1, /* command queueing */ 266 inq_SIP_3 : 1; /* Interlocked Protocol */ 267#else 268 uchar_t inq_SIP_3 : 1, /* Interlocked Protocol */ 269 inq_3_cmdque : 1, /* command queueing */ 270 inq_trandis : 1, /* Transfer Disable */ 271 inq_3_linked : 1, /* linked commands */ 272 inq_SIP_2 : 3, /* Interlocked Protocol */ 273 inq_3_reladdr : 1; /* relative addressing */ 274#endif /* _BIT_FIELDS_HTOL */ 275} L_inq_3; 276 277typedef struct l_inquiry_struct { 278 /* 279 * byte 0 280 * 281 * Bits 7-5 are the Peripheral Device Qualifier 282 * Bits 4-0 are the Peripheral Device Type 283 * 284 */ 285 uchar_t inq_dtype; 286 /* byte 1 */ 287#if defined(_BIT_FIELDS_HTOL) 288 uchar_t inq_rmb : 1, /* removable media */ 289 inq_qual : 7; /* device type qualifier */ 290#else 291 uchar_t inq_qual : 7, /* device type qualifier */ 292 inq_rmb : 1; /* removable media */ 293#endif /* _BIT_FIELDS_HTOL */ 294 295 /* byte 2 */ 296#if defined(_BIT_FIELDS_HTOL) 297 uchar_t inq_iso : 2, /* ISO version */ 298 inq_ecma : 3, /* ECMA version */ 299 inq_ansi : 3; /* ANSI version */ 300#else 301 uchar_t inq_ansi : 3, /* ANSI version */ 302 inq_ecma : 3, /* ECMA version */ 303 inq_iso : 2; /* ISO version */ 304#endif /* _BIT_FIELDS_HTOL */ 305 306 /* byte 3 */ 307#define inq_aerc inq_aenc /* SCSI-3 */ 308#if defined(_BIT_FIELDS_HTOL) 309 uchar_t inq_aenc : 1, /* async event notification cap. */ 310 inq_trmiop : 1, /* supports TERMINATE I/O PROC msg */ 311 inq_normaca : 1, /* Normal ACA Supported */ 312 : 1, /* reserved */ 313 inq_rdf : 4; /* response data format */ 314#else 315 uchar_t inq_rdf : 4, /* response data format */ 316 : 1, /* reserved */ 317 inq_normaca : 1, /* Normal ACA Supported */ 318 inq_trmiop : 1, /* supports TERMINATE I/O PROC msg */ 319 inq_aenc : 1; /* async event notification cap. */ 320#endif /* _BIT_FIELDS_HTOL */ 321 322 /* bytes 4-7 */ 323 uchar_t inq_len; /* additional length */ 324 uchar_t : 8; /* reserved */ 325#if defined(_BIT_FIELDS_HTOL) 326 uchar_t : 2, /* reserved */ 327 inq_port : 1, /* Only defined when dual_p set */ 328 inq_dual_p : 1, /* Dual Port */ 329 inq_mchngr : 1, /* Medium Changer */ 330 inq_SIP_1 : 3; /* Interlocked Protocol */ 331#else 332 uchar_t inq_SIP_1 : 3, /* Interlocked Protocol */ 333 inq_mchngr : 1, /* Medium Changer */ 334 inq_dual_p : 1, /* Dual Port */ 335 inq_port : 1, /* Only defined when dual_p set */ 336 : 2; /* reserved */ 337#endif /* _BIT_FIELDS_HTOL */ 338 339 union { 340 L_inq_2 inq_2; 341 L_inq_3 inq_3; 342 } ui; 343 344 345 /* bytes 8-35 */ 346 347 uchar_t inq_vid[8]; /* vendor ID */ 348 349 uchar_t inq_pid[16]; /* product ID */ 350 351 uchar_t inq_revision[4]; /* product revision level */ 352 353 /* 354 * Bytes 36-55 are vendor-specific parameter bytes 355 */ 356 357 /* SSA specific definitions */ 358 /* bytes 36 - 39 */ 359#define inq_ven_specific_1 inq_firmware_rev 360 uchar_t inq_firmware_rev[4]; /* firmware revision level */ 361 362 /* bytes 40 - 51 */ 363 uchar_t inq_serial[12]; /* serial number, not used any more */ 364 365 /* bytes 52-53 */ 366 uchar_t inq_res2[2]; 367 368 /* byte 54, 55 */ 369 uchar_t inq_ssa_ports; /* number of ports */ 370 uchar_t inq_ssa_tgts; /* number of targets */ 371 372 /* 373 * Bytes 56-95 are reserved. 374 */ 375 uchar_t inq_res3[40]; 376 /* 377 * 96 to 'n' are vendor-specific parameter bytes 378 */ 379 uchar_t inq_box_name[32]; 380 uchar_t inq_avu[256]; 381} L_inquiry; 382#define HEX_ONLY 0 /* Print Hex only */ 383#define HEX_ASCII 1 /* Print Hex and Ascii */ 384#define WWN_SIZE 8 /* # of bytes to dump per line */ 385 386/* NOTE: These command op codes are not defined in commands.h */ 387#define SCMD_SYNC_CACHE 0x35 388#define SCMD_LOG_SENSE 0x4d 389#define SCMD_PERS_RESERV_IN 0x5e 390#define SCMD_PERS_RESERV_OUT 0x5f 391 392typedef struct rls_payload { 393 uint_t rls_portno; 394 uint_t rls_linkfail; 395 uint_t rls_syncfail; 396 uint_t rls_sigfail; 397 uint_t rls_primitiverr; 398 uint_t rls_invalidword; 399 uint_t rls_invalidcrc; 400} rls_payload_t; 401 402typedef struct l_inquiry00_struct { 403#if defined(_BIT_FIELDS_LTOH) 404uchar_t qual :3, 405 dtype :5; 406#else 407uchar_t dtype :5, 408 qual :3; 409#endif /* _BIT_FIELDS_LTOH */ 410uchar_t page_code; 411uchar_t reserved; 412uchar_t len; 413uchar_t page_list[251]; 414} L_inquiry00; 415 416#define MIN(a, b) (a < b ? a : b) 417#define ER_DPRINTF if (getenv("_LUX_ER_DEBUG") != NULL) (void) printf 418#define O_DPRINTF if (getenv("_LUX_O_DEBUG") != NULL) (void) printf 419#define P_DPRINTF if (getenv("_LUX_P_DEBUG") != NULL) (void) printf 420#define R_DPRINTF if (getenv("_LUX_R_DEBUG") != NULL) (void) printf 421#define I_DPRINTF if (getenv("_LUX_I_DEBUG") != NULL) (void) printf 422#define S_DPRINTF if (getenv("_LUX_S_DEBUG") != NULL) (void) printf 423#define RETRY_FCIO_IOCTL 360 424#define WAIT_FCIO_IOCTL 250000 /* 1/4 of a second */ 425 426#endif /* __x86 */ 427 428 429int adm_display_config(char **argv); 430void adm_download(char **argv, char *file_name); 431void up_encl_name(char **argv, int argc); 432void adm_failover(char **argv); 433void pho_probe(); 434void non_encl_probe(); 435void adm_led(char **argv, int led_action); 436void up_password(char **argv); 437int adm_start(char **argv); 438int adm_stop(char **argv); 439int adm_power_off(char **argv, int off_flag); 440int adm_forcelip(char **argv); 441void adm_bypass_enable(char **argv, int bypass_flag); 442int adm_port_offline_online(char *argv[], int flag); 443void display_link_status(char **argv); 444int read_repos_file(char *repos_filename); 445int adm_check_file(char **argv, int flag); 446void dump(char **argv); 447void dump_map(char **argv); 448int adm_port_loopback(char *portpath, int flag); 449int adm_inquiry(char **argv); 450int adm_display_port(int verbose); 451 452int adm_reserve(char *path); 453int adm_release(char *path); 454void i18n_catopen(); 455void dump_hex_data(char *, uchar_t *, int, int); 456void print_errString(int, char *); 457void print_chars(uchar_t *, int, int); 458void print_inq_data(char *, char *, L_inquiry, uchar_t *, size_t); 459void print_fabric_dtype_prop(uchar_t *hba_port_wwn, uchar_t *port_wwn, 460 uchar_t dtype_prop); 461void print_private_loop_dtype_prop(uchar_t *hba_port_wwn, uchar_t *port_wwn, 462 uchar_t dtype_prop); 463char *get_errString(int errornum); 464int cmp_raw_wwn(uchar_t *wwn_1, uchar_t *wwn_2); 465 466/* routines in fchba*.c files */ 467int fchba_display_port(int verbose); 468int fchba_display_config(char **argv, int option_t_input, int argc); 469char *get_slash_devices_from_osDevName(char *osDevName, int flag); 470int get_scsi_vhci_pathinfo(char *dev_path, sv_iocdata_t *ioc, 471 int *path_count); 472int get_mode_page(char *path, uchar_t **pg_buf); 473int scsi_mode_sense_cmd(int fd, uchar_t *buf_ptr, int buf_len, uchar_t pc, 474 uchar_t page_code); 475int scsi_release(char *path); 476int scsi_reserve(char *path); 477int is_path(char *arg); 478int is_wwn(char *arg); 479int loadLibrary(); 480uint32_t getNumberOfAdapters(); 481int getAdapterAttrs(HBA_HANDLE handle, 482 char *name, HBA_ADAPTERATTRIBUTES *attrs); 483int getAdapterPortAttrs(HBA_HANDLE handle, char *name, int portIndex, 484 HBA_PORTATTRIBUTES *attrs); 485HBA_STATUS fetch_mappings(HBA_HANDLE handle, HBA_WWN pwwn, 486 HBA_FCPTARGETMAPPINGV2 **map); 487int match_mappings(char *compare, HBA_FCPTARGETMAPPINGV2 *map); 488uint64_t wwnConversion(uchar_t *wwn); 489 490 491#ifdef __cplusplus 492} 493#endif 494 495#endif /* _COMMON_H */ 496