2008-03-31 11:15:28 +02:00
/*
2010-12-02 15:16:14 +01:00
* zfcp device driver
* debug feature declarations
2008-03-31 11:15:28 +02:00
*
2010-12-02 15:16:14 +01:00
* Copyright IBM Corp . 2008 , 2010
2008-03-31 11:15:28 +02:00
*/
# ifndef ZFCP_DBF_H
# define ZFCP_DBF_H
2009-11-24 16:54:08 +01:00
# include <scsi/fc/fc_fcp.h>
2009-08-18 15:43:08 +02:00
# include "zfcp_ext.h"
2008-03-31 11:15:28 +02:00
# include "zfcp_fsf.h"
2009-08-18 15:43:08 +02:00
# include "zfcp_def.h"
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:12 +01:00
# define ZFCP_DBF_TAG_LEN 7
2008-03-31 11:15:28 +02:00
2010-02-17 11:18:54 +01:00
# define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull
2010-12-02 15:16:12 +01:00
/**
* struct zfcp_dbf_rec_trigger - trace record for triggered recovery action
* @ ready : number of ready recovery actions
* @ running : number of running recovery actions
* @ want : wanted recovery action
* @ need : needed recovery action
*/
struct zfcp_dbf_rec_trigger {
2008-03-31 11:15:28 +02:00
u32 ready ;
u32 running ;
u8 want ;
u8 need ;
2010-12-02 15:16:12 +01:00
} __packed ;
/**
* struct zfcp_dbf_rec_running - trace record for running recovery
* @ fsf_req_id : request id for fsf requests
* @ rec_status : status of the fsf request
* @ rec_step : current step of the recovery action
* rec_count : recovery counter
*/
struct zfcp_dbf_rec_running {
u64 fsf_req_id ;
u32 rec_status ;
u16 rec_step ;
u8 rec_action ;
u8 rec_count ;
} __packed ;
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:12 +01:00
/**
* enum zfcp_dbf_rec_id - recovery trace record id
* @ ZFCP_DBF_REC_TRIG : triggered recovery identifier
* @ ZFCP_DBF_REC_RUN : running recovery identifier
*/
enum zfcp_dbf_rec_id {
ZFCP_DBF_REC_TRIG = 1 ,
ZFCP_DBF_REC_RUN = 2 ,
2008-05-19 12:17:46 +02:00
} ;
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:12 +01:00
/**
* struct zfcp_dbf_rec - trace record for error recovery actions
* @ id : unique number of recovery record type
* @ tag : identifier string specifying the location of initiation
* @ lun : logical unit number
* @ wwpn : word wide port number
* @ d_id : destination ID
* @ adapter_status : current status of the adapter
* @ port_status : current status of the port
* @ lun_status : current status of the lun
* @ u . trig : structure zfcp_dbf_rec_trigger
* @ u . run : structure zfcp_dbf_rec_running
*/
struct zfcp_dbf_rec {
2008-03-31 11:15:28 +02:00
u8 id ;
2010-12-02 15:16:12 +01:00
char tag [ ZFCP_DBF_TAG_LEN ] ;
u64 lun ;
u64 wwpn ;
u32 d_id ;
u32 adapter_status ;
u32 port_status ;
u32 lun_status ;
2008-03-31 11:15:28 +02:00
union {
2010-12-02 15:16:12 +01:00
struct zfcp_dbf_rec_trigger trig ;
struct zfcp_dbf_rec_running run ;
2008-03-31 11:15:28 +02:00
} u ;
2010-12-02 15:16:12 +01:00
} __packed ;
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:13 +01:00
/**
* enum zfcp_dbf_san_id - SAN trace record identifier
* @ ZFCP_DBF_SAN_REQ : request trace record id
* @ ZFCP_DBF_SAN_RES : response trace record id
* @ ZFCP_DBF_SAN_ELS : extended link service record id
*/
enum zfcp_dbf_san_id {
ZFCP_DBF_SAN_REQ = 1 ,
ZFCP_DBF_SAN_RES = 2 ,
ZFCP_DBF_SAN_ELS = 3 ,
} ;
/** struct zfcp_dbf_san - trace record for SAN requests and responses
* @ id : unique number of recovery record type
* @ tag : identifier string specifying the location of initiation
* @ fsf_req_id : request id for fsf requests
* @ payload : unformatted information related to request / response
* @ d_id : destination id
*/
struct zfcp_dbf_san {
u8 id ;
char tag [ ZFCP_DBF_TAG_LEN ] ;
u64 fsf_req_id ;
u32 d_id ;
# define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32)
char payload [ ZFCP_DBF_SAN_MAX_PAYLOAD ] ;
} __packed ;
2010-12-02 15:16:14 +01:00
/**
* struct zfcp_dbf_hba_res - trace record for hba responses
* @ req_issued : timestamp when request was issued
* @ prot_status : protocol status
* @ prot_status_qual : protocol status qualifier
* @ fsf_status : fsf status
* @ fsf_status_qual : fsf status qualifier
*/
struct zfcp_dbf_hba_res {
u64 req_issued ;
u32 prot_status ;
u8 prot_status_qual [ FSF_PROT_STATUS_QUAL_SIZE ] ;
2008-03-31 11:15:28 +02:00
u32 fsf_status ;
2010-12-02 15:16:14 +01:00
u8 fsf_status_qual [ FSF_STATUS_QUALIFIER_SIZE ] ;
} __packed ;
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:14 +01:00
/**
* struct zfcp_dbf_hba_uss - trace record for unsolicited status
* @ status_type : type of unsolicited status
* @ status_subtype : subtype of unsolicited status
* @ d_id : destination ID
* @ lun : logical unit number
* @ queue_designator : queue designator
*/
struct zfcp_dbf_hba_uss {
2008-03-31 11:15:28 +02:00
u32 status_type ;
u32 status_subtype ;
2010-12-02 15:16:14 +01:00
u32 d_id ;
u64 lun ;
u64 queue_designator ;
} __packed ;
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:14 +01:00
/**
* enum zfcp_dbf_hba_id - HBA trace record identifier
* @ ZFCP_DBF_HBA_RES : response trace record
* @ ZFCP_DBF_HBA_USS : unsolicited status trace record
* @ ZFCP_DBF_HBA_BIT : bit error trace record
*/
enum zfcp_dbf_hba_id {
ZFCP_DBF_HBA_RES = 1 ,
ZFCP_DBF_HBA_USS = 2 ,
ZFCP_DBF_HBA_BIT = 3 ,
} ;
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:14 +01:00
/**
* struct zfcp_dbf_hba - common trace record for HBA records
* @ id : unique number of recovery record type
* @ tag : identifier string specifying the location of initiation
* @ fsf_req_id : request id for fsf requests
* @ fsf_req_status : status of fsf request
* @ fsf_cmd : fsf command
* @ fsf_seq_no : fsf sequence number
* @ pl_len : length of payload stored as zfcp_dbf_pay
* @ u : record type specific data
*/
struct zfcp_dbf_hba {
u8 id ;
char tag [ ZFCP_DBF_TAG_LEN ] ;
u64 fsf_req_id ;
u32 fsf_req_status ;
u32 fsf_cmd ;
u32 fsf_seq_no ;
u16 pl_len ;
2008-03-31 11:15:28 +02:00
union {
2010-12-02 15:16:14 +01:00
struct zfcp_dbf_hba_res res ;
struct zfcp_dbf_hba_uss uss ;
struct fsf_bit_error_payload be ;
2008-03-31 11:15:29 +02:00
} u ;
2010-12-02 15:16:14 +01:00
} __packed ;
2010-12-02 15:16:15 +01:00
/**
* enum zfcp_dbf_scsi_id - scsi trace record identifier
* @ ZFCP_DBF_SCSI_CMND : scsi command trace record
*/
enum zfcp_dbf_scsi_id {
ZFCP_DBF_SCSI_CMND = 1 ,
} ;
/**
* struct zfcp_dbf_scsi - common trace record for SCSI records
* @ id : unique number of recovery record type
* @ tag : identifier string specifying the location of initiation
* @ scsi_id : scsi device id
* @ scsi_lun : scsi device logical unit number
* @ scsi_result : scsi result
* @ scsi_retries : current retry number of scsi request
* @ scsi_allowed : allowed retries
* @ fcp_rsp_info : FCP response info
* @ scsi_opcode : scsi opcode
* @ fsf_req_id : request id of fsf request
* @ host_scribble : LLD specific data attached to SCSI request
* @ pl_len : length of paload stored as zfcp_dbf_pay
* @ fsf_rsp : response for fsf request
*/
struct zfcp_dbf_scsi {
u8 id ;
char tag [ ZFCP_DBF_TAG_LEN ] ;
u32 scsi_id ;
u32 scsi_lun ;
u32 scsi_result ;
u8 scsi_retries ;
u8 scsi_allowed ;
u8 fcp_rsp_info ;
# define ZFCP_DBF_SCSI_OPCODE 16
u8 scsi_opcode [ ZFCP_DBF_SCSI_OPCODE ] ;
u64 fsf_req_id ;
u64 host_scribble ;
u16 pl_len ;
struct fcp_resp_with_ext fcp_rsp ;
} __packed ;
2010-12-02 15:16:14 +01:00
/**
* struct zfcp_dbf_pay - trace record for unformatted payload information
* @ area : area this record is originated from
* @ counter : ascending record number
* @ fsf_req_id : request id of fsf request
* @ data : unformatted data
*/
struct zfcp_dbf_pay {
2010-12-02 15:16:16 +01:00
u8 counter ;
2010-12-02 15:16:14 +01:00
char area [ ZFCP_DBF_TAG_LEN ] ;
u64 fsf_req_id ;
# define ZFCP_DBF_PAY_MAX_REC 0x100
char data [ ZFCP_DBF_PAY_MAX_REC ] ;
} __packed ;
2008-03-31 11:15:28 +02:00
2010-12-02 15:16:16 +01:00
/**
* struct zfcp_dbf - main dbf trace structure
* @ pay : reference to payload trace area
* @ rec : reference to recovery trace area
* @ hba : reference to hba trace area
* @ san : reference to san trace area
* @ scsi : reference to scsi trace area
* @ pay_lock : lock protecting payload trace buffer
* @ rec_lock : lock protecting recovery trace buffer
* @ hba_lock : lock protecting hba trace buffer
* @ san_lock : lock protecting san trace buffer
* @ scsi_lock : lock protecting scsi trace buffer
* @ pay_buf : pre - allocated buffer for payload
* @ rec_buf : pre - allocated buffer for recovery
* @ hba_buf : pre - allocated buffer for hba
* @ san_buf : pre - allocated buffer for san
* @ scsi_buf : pre - allocated buffer for scsi
*/
2009-08-18 15:43:07 +02:00
struct zfcp_dbf {
2010-12-02 15:16:14 +01:00
debug_info_t * pay ;
2009-08-18 15:43:21 +02:00
debug_info_t * rec ;
debug_info_t * hba ;
debug_info_t * san ;
debug_info_t * scsi ;
2010-12-02 15:16:14 +01:00
spinlock_t pay_lock ;
2009-08-18 15:43:21 +02:00
spinlock_t rec_lock ;
spinlock_t hba_lock ;
spinlock_t san_lock ;
spinlock_t scsi_lock ;
2010-12-02 15:16:16 +01:00
struct zfcp_dbf_pay pay_buf ;
2010-12-02 15:16:12 +01:00
struct zfcp_dbf_rec rec_buf ;
2010-12-02 15:16:14 +01:00
struct zfcp_dbf_hba hba_buf ;
2010-12-02 15:16:13 +01:00
struct zfcp_dbf_san san_buf ;
2010-12-02 15:16:15 +01:00
struct zfcp_dbf_scsi scsi_buf ;
2009-08-18 15:43:07 +02:00
} ;
2009-08-18 15:43:09 +02:00
static inline
2010-12-02 15:16:14 +01:00
void zfcp_dbf_hba_fsf_resp ( char * tag , int level , struct zfcp_fsf_req * req )
2009-08-18 15:43:09 +02:00
{
2010-12-02 15:16:14 +01:00
if ( level < = req - > adapter - > dbf - > hba - > level )
zfcp_dbf_hba_fsf_res ( tag , req ) ;
2009-08-18 15:43:09 +02:00
}
/**
2009-08-18 15:43:21 +02:00
* zfcp_dbf_hba_fsf_response - trace event for request completion
2010-12-02 15:16:15 +01:00
* @ req : request that has been completed
2009-08-18 15:43:09 +02:00
*/
2010-12-02 15:16:14 +01:00
static inline
void zfcp_dbf_hba_fsf_response ( struct zfcp_fsf_req * req )
2009-08-18 15:43:09 +02:00
{
struct fsf_qtcb * qtcb = req - > qtcb ;
if ( ( qtcb - > prefix . prot_status ! = FSF_PROT_GOOD ) & &
( qtcb - > prefix . prot_status ! = FSF_PROT_FSF_STATUS_PRESENTED ) ) {
2010-12-02 15:16:14 +01:00
zfcp_dbf_hba_fsf_resp ( " fs_perr " , 1 , req ) ;
2009-08-18 15:43:09 +02:00
} else if ( qtcb - > header . fsf_status ! = FSF_GOOD ) {
2010-12-02 15:16:14 +01:00
zfcp_dbf_hba_fsf_resp ( " fs_ferr " , 1 , req ) ;
2009-08-18 15:43:09 +02:00
} else if ( ( req - > fsf_command = = FSF_QTCB_OPEN_PORT_WITH_DID ) | |
( req - > fsf_command = = FSF_QTCB_OPEN_LUN ) ) {
2010-12-02 15:16:14 +01:00
zfcp_dbf_hba_fsf_resp ( " fs_open " , 4 , req ) ;
2009-08-18 15:43:09 +02:00
} else if ( qtcb - > header . log_length ) {
2010-12-02 15:16:14 +01:00
zfcp_dbf_hba_fsf_resp ( " fs_qtcb " , 5 , req ) ;
2009-08-18 15:43:09 +02:00
} else {
2010-12-02 15:16:14 +01:00
zfcp_dbf_hba_fsf_resp ( " fs_norm " , 6 , req ) ;
2009-08-18 15:43:09 +02:00
}
}
2009-08-18 15:43:08 +02:00
static inline
2010-12-02 15:16:15 +01:00
void _zfcp_dbf_scsi ( char * tag , int level , struct scsi_cmnd * scmd ,
struct zfcp_fsf_req * req )
2009-08-18 15:43:08 +02:00
{
2010-12-02 15:16:15 +01:00
struct zfcp_adapter * adapter = ( struct zfcp_adapter * )
scmd - > device - > host - > hostdata [ 0 ] ;
if ( level < = adapter - > dbf - > scsi - > level )
zfcp_dbf_scsi ( tag , scmd , req ) ;
2009-08-18 15:43:08 +02:00
}
/**
2009-08-18 15:43:21 +02:00
* zfcp_dbf_scsi_result - trace event for SCSI command completion
2009-08-18 15:43:08 +02:00
* @ scmd : SCSI command pointer
2010-02-17 11:18:57 +01:00
* @ req : FSF request used to issue SCSI command
2009-08-18 15:43:08 +02:00
*/
static inline
2010-12-02 15:16:15 +01:00
void zfcp_dbf_scsi_result ( struct scsi_cmnd * scmd , struct zfcp_fsf_req * req )
2009-08-18 15:43:08 +02:00
{
2010-02-17 11:18:57 +01:00
if ( scmd - > result ! = 0 )
2010-12-02 15:16:15 +01:00
_zfcp_dbf_scsi ( " rsl_err " , 3 , scmd , req ) ;
2010-02-17 11:18:57 +01:00
else if ( scmd - > retries > 0 )
2010-12-02 15:16:15 +01:00
_zfcp_dbf_scsi ( " rsl_ret " , 4 , scmd , req ) ;
2010-02-17 11:18:57 +01:00
else
2010-12-02 15:16:15 +01:00
_zfcp_dbf_scsi ( " rsl_nor " , 6 , scmd , req ) ;
2010-02-17 11:18:57 +01:00
}
/**
* zfcp_dbf_scsi_fail_send - trace event for failure to send SCSI command
* @ scmd : SCSI command pointer
*/
static inline
2010-12-02 15:16:15 +01:00
void zfcp_dbf_scsi_fail_send ( struct scsi_cmnd * scmd )
2010-02-17 11:18:57 +01:00
{
2010-12-02 15:16:15 +01:00
_zfcp_dbf_scsi ( " rsl_fai " , 4 , scmd , NULL ) ;
2009-08-18 15:43:08 +02:00
}
/**
2009-08-18 15:43:21 +02:00
* zfcp_dbf_scsi_abort - trace event for SCSI command abort
2009-08-18 15:43:08 +02:00
* @ tag : tag indicating success or failure of abort operation
* @ scmd : SCSI command to be aborted
2010-12-02 15:16:15 +01:00
* @ fsf_req : request containing abort ( might be NULL )
2009-08-18 15:43:08 +02:00
*/
static inline
2010-12-02 15:16:15 +01:00
void zfcp_dbf_scsi_abort ( char * tag , struct scsi_cmnd * scmd ,
struct zfcp_fsf_req * fsf_req )
2009-08-18 15:43:08 +02:00
{
2010-12-02 15:16:15 +01:00
_zfcp_dbf_scsi ( tag , 1 , scmd , fsf_req ) ;
2009-08-18 15:43:08 +02:00
}
/**
2009-08-18 15:43:21 +02:00
* zfcp_dbf_scsi_devreset - trace event for Logical Unit or Target Reset
2009-08-18 15:43:08 +02:00
* @ tag : tag indicating success or failure of reset operation
2010-09-08 14:39:55 +02:00
* @ scmnd : SCSI command which caused this error recovery
2009-08-18 15:43:08 +02:00
* @ flag : indicates type of reset ( Target Reset , Logical Unit Reset )
*/
static inline
2010-12-02 15:16:15 +01:00
void zfcp_dbf_scsi_devreset ( char * tag , struct scsi_cmnd * scmnd , u8 flag )
2009-08-18 15:43:08 +02:00
{
2010-12-02 15:16:15 +01:00
char tmp_tag [ ZFCP_DBF_TAG_LEN ] ;
if ( flag = = FCP_TMF_TGT_RESET )
memcpy ( tmp_tag , " tr_ " , 3 ) ;
else
memcpy ( tmp_tag , " lr_ " , 3 ) ;
2010-09-08 14:39:55 +02:00
2010-12-02 15:16:15 +01:00
memcpy ( & tmp_tag [ 3 ] , tag , 4 ) ;
_zfcp_dbf_scsi ( tmp_tag , 1 , scmnd , NULL ) ;
2009-08-18 15:43:08 +02:00
}
2008-03-31 11:15:28 +02:00
# endif /* ZFCP_DBF_H */