1/**
2 *
3 * TODO: description
4 *
5 * This file is a part of USB SCSI CAM for Haiku.
6 * May be used under terms of the MIT License
7 *
8 * Author(s):
9 * 	Siarzhuk Zharski <imker@gmx.li>
10 *
11 *
12 */
13/** tracing support definitions */
14
15#ifndef _USB_SCSI_TRACING_H_
16	#define _USB_SCSI_TRACING_H_
17
18#ifndef _SG_BUFFER_H_
19	#include "sg_buffer.h"
20#endif /*_SG_BUFFER_H_*/
21
22void load_log_settings(void *sh);
23void create_log(void);
24void usb_scsi_trace(bool b_force, const char *fmt, ...);
25
26/* non-switchable tracng functions */
27void usb_scsi_trace_bytes(const char *prefix, const uint8 *bytes, size_t bytes_len);
28void usb_scsi_trace_sgb(const char *prefix, sg_buffer *sgb);
29void usb_scsi_trace_CCB_HEADER(const CCB_HEADER *ccb);
30void usb_scsi_trace_CCB_SCSIIO(const CCB_SCSIIO *ccbio);
31
32/* ---------------------- Generic tracing --------------------------------------- */
33/**
34	\define:TRACE_ALWAYS
35	trace always - used mainly for error messages
36*/
37#define TRACE_ALWAYS(x...) \
38		usb_scsi_trace(true, x)
39/**
40	\define:TRACE
41	trace only if logging is activated
42*/
43#define TRACE(x...) \
44		usb_scsi_trace(false, x)
45
46/* ---------------------- SCSI commands tracing -------------------------------- */
47extern bool b_log_scsi_cmd;
48void usb_scsi_trace_command(bool b_hlight, const uint8 *cmd, size_t cmdlen);
49/**
50	\define:TRACE_SCSI_COMMAND
51	trace SCSI command
52*/
53#define TRACE_SCSI_COMMAND(cmd, cmdlen)\
54		{ if(b_log_scsi_cmd) usb_scsi_trace_command(false, cmd, cmdlen); }
55/**
56	\define:TRACE_SCSI_COMMAND_HLIGHT
57	trace SCSI command and prefixes it with special sign. Used for tracing
58	commands internally converted by this module.
59*/
60#define TRACE_SCSI_COMMAND_HLIGHT(cmd, cmdlen)\
61		{ if(b_log_scsi_cmd) usb_scsi_trace_command(true, cmd, cmdlen); }
62
63/* ---------------------- USB callback tracing -------------------------------- */
64/**
65	\define:TRACE_BULK_CALLBACK
66	trace the bulk_callback procedures data and status flow.
67*/
68extern bool b_log_bulk_cb;
69#define TRACE_BULK_CALLBACK(stat, len)\
70		{ if(b_log_bulk_cb) TRACE("B_CB:status:%08x;length:%d\n", stat, len); }
71
72/* --------------- USB mass storage commands tracing --------------------------- */
73extern bool b_log_protocol;
74/* --------------------------- data i/o tracing -------------------------------- */
75extern bool b_log_data_processing;
76void usb_scsi_trace_SG(iovec *sg, int count);
77/**
78	\define:TRACE_DATA_IO
79	trace the information about amount processed data and status of process.
80*/
81#define TRACE_DATA_IO(x...)\
82		{ if(b_log_data_processing) usb_scsi_trace(false, x); }
83#define TRACE_DATA_IO_SG(sg, cnt)\
84		{ if(b_log_data_processing) usb_scsi_trace_SG(sg, cnt); }
85
86extern bool b_log_sense_data;
87/**
88	\define:TRACE_SENSE_DATA
89	trace the information REQUEST SENSE data.
90*/
91#define TRACE_SENSE_DATA(data, len)\
92		{ if(b_log_sense_data) usb_scsi_trace_bytes("SENSE:", data, len); }
93#define TRACE_MODE_SENSE_DATA(prefix, data, len)\
94		{ if(b_log_sense_data) usb_scsi_trace_bytes(prefix, data, len); }
95#define TRACE_MODE_SENSE_SGB(prefix, data)\
96		{ if(b_log_sense_data) usb_scsi_trace_sgb(prefix, data); }
97
98extern bool b_log_capacity;
99#define TRACE_CAPACITY(prefix, data)\
100		{ if(b_log_capacity) usb_scsi_trace_sgb(prefix, data); }
101
102#endif /*_USB_SCSI_TRACING_H_*/
103
104