1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright (C) 2013 Hewlett-Packard Development Company, L.P. 14 */ 15 16 #ifndef _CPQARY3_SCSI_H 17 #define _CPQARY3_SCSI_H 18 19 #include <sys/types.h> 20 #include "cpqary3_ciss.h" 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 /* CISS LUN Addressing MODEs */ 27 #define PERIPHERIAL_DEV_ADDR 0x0 28 #define LOGICAL_VOL_ADDR 0x1 29 #define MASK_PERIPHERIAL_DEV_ADDR 0x3 30 #define CISS_PHYS_MODE 0x0 31 32 /* 33 * Definitions for compatibility with the old array BMIC interface 34 * CISS_OPCODE_RLL IS THE OPCODE FOR THE Report Logical Luns command 35 */ 36 #define ARRAY_READ 0x26 37 #define ARRAY_WRITE 0x27 38 #define CISS_NEW_READ 0xC0 39 #define CISS_NEW_WRITE 0xC1 40 #define CISS_OPCODE_RLL 0xC2 41 #define CISS_OPCODE_RPL 0xC3 42 #define CISS_NO_TIMEOUT 0x0 43 44 /* 45 * BMIC commands 46 */ 47 #define CISS_FLUSH_CACHE 0xC2 48 #define BMIC_IDENTIFY_LOGICAL_DRIVE 0x10 49 #define BMIC_SENSE_LOGICAL_DRIVE_STATUS 0x12 50 51 #define CISS_MSG_ABORT 0x0 52 #define CISS_ABORT_TASK 0x0 53 #define CISS_ABORT_TASKSET 0x1 54 #define CISS_CTLR_INIT 0xffff0000 55 56 #define CISS_MSG_RESET 0x1 57 #define CISS_RESET_CTLR 0x0 58 #define CISS_RESET_TGT 0x3 59 60 /* 61 * The Controller SCSI ID is 7. Hence, when ever the OS issues a command 62 * for a target with ID greater than 7, the intended Logical Drive is 63 * actually one less than the issued ID. 64 * So, the allignment. 65 * The Mapping from OS to the HBA is as follows: 66 * OS Target IDs HBA taret IDs 67 * 0 - 6 0 - 6 68 * 7 - (Controller) 69 * 8 - 32 7 - 31 70 */ 71 72 #define CPQARY3_TGT_ALIGNMENT 0x1 73 #define CPQARY3_LEN_TAGINUSE 0x4 74 75 #define CPQARY3_CDBLEN_12 12 76 #define CPQARY3_CDBLEN_16 16 77 78 /* 79 * possible values to fill in the cmdpvt_flag member 80 * in the cpqary3_cmdpvt_t structure 81 */ 82 #define CPQARY3_TIMEOUT 1 83 #define CPQARY3_CV_TIMEOUT 2 84 #define CPQARY3_RESET 4 85 #define CPQARY3_SYNC_SUBMITTED 8 86 #define CPQARY3_SYNC_TIMEOUT 16 87 88 #define CPQARY3_INTR_ENABLE 1 89 #define CPQARY3_INTR_DISABLE 2 90 91 #define CPQARY3_LOCKUP_INTR_ENABLE 1 92 #define CPQARY3_LOCKUP_INTR_DISABLE 2 93 94 #define CPQARY3_COALESCE_DELAY 0x0 95 #define CPQARY3_COALESCE_COUNT 0x00000001l 96 97 #define CPQARY3_NO_MUTEX 0 98 #define CPQARY3_HOLD_SW_MUTEX 1 99 100 /* Completed With NO Error */ 101 #define CPQARY3_OSCMD_SUCCESS 0x0 102 #define CPQARY3_SELFCMD_SUCCESS 0x2 103 #define CPQARY3_NOECMD_SUCCESS 0x4 104 #define CPQARY3_SYNCCMD_SUCCESS 0x6 105 106 /* Completed With ERROR */ 107 #define CPQARY3_OSCMD_FAILURE 0x1 108 #define CPQARY3_SELFCMD_FAILURE 0x3 109 #define CPQARY3_NOECMD_FAILURE 0x5 110 #define CPQARY3_SYNCCMD_FAILURE 0x7 111 112 /* Fatal SCSI Status */ 113 #define SCSI_CHECK_CONDITION 0x2 114 #define SCSI_COMMAND_TERMINATED 0x22 115 116 #pragma pack(1) 117 118 typedef struct flushcache { 119 uint16_t disable_flag; 120 uint8_t reserved[510]; 121 } flushcache_buf_t; 122 123 typedef struct each_logical_lun_data { 124 uint32_t logical_id:30; 125 uint32_t mode:2; 126 uint8_t reserved[4]; 127 } each_ll_data_t; 128 129 typedef struct rll_data { 130 uint8_t lunlist_byte3; 131 uint8_t lunlist_byte2; 132 uint8_t lunlist_byte1; 133 uint8_t lunlist_byte0; 134 uint32_t reserved; 135 each_ll_data_t ll_data[MAX_LOGDRV]; 136 } rll_data_t; 137 138 typedef struct each_physical_lun_data { 139 uint32_t DevID; 140 uint32_t SecLevel; 141 } each_pl_data_t; 142 143 typedef struct rpl_data { 144 uint8_t lunlist_byte3; 145 uint8_t lunlist_byte2; 146 uint8_t lunlist_byte1; 147 uint8_t lunlist_byte0; 148 uint32_t reserved; 149 PhysDevAddr_t pl_data[CPQARY3_MAX_TGT]; 150 } rpl_data_t; 151 152 153 /* 154 * Format of the data returned for the IDENTIFY LOGICAL DRIVE Command 155 */ 156 157 typedef struct Identify_Logical_Drive { 158 uint16_t block_size_in_bytes; 159 uint32_t blocks_available; 160 uint16_t cylinders; 161 uint8_t heads; 162 uint8_t general[11]; 163 uint8_t sectors; 164 uint8_t checksum; 165 uint8_t fault_tolerance; 166 uint8_t reserved; 167 uint8_t bios_disable_flag; 168 uint8_t reserved1; 169 uint32_t logical_drive_identifier; 170 uint8_t logical_drive_label[64]; 171 uint8_t reserved3[418]; 172 } IdLogDrive; 173 174 /* FORMAT */ 175 typedef struct Identify_Ld_Status { 176 uint8_t status; /* Logical Drive Status */ 177 uint32_t failure_map; /* Drive Failure Map */ 178 uint16_t read_error_count[32]; /* read error count */ 179 uint16_t write_error_count[32]; /* write error count */ 180 uint8_t drive_error_data[256]; /* drive error data */ 181 uint8_t drq_time_out_count[32]; /* drq timeout count */ 182 uint32_t blocks_left_to_recover; /* blocks yet to recover */ 183 uint8_t drive_recovering; /* drive recovering */ 184 uint16_t remap_count[32]; /* remap count */ 185 uint32_t replacement_drive_map; /* replacement drive map */ 186 uint32_t active_spare_map; /* active spare map */ 187 uint8_t spare_status; /* spare status */ 188 uint8_t spare_to_replace_map[32]; 189 uint32_t replace_ok_map; /* Marked ok but no rebuild */ 190 uint8_t media_exchanged; /* Media exchanged (see 0xE0) */ 191 uint8_t cache_failure; /* volume failed cache fail */ 192 uint8_t expand_failure; /* volume failed for failure */ 193 uint8_t unit_flags; /* SMART-2 only */ 194 195 /* 196 * The following fields are for firmware supporting > 7 drives per 197 * SCSI bus. The "Drives Per SCSI Bus" indicates how many bits / 198 * words (in case of remap count) correspond to each drive. 199 */ 200 uint16_t big_failure_map[8]; /* Big Drive Failure Map */ 201 uint16_t big_remap_cnt[128]; /* Big Drive Remap Count */ 202 uint16_t big_replace_map[8]; /* Big Replacement Drive Map */ 203 uint16_t big_spare_map[8]; /* Big spare drive map */ 204 uint8_t big_spare_replace_map[128]; /* Big spare replace map */ 205 uint16_t big_replace_ok_map[8]; /* Big replaced marked OK map */ 206 uint8_t big_drive_rebuild; /* Drive Rebuilding - Drive # */ 207 uint8_t reserved[36]; 208 } SenseLdStatus; 209 /* FORMAT */ 210 211 /* 212 * SCSI Command Opcodes 213 */ 214 #define SCSI_READ_6 0x08 /* READ - 6 byte command */ 215 #define SCSI_READ_10 0x28 /* READ - 10 byte command */ 216 #define SCSI_READ_12 0xA8 /* READ - 12 byte command */ 217 #define SCSI_WRITE_6 0x0A /* WRITE - 6 byte command */ 218 #define SCSI_WRITE_10 0x2A /* WRITE - 10 byte command */ 219 #define SCSI_WRITE_12 0xAA /* WRITE - 12 byte command */ 220 221 /* 222 * SCSI Opcodes Not supported by FW 223 * 224 */ 225 #define SCSI_LOG_SENSE 0x4D /* LOG SENSE */ 226 #define SCSI_MODE_SELECT 0x15 /* LOG SENSE */ 227 #define SCSI_PERSISTENT_RESERVE_IN 0x5E /* PERSISTENT RESERVE IN */ 228 229 #pragma pack() 230 231 #ifdef __cplusplus 232 } 233 #endif 234 235 #endif /* _CPQARY3_SCSI_H */ 236