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, 2009 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 <scsi/fc/fc_fcp.h> 26 #include "zfcp_ext.h" 27 #include "zfcp_fsf.h" 28 #include "zfcp_def.h" 29 30 #define ZFCP_DBF_TAG_SIZE 4 31 #define ZFCP_DBF_ID_SIZE 7 32 33 #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull 34 35 struct zfcp_dbf_dump { 36 u8 tag[ZFCP_DBF_TAG_SIZE]; 37 u32 total_size; /* size of total dump data */ 38 u32 offset; /* how much data has being already dumped */ 39 u32 size; /* how much data comes with this record */ 40 u8 data[]; /* dump data */ 41 } __attribute__ ((packed)); 42 43 struct zfcp_dbf_rec_record_thread { 44 u32 total; 45 u32 ready; 46 u32 running; 47 }; 48 49 struct zfcp_dbf_rec_record_target { 50 u64 ref; 51 u32 status; 52 u32 d_id; 53 u64 wwpn; 54 u64 fcp_lun; 55 u32 erp_count; 56 }; 57 58 struct zfcp_dbf_rec_record_trigger { 59 u8 want; 60 u8 need; 61 u32 as; 62 u32 ps; 63 u32 us; 64 u64 ref; 65 u64 action; 66 u64 wwpn; 67 u64 fcp_lun; 68 }; 69 70 struct zfcp_dbf_rec_record_action { 71 u32 status; 72 u32 step; 73 u64 action; 74 u64 fsf_req; 75 }; 76 77 struct zfcp_dbf_rec_record { 78 u8 id; 79 char id2[7]; 80 union { 81 struct zfcp_dbf_rec_record_action action; 82 struct zfcp_dbf_rec_record_thread thread; 83 struct zfcp_dbf_rec_record_target target; 84 struct zfcp_dbf_rec_record_trigger trigger; 85 } u; 86 }; 87 88 enum { 89 ZFCP_REC_DBF_ID_ACTION, 90 ZFCP_REC_DBF_ID_THREAD, 91 ZFCP_REC_DBF_ID_TARGET, 92 ZFCP_REC_DBF_ID_TRIGGER, 93 }; 94 95 struct zfcp_dbf_hba_record_response { 96 u32 fsf_command; 97 u64 fsf_reqid; 98 u32 fsf_seqno; 99 u64 fsf_issued; 100 u32 fsf_prot_status; 101 u32 fsf_status; 102 u8 fsf_prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE]; 103 u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE]; 104 u32 fsf_req_status; 105 u8 sbal_first; 106 u8 sbal_last; 107 u8 sbal_response; 108 u8 pool; 109 u64 erp_action; 110 union { 111 struct { 112 u64 cmnd; 113 u64 serial; 114 } fcp; 115 struct { 116 u64 wwpn; 117 u32 d_id; 118 u32 port_handle; 119 } port; 120 struct { 121 u64 wwpn; 122 u64 fcp_lun; 123 u32 port_handle; 124 u32 lun_handle; 125 } unit; 126 struct { 127 u32 d_id; 128 } els; 129 } u; 130 } __attribute__ ((packed)); 131 132 struct zfcp_dbf_hba_record_status { 133 u8 failed; 134 u32 status_type; 135 u32 status_subtype; 136 struct fsf_queue_designator 137 queue_designator; 138 u32 payload_size; 139 #define ZFCP_DBF_UNSOL_PAYLOAD 80 140 #define ZFCP_DBF_UNSOL_PAYLOAD_SENSE_DATA_AVAIL 32 141 #define ZFCP_DBF_UNSOL_PAYLOAD_BIT_ERROR_THRESHOLD 56 142 #define ZFCP_DBF_UNSOL_PAYLOAD_FEATURE_UPDATE_ALERT 2 * sizeof(u32) 143 u8 payload[ZFCP_DBF_UNSOL_PAYLOAD]; 144 } __attribute__ ((packed)); 145 146 struct zfcp_dbf_hba_record_qdio { 147 u32 qdio_error; 148 u8 sbal_index; 149 u8 sbal_count; 150 } __attribute__ ((packed)); 151 152 struct zfcp_dbf_hba_record { 153 u8 tag[ZFCP_DBF_TAG_SIZE]; 154 u8 tag2[ZFCP_DBF_TAG_SIZE]; 155 union { 156 struct zfcp_dbf_hba_record_response response; 157 struct zfcp_dbf_hba_record_status status; 158 struct zfcp_dbf_hba_record_qdio qdio; 159 struct fsf_bit_error_payload berr; 160 } u; 161 } __attribute__ ((packed)); 162 163 struct zfcp_dbf_san_record_ct_request { 164 u16 cmd_req_code; 165 u8 revision; 166 u8 gs_type; 167 u8 gs_subtype; 168 u8 options; 169 u16 max_res_size; 170 u32 len; 171 u32 d_id; 172 } __attribute__ ((packed)); 173 174 struct zfcp_dbf_san_record_ct_response { 175 u16 cmd_rsp_code; 176 u8 revision; 177 u8 reason_code; 178 u8 expl; 179 u8 vendor_unique; 180 u16 max_res_size; 181 u32 len; 182 } __attribute__ ((packed)); 183 184 struct zfcp_dbf_san_record_els { 185 u32 d_id; 186 } __attribute__ ((packed)); 187 188 struct zfcp_dbf_san_record { 189 u8 tag[ZFCP_DBF_TAG_SIZE]; 190 u64 fsf_reqid; 191 u32 fsf_seqno; 192 union { 193 struct zfcp_dbf_san_record_ct_request ct_req; 194 struct zfcp_dbf_san_record_ct_response ct_resp; 195 struct zfcp_dbf_san_record_els els; 196 } u; 197 } __attribute__ ((packed)); 198 199 #define ZFCP_DBF_SAN_MAX_PAYLOAD 1024 200 201 struct zfcp_dbf_scsi_record { 202 u8 tag[ZFCP_DBF_TAG_SIZE]; 203 u8 tag2[ZFCP_DBF_TAG_SIZE]; 204 u32 scsi_id; 205 u32 scsi_lun; 206 u32 scsi_result; 207 u64 scsi_cmnd; 208 u64 scsi_serial; 209 #define ZFCP_DBF_SCSI_OPCODE 16 210 u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE]; 211 u8 scsi_retries; 212 u8 scsi_allowed; 213 u64 fsf_reqid; 214 u32 fsf_seqno; 215 u64 fsf_issued; 216 u64 old_fsf_reqid; 217 u8 rsp_validity; 218 u8 rsp_scsi_status; 219 u32 rsp_resid; 220 u8 rsp_code; 221 #define ZFCP_DBF_SCSI_FCP_SNS_INFO 16 222 #define ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO 256 223 u32 sns_info_len; 224 u8 sns_info[ZFCP_DBF_SCSI_FCP_SNS_INFO]; 225 } __attribute__ ((packed)); 226 227 struct zfcp_dbf { 228 debug_info_t *rec; 229 debug_info_t *hba; 230 debug_info_t *san; 231 debug_info_t *scsi; 232 spinlock_t rec_lock; 233 spinlock_t hba_lock; 234 spinlock_t san_lock; 235 spinlock_t scsi_lock; 236 struct zfcp_dbf_rec_record rec_buf; 237 struct zfcp_dbf_hba_record hba_buf; 238 struct zfcp_dbf_san_record san_buf; 239 struct zfcp_dbf_scsi_record scsi_buf; 240 struct zfcp_adapter *adapter; 241 }; 242 243 static inline 244 void zfcp_dbf_hba_fsf_resp(const char *tag2, int level, 245 struct zfcp_fsf_req *req, struct zfcp_dbf *dbf) 246 { 247 if (level <= dbf->hba->level) 248 _zfcp_dbf_hba_fsf_response(tag2, level, req, dbf); 249 } 250 251 /** 252 * zfcp_dbf_hba_fsf_response - trace event for request completion 253 * @fsf_req: request that has been completed 254 */ 255 static inline void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req) 256 { 257 struct zfcp_dbf *dbf = req->adapter->dbf; 258 struct fsf_qtcb *qtcb = req->qtcb; 259 260 if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) && 261 (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) { 262 zfcp_dbf_hba_fsf_resp("perr", 1, req, dbf); 263 264 } else if (qtcb->header.fsf_status != FSF_GOOD) { 265 zfcp_dbf_hba_fsf_resp("ferr", 1, req, dbf); 266 267 } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) || 268 (req->fsf_command == FSF_QTCB_OPEN_LUN)) { 269 zfcp_dbf_hba_fsf_resp("open", 4, req, dbf); 270 271 } else if (qtcb->header.log_length) { 272 zfcp_dbf_hba_fsf_resp("qtcb", 5, req, dbf); 273 274 } else { 275 zfcp_dbf_hba_fsf_resp("norm", 6, req, dbf); 276 } 277 } 278 279 /** 280 * zfcp_dbf_hba_fsf_unsol - trace event for an unsolicited status buffer 281 * @tag: tag indicating which kind of unsolicited status has been received 282 * @dbf: reference to dbf structure 283 * @status_buffer: buffer containing payload of unsolicited status 284 */ 285 static inline 286 void zfcp_dbf_hba_fsf_unsol(const char *tag, struct zfcp_dbf *dbf, 287 struct fsf_status_read_buffer *buf) 288 { 289 int level = 2; 290 291 if (level <= dbf->hba->level) 292 _zfcp_dbf_hba_fsf_unsol(tag, level, dbf, buf); 293 } 294 295 static inline 296 void zfcp_dbf_scsi(const char *tag, const char *tag2, int level, 297 struct zfcp_dbf *dbf, struct scsi_cmnd *scmd, 298 struct zfcp_fsf_req *req, unsigned long old_id) 299 { 300 if (level <= dbf->scsi->level) 301 _zfcp_dbf_scsi(tag, tag2, level, dbf, scmd, req, old_id); 302 } 303 304 /** 305 * zfcp_dbf_scsi_result - trace event for SCSI command completion 306 * @dbf: adapter dbf trace 307 * @scmd: SCSI command pointer 308 * @req: FSF request used to issue SCSI command 309 */ 310 static inline 311 void zfcp_dbf_scsi_result(struct zfcp_dbf *dbf, struct scsi_cmnd *scmd, 312 struct zfcp_fsf_req *req) 313 { 314 if (scmd->result != 0) 315 zfcp_dbf_scsi("rslt", "erro", 3, dbf, scmd, req, 0); 316 else if (scmd->retries > 0) 317 zfcp_dbf_scsi("rslt", "retr", 4, dbf, scmd, req, 0); 318 else 319 zfcp_dbf_scsi("rslt", "norm", 6, dbf, scmd, req, 0); 320 } 321 322 /** 323 * zfcp_dbf_scsi_fail_send - trace event for failure to send SCSI command 324 * @dbf: adapter dbf trace 325 * @scmd: SCSI command pointer 326 */ 327 static inline 328 void zfcp_dbf_scsi_fail_send(struct zfcp_dbf *dbf, struct scsi_cmnd *scmd) 329 { 330 zfcp_dbf_scsi("rslt", "fail", 4, dbf, scmd, NULL, 0); 331 } 332 333 /** 334 * zfcp_dbf_scsi_abort - trace event for SCSI command abort 335 * @tag: tag indicating success or failure of abort operation 336 * @adapter: adapter thas has been used to issue SCSI command to be aborted 337 * @scmd: SCSI command to be aborted 338 * @new_req: request containing abort (might be NULL) 339 * @old_id: identifier of request containg SCSI command to be aborted 340 */ 341 static inline 342 void zfcp_dbf_scsi_abort(const char *tag, struct zfcp_dbf *dbf, 343 struct scsi_cmnd *scmd, struct zfcp_fsf_req *new_req, 344 unsigned long old_id) 345 { 346 zfcp_dbf_scsi("abrt", tag, 1, dbf, scmd, new_req, old_id); 347 } 348 349 /** 350 * zfcp_dbf_scsi_devreset - trace event for Logical Unit or Target Reset 351 * @tag: tag indicating success or failure of reset operation 352 * @flag: indicates type of reset (Target Reset, Logical Unit Reset) 353 * @unit: unit that needs reset 354 * @scsi_cmnd: SCSI command which caused this error recovery 355 */ 356 static inline 357 void zfcp_dbf_scsi_devreset(const char *tag, u8 flag, struct zfcp_unit *unit, 358 struct scsi_cmnd *scsi_cmnd) 359 { 360 zfcp_dbf_scsi(flag == FCP_TMF_TGT_RESET ? "trst" : "lrst", tag, 1, 361 unit->port->adapter->dbf, scsi_cmnd, NULL, 0); 362 } 363 364 #endif /* ZFCP_DBF_H */ 365