#ifndef _USB_SCSI_TRACING_H_
#define _USB_SCSI_TRACING_H_
#ifndef _SG_BUFFER_H_
#include "sg_buffer.h"
#endif
void load_log_settings(void *sh);
void create_log(void);
void usb_scsi_trace(bool b_force, const char *fmt, ...);
void usb_scsi_trace_bytes(const char *prefix, const uint8 *bytes, size_t bytes_len);
void usb_scsi_trace_sgb(const char *prefix, sg_buffer *sgb);
void usb_scsi_trace_CCB_HEADER(const CCB_HEADER *ccb);
void usb_scsi_trace_CCB_SCSIIO(const CCB_SCSIIO *ccbio);
#define TRACE_ALWAYS(x...) \
usb_scsi_trace(true, x)
#define TRACE(x...) \
usb_scsi_trace(false, x)
extern bool b_log_scsi_cmd;
void usb_scsi_trace_command(bool b_hlight, const uint8 *cmd, size_t cmdlen);
#define TRACE_SCSI_COMMAND(cmd, cmdlen)\
{ if(b_log_scsi_cmd) usb_scsi_trace_command(false, cmd, cmdlen); }
#define TRACE_SCSI_COMMAND_HLIGHT(cmd, cmdlen)\
{ if(b_log_scsi_cmd) usb_scsi_trace_command(true, cmd, cmdlen); }
extern bool b_log_bulk_cb;
#define TRACE_BULK_CALLBACK(stat, len)\
{ if(b_log_bulk_cb) TRACE("B_CB:status:%08x;length:%d\n", stat, len); }
extern bool b_log_protocol;
extern bool b_log_data_processing;
void usb_scsi_trace_SG(iovec *sg, int count);
#define TRACE_DATA_IO(x...)\
{ if(b_log_data_processing) usb_scsi_trace(false, x); }
#define TRACE_DATA_IO_SG(sg, cnt)\
{ if(b_log_data_processing) usb_scsi_trace_SG(sg, cnt); }
extern bool b_log_sense_data;
#define TRACE_SENSE_DATA(data, len)\
{ if(b_log_sense_data) usb_scsi_trace_bytes("SENSE:", data, len); }
#define TRACE_MODE_SENSE_DATA(prefix, data, len)\
{ if(b_log_sense_data) usb_scsi_trace_bytes(prefix, data, len); }
#define TRACE_MODE_SENSE_SGB(prefix, data)\
{ if(b_log_sense_data) usb_scsi_trace_sgb(prefix, data); }
extern bool b_log_capacity;
#define TRACE_CAPACITY(prefix, data)\
{ if(b_log_capacity) usb_scsi_trace_sgb(prefix, data); }
#endif