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