test: add support for 0x0A type XCOPY segment descriptors

Type 0x0A segment descriptors provide a 32-bit wide number-of-bytes
field, allowing for much larger copy offloads with a single segment
descriptor.

Signed-off-by: David Disseldorp <ddiss@suse.de>
This commit is contained in:
David Disseldorp
2020-03-18 15:04:11 +01:00
parent 385c6e8ae9
commit c8992f45b1
3 changed files with 25 additions and 0 deletions

View File

@@ -1167,6 +1167,7 @@ enum ec_descr_type_code {
STRM_TO_BLK_SEG_DESCR = 0x01,
BLK_TO_BLK_SEG_DESCR = 0x02,
STRM_TO_STRM_SEG_DESCR = 0x03,
BLK_TO_BLK_OFF_SEG_DESCR = 0x0A,
/* Target descriptors : 0xEO to 0xFE */
IDENT_DESCR_TGT_DESCR = 0xE4,

View File

@@ -2883,6 +2883,9 @@ int get_desc_len(enum ec_descr_type_code desc_type)
case STRM_TO_STRM_SEG_DESCR:
desc_len = 0x10 + SEG_DESC_SRC_INDEX_OFFSET;
break;
case BLK_TO_BLK_OFF_SEG_DESCR:
desc_len = 0x1C + SEG_DESC_SRC_INDEX_OFFSET;
break;
/* Target Descriptors */
case IPV6_TGT_DESCR:
@@ -2992,6 +2995,23 @@ int populate_seg_desc_b2b(unsigned char *desc, int dc, int cat, int src_index, i
return desc_len;
}
int populate_seg_desc_b2b_off(unsigned char *desc, int cat, int src_index,
int dst_index, uint32_t num_bytes,
uint64_t src_lba, uint64_t dst_lba,
uint16_t src_byte_off, uint16_t dst_byte_off)
{
int desc_len = populate_seg_desc_hdr(desc, BLK_TO_BLK_OFF_SEG_DESCR, 0,
cat, src_index, dst_index);
scsi_set_uint32(&desc[8], num_bytes);
scsi_set_uint64(&desc[12], src_lba);
scsi_set_uint64(&desc[20], dst_lba);
scsi_set_uint16(&desc[28], src_byte_off);
scsi_set_uint16(&desc[30], dst_byte_off);
return desc_len;
}
void populate_param_header(unsigned char *buf, int list_id, int str, int list_id_usage, int prio, int tgt_desc_len, int seg_desc_len, int inline_data_len)
{
buf[0] = list_id;

View File

@@ -917,6 +917,10 @@ int get_desc_len(enum ec_descr_type_code desc_type);
int populate_tgt_desc(unsigned char *desc, enum ec_descr_type_code desc_type, int luid_type, int nul, int peripheral_type, uint16_t rel_init_port_id, int pad, struct scsi_device *dev);
int populate_seg_desc_hdr(unsigned char *hdr, enum ec_descr_type_code desc_type, int dc, int cat, uint16_t src_index, uint16_t dst_index);
int populate_seg_desc_b2b(unsigned char *desc, int dc, int cat, int src_index, int dst_index, uint16_t num_blks, uint64_t src_lba, uint64_t dst_lba);
int populate_seg_desc_b2b_off(unsigned char *desc, int cat, int src_index,
int dst_index, uint32_t num_bytes,
uint64_t src_lba, uint64_t dst_lba,
uint16_t src_byte_off, uint16_t dst_byte_off);
void populate_param_header(unsigned char *buf, int list_id, int str, int list_id_usage, int prio, int tgt_desc_len, int seg_desc_len, int inline_data_len);
int receive_copy_results(struct scsi_task **task, struct scsi_device *sdev,
enum scsi_copy_results_sa sa, int list_id,