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