- fixed warnings, produced by Haiku version of gcc;

- space-based indentations replaced with tab-based ones;
 - a bit of cleanup;


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18784 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
imker
2006-09-08 19:44:19 +00:00
parent 9bb1a5cd57
commit 65482713f4
4 changed files with 583 additions and 553 deletions
@@ -1,57 +1,65 @@
/*
* Copyright (c) 2003-2005 by Siarzhuk Zharski <[email protected]>
* Distributed under the terms of the BSD License.
/**
*
* TODO: description
*
* This file is a part of USB SCSI CAM for Haiku OS.
* May be used under terms of the MIT License
*
* Author(s):
* Siarzhuk Zharski <[email protected]>
*
*
*/
#ifndef _DEVICE_INFO_H_
#define _DEVICE_INFO_H_
#define _DEVICE_INFO_H_
#ifndef _SCSI_COMMANDS_H_
#include "scsi_commands.h"
#include "scsi_commands.h"
#endif /*_SCSI_COMMANDS_H_*/
#ifndef _PROTO_MODULE_H_
#include "proto_module.h"
#include "proto_module.h"
#endif /* _PROTO_MODULE_H_ */
typedef struct _usb_device_info{
uint8 dev_num; /**/
const usb_device device; /**/
uint16 interface; /**/
uint8 max_lun; /**/
uint32 properties;
usb_pipe pipe_in; /**/
usb_pipe pipe_out; /**/
usb_pipe pipe_intr; /**/
sem_id lock_sem; /**/
sem_id trans_sem; /**/
uint32 tag; /**/
status_t status; /**/
bigtime_t trans_timeout;
usb_module_info *usb_m;
void *data; /**/
int actual_len; /**/
protocol_module_info *protocol_m;
char *protocol_m_path;
transform_module_info *transform_m;
char *transform_m_path;
bool b_trace;
void (*trace)(bool b_force, const char *fmt, ...);
void (*trace_bytes)(const char *prefix, const uint8 *bytes, size_t bytes_len);
uint8 dev_num; /**/
const usb_device device; /**/
uint16 interface; /**/
uint8 max_lun; /**/
uint32 properties;
usb_pipe pipe_in; /**/
usb_pipe pipe_out; /**/
usb_pipe pipe_intr; /**/
sem_id lock_sem; /**/
sem_id trans_sem; /**/
uint32 tag; /**/
status_t status; /**/
bigtime_t trans_timeout;
usb_module_info *usb_m;
void *data; /**/
int actual_len; /**/
protocol_module_info *protocol_m;
char *protocol_m_path;
transform_module_info *transform_m;
char *transform_m_path;
bool b_trace;
void (*trace)(bool b_force, const char *fmt, ...);
void (*trace_bytes)(const char *prefix, const uint8 *bytes, size_t bytes_len);
uint8 scsi_command_buf[IOCDBLEN];
/* auto sense buffer. Some commands doesn't have it. emulate */
scsi_sense_data autosense_data;
/* iovec autosense_sg; DO NOT RESTORE IT !!!*/
uint8 not_ready_luns;
uint8 scsi_command_buf[IOCDBLEN];
/* auto sense buffer. Some commands doesn't have it. emulate */
scsi_sense_data autosense_data;
/* iovec autosense_sg; DO NOT RESTORE IT !!!*/
uint8 not_ready_luns;
} usb_device_info;
#endif /* _DEVICE_INFO_H_ */
#endif /* _DEVICE_INFO_H_ */
+237 -230
View File
@@ -1,13 +1,19 @@
/*
* Copyright (c) 2003-2005 by Siarzhuk Zharski <[email protected]>
* Distributed under the terms of the BSD License.
/**
*
* TODO: description
*
* This file is a part of USB SCSI CAM for Haiku OS.
* May be used under terms of the MIT License
*
* Author(s):
* Siarzhuk Zharski <[email protected]>
*
*
*/
/** definitions for SCSI commands, structures etc. */
#ifndef _SCSI_COMMANDS_H_
#define _SCSI_COMMANDS_H_
#define _SCSI_COMMANDS_H_
/* References:
* http://www.t10.org/ftp/t10/drafts/rbc/rbc-r10a.pdf
@@ -22,297 +28,298 @@
#define CAM_DIR_MASK (CAM_DIR_IN | CAM_DIR_OUT | CAM_DIR_NONE )
/* SCSI status defines */
#define SCSI_STATUS_OK 0x00
#define SCSI_STATUS_CHECK_CONDITION 0x02
#define SCSI_STATUS_OK 0x00
#define SCSI_STATUS_CHECK_CONDITION 0x02
/* SCSI command opcodes */
#define READ_6 0x08
#define WRITE_6 0x0a
#define READ_10 0x28
#define WRITE_10 0x2a
#define MODE_SELECT_6 0x15
#define MODE_SENSE_6 0x1a
#define MODE_SELECT_10 0x55
#define MODE_SENSE_10 0x5a
#define READ_CAPACITY 0x25
#define TEST_UNIT_READY 0x00
#define START_STOP_UNIT 0x1b
#define READ_6 0x08
#define WRITE_6 0x0a
#define READ_10 0x28
#define WRITE_10 0x2a
#define MODE_SELECT_6 0x15
#define MODE_SENSE_6 0x1a
#define MODE_SELECT_10 0x55
#define MODE_SENSE_10 0x5a
#define READ_CAPACITY 0x25
#define TEST_UNIT_READY 0x00
#define START_STOP_UNIT 0x1b
/* come from UFI specs */
#define FORMAT_UNIT 0x04
#define INQUIRY 0x12
/*#define START_STOP_UNIT 0x1b
#define MODE_SELECT 0x55
#define MODE_SENSE 0x5a */
#define FORMAT_UNIT 0x04
#define INQUIRY 0x12
/*#define START_STOP_UNIT 0x1b
#define MODE_SELECT 0x55
#define MODE_SENSE 0x5a */
#define PREVENT_ALLOW_MEDIA_REMOVAL 0x1e
#define READ_10 0x28
#define READ_12 0xa8
/*#define READ_CAPACITY 0x25*/
#define READ_FORMAT_CAPACITY 0x23
#define REQUEST_SENSE 0x03
#define REZERO_UNIT 0x01
#define SEEK_10 0x2b
#define SEND_DIAGNOSTICS 0x1d
/*#define TEST_UNIT_READY 0x00*/
#define VERIFY 0x2f
#define WRITE_10 0x2a
#define WRITE_12 0xaa
#define WRITE_AND_VERIFY 0x2e
#define READ_10 0x28
#define READ_12 0xa8
/*#define READ_CAPACITY 0x25*/
#define READ_FORMAT_CAPACITY 0x23
#define REQUEST_SENSE 0x03
#define REZERO_UNIT 0x01
#define SEEK_10 0x2b
#define SEND_DIAGNOSTICS 0x1d
/*#define TEST_UNIT_READY 0x00*/
#define VERIFY 0x2f
#define WRITE_10 0x2a
#define WRITE_12 0xaa
#define WRITE_AND_VERIFY 0x2e
/* end of UFI commands*/
/* come from ATAPI specs*/
/*#define FORMAT_UNIT 0x04
#define INQUIRY 0x12
#define MODE_SELECT 0x55
#define MODE_SENSE 0x5a
#define PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
#define READ_10 0x28
#define READ_12 0xa8
/*#define FORMAT_UNIT 0x04
#define INQUIRY 0x12
#define MODE_SELECT 0x55
#define MODE_SENSE 0x5a
#define PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
#define READ_10 0x28
#define READ_12 0xa8
#define READ_CAPACITY 0x25
#define READ_FORMAT_CAPACITIES 0x23
#define READ_FORMAT_CAPACITIES 0x23
#define REQUEST_SENSE 0x03
#define SEEK 0x2b
#define START_STOP_UNIT 0x1b
#define TEST_UNIT_READY 0x00
#define VERIFY 0x2f
#define WRITE_10 0x2a
#define WRITE_12 0xaa
#define SEEK 0x2b
#define START_STOP_UNIT 0x1b
#define TEST_UNIT_READY 0x00
#define VERIFY 0x2f
#define WRITE_10 0x2a
#define WRITE_12 0xaa
#define WRITE_AND_VEIRIFY 0x2e */
#define PAUSE_RESUME 0x4b
#define PLAY_AUDIO 0x45
#define PLAY_AUDIO_MSF 0x47
#define REWIND 0x01
#define PLAY_AUDIO_TRACK 0x48
#define PAUSE_RESUME 0x4b
#define PLAY_AUDIO 0x45
#define PLAY_AUDIO_MSF 0x47
#define REWIND 0x01
#define PLAY_AUDIO_TRACK 0x48
/* end of ATAPI commands*/
/* come from MMC2 specs */
#define READ_BUFFER 0x3c
#define READ_SUBCHANNEL 0x42
#define READ_TOC 0x43
#define READ_HEADER 0x44
#define READ_DISK_INFO 0x51
#define READ_TRACK_INFO 0x52
#define SEND_OPC 0x54
#define READ_MASTER_CUE 0x59
#define CLOSE_TR_SESSION 0x5b
#define READ_BUFFER_CAP 0x5c
#define SEND_CUE_SHEET 0x5d
#define BLANK 0xa1
#define EXCHANGE_MEDIUM 0xa6
#define READ_DVD_STRUCTURE 0xad
#define DVD_REPORT_KEY 0xa4
#define DVD_SEND_KEY 0xa3
#define SET_CD_SPEED 0xbb
#define GET_CONFIGURATION 0x46
#define READ_BUFFER 0x3c
#define READ_SUBCHANNEL 0x42
#define READ_TOC 0x43
#define READ_HEADER 0x44
#define READ_DISK_INFO 0x51
#define READ_TRACK_INFO 0x52
#define SEND_OPC 0x54
#define READ_MASTER_CUE 0x59
#define CLOSE_TR_SESSION 0x5b
#define READ_BUFFER_CAP 0x5c
#define SEND_CUE_SHEET 0x5d
#define BLANK 0xa1
#define EXCHANGE_MEDIUM 0xa6
#define READ_DVD_STRUCTURE 0xad
#define DVD_REPORT_KEY 0xa4
#define DVD_SEND_KEY 0xa3
#define SET_CD_SPEED 0xbb
#define GET_CONFIGURATION 0x46
/* end of MMC2 specs */
/* come from RBC specs */
/*#define FORMAT_UNIT 0x04
#define INQUIRY 0x12
#define MODE_SELECT_6 0x15
#define MODE_SENSE_6 0x1a*/
#define PERSISTENT_RESERVE_IN 0x5e
#define PERSISTENT_RESERVE_OUT 0x5f
/*#define PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
#define READ_10 0x28
#define READ_CAPACITY 0x25*/
#define RELEASE_6 0x17
/*#define REQUEST_SENSE 0x03*/
#define RESERVE_6 0x16
/*#define START_STOP_UNIT 0x1b*/
#define SYNCHRONIZE_CACHE 0x35
/*#define TEST_UNIT_READY 0x00
#define VERIFY_10 0x2f
#define WRITE_10 0x2a*/
#define WRITE_BUFFER 0x3b
/*#define FORMAT_UNIT 0x04
#define INQUIRY 0x12
#define MODE_SELECT_6 0x15
#define MODE_SENSE_6 0x1a*/
#define PERSISTENT_RESERVE_IN 0x5e
#define PERSISTENT_RESERVE_OUT 0x5f
/*#define PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
#define READ_10 0x28
#define READ_CAPACITY 0x25*/
#define RELEASE_6 0x17
/*#define REQUEST_SENSE 0x03*/
#define RESERVE_6 0x16
/*#define START_STOP_UNIT 0x1b*/
#define SYNCHRONIZE_CACHE 0x35
/*#define TEST_UNIT_READY 0x00
#define VERIFY_10 0x2f
#define WRITE_10 0x2a*/
#define WRITE_BUFFER 0x3b
/* end of RBC commands */
/* come from QIC-157 specvs */
#define ERASE 0x19
/*#define INQUIRY 0x12*/
#define LOAD_UNLOAD 0x1b
#define LOCATE 0x2b
#define LOG_SELECT 0x4c
#define LOG_SENSE 0x4d
/*#define MODE_SELECT 0x15
#define MODE_SENSE 0x1a
#define READ 0x08*/
#define READ_POSITION 0x34
/*#define REQUEST_SENSE 0x03*/
#define REWIND 0x01
#define SPACE 0x11
#define ERASE 0x19
/*#define INQUIRY 0x12*/
#define LOAD_UNLOAD 0x1b
#define LOCATE 0x2b
#define LOG_SELECT 0x4c
#define LOG_SENSE 0x4d
/*#define MODE_SELECT 0x15
#define MODE_SENSE 0x1a
#define READ 0x08*/
#define READ_POSITION 0x34
/*#define REQUEST_SENSE 0x03*/
#define REWIND 0x01
#define SPACE 0x11
/*#define TEST_UNIT_READY 0x00
#define WRITE 0x0a*/
#define WRITE_FILEMARK 0x10
#define WRITE 0x0a*/
#define WRITE_FILEMARK 0x10
/* end of QIC-157 */
/* SCSI commands layout*/
/* generic commands layout*/
typedef struct{
uint8 opcode;
uint8 bytes[11];
uint8 opcode;
uint8 bytes[11];
}scsi_cmd_generic;
/* six-bytes command*/
typedef struct{
uint8 opcode;
uint8 addr[3];
#define CMD_GEN_6_ADDR 0x1f /* mask used for addr field*/
#define CMD_LUN 0xE0 /* mask used for LUN */
#define CMD_LUN_SHIFT 0x05 /* shift for LUN */
uint8 len;
uint8 ctrl;
uint8 opcode;
uint8 addr[3];
#define CMD_GEN_6_ADDR 0x1f /* mask used for addr field*/
#define CMD_LUN 0xE0 /* mask used for LUN */
#define CMD_LUN_SHIFT 0x05 /* shift for LUN */
uint8 len;
uint8 ctrl;
}scsi_cmd_generic_6;
/* ten-bytes command*/
typedef struct{
uint8 opcode;
uint8 byte2;
uint8 addr[4];
uint8 reserved;
uint8 len[2];
uint8 ctrl;
uint8 opcode;
uint8 byte2;
uint8 addr[4];
uint8 reserved;
uint8 len[2];
uint8 ctrl;
}scsi_cmd_generic_10;
/* twelve-bytes command*/
typedef struct{
uint8 opcode;
uint8 byte2;
uint8 addr[4];
uint8 len[4];
uint8 reserved;
uint8 ctrl;
uint8 opcode;
uint8 byte2;
uint8 addr[4];
uint8 len[4];
uint8 reserved;
uint8 ctrl;
}scsi_cmd_generic_12;
/* READ_6 / WRITE_6 */
typedef scsi_cmd_generic_6 scsi_cmd_rw_6;
/* READ_10 / WRITE_10 */
typedef struct{
uint8 opcode;
uint8 byte2;
#define CMD_RW_10_RELADDR 0x01
#define CMD_RW_10_FUA 0x08
#define CMD_RW_10_DPO 0x10
uint8 addr[4];
uint8 reserved;
uint8 len[2];
uint8 ctrl;
uint8 opcode;
uint8 byte2;
#define CMD_RW_10_RELADDR 0x01
#define CMD_RW_10_FUA 0x08
#define CMD_RW_10_DPO 0x10
uint8 addr[4];
uint8 reserved;
uint8 len[2];
uint8 ctrl;
}scsi_cmd_rw_10;
/* MODE_SELECT_6 */
typedef struct{
uint8 opcode;
uint8 byte2;
#define CMD_MSEL_6_SP 0x01
#define CMD_MSEL_6_PF 0x10
uint8 reserved[2];
uint8 len;
uint8 ctrl;
uint8 opcode;
uint8 byte2;
#define CMD_MSEL_6_SP 0x01
#define CMD_MSEL_6_PF 0x10
uint8 reserved[2];
uint8 len;
uint8 ctrl;
}scsi_cmd_mode_select_6;
/* MODE_SELECT_10 */
typedef struct{
uint8 opcode;
uint8 byte2;
#define CMD_MSEL_10_SP 0x01
#define CMD_MSEL_10_PF 0x10
uint8 reserved[5];
uint8 len[2];
uint8 ctrl;
uint8 opcode;
uint8 byte2;
#define CMD_MSEL_10_SP 0x01
#define CMD_MSEL_10_PF 0x10
uint8 reserved[5];
uint8 len[2];
uint8 ctrl;
}scsi_cmd_mode_select_10;
/* MODE_SENSE_6 */
typedef struct{
uint8 opcode;
uint8 byte2;
#define CMD_MSENSE_6_DBD 0x08
uint8 byte3;
#define CMD_MSENSE_6_PC 0x0c
uint8 reserved;
uint8 len;
uint8 ctrl;
uint8 opcode;
uint8 byte2;
#define CMD_MSENSE_6_DBD 0x08
uint8 byte3;
#define CMD_MSENSE_6_PC 0x0c
uint8 reserved;
uint8 len;
uint8 ctrl;
}scsi_cmd_mode_sense_6;
typedef struct{
uint8 mode_data_len;
uint8 medium_type;
uint8 device_spec_params;
uint8 block_descr_len;
uint8 mode_data_len;
uint8 medium_type;
uint8 device_spec_params;
uint8 block_descr_len;
}scsi_mode_param_header_6;
/* MODE_SENSE_10 */
typedef struct{
uint8 opcode;
uint8 byte2;
#define CMD_MSENSE_10_DBD 0x08
uint8 byte3;
#define CMD_MSENSE_10_PC 0x0c
uint8 reserved[4];
uint8 len[2];
uint8 ctrl;
uint8 opcode;
uint8 byte2;
#define CMD_MSENSE_10_DBD 0x08
uint8 byte3;
#define CMD_MSENSE_10_PC 0x0c
uint8 reserved[4];
uint8 len[2];
uint8 ctrl;
}scsi_cmd_mode_sense_10;
typedef struct{
uint8 mode_data_len[2];
uint8 medium_type;
uint8 device_spec_params;
uint8 reserved1;
uint8 reserved2;
uint8 block_descr_len[2];
uint8 mode_data_len[2];
uint8 medium_type;
uint8 device_spec_params;
uint8 reserved1;
uint8 reserved2;
uint8 block_descr_len[2];
}scsi_mode_param_header_10;
/* TEST_UNIT_READY */
typedef struct{
uint8 opcode;
uint8 byte2;
uint8 reserved[3];
uint8 ctrl;
uint8 opcode;
uint8 byte2;
uint8 reserved[3];
uint8 ctrl;
}scsi_cmd_test_unit_ready;
/* START_STOP_UNIT */
typedef struct{
uint8 opcode;
uint8 byte2;
#define CMD_SSU_IMMED 0x01
uint8 reserved[2];
uint8 start_loej;
#define CMD_SSU_LOEJ 0x02
#define CMD_SSU_START 0x01
uint8 ctrl;
uint8 opcode;
uint8 byte2;
#define CMD_SSU_IMMED 0x01
uint8 reserved[2];
uint8 start_loej;
#define CMD_SSU_LOEJ 0x02
#define CMD_SSU_START 0x01
uint8 ctrl;
}scsi_cmd_start_stop_unit;
/* SCSI REQUEST SENSE data. See 8.2.14*/
typedef struct _scsi_sense_data{
uint8 error_code;
#define SSD_ERRCODE 0x7F
#define SSD_CURRENT_ERROR 0x70
#define SSD_DEFERRED_ERROR 0x71
#define SSD_ERRCODE_VALID 0x80
uint8 segment;
uint8 flags;
#define SSD_KEY 0x0F
#define SSD_KEY_NO_SENSE 0x00
#define SSD_KEY_RECOVERED_ERROR 0x01
#define SSD_KEY_NOT_READY 0x02
#define SSD_KEY_MEDIUM_ERROR 0x03
#define SSD_KEY_HARDWARE_ERROR 0x04
#define SSD_KEY_ILLEGAL_REQUEST 0x05
#define SSD_KEY_UNIT_ATTENTION 0x06
#define SSD_KEY_DATA_PROTECT 0x07
#define SSD_KEY_BLANK_CHECK 0x08
#define SSD_KEY_Vendor_Specific 0x09
#define SSD_KEY_COPY_ABORTED 0x0a
#define SSD_KEY_ABORTED_COMMAND 0x0b
#define SSD_KEY_EQUAL 0x0c
#define SSD_KEY_VOLUME_OVERFLOW 0x0d
#define SSD_KEY_MISCOMPARE 0x0e
#define SSD_KEY_RESERVED 0x0f
#define SSD_ILI 0x20
#define SSD_EOM 0x40
#define SSD_FILEMARK 0x80
uint8 info[4];
uint8 extra_len;
uint8 cmd_spec_info[4];
uint8 add_sense_code;
uint8 add_sense_code_qual;
uint8 fru;
uint8 sense_key_spec[3];
#define SSD_SCS_VALID 0x80
#define SSD_FIELDPTR_CMD 0x40
#define SSD_BITPTR_VALID 0x08
#define SSD_BITPTR_VALUE 0x07
#define SSD_MIN_SIZE 18
uint8 extra_bytes[14];
uint8 error_code;
#define SSD_ERRCODE 0x7F
#define SSD_CURRENT_ERROR 0x70
#define SSD_DEFERRED_ERROR 0x71
#define SSD_ERRCODE_VALID 0x80
uint8 segment;
uint8 flags;
#define SSD_KEY 0x0F
#define SSD_KEY_NO_SENSE 0x00
#define SSD_KEY_RECOVERED_ERROR 0x01
#define SSD_KEY_NOT_READY 0x02
#define SSD_KEY_MEDIUM_ERROR 0x03
#define SSD_KEY_HARDWARE_ERROR 0x04
#define SSD_KEY_ILLEGAL_REQUEST 0x05
#define SSD_KEY_UNIT_ATTENTION 0x06
#define SSD_KEY_DATA_PROTECT 0x07
#define SSD_KEY_BLANK_CHECK 0x08
#define SSD_KEY_Vendor_Specific 0x09
#define SSD_KEY_COPY_ABORTED 0x0a
#define SSD_KEY_ABORTED_COMMAND 0x0b
#define SSD_KEY_EQUAL 0x0c
#define SSD_KEY_VOLUME_OVERFLOW 0x0d
#define SSD_KEY_MISCOMPARE 0x0e
#define SSD_KEY_RESERVED 0x0f
#define SSD_ILI 0x20
#define SSD_EOM 0x40
#define SSD_FILEMARK 0x80
uint8 info[4];
uint8 extra_len;
uint8 cmd_spec_info[4];
uint8 add_sense_code;
uint8 add_sense_code_qual;
uint8 fru;
uint8 sense_key_spec[3];
#define SSD_SCS_VALID 0x80
#define SSD_FIELDPTR_CMD 0x40
#define SSD_BITPTR_VALID 0x08
#define SSD_BITPTR_VALUE 0x07
#define SSD_MIN_SIZE 18
uint8 extra_bytes[14];
#define SSD_FULL_SIZE sizeof(struct _scsi_sense_data)
}scsi_sense_data;
#endif /*_SCSI_COMMANDS_H_*/
#endif /*_SCSI_COMMANDS_H_*/
+254 -246
View File
@@ -1,9 +1,15 @@
/*
* Copyright (c) 2003-2005 by Siarzhuk Zharski <[email protected]>
* Distributed under the terms of the BSD License.
/**
*
* TODO: description
*
* This file is a part of USB SCSI CAM for Haiku OS.
* May be used under terms of the MIT License
*
* Author(s):
* Siarzhuk Zharski <[email protected]>
*
*
*/
/** tracing support implementation */
#include "usb_scsi.h"
@@ -18,32 +24,32 @@
/** private log path name */
static const char *private_log_path = "/var/log/"MODULE_NAME".log";
static const char *log_port_name = MODULE_NAME"-logging";
static const char *log_port_name = MODULE_NAME"-logging";
#ifdef BUILD_LOG_DAEMON
int main(int argc, char**argv)
{
if(B_NAME_NOT_FOUND == find_port(log_port_name)){
bool b_screen = (argc > 1);
port_id pid = create_port(1000, log_port_name);
while(true){
int32 code;
char buffer[1024 + 1];
size_t sz = read_port_etc(pid, &code, buffer, 1024, B_TIMEOUT, 1000 * 1000);
if(sz != B_TIMED_OUT){
if(b_screen){
buffer[sz] = 0;
printf(buffer);
} else {
FILE *f = fopen(private_log_path, "a");
fwrite(buffer, sz, 1, f);
fclose(f);
}
}
}
}
return 0;
if(B_NAME_NOT_FOUND == find_port(log_port_name)){
bool b_screen = (argc > 1);
port_id pid = create_port(1000, log_port_name);
while(true){
int32 code;
char buffer[1024 + 1];
size_t sz = read_port_etc(pid, &code, buffer, 1024, B_TIMEOUT, 1000 * 1000);
if(sz != B_TIMED_OUT){
if(b_screen){
buffer[sz] = 0;
printf(buffer);
} else {
FILE *f = fopen(private_log_path, "a");
fwrite(buffer, sz, 1, f);
fclose(f);
}
}
}
}
return 0;
}
#else /* BUILD_LOG_DAEMON */
@@ -55,23 +61,23 @@ bool b_log = true;
bool b_log = false;
#endif
/** logging in private file */
bool b_log_file = false;
bool b_log_file = false;
/** appending logs to previous log sessions */
bool b_log_append = false;
bool b_log_append = false;
/** log SCSI commands */
bool b_log_scsi_cmd = false;
/** log USB bulk callback function activity */
bool b_log_bulk_cb = false;
bool b_log_bulk_cb = false;
bool b_log_protocol = false;
//bool b_log_CSW = false;
//bool b_log_CDB = false;
bool b_log_data_processing = false;
bool b_log_sense_data = false;
bool b_log_sense_data = false;
/** log time at wich logging event occured */
static bool b_log_time = false;
static bool b_log_time = false;
/** log thread id from wich logging performed */
static bool b_log_thid = false;
static bool b_log_thid = false;
/** log thread name from wich logging performed */
static bool b_log_thname = false;
/** semaphore id used to synchronizing logging requests */
@@ -79,129 +85,130 @@ static bool b_log_thname = false;
/** log result of READ_CAPACITY command */
bool b_log_capacity = false;
/**
\fn: load_log_settings
\param sh: driver_settings handle
called from main driver settings loading procedure to load log-related
parameters
\fn: load_log_settings
\param sh: driver_settings handle
called from main driver settings loading procedure to load log-related
parameters
*/
void
load_log_settings(void *sh)
{
if(sh){
if(sh){
#if !DEBUG
b_log = get_driver_boolean_parameter(sh, "debug_output", b_log, true);
b_log = get_driver_boolean_parameter(sh, "debug_output", b_log, true);
#endif
b_log_file = get_driver_boolean_parameter(sh, "debug_output_in_file",
b_log_file, true);
b_log_append = ! get_driver_boolean_parameter(sh, "debug_output_file_rewrite",
!b_log_append, true);
b_log_time = get_driver_boolean_parameter(sh, "debug_trace_time",
b_log_time, false);
b_log_thid = get_driver_boolean_parameter(sh, "debug_trace_threadid",
b_log_thid, false);
b_log_thname = get_driver_boolean_parameter(sh, "debug_trace_thread_name",
b_log_thname, false);
b_log_scsi_cmd = get_driver_boolean_parameter(sh, "debug_trace_commands",
b_log_scsi_cmd, false);
b_log_bulk_cb = get_driver_boolean_parameter(sh, "debug_trace_bulk_callback",
b_log_bulk_cb, false);
b_log_protocol = get_driver_boolean_parameter(sh, "debug_trace_protocol",
b_log_protocol, false);
b_log_data_processing =
get_driver_boolean_parameter(sh, "debug_trace_data_io",
b_log_data_processing, false);
b_log_sense_data =
get_driver_boolean_parameter(sh, "debug_trace_sense_data",
b_log_sense_data, false);
b_log_capacity = get_driver_boolean_parameter(sh, "debug_trace_capacity",
b_log_capacity, false);
if(!b_log_file){ /* some information is already in system log entries */
b_log_thid = false;
b_log_thname = false;
}
}
b_log_file = get_driver_boolean_parameter(sh, "debug_output_in_file",
b_log_file, true);
b_log_append = ! get_driver_boolean_parameter(sh, "debug_output_file_rewrite",
!b_log_append, true);
b_log_time = get_driver_boolean_parameter(sh, "debug_trace_time",
b_log_time, false);
b_log_thid = get_driver_boolean_parameter(sh, "debug_trace_threadid",
b_log_thid, false);
b_log_thname = get_driver_boolean_parameter(sh, "debug_trace_thread_name",
b_log_thname, false);
b_log_scsi_cmd = get_driver_boolean_parameter(sh, "debug_trace_commands",
b_log_scsi_cmd, false);
b_log_bulk_cb = get_driver_boolean_parameter(sh, "debug_trace_bulk_callback",
b_log_bulk_cb, false);
b_log_protocol = get_driver_boolean_parameter(sh, "debug_trace_protocol",
b_log_protocol, false);
b_log_data_processing =
get_driver_boolean_parameter(sh, "debug_trace_data_io",
b_log_data_processing, false);
b_log_sense_data =
get_driver_boolean_parameter(sh, "debug_trace_sense_data",
b_log_sense_data, false);
b_log_capacity = get_driver_boolean_parameter(sh, "debug_trace_capacity",
b_log_capacity, false);
if(!b_log_file){ /* some information is already in system log entries */
b_log_thid = false;
b_log_thname = false;
}
}
}
/**
\fn: create_log
called to [re]create private log file
\fn: create_log
called to [re]create private log file
*/
void
create_log()
create_log(void)
{
int flags = O_WRONLY | O_CREAT | ((!b_log_append) ? O_TRUNC : 0);
if(b_log_file){
close(open(private_log_path, flags, 0666));
}
int flags = O_WRONLY | O_CREAT | ((!b_log_append) ? O_TRUNC : 0);
if(b_log_file){
close(open(private_log_path, flags, 0666));
}
}
/**
\fn: usb_scsi_trace
\param b_force: if true - output message ignoring current logging state
\param fmt: format string used in message formatting
\param ...: variable argument used in message formatting
formats and traces messages to current debug output target.
\fn: usb_scsi_trace
\param b_force: if true - output message ignoring current logging state
\param fmt: format string used in message formatting
\param ...: variable argument used in message formatting
formats and traces messages to current debug output target.
*/
void
usb_scsi_trace(bool b_force, const char *fmt, ...)
{
if(b_force || b_log){
va_list arg_list;
static char *prefix = "\33[35m"MODULE_NAME":\33[0m";
static char buf[1024];
char *buf_ptr = buf;
port_id pid = find_port(log_port_name);
bool b_no_port = (pid == B_NAME_NOT_FOUND);
if(!b_log_file || b_no_port){ /* it's not a good idea to add prefix in private file */
strcpy(buf, prefix);
buf_ptr += strlen(prefix);
}
if(b_log_time){ /* add time of logging this string */
bigtime_t time = system_time();
uint32 msec = time / 1000;
uint32 sec = msec / 1000;
sprintf(buf_ptr, "%02ld.%02ld.%03ld:", sec / 60, sec % 60, msec % 1000);
buf_ptr += strlen(buf_ptr);
}
if(b_log_thid){ /* add id of the calling thread */
thread_id tid = find_thread(0);
thread_info tinfo = {0};
if(b_log_thname){ /* add name of the calling thread */
get_thread_info(tid, &tinfo);
}
sprintf(buf_ptr, "['%s':%lx]:", tinfo.name, tid);
buf_ptr += strlen(buf_ptr);
}
va_start(arg_list, fmt);
vsprintf(buf_ptr, fmt, arg_list);
va_end(arg_list);
if(b_log_file && !b_no_port){ /* write in private log file */
if(B_OK != write_port_etc(pid, 0, buf, strlen(buf), B_TIMEOUT, 0))
dprintf(buf);
} else /* write in system log*/
dprintf(buf);
}
if(b_force || b_log){
va_list arg_list;
static char *prefix = "\33[35m"MODULE_NAME":\33[0m";
static char buf[1024];
char *buf_ptr = buf;
port_id pid = find_port(log_port_name);
bool b_no_port = (pid == B_NAME_NOT_FOUND);
if(!b_log_file || b_no_port){ /* it's not a good idea to add prefix in private file */
strcpy(buf, prefix);
buf_ptr += strlen(prefix);
}
if(b_log_time){ /* add time of logging this string */
bigtime_t time = system_time();
uint32 msec = time / 1000;
uint32 sec = msec / 1000;
sprintf(buf_ptr, "%02ld.%02ld.%03ld:", sec / 60, sec % 60, msec % 1000);
buf_ptr += strlen(buf_ptr);
}
if(b_log_thid){ /* add id of the calling thread */
thread_id tid = find_thread(0);
thread_info tinfo = {0};
if(b_log_thname){ /* add name of the calling thread */
get_thread_info(tid, &tinfo);
}
sprintf(buf_ptr, "['%s':%lx]:", tinfo.name, tid);
buf_ptr += strlen(buf_ptr);
}
va_start(arg_list, fmt);
vsprintf(buf_ptr, fmt, arg_list);
va_end(arg_list);
if(b_log_file && !b_no_port){ /* write in private log file */
if(B_OK != write_port_etc(pid, 0, buf, strlen(buf), B_TIMEOUT, 0))
dprintf(buf);
} else /* write in system log*/
dprintf(buf);
}
}
/**
\fn: trace_CCB_HEADER
\param ccbh: struct to be traced
traces CCB_HEADER struct to current debug output target
\fn: trace_CCB_HEADER
\param ccbh: struct to be traced
traces CCB_HEADER struct to current debug output target
*/
void
usb_scsi_trace_CCB_HEADER(const CCB_HEADER *ccbh)
{
TRACE("CCB_HEADER:%08x\n"
" phys_addr:%ld\n"
" cam_ccb_len:%d\n"
" cam_func_code:%02x\n"
" cam_status:%02x\n"
" cam_hrsvd0:%02x\n"
" cam_path_id:%02x\n"
" cam_target_id:%02x\n"
" cam_target_lun:%02x\n"
" cam_flags:%08x\n",
ccbh,
ccbh->phys_addr,
TRACE("CCB_HEADER:%08x\n"
" phys_addr:%ld\n"
" cam_ccb_len:%d\n"
" cam_func_code:%02x\n"
" cam_status:%02x\n"
" cam_hrsvd0:%02x\n"
" cam_path_id:%02x\n"
" cam_target_id:%02x\n"
" cam_target_lun:%02x\n"
" cam_flags:%08x\n",
ccbh,
ccbh->phys_addr,
ccbh->cam_ccb_len,
ccbh->cam_func_code,
ccbh->cam_status,
@@ -212,34 +219,34 @@ usb_scsi_trace_CCB_HEADER(const CCB_HEADER *ccbh)
ccbh->cam_flags);
}
/**
\fn: trace_CCB_SCSIIO
\param ccbio: struct to be traced
traces CCB_SCSIIO struct to current debug output target
\fn: trace_CCB_SCSIIO
\param ccbio: struct to be traced
traces CCB_SCSIIO struct to current debug output target
*/
void
usb_scsi_trace_CCB_SCSIIO(const CCB_SCSIIO *ccbio)
{
TRACE("CCB_SCSIIO:%08x\n", ccbio);
usb_scsi_trace_CCB_HEADER(&ccbio->cam_ch);
TRACE(" cam_pdrv_ptr:%08x\n"
" cam_next_ccb:%08x\n"
" cam_req_map:%08x\n"
" (*cam_cbfcnp):%08x\n"
" cam_data_ptr:%08x\n"
" cam_dxfer_len:%ld\n"
" cam_sense_ptr:%08x\n"
" cam_sense_len:%d\n"
" cam_cdb_len:%d\n"
" cam_sglist_cnt:%d\n"
" cam_sort:%d\n"
" cam_scsi_status:%02x\n"
" cam_sense_resid:%d\n"
" cam_resid:%d\n"
" cam_timeout:%d\n"
" cam_msg_ptr:%08x\n"
" cam_msgb_len:%d\n"
" cam_vu_flags:%04x\n"
" cam_tag_action:%d\n",
TRACE("CCB_SCSIIO:%08x\n", ccbio);
usb_scsi_trace_CCB_HEADER(&ccbio->cam_ch);
TRACE(" cam_pdrv_ptr:%08x\n"
" cam_next_ccb:%08x\n"
" cam_req_map:%08x\n"
" (*cam_cbfcnp):%08x\n"
" cam_data_ptr:%08x\n"
" cam_dxfer_len:%ld\n"
" cam_sense_ptr:%08x\n"
" cam_sense_len:%d\n"
" cam_cdb_len:%d\n"
" cam_sglist_cnt:%d\n"
" cam_sort:%d\n"
" cam_scsi_status:%02x\n"
" cam_sense_resid:%d\n"
" cam_resid:%d\n"
" cam_timeout:%d\n"
" cam_msg_ptr:%08x\n"
" cam_msgb_len:%d\n"
" cam_vu_flags:%04x\n"
" cam_tag_action:%d\n",
ccbio->cam_pdrv_ptr,
ccbio->cam_next_ccb,
ccbio->cam_req_map,
@@ -260,118 +267,119 @@ usb_scsi_trace_CCB_SCSIIO(const CCB_SCSIIO *ccbio)
ccbio->cam_vu_flags,
ccbio->cam_tag_action);
usb_scsi_trace_bytes("CDB_UN:\n", ccbio->cam_cdb_io.cam_cdb_bytes, IOCDBLEN);
usb_scsi_trace_bytes("CDB_UN:\n", ccbio->cam_cdb_io.cam_cdb_bytes, IOCDBLEN);
}
/**
\fn: usb_scsi_command_trace
\param b_hlight: highlight command and prefix it with spec. charachter
\param cmd: array of bytes to be traced. typically pointer SCSI command buffer
\param cmdlen: size of buffer in cmd parameter
traces SCSI commands into debug output target.can highlight and prefix the
text with special charachter and color for two different types
of commands.
\fn: usb_scsi_command_trace
\param b_hlight: highlight command and prefix it with spec. charachter
\param cmd: array of bytes to be traced. typically pointer SCSI command buffer
\param cmdlen: size of buffer in cmd parameter
traces SCSI commands into debug output target.can highlight and prefix the
text with special charachter and color for two different types
of commands.
*/
void
usb_scsi_trace_command(bool b_hlight, const uint8 *cmd, size_t cmdlen)
{
size_t len = min(cmdlen, 12); /* command length watchdog */
char hl_mask[] = "\33[%sCMD:\33[0m";
char prefix[sizeof(hl_mask) + 6];
if(b_log_file){ /* compose CMD prefix */
sprintf(prefix, "%sCMD:", b_hlight ? "=>":"");
} else {
sprintf(prefix, hl_mask, b_hlight ? "33m=>":"32m");
}
usb_scsi_trace_bytes(prefix, cmd, len); /* append command bytes to log */
size_t len = min(cmdlen, 12); /* command length watchdog */
char hl_mask[] = "\33[%sCMD:\33[0m";
char prefix[sizeof(hl_mask) + 6];
if(b_log_file){ /* compose CMD prefix */
sprintf(prefix, "%sCMD:", b_hlight ? "=>":"");
} else {
sprintf(prefix, hl_mask, b_hlight ? "33m=>":"32m");
}
usb_scsi_trace_bytes(prefix, cmd, len); /* append command bytes to log */
}
/**
\fn:usb_scsi_bytes_trace
\param bytes:array of bytes to be traced.
\param bytes_len: size of buffer in bytes parameter
traces buffer bytes one by one into debug output target.
\fn:usb_scsi_bytes_trace
\param bytes:array of bytes to be traced.
\param bytes_len: size of buffer in bytes parameter
traces buffer bytes one by one into debug output target.
*/
void
usb_scsi_trace_bytes(const char *prefix, const uint8 *bytes, size_t bytes_len)
{
size_t len = min(bytes_len, 0x100); /* length watchdog */
char truncTail[] = "<TRUNC>\n";
char *pbuf = (char *)malloc(len * 3 + sizeof(truncTail) + strlen(prefix) + 1);
if(pbuf){
size_t i = 0;
char *p = pbuf;
strcpy(p, prefix);
p += strlen(prefix);
for(;i < len; i++){
sprintf(p, " %02x", bytes[i]);
p += strlen(p);
}
/* user should be informed about truncation too*/
strcpy(p, (len < bytes_len) ? truncTail : "\n");
TRACE(pbuf);
free(pbuf);
} else {
TRACE_ALWAYS("usb_scsi_trace_bytes:error allocate "
"memory for tracing %d bytes\n", len);
}
size_t len = min(bytes_len, 0x100); /* length watchdog */
char truncTail[] = "<TRUNC>\n";
char *pbuf = (char *)malloc(len * 3 + sizeof(truncTail) + strlen(prefix) + 1);
if(pbuf){
size_t i = 0;
char *p = pbuf;
strcpy(p, prefix);
p += strlen(prefix);
for(;i < len; i++){
sprintf(p, " %02x", bytes[i]);
p += strlen(p);
}
/* user should be informed about truncation too*/
strcpy(p, (len < bytes_len) ? truncTail : "\n");
TRACE(pbuf);
free(pbuf);
} else {
TRACE_ALWAYS("usb_scsi_trace_bytes:error allocate "
"memory for tracing %d bytes\n", len);
}
}
void usb_scsi_trace_sgb(const char *prefix, sg_buffer *sgb)
{
char sgbHead[] = "SGB:";
size_t i = 0;
size_t len = strlen(prefix) + strlen(sgbHead) + sgb->count * 9;
char *sgbPrefix = (char*)malloc(len);
if(0 != sgbPrefix){
sg_buffer sgb_own;
size_t sgb_len = 0;
char *p = sgbPrefix;
strcpy(p, prefix);
p += strlen(p);
strcpy(p, sgbHead);
p += strlen(p);
i = 0;
for(; i < sgb->count; i++){
sprintf(p, "%lX,", sgb->piov[i].iov_len);
sgb_len += sgb->piov[i].iov_len;
p += strlen(p);
}
if(B_OK == realloc_sg_buffer(&sgb_own, sgb_len)){
sg_memcpy(&sgb_own, 0, sgb, 0, sgb_len);
/* assume non-fragmented memory */
usb_scsi_trace_bytes(sgbPrefix, sgb_own.piov->iov_base, sgb_own.piov->iov_len);
free_sg_buffer(&sgb_own);
} else {
TRACE_ALWAYS("usb_scsi_trace_sgb:error allocate sgb for %d bytes\n", sgb_len);
}
} else {
TRACE_ALWAYS("usb_scsi_trace_sgb:error allocate memory for %d bytes\n", len);
}
char sgbHead[] = "SGB:";
size_t i = 0;
size_t len = strlen(prefix) + strlen(sgbHead) + sgb->count * 9;
char *sgbPrefix = (char*)malloc(len);
if(0 != sgbPrefix){
sg_buffer sgb_own;
size_t sgb_len = 0;
char *p = sgbPrefix;
strcpy(p, prefix);
p += strlen(p);
strcpy(p, sgbHead);
p += strlen(p);
i = 0;
for(; i < sgb->count; i++){
sprintf(p, "%lX,", sgb->piov[i].iov_len);
sgb_len += sgb->piov[i].iov_len;
p += strlen(p);
}
if(B_OK == realloc_sg_buffer(&sgb_own, sgb_len)){
sg_memcpy(&sgb_own, 0, sgb, 0, sgb_len);
/* assume non-fragmented memory */
usb_scsi_trace_bytes(sgbPrefix, sgb_own.piov->iov_base, sgb_own.piov->iov_len);
free_sg_buffer(&sgb_own);
} else {
TRACE_ALWAYS("usb_scsi_trace_sgb:error allocate sgb for %d bytes\n", sgb_len);
}
} else {
TRACE_ALWAYS("usb_scsi_trace_sgb:error allocate memory for %d bytes\n", len);
}
}
void usb_scsi_trace_SG(iovec *sg, int count)
{
char sg_mask[] = "SG:{%s}\n";
char truncTail[] = "<TRUNC>";
size_t trunc_count = min(count, 0x20); /* length watchdog */
size_t len = sizeof(sg_mask) + sizeof(truncTail) + trunc_count * 16;
char *pbuf = (char *)malloc(len + 1);
if(pbuf){
int i = 0;
char *p = pbuf;
for(; i < trunc_count; i++){
sprintf(p, (!i) ? "%d" : ", %d", sg[i].iov_len);
p += strlen(p);
}
/* user should be informed about truncation too*/
if(trunc_count < count)
strcpy(p, truncTail);
TRACE(sg_mask, pbuf);
free(pbuf);
} else {
TRACE_ALWAYS("usb_scsi_trace_SG:error allocate "
"memory for tracing %d SG entries\n", trunc_count);
}
char sg_mask[] = "SG:{%s}\n";
char truncTail[] = "<TRUNC>";
size_t trunc_count = min(count, 0x20); /* length watchdog */
size_t len = sizeof(sg_mask) + sizeof(truncTail) + trunc_count * 16;
char *pbuf = (char *)malloc(len + 1);
if(pbuf){
int i = 0;
char *p = pbuf;
for(; i < trunc_count; i++){
sprintf(p, (!i) ? "%d" : ", %d", sg[i].iov_len);
p += strlen(p);
}
/* user should be informed about truncation too*/
if(trunc_count < count)
strcpy(p, truncTail);
TRACE(sg_mask, pbuf);
free(pbuf);
} else {
TRACE_ALWAYS("usb_scsi_trace_SG:error allocate "
"memory for tracing %d SG entries\n", trunc_count);
}
}
#endif /* BUILD_LOG_DAEMON */
+41 -34
View File
@@ -1,20 +1,26 @@
/*
* Copyright (c) 2003-2005 by Siarzhuk Zharski <[email protected]>
* Distributed under the terms of the BSD License.
/**
*
* TODO: description
*
* This file is a part of USB SCSI CAM for Haiku OS.
* May be used under terms of the MIT License
*
* Author(s):
* Siarzhuk Zharski <[email protected]>
*
*
*/
/** tracing support definitions */
#ifndef _USB_SCSI_TRACING_H_
#define _USB_SCSI_TRACING_H_
#define _USB_SCSI_TRACING_H_
#ifndef _SG_BUFFER_H_
#include "sg_buffer.h"
#include "sg_buffer.h"
#endif /*_SG_BUFFER_H_*/
void load_log_settings(void *sh);
void create_log();
void create_log(void);
void usb_scsi_trace(bool b_force, const char *fmt, ...);
/* non-switchable tracng functions */
@@ -25,43 +31,43 @@ void usb_scsi_trace_CCB_SCSIIO(const CCB_SCSIIO *ccbio);
/* ---------------------- Generic tracing --------------------------------------- */
/**
\define:TRACE_ALWAYS
trace always - used mainly for error messages
\define:TRACE_ALWAYS
trace always - used mainly for error messages
*/
#define TRACE_ALWAYS(x...) \
usb_scsi_trace(true, x)
usb_scsi_trace(true, x)
/**
\define:TRACE
trace only if logging is activated
\define:TRACE
trace only if logging is activated
*/
#define TRACE(x...) \
usb_scsi_trace(false, x)
usb_scsi_trace(false, x)
/* ---------------------- SCSI commands tracing -------------------------------- */
extern bool b_log_scsi_cmd;
void usb_scsi_trace_command(bool b_hlight, const uint8 *cmd, size_t cmdlen);
/**
\define:TRACE_SCSI_COMMAND
trace SCSI command
\define:TRACE_SCSI_COMMAND
trace SCSI command
*/
#define TRACE_SCSI_COMMAND(cmd, cmdlen)\
{ if(b_log_scsi_cmd) usb_scsi_trace_command(false, cmd, cmdlen); }
{ if(b_log_scsi_cmd) usb_scsi_trace_command(false, cmd, cmdlen); }
/**
\define:TRACE_SCSI_COMMAND_HLIGHT
trace SCSI command and prefixes it with special sign. Used for tracing
commands internally converted by this module.
\define:TRACE_SCSI_COMMAND_HLIGHT
trace SCSI command and prefixes it with special sign. Used for tracing
commands internally converted by this module.
*/
#define TRACE_SCSI_COMMAND_HLIGHT(cmd, cmdlen)\
{ if(b_log_scsi_cmd) usb_scsi_trace_command(true, cmd, cmdlen); }
{ if(b_log_scsi_cmd) usb_scsi_trace_command(true, cmd, cmdlen); }
/* ---------------------- USB callback tracing -------------------------------- */
/**
\define:TRACE_BULK_CALLBACK
trace the bulk_callback procedures data and status flow.
\define:TRACE_BULK_CALLBACK
trace the bulk_callback procedures data and status flow.
*/
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); }
{ if(b_log_bulk_cb) TRACE("B_CB:status:%08x;length:%d\n", stat, len); }
/* --------------- USB mass storage commands tracing --------------------------- */
extern bool b_log_protocol;
@@ -69,28 +75,29 @@ extern bool b_log_protocol;
extern bool b_log_data_processing;
void usb_scsi_trace_SG(iovec *sg, int count);
/**
\define:TRACE_DATA_IO
trace the information about amount processed data and status of process.
\define:TRACE_DATA_IO
trace the information about amount processed data and status of process.
*/
#define TRACE_DATA_IO(x...)\
{ if(b_log_data_processing) usb_scsi_trace(false, 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); }
{ if(b_log_data_processing) usb_scsi_trace_SG(sg, cnt); }
extern bool b_log_sense_data;
/**
\define:TRACE_SENSE_DATA
trace the information REQUEST SENSE data.
\define:TRACE_SENSE_DATA
trace the information REQUEST SENSE data.
*/
#define TRACE_SENSE_DATA(data, len)\
{ if(b_log_sense_data) usb_scsi_trace_bytes("SENSE:", 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); }
{ 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); }
{ 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); }
{ if(b_log_capacity) usb_scsi_trace_sgb(prefix, data); }
#endif /*_USB_SCSI_TRACING_H_*/