Add support and tests for ExtendedCopy and ReceiveCopyResults
From sushma.gurram@sandisk.com Add support to libiscsi and tests for these two opcodes. Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
This commit is contained in:
@@ -54,6 +54,8 @@ enum scsi_opcode {
|
||||
SCSI_OPCODE_MODESENSE10 = 0x5A,
|
||||
SCSI_OPCODE_PERSISTENT_RESERVE_IN = 0x5E,
|
||||
SCSI_OPCODE_PERSISTENT_RESERVE_OUT = 0x5F,
|
||||
SCSI_OPCODE_EXTENDED_COPY = 0x83,
|
||||
SCSI_OPCODE_RECEIVE_COPY_RESULTS = 0x84,
|
||||
SCSI_OPCODE_READ16 = 0x88,
|
||||
SCSI_OPCODE_COMPARE_AND_WRITE = 0x89,
|
||||
SCSI_OPCODE_WRITE16 = 0x8A,
|
||||
@@ -148,7 +150,10 @@ enum scsi_sense_key {
|
||||
EXTERN const char *scsi_sense_key_str(int key);
|
||||
|
||||
/* ascq */
|
||||
#define SCSI_SENSE_ASCQ_NO_ADDL_SENSE 0x0000
|
||||
#define SCSI_SENSE_ASCQ_SANITIZE_IN_PROGRESS 0x041b
|
||||
#define SCSI_SENSE_ASCQ_UNREACHABLE_COPY_TARGET 0x0804
|
||||
#define SCSI_SENSE_ASCQ_COPY_TARGET_DEVICE_NOT_REACHABLE 0x0d02
|
||||
#define SCSI_SENSE_ASCQ_WRITE_AFTER_SANITIZE_REQUIRED 0x1115
|
||||
#define SCSI_SENSE_ASCQ_PARAMETER_LIST_LENGTH_ERROR 0x1a00
|
||||
#define SCSI_SENSE_ASCQ_MISCOMPARE_DURING_VERIFY 0x1d00
|
||||
@@ -158,6 +163,10 @@ EXTERN const char *scsi_sense_key_str(int key);
|
||||
#define SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB 0x2400
|
||||
#define SCSI_SENSE_ASCQ_LOGICAL_UNIT_NOT_SUPPORTED 0x2500
|
||||
#define SCSI_SENSE_ASCQ_INVALID_FIELD_IN_PARAMETER_LIST 0x2600
|
||||
#define SCSI_SENSE_ASCQ_TOO_MANY_TARGET_DESCRIPTORS 0x2606
|
||||
#define SCSI_SENSE_ASCQ_UNSUPPORTED_TARGET_DESCRIPTOR_TYPE_CODE 0x2607
|
||||
#define SCSI_SENSE_ASCQ_TOO_MANY_SEGMENT_DESCRIPTORS 0x2608
|
||||
#define SCSI_SENSE_ASCQ_UNSUPPORTED_SEGMENT_DESCRIPTOR_TYPE_CODE 0x2609
|
||||
#define SCSI_SENSE_ASCQ_WRITE_PROTECTED 0x2700
|
||||
#define SCSI_SENSE_ASCQ_HARDWARE_WRITE_PROTECTED 0x2701
|
||||
#define SCSI_SENSE_ASCQ_SOFTWARE_WRITE_PROTECTED 0x2702
|
||||
@@ -348,7 +357,6 @@ EXTERN struct scsi_task *scsi_cdb_testunitready(void);
|
||||
EXTERN struct scsi_task *scsi_cdb_sanitize(int immed, int ause, int sa,
|
||||
int param_len);
|
||||
|
||||
|
||||
/*
|
||||
* REPORTLUNS
|
||||
*/
|
||||
@@ -1095,6 +1103,78 @@ EXTERN struct scsi_task *scsi_cdb_writeverify12(uint32_t lba, uint32_t xferlen,
|
||||
EXTERN struct scsi_task *scsi_cdb_writeverify16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number);
|
||||
|
||||
|
||||
/*
|
||||
* EXTENDED COPY
|
||||
*/
|
||||
#define XCOPY_DESC_OFFSET 16
|
||||
#define SEG_DESC_SRC_INDEX_OFFSET 4
|
||||
enum list_id_usage {
|
||||
LIST_ID_USAGE_HOLD = 0,
|
||||
LIST_ID_USAGE_DISCARD = 2,
|
||||
LIST_ID_USAGE_DISABLE = 3
|
||||
};
|
||||
|
||||
enum ec_descr_type_code {
|
||||
/* Segment descriptors : 0x00 to 0xBF */
|
||||
BLK_TO_STRM_SEG_DESCR = 0x00,
|
||||
STRM_TO_BLK_SEG_DESCR = 0x01,
|
||||
BLK_TO_BLK_SEG_DESCR = 0x02,
|
||||
STRM_TO_STRM_SEG_DESCR = 0x03,
|
||||
|
||||
/* Target descriptors : 0xEO to 0xFE */
|
||||
IDENT_DESCR_TGT_DESCR = 0xE4,
|
||||
IPV4_TGT_DESCR = 0xE5,
|
||||
IPV6_TGT_DESCR = 0xEA,
|
||||
IP_COPY_SVC_TGT_DESCR = 0xEB
|
||||
};
|
||||
|
||||
enum lu_id_type {
|
||||
LU_ID_TYPE_LUN = 0x00,
|
||||
LU_ID_TYPE_PROXY_TOKEN = 0x01,
|
||||
LU_ID_TYPE_RSVD = 0x02,
|
||||
LU_ID_TYPE_RSVD1 = 0x03
|
||||
};
|
||||
|
||||
EXTERN struct scsi_task *scsi_cdb_extended_copy(int immed);
|
||||
|
||||
/*
|
||||
* RECEIVE COPY RESULTS
|
||||
*/
|
||||
enum scsi_copy_results_sa {
|
||||
SCSI_COPY_RESULTS_COPY_STATUS = 0,
|
||||
SCSI_COPY_RESULTS_RECEIVE_DATA = 1,
|
||||
SCSI_COPY_RESULTS_OP_PARAMS = 3,
|
||||
SCSI_COPY_RESULTS_FAILED_SEGMENT = 4,
|
||||
};
|
||||
|
||||
EXTERN struct scsi_task *scsi_cdb_receive_copy_results(enum scsi_copy_results_sa sa, int list_id, int xferlen);
|
||||
|
||||
struct scsi_copy_results_copy_status {
|
||||
uint32_t available_data;
|
||||
uint8_t copy_manager_status;
|
||||
uint8_t hdd;
|
||||
uint16_t segments_processed;
|
||||
uint8_t transfer_count_units;
|
||||
uint32_t transfer_count;
|
||||
};
|
||||
|
||||
struct scsi_copy_results_op_params {
|
||||
uint32_t available_data;
|
||||
uint16_t max_target_desc_count;
|
||||
uint16_t max_segment_desc_count;
|
||||
uint32_t max_desc_list_length;
|
||||
uint32_t max_segment_length;
|
||||
uint32_t max_inline_data_length;
|
||||
uint32_t held_data_limit;
|
||||
uint32_t max_stream_device_transfer_size;
|
||||
uint16_t total_concurrent_copies;
|
||||
uint8_t max_concurrent_copies;
|
||||
uint8_t data_segment_granularity;
|
||||
uint8_t inline_data_granularity;
|
||||
uint8_t held_data_granularity;
|
||||
uint8_t impl_desc_list_length;
|
||||
uint8_t imp_desc_type_codes[0];
|
||||
};
|
||||
void *scsi_malloc(struct scsi_task *task, size_t size);
|
||||
|
||||
uint64_t scsi_get_uint64(const unsigned char *c);
|
||||
|
||||
Reference in New Issue
Block a user