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 2010 QLogic Corporation */ 23 24 /* 25 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 26 */ 27 28 #ifndef _QL_XIOCTL_H 29 #define _QL_XIOCTL_H 30 31 /* 32 * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver header file. 33 * 34 * *********************************************************************** 35 * * ** 36 * * NOTICE ** 37 * * COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION ** 38 * * ALL RIGHTS RESERVED ** 39 * * ** 40 * *********************************************************************** 41 * 42 */ 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 #include <exioct.h> 49 50 /* 0xFFFFFA Mgmt Server */ 51 #define MANAGEMENT_SERVER_LOOP_ID 0xfe 52 #define MANAGEMENT_SERVER_24XX_LOOP_ID 0x7ef 53 54 /* Returned Mailbox registers. */ 55 typedef struct ql_mbx_ret { 56 uint16_t mb[MAX_MBOX_COUNT]; 57 } ql_mbx_ret_t; 58 59 /* 60 * Name type defines for use with ql_scsi_passthru() and 61 * elsewhere when searching for name matches. 62 * NOTE that these defines are used both as flags and values. 63 */ 64 #define QLNT_NODE 0x01 65 #define QLNT_PORT 0x02 66 #define QLNT_BOTH (QLNT_NODE | QLNT_PORT) 67 #define QLNT_PID 0x04 68 #define QLNT_LOOP_ID 0x08 69 #define QLNT_MASK 0x0F 70 71 /* 72 * CT information unit basic preamble. 73 */ 74 typedef struct ql_ct_iu_preamble { 75 uint8_t revision; 76 uint8_t in_id[3]; 77 uint8_t gs_type; 78 uint8_t gs_subtype; 79 uint8_t options; 80 uint8_t reserved; 81 uint16_t command_response_code; 82 uint16_t max_residual_size; 83 uint8_t fragment_id; 84 uint8_t reason_code; 85 uint8_t reason_code_explanation; 86 uint8_t vendor_specific; 87 } ql_ct_iu_preamble_t; 88 89 #define GS_TYPE_DIR_SERVER 0xFC 90 91 /* 92 * Link Status Counts structure 93 * 94 * Counts are BIG ENDIAN 95 */ 96 typedef struct ql_link_stats { 97 uint32_t link_fail_cnt; 98 uint32_t sync_loss_cnt; 99 uint32_t signal_loss_cnt; 100 uint32_t prot_err_cnt; /* Primitive seq protocol errors */ 101 uint32_t inv_xmit_cnt; /* Invalid transmission word count */ 102 uint32_t inv_crc_cnt; /* Invalid CRC count */ 103 } ql_link_stats_t; 104 105 /* 106 * Report LUN definitions. 107 */ 108 typedef struct ql_rpt_hdr { 109 uint32_t len; 110 uint32_t rsrv; 111 } ql_rpt_hdr_t; 112 113 typedef struct ql_rpt_lun { 114 struct { 115 uint8_t b : 6; 116 uint8_t address_method : 2; 117 } msb; 118 uint8_t lsb; 119 uint8_t unused[6]; 120 } ql_rpt_lun_t; 121 122 typedef struct ql_rpt_lun_lst { 123 ql_rpt_hdr_t hdr; 124 ql_rpt_lun_t lst[MAX_LUNS]; 125 } ql_rpt_lun_lst_t; 126 127 #define INQ_DATA_SIZE 8 128 129 /* 130 * Flash definitions. 131 */ 132 typedef struct ql_flash_info { 133 uint32_t type; /* flash type */ 134 uint32_t size; /* length in bytes of flash */ 135 uint32_t sec_mask; /* sector number mask */ 136 uint8_t man_id; /* flash chip manufacturer id */ 137 uint8_t id; /* flash chip id */ 138 uint8_t cap; /* flash chip capacity */ 139 } ql_flash_info_t; 140 141 /* 142 * Flash Description Table 143 */ 144 #define FLASH_DESC_VERSION 1 145 #define FLASH_DESC_VAILD 0x44494C51 /* "QLID" */ 146 typedef struct flash_desc { 147 uint32_t flash_valid; 148 uint16_t flash_version; 149 uint16_t flash_len; 150 uint16_t flash_checksum; 151 uint16_t flash_unused; 152 uint8_t flash_model[16]; 153 uint16_t flash_manuf; 154 uint16_t flash_id; 155 uint8_t flash_flag; 156 uint8_t erase_cmd; 157 uint8_t alt_erase_cmd; 158 uint8_t write_enable_cmd; 159 uint8_t write_enable_bits; 160 uint8_t write_statusreg_cmd; 161 uint8_t unprotect_sector_cmd; 162 uint8_t read_manuf_cmd; 163 uint32_t block_size; 164 uint32_t alt_block_size; 165 uint32_t flash_size; 166 uint32_t write_enable_data; 167 uint8_t readid_address_len; 168 uint8_t write_disable_bits; 169 uint8_t read_device_id_len; 170 uint8_t chip_erase_cmd; 171 uint16_t read_timeout; 172 uint8_t protect_sector_cmd; 173 uint8_t exp_reserved[65]; 174 } flash_desc_t; 175 176 /* flash manufacturer id's */ 177 #define AMD_FLASH 0x01 /* AMD / Spansion */ 178 #define ST_FLASH 0x20 /* ST Electronics */ 179 #define SST_FLASH 0xbf /* SST Electronics */ 180 #define MXIC_FLASH 0xc2 /* Macronix (MXIC) */ 181 #define ATMEL_FLASH 0x1f /* Atmel (AT26DF081A) */ 182 #define WINBOND_FLASH 0xef /* Winbond (W25X16) */ 183 #define INTEL_FLASH 0x89 /* Intel (QB25F016S33B8) */ 184 185 /* flash id defines */ 186 #define AMD_FLASHID_128K 0x6e /* 128k AMD flash chip */ 187 #define AMD_FLASHID_512K 0x4f /* 512k AMD flash chip */ 188 #define AMD_FLASHID_512Kt 0xb9 /* 512k AMD flash chip - top boot blk */ 189 #define AMD_FLASHID_512Kb 0xba /* 512k AMD flash chip - btm boot blk */ 190 #define AMD_FLASHID_1024K 0x38 /* 1 MB AMD flash chip */ 191 #define ST_FLASHID_128K 0x23 /* 128k ST flash chip */ 192 #define ST_FLASHID_512K 0xe3 /* 512k ST flash chip */ 193 #define ST_FLASHID_M25PXX 0x20 /* M25Pxx ST flash chip */ 194 #define SST_FLASHID_128K 0xd5 /* 128k SST flash chip */ 195 #define SST_FLASHID_1024K 0xd8 /* 1 MB SST flash chip */ 196 #define SST_FLASHID_1024K_A 0x80 /* 1 MB SST 25LF080A flash chip */ 197 #define SST_FLASHID_1024K_B 0x8e /* 1 MB SST 25VF080B flash chip */ 198 #define SST_FLASHID_2048K 0x25 /* 2 MB SST 25VF016B flash chip */ 199 #define MXIC_FLASHID_512K 0x4f /* 512k MXIC flash chip */ 200 #define MXIC_FLASHID_1024K 0x38 /* 1 MB MXIC flash chip */ 201 #define MXIC_FLASHID_25LXX 0x20 /* 25Lxx MXIC flash chip */ 202 #define ATMEL_FLASHID_1024K 0x45 /* 1 MB ATMEL flash chip */ 203 #define SPAN_FLASHID_2048K 0x02 /* 2 MB Spansion flash chip */ 204 #define WINBOND_FLASHID 0x30 /* Winbond W25Xxx flash chip */ 205 #define INTEL_FLASHID 0x89 /* Intel QB25F016S33B8 flash chip */ 206 207 /* flash type defines */ 208 #define FLASH128 BIT_0 209 #define FLASH512 BIT_1 210 #define FLASH512S BIT_2 211 #define FLASH1024 BIT_3 212 #define FLASH2048 BIT_4 213 #define FLASH4096 BIT_5 214 #define FLASH8192 BIT_6 215 #define FLASH_PAGE BIT_31 216 #define FLASH_LEGACY (FLASH128 | FLASH512S) 217 218 typedef struct ql_ledstate { 219 uint32_t BeaconState; 220 uint32_t LEDflags; 221 uint32_t flags; 222 } ql_ledstate_t; 223 224 /* 225 * ledstate flags definitions 226 */ 227 #define LED_ACTIVE BIT_0 228 229 /* 230 * ledstate BeaconState definitions 231 */ 232 #define BEACON_OFF 0 233 #define BEACON_ON BIT_0 234 235 /* 236 * ledstate LEDflags definitions 237 */ 238 #define LED_ALL_OFF 0 239 #define LED_RED BIT_0 240 #define LED_GREEN BIT_6 241 #define LED_AMBER BIT_7 242 #define LED_MASK (LED_AMBER | LED_GREEN | LED_RED) 243 244 /* 245 * 24xx ledstate LEDflags definitions 246 */ 247 #define LED_MASK_UPDATE_24 (BIT_20 | BIT_19 | BIT_18) 248 #define LED_YELLOW_24 BIT_2 249 #define LED_GREEN_24 BIT_3 250 #define LED_AMBER_24 BIT_4 251 #define LED_MASK_COLORS_24 (LED_AMBER_24 | LED_GREEN_24 | LED_YELLOW_24) 252 253 typedef struct { 254 uint8_t signature[2]; 255 uint8_t reserved[0x16]; 256 uint8_t dataoffset[2]; 257 uint8_t pad[6]; 258 } pci_header_t; 259 260 typedef struct { 261 uint8_t signature[4]; 262 uint8_t vid[2]; 263 uint8_t did[2]; 264 uint8_t reserved0[2]; 265 uint8_t pcidatalen[2]; 266 uint8_t pcidatarev; 267 uint8_t classcode[3]; 268 uint8_t imagelength[2]; /* In sectors */ 269 uint8_t revisionlevel[2]; 270 uint8_t codetype; 271 uint8_t indicator; 272 uint8_t reserved1[2]; 273 uint8_t pad[8]; 274 } pci_data_t; 275 276 #define PCI_HEADER0 0x55 277 #define PCI_HEADER1 0xAA 278 #define PCI_DATASIG "PCIR" 279 #define PCI_SECTOR_SIZE 0x200 280 #define PCI_CODE_X86PC 0 281 #define PCI_CODE_FCODE 1 282 #define PCI_CODE_HPPA 2 283 #define PCI_CODE_EFI 3 284 #define PCI_CODE_FW 0xfe 285 #define PCI_IND_LAST_IMAGE 0x80 286 #define SBUS_CODE_FCODE 0xf1 287 288 typedef struct ql_fcache { 289 struct ql_fcache *next; 290 uint32_t type; 291 int8_t verstr[FCHBA_OPTION_ROM_VERSION_LEN]; 292 uint32_t buflen; 293 uint8_t *buf; 294 } ql_fcache_t; 295 296 /* fcache types */ 297 #define FTYPE_UNKNOWN 0 298 #define FTYPE_FCODE BIT_0 299 #define FTYPE_BIOS BIT_1 300 #define FTYPE_EFI BIT_2 301 #define FTYPE_FW BIT_3 302 #define FTYPE_HPPA BIT_4 303 304 #define FBUFSIZE 100 305 306 /* 307 * Flash Layout Table definitions. 308 */ 309 typedef struct ql_flash_layout_pointer { 310 uint8_t sig[4]; 311 uint8_t addr[4]; 312 uint8_t version; 313 uint8_t reserved[5]; 314 uint8_t checksum[2]; 315 } ql_flt_ptr_t; 316 317 typedef struct ql_flash_layout_header { 318 uint8_t version[2]; 319 uint8_t len[2]; 320 uint8_t checksum[2]; 321 uint8_t reserved[2]; 322 } ql_flt_hdr_t; 323 324 typedef struct ql_flash_layout_region { 325 uint8_t region; 326 uint8_t reserved; 327 uint8_t attribute; 328 uint8_t reserved_1; 329 uint8_t size[4]; 330 uint8_t beg_addr[4]; 331 uint8_t end_addr[4]; 332 } ql_flt_region_t; 333 334 typedef struct ql_fp_cfg_hdr { 335 uint8_t version[2]; 336 uint8_t len[2]; 337 uint8_t checksum[2]; 338 uint8_t NumberEntries[2]; 339 uint8_t SizeEntry[2]; 340 uint8_t unused[2]; 341 uint8_t Signature[4]; 342 } ql_fp_cfg_hdr_t; 343 344 typedef struct ql_fp_cfg { 345 uint8_t FunctionNumber[2]; 346 uint8_t FunctionType; 347 uint8_t PortConfigIndex; 348 uint8_t ConfigRegion; 349 uint8_t VpdRegion; 350 uint8_t DCBXRegion; 351 uint8_t Reserved; 352 } ql_fp_cfg_t; 353 354 #define FT_NIC 0 355 #define FT_FC 1 356 #define FT_ISCSI 2 357 #define FT_VNIC 3 358 359 typedef struct ql_fp_cfg_map { 360 ql_fp_cfg_hdr_t hdr; 361 ql_fp_cfg_t cfg[6]; 362 } ql_fp_cfg_map_t; 363 364 #define FLASH_FW_REGION 0x01 365 #define FLASH_VPD_0_REGION 0x14 366 #define FLASH_NVRAM_0_REGION 0x15 367 #define FLASH_VPD_1_REGION 0x16 368 #define FLASH_NVRAM_1_REGION 0x17 369 #define FLASH_DESC_TABLE_REGION 0x1A 370 #define FLASH_ERROR_LOG_0_REGION 0x1D 371 #define FLASH_ERROR_LOG_1_REGION 0x1F 372 #define FLASH_GOLDEN_FW_REGION 0x2F 373 374 #define FLASH_8021_FW_REGION 0x74 375 #define FLASH_8021_GOLDEN_FW_REGION 0x75 376 #define FLASH_8021_BOOTLOADER_REGION 0x72 377 #define FLASH_8021_VPD_REGION 0x81 378 379 #define FLASH_LAYOUT_TABLE_SIZE 4096 380 381 /* 382 * Per instance XIOCTL context defintions. 383 */ 384 typedef struct ql_xioctl { 385 /* Driver context */ 386 flash_desc_t fdesc; 387 388 /* Adapter I/O statistics */ 389 uint32_t ControllerErrorCount; 390 uint32_t DeviceErrorCount; 391 uint32_t TotalLipResets; 392 uint32_t TotalInterrupts; 393 394 uint64_t BytesRequested; 395 uint64_t IosRequested; 396 397 /* SNIA stat counters */ 398 int64_t IOInputRequests; 399 int64_t IOOutputRequests; 400 int64_t IOControlRequests; 401 int64_t IOOutputMByteCnt; /* # of mb's */ 402 int64_t IOInputMByteCnt; /* # of mb's */ 403 404 /* SNIA intermediate (less than 1mb) counters */ 405 int64_t IOOutputByteCnt; 406 int64_t IOInputByteCnt; 407 408 /* Adapter LED state */ 409 ql_ledstate_t ledstate; 410 411 /* Async event context */ 412 void *aen_tracking_queue; 413 uint8_t aen_q_head; 414 uint8_t aen_q_tail; 415 416 uint32_t flags; 417 } ql_xioctl_t; 418 419 /* 420 * ql adapter flag defintions. 421 */ 422 #define QL_AEN_TRACKING_ENABLE BIT_0 423 #define QL_MGMT_SERVER_LOGIN BIT_1 424 425 /* 426 * Global Data in ql_xioctl.c source file. 427 */ 428 429 /* 430 * Global Function Prototypes in ql_xioctl.c source file. 431 */ 432 int ql_alloc_xioctl_resource(ql_adapter_state_t *); 433 void ql_free_xioctl_resource(ql_adapter_state_t *); 434 int ql_xioctl(ql_adapter_state_t *, int, intptr_t, int, cred_t *, int *); 435 void ql_enqueue_aen(ql_adapter_state_t *, uint16_t, void *); 436 int ql_setup_fcache(ql_adapter_state_t *); 437 void ql_blink_led(ql_adapter_state_t *); 438 void ql_fcache_rel(ql_fcache_t *); 439 ql_fcache_t *ql_get_fbuf(ql_fcache_t *, uint32_t); 440 int ql_dump_fcode(ql_adapter_state_t *, uint8_t *, uint32_t, uint32_t); 441 int ql_pci_dump(ql_adapter_state_t *, uint32_t *, uint32_t, int); 442 int ql_load_fcode(ql_adapter_state_t *, uint8_t *, uint32_t, uint32_t); 443 444 #ifdef __cplusplus 445 } 446 #endif 447 448 #endif /* _QL_XIOCTL_H */ 449