- 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:
@@ -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_ */
|
||||
|
||||
|
||||
@@ -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_*/
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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_*/
|
||||
|
||||
|
||||
Reference in New Issue
Block a user