Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
zfcp_dbf.h
Go to the documentation of this file.
1 /*
2  * zfcp device driver
3  * debug feature declarations
4  *
5  * Copyright IBM Corp. 2008, 2010
6  */
7 
8 #ifndef ZFCP_DBF_H
9 #define ZFCP_DBF_H
10 
11 #include <scsi/fc/fc_fcp.h>
12 #include "zfcp_ext.h"
13 #include "zfcp_fsf.h"
14 #include "zfcp_def.h"
15 
16 #define ZFCP_DBF_TAG_LEN 7
17 
18 #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull
19 
32 } __packed;
33 
47 } __packed;
48 
57 };
58 
72 struct zfcp_dbf_rec {
73  u8 id;
81  union {
84  } u;
85 } __packed;
86 
97 };
98 
106 struct zfcp_dbf_san {
111 #define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32)
113 } __packed;
114 
129 } __packed;
130 
145 } __packed;
146 
158 };
159 
171 struct zfcp_dbf_hba {
179  union {
183  } u;
184 } __packed;
185 
192 };
193 
219 #define ZFCP_DBF_SCSI_OPCODE 16
225 } __packed;
226 
234 struct zfcp_dbf_pay {
238 #define ZFCP_DBF_PAY_MAX_REC 0x100
240 } __packed;
241 
260 struct zfcp_dbf {
276 };
277 
278 static inline
279 void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req)
280 {
281  if (level <= req->adapter->dbf->hba->level)
282  zfcp_dbf_hba_fsf_res(tag, req);
283 }
284 
289 static inline
290 void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req)
291 {
292  struct fsf_qtcb *qtcb = req->qtcb;
293 
294  if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
295  (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
296  zfcp_dbf_hba_fsf_resp("fs_perr", 1, req);
297 
298  } else if (qtcb->header.fsf_status != FSF_GOOD) {
299  zfcp_dbf_hba_fsf_resp("fs_ferr", 1, req);
300 
301  } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
302  (req->fsf_command == FSF_QTCB_OPEN_LUN)) {
303  zfcp_dbf_hba_fsf_resp("fs_open", 4, req);
304 
305  } else if (qtcb->header.log_length) {
306  zfcp_dbf_hba_fsf_resp("fs_qtcb", 5, req);
307 
308  } else {
309  zfcp_dbf_hba_fsf_resp("fs_norm", 6, req);
310  }
311 }
312 
313 static inline
314 void _zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *scmd,
315  struct zfcp_fsf_req *req)
316 {
317  struct zfcp_adapter *adapter = (struct zfcp_adapter *)
318  scmd->device->host->hostdata[0];
319 
320  if (level <= adapter->dbf->scsi->level)
321  zfcp_dbf_scsi(tag, scmd, req);
322 }
323 
329 static inline
330 void zfcp_dbf_scsi_result(struct scsi_cmnd *scmd, struct zfcp_fsf_req *req)
331 {
332  if (scmd->result != 0)
333  _zfcp_dbf_scsi("rsl_err", 3, scmd, req);
334  else if (scmd->retries > 0)
335  _zfcp_dbf_scsi("rsl_ret", 4, scmd, req);
336  else
337  _zfcp_dbf_scsi("rsl_nor", 6, scmd, req);
338 }
339 
344 static inline
345 void zfcp_dbf_scsi_fail_send(struct scsi_cmnd *scmd)
346 {
347  _zfcp_dbf_scsi("rsl_fai", 4, scmd, NULL);
348 }
349 
356 static inline
357 void zfcp_dbf_scsi_abort(char *tag, struct scsi_cmnd *scmd,
358  struct zfcp_fsf_req *fsf_req)
359 {
360  _zfcp_dbf_scsi(tag, 1, scmd, fsf_req);
361 }
362 
369 static inline
370 void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag)
371 {
372  char tmp_tag[ZFCP_DBF_TAG_LEN];
373 
374  if (flag == FCP_TMF_TGT_RESET)
375  memcpy(tmp_tag, "tr_", 3);
376  else
377  memcpy(tmp_tag, "lr_", 3);
378 
379  memcpy(&tmp_tag[3], tag, 4);
380  _zfcp_dbf_scsi(tmp_tag, 1, scmnd, NULL);
381 }
382 
383 #endif /* ZFCP_DBF_H */