1 /* 2 * This file is part of the zfcp device driver for 3 * FCP adapters for IBM System z9 and zSeries. 4 * 5 * Copyright IBM Corp. 2008, 2008 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22 #ifndef ZFCP_DBF_H 23 #define ZFCP_DBF_H 24 25 #include "zfcp_fsf.h" 26 27 #define ZFCP_DBF_TAG_SIZE 4 28 29 struct zfcp_dbf_dump { 30 u8 tag[ZFCP_DBF_TAG_SIZE]; 31 u32 total_size; /* size of total dump data */ 32 u32 offset; /* how much data has being already dumped */ 33 u32 size; /* how much data comes with this record */ 34 u8 data[]; /* dump data */ 35 } __attribute__ ((packed)); 36 37 struct zfcp_rec_dbf_record_thread { 38 u32 total; 39 u32 ready; 40 u32 running; 41 } __attribute__ ((packed)); 42 43 struct zfcp_rec_dbf_record_target { 44 u64 ref; 45 u32 status; 46 u32 d_id; 47 u64 wwpn; 48 u64 fcp_lun; 49 u32 erp_count; 50 } __attribute__ ((packed)); 51 52 struct zfcp_rec_dbf_record_trigger { 53 u8 want; 54 u8 need; 55 u32 as; 56 u32 ps; 57 u32 us; 58 u64 ref; 59 u64 action; 60 u64 wwpn; 61 u64 fcp_lun; 62 } __attribute__ ((packed)); 63 64 struct zfcp_rec_dbf_record_action { 65 u32 status; 66 u32 step; 67 u64 action; 68 u64 fsf_req; 69 } __attribute__ ((packed)); 70 71 struct zfcp_rec_dbf_record { 72 u8 id; 73 u8 id2; 74 union { 75 struct zfcp_rec_dbf_record_action action; 76 struct zfcp_rec_dbf_record_thread thread; 77 struct zfcp_rec_dbf_record_target target; 78 struct zfcp_rec_dbf_record_trigger trigger; 79 } u; 80 } __attribute__ ((packed)); 81 82 enum { 83 ZFCP_REC_DBF_ID_ACTION, 84 ZFCP_REC_DBF_ID_THREAD, 85 ZFCP_REC_DBF_ID_TARGET, 86 ZFCP_REC_DBF_ID_TRIGGER, 87 }; 88 89 struct zfcp_hba_dbf_record_response { 90 u32 fsf_command; 91 u64 fsf_reqid; 92 u32 fsf_seqno; 93 u64 fsf_issued; 94 u32 fsf_prot_status; 95 u32 fsf_status; 96 u8 fsf_prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE]; 97 u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE]; 98 u32 fsf_req_status; 99 u8 sbal_first; 100 u8 sbal_curr; 101 u8 sbal_last; 102 u8 pool; 103 u64 erp_action; 104 union { 105 struct { 106 u64 cmnd; 107 u64 serial; 108 } fcp; 109 struct { 110 u64 wwpn; 111 u32 d_id; 112 u32 port_handle; 113 } port; 114 struct { 115 u64 wwpn; 116 u64 fcp_lun; 117 u32 port_handle; 118 u32 lun_handle; 119 } unit; 120 struct { 121 u32 d_id; 122 u8 ls_code; 123 } els; 124 } u; 125 } __attribute__ ((packed)); 126 127 struct zfcp_hba_dbf_record_status { 128 u8 failed; 129 u32 status_type; 130 u32 status_subtype; 131 struct fsf_queue_designator 132 queue_designator; 133 u32 payload_size; 134 #define ZFCP_DBF_UNSOL_PAYLOAD 80 135 #define ZFCP_DBF_UNSOL_PAYLOAD_SENSE_DATA_AVAIL 32 136 #define ZFCP_DBF_UNSOL_PAYLOAD_BIT_ERROR_THRESHOLD 56 137 #define ZFCP_DBF_UNSOL_PAYLOAD_FEATURE_UPDATE_ALERT 2 * sizeof(u32) 138 u8 payload[ZFCP_DBF_UNSOL_PAYLOAD]; 139 } __attribute__ ((packed)); 140 141 struct zfcp_hba_dbf_record_qdio { 142 u32 status; 143 u32 qdio_error; 144 u32 siga_error; 145 u8 sbal_index; 146 u8 sbal_count; 147 } __attribute__ ((packed)); 148 149 struct zfcp_hba_dbf_record { 150 u8 tag[ZFCP_DBF_TAG_SIZE]; 151 u8 tag2[ZFCP_DBF_TAG_SIZE]; 152 union { 153 struct zfcp_hba_dbf_record_response response; 154 struct zfcp_hba_dbf_record_status status; 155 struct zfcp_hba_dbf_record_qdio qdio; 156 } u; 157 } __attribute__ ((packed)); 158 159 struct zfcp_san_dbf_record_ct_request { 160 u16 cmd_req_code; 161 u8 revision; 162 u8 gs_type; 163 u8 gs_subtype; 164 u8 options; 165 u16 max_res_size; 166 u32 len; 167 #define ZFCP_DBF_CT_PAYLOAD 24 168 u8 payload[ZFCP_DBF_CT_PAYLOAD]; 169 } __attribute__ ((packed)); 170 171 struct zfcp_san_dbf_record_ct_response { 172 u16 cmd_rsp_code; 173 u8 revision; 174 u8 reason_code; 175 u8 expl; 176 u8 vendor_unique; 177 u32 len; 178 u8 payload[ZFCP_DBF_CT_PAYLOAD]; 179 } __attribute__ ((packed)); 180 181 struct zfcp_san_dbf_record_els { 182 u8 ls_code; 183 u32 len; 184 #define ZFCP_DBF_ELS_PAYLOAD 32 185 #define ZFCP_DBF_ELS_MAX_PAYLOAD 1024 186 u8 payload[ZFCP_DBF_ELS_PAYLOAD]; 187 } __attribute__ ((packed)); 188 189 struct zfcp_san_dbf_record { 190 u8 tag[ZFCP_DBF_TAG_SIZE]; 191 u64 fsf_reqid; 192 u32 fsf_seqno; 193 u32 s_id; 194 u32 d_id; 195 union { 196 struct zfcp_san_dbf_record_ct_request ct_req; 197 struct zfcp_san_dbf_record_ct_response ct_resp; 198 struct zfcp_san_dbf_record_els els; 199 } u; 200 } __attribute__ ((packed)); 201 202 struct zfcp_scsi_dbf_record { 203 u8 tag[ZFCP_DBF_TAG_SIZE]; 204 u8 tag2[ZFCP_DBF_TAG_SIZE]; 205 u32 scsi_id; 206 u32 scsi_lun; 207 u32 scsi_result; 208 u64 scsi_cmnd; 209 u64 scsi_serial; 210 #define ZFCP_DBF_SCSI_OPCODE 16 211 u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE]; 212 u8 scsi_retries; 213 u8 scsi_allowed; 214 u64 fsf_reqid; 215 u32 fsf_seqno; 216 u64 fsf_issued; 217 u64 old_fsf_reqid; 218 u8 rsp_validity; 219 u8 rsp_scsi_status; 220 u32 rsp_resid; 221 u8 rsp_code; 222 #define ZFCP_DBF_SCSI_FCP_SNS_INFO 16 223 #define ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO 256 224 u32 sns_info_len; 225 u8 sns_info[ZFCP_DBF_SCSI_FCP_SNS_INFO]; 226 } __attribute__ ((packed)); 227 228 #endif /* ZFCP_DBF_H */ 229