scsi: scsi_debug: ARRAY_SIZE and FF_MEDIA_IO
Reviewer suggested using the ARRAY_SIZE macro. That reduced one of the subtle inter-dependencies in the parser's tables. It is important that commands which simulate media access, indicate this in the flags for that command. The flag to do that was FF_DIRECT_IO. On reflection FF_MEDIA_IO seems a more accurate description. Signed-off-by: Douglas Gilbert <dgilbert@interlog.com> Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
0a7e69c7d4
commit
46f64e70b8
@ -235,7 +235,7 @@ static const char *sdebug_version_date = "20171202";
|
||||
#define F_M_ACCESS 0x800 /* media access */
|
||||
|
||||
#define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
|
||||
#define FF_DIRECT_IO (F_M_ACCESS | F_FAKE_RW)
|
||||
#define FF_MEDIA_IO (F_M_ACCESS | F_FAKE_RW)
|
||||
#define FF_SA (F_SA_HIGH | F_SA_LOW)
|
||||
|
||||
#define SDEBUG_MAX_PARTS 4
|
||||
@ -326,12 +326,12 @@ enum sdeb_opcode_index {
|
||||
SDEB_I_READ = 9, /* 6, 10, 12, 16 */
|
||||
SDEB_I_WRITE = 10, /* 6, 10, 12, 16 */
|
||||
SDEB_I_START_STOP = 11,
|
||||
SDEB_I_SERV_ACT_IN = 12, /* 12, 16 */
|
||||
SDEB_I_SERV_ACT_OUT = 13, /* 12, 16 */
|
||||
SDEB_I_SERV_ACT_IN_16 = 12, /* add ...SERV_ACT_IN_12 if needed */
|
||||
SDEB_I_SERV_ACT_OUT_16 = 13, /* add ...SERV_ACT_OUT_12 if needed */
|
||||
SDEB_I_MAINT_IN = 14,
|
||||
SDEB_I_MAINT_OUT = 15,
|
||||
SDEB_I_VERIFY = 16, /* 10 only */
|
||||
SDEB_I_VARIABLE_LEN = 17,
|
||||
SDEB_I_VARIABLE_LEN = 17, /* READ(32), WRITE(32) */
|
||||
SDEB_I_RESERVE = 18, /* 6, 10 */
|
||||
SDEB_I_RELEASE = 19, /* 6, 10 */
|
||||
SDEB_I_ALLOW_REMOVAL = 20, /* PREVENT ALLOW MEDIUM REMOVAL */
|
||||
@ -376,12 +376,12 @@ static const unsigned char opcode_ind_arr[256] = {
|
||||
0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
|
||||
SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, SDEB_I_WRITE_SAME, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN, SDEB_I_SERV_ACT_OUT,
|
||||
0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN_16, SDEB_I_SERV_ACT_OUT_16,
|
||||
/* 0xa0; 0xa0->0xbf: 12 byte cdbs */
|
||||
SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
|
||||
SDEB_I_MAINT_OUT, 0, 0, 0,
|
||||
SDEB_I_READ, SDEB_I_SERV_ACT_OUT, SDEB_I_WRITE, SDEB_I_SERV_ACT_IN,
|
||||
0, 0, 0, 0,
|
||||
SDEB_I_READ, 0 /* SDEB_I_SERV_ACT_OUT_12 */, SDEB_I_WRITE,
|
||||
0 /* SDEB_I_SERV_ACT_IN_12 */, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
/* 0xc0; 0xc0->0xff: vendor specific */
|
||||
@ -413,72 +413,78 @@ static int resp_xdwriteread_10(struct scsi_cmnd *, struct sdebug_dev_info *);
|
||||
static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
|
||||
static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
|
||||
|
||||
static const struct opcode_info_t msense_iarr[1] = {
|
||||
/*
|
||||
* The following are overflow arrays for cdbs that "hit" the same index in
|
||||
* the opcode_info_arr array. The most time sensitive (or commonly used) cdb
|
||||
* should be placed in opcode_info_arr[], the others should be placed here.
|
||||
*/
|
||||
static const struct opcode_info_t msense_iarr[] = {
|
||||
{0, 0x1a, 0, F_D_IN, NULL, NULL,
|
||||
{6, 0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
};
|
||||
|
||||
static const struct opcode_info_t mselect_iarr[1] = {
|
||||
static const struct opcode_info_t mselect_iarr[] = {
|
||||
{0, 0x15, 0, F_D_OUT, NULL, NULL,
|
||||
{6, 0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
};
|
||||
|
||||
static const struct opcode_info_t read_iarr[3] = {
|
||||
{0, 0x28, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL,/* READ(10) */
|
||||
static const struct opcode_info_t read_iarr[] = {
|
||||
{0, 0x28, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(10) */
|
||||
{10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
|
||||
0, 0, 0, 0} },
|
||||
{0, 0x8, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL, /* READ(6) */
|
||||
{0, 0x8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL, /* READ(6) */
|
||||
{6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0xa8, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, NULL,/* READ(12) */
|
||||
{0, 0xa8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(12) */
|
||||
{12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
|
||||
0xc7, 0, 0, 0, 0} },
|
||||
};
|
||||
|
||||
static const struct opcode_info_t write_iarr[3] = {
|
||||
{0, 0x2a, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL, /* 10 */
|
||||
{10, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
|
||||
0, 0, 0, 0} },
|
||||
{0, 0xa, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL, /* 6 */
|
||||
{6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0xaa, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, NULL, /* 12 */
|
||||
{12, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
|
||||
0xc7, 0, 0, 0, 0} },
|
||||
static const struct opcode_info_t write_iarr[] = {
|
||||
{0, 0x2a, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(10) */
|
||||
NULL, {10, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
|
||||
0, 0, 0, 0, 0, 0} },
|
||||
{0, 0xa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(6) */
|
||||
NULL, {6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0} },
|
||||
{0, 0xaa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(12) */
|
||||
NULL, {12, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xbf, 0xc7, 0, 0, 0, 0} },
|
||||
};
|
||||
|
||||
static const struct opcode_info_t sa_in_iarr[1] = {
|
||||
static const struct opcode_info_t sa_in_16_iarr[] = {
|
||||
{0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
|
||||
{16, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0, 0xc7} },
|
||||
0xff, 0xff, 0xff, 0, 0xc7} }, /* GET LBA STATUS(16) */
|
||||
};
|
||||
|
||||
static const struct opcode_info_t vl_iarr[1] = { /* VARIABLE LENGTH */
|
||||
{0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_DIRECT_IO, resp_write_dt0,
|
||||
static const struct opcode_info_t vl_iarr[] = { /* VARIABLE LENGTH */
|
||||
{0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_dt0,
|
||||
NULL, {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0xb, 0xfa,
|
||||
0, 0xff, 0xff, 0xff, 0xff} }, /* WRITE(32) */
|
||||
};
|
||||
|
||||
static const struct opcode_info_t maint_in_iarr[2] = {
|
||||
static const struct opcode_info_t maint_in_iarr[] = { /* MAINT IN */
|
||||
{0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
|
||||
{12, 0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
|
||||
0xc7, 0, 0, 0, 0} },
|
||||
0xc7, 0, 0, 0, 0} }, /* REPORT SUPPORTED OPERATION CODES */
|
||||
{0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
|
||||
{12, 0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
|
||||
0, 0} },
|
||||
0, 0} }, /* REPORTED SUPPORTED TASK MANAGEMENT FUNCTIONS */
|
||||
};
|
||||
|
||||
static const struct opcode_info_t write_same_iarr[1] = {
|
||||
{0, 0x93, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, resp_write_same_16, NULL,
|
||||
static const struct opcode_info_t write_same_iarr[] = {
|
||||
{0, 0x93, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_write_same_16, NULL,
|
||||
{16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x3f, 0xc7} },
|
||||
0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* WRITE SAME(16) */
|
||||
};
|
||||
|
||||
static const struct opcode_info_t reserve_iarr[1] = {
|
||||
{0, 0x16, 0, F_D_OUT, NULL, NULL, /* RESERVE(6) */
|
||||
static const struct opcode_info_t reserve_iarr[] = {
|
||||
{0, 0x16, 0, F_D_OUT, NULL, NULL, /* RESERVE(6) */
|
||||
{6, 0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
};
|
||||
|
||||
static const struct opcode_info_t release_iarr[1] = {
|
||||
{0, 0x17, 0, F_D_OUT, NULL, NULL, /* RELEASE(6) */
|
||||
static const struct opcode_info_t release_iarr[] = {
|
||||
{0, 0x17, 0, F_D_OUT, NULL, NULL, /* RELEASE(6) */
|
||||
{6, 0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
};
|
||||
|
||||
@ -488,57 +494,66 @@ static const struct opcode_info_t release_iarr[1] = {
|
||||
* REPORT SUPPORTED OPERATION CODES. */
|
||||
static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEMENT + 1] = {
|
||||
/* 0 */
|
||||
{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL,
|
||||
{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* unknown opcodes */
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL,
|
||||
{0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL, /* INQUIRY */
|
||||
{6, 0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
|
||||
{12, 0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
|
||||
0, 0} },
|
||||
0, 0} }, /* REPORT LUNS */
|
||||
{0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
|
||||
{6, 0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
|
||||
{6, 0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{1, 0x5a, 0, F_D_IN, resp_mode_sense, msense_iarr,
|
||||
{10, 0xf8, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
|
||||
0} },
|
||||
{1, 0x55, 0, F_D_OUT, resp_mode_select, mselect_iarr,
|
||||
{10, 0xf1, 0, 0, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x4d, 0, F_D_IN, resp_log_sense, NULL,
|
||||
/* 5 */
|
||||
{ARRAY_SIZE(msense_iarr), 0x5a, 0, F_D_IN, /* MODE SENSE(10) */
|
||||
resp_mode_sense, msense_iarr, {10, 0xf8, 0xff, 0xff, 0, 0, 0,
|
||||
0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
|
||||
{ARRAY_SIZE(mselect_iarr), 0x55, 0, F_D_OUT, /* MODE SELECT(10) */
|
||||
resp_mode_select, mselect_iarr, {10, 0xf1, 0, 0, 0, 0, 0, 0xff,
|
||||
0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x4d, 0, F_D_IN, resp_log_sense, NULL, /* LOG SENSE */
|
||||
{10, 0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
|
||||
0, 0, 0} },
|
||||
{0, 0x25, 0, F_D_IN, resp_readcap, NULL,
|
||||
{0, 0x25, 0, F_D_IN, resp_readcap, NULL, /* READ CAPACITY(10) */
|
||||
{10, 0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
|
||||
0, 0} },
|
||||
{3, 0x88, 0, F_D_IN | FF_DIRECT_IO, resp_read_dt0, read_iarr,
|
||||
{16, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xc7} }, /* READ(16) */
|
||||
{ARRAY_SIZE(read_iarr), 0x88, 0, F_D_IN | FF_MEDIA_IO, /* READ(16) */
|
||||
resp_read_dt0, read_iarr, {16, 0xfe, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
|
||||
/* 10 */
|
||||
{3, 0x8a, 0, F_D_OUT | FF_DIRECT_IO, resp_write_dt0, write_iarr,
|
||||
{16, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xc7} }, /* WRITE(16) */
|
||||
{ARRAY_SIZE(write_iarr), 0x8a, 0, F_D_OUT | FF_MEDIA_IO,
|
||||
resp_write_dt0, write_iarr, /* WRITE(16) */
|
||||
{16, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} }, /* WRITE(16) */
|
||||
{0, 0x1b, 0, 0, resp_start_stop, NULL, /* START STOP UNIT */
|
||||
{6, 0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{1, 0x9e, 0x10, F_SA_LOW | F_D_IN, resp_readcap16, sa_in_iarr,
|
||||
{16, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1, 0xc7} }, /* READ CAPACITY(16) */
|
||||
{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* SA OUT */
|
||||
{ARRAY_SIZE(sa_in_16_iarr), 0x9e, 0x10, F_SA_LOW | F_D_IN,
|
||||
resp_readcap16, sa_in_16_iarr, /* SA_IN(16), READ CAPACITY(16) */
|
||||
{16, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x1, 0xc7} },
|
||||
{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* SA_OUT(16) */
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{2, 0xa3, 0xa, F_SA_LOW | F_D_IN, resp_report_tgtpgs, maint_in_iarr,
|
||||
{12, 0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0, 0,
|
||||
0} },
|
||||
{ARRAY_SIZE(maint_in_iarr), 0xa3, 0xa, F_SA_LOW | F_D_IN,
|
||||
resp_report_tgtpgs, /* MAINT IN, REPORT TARGET PORT GROUPS */
|
||||
maint_in_iarr, {12, 0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff,
|
||||
0xff, 0, 0xc7, 0, 0, 0, 0} },
|
||||
/* 15 */
|
||||
{0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x2f, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, NULL, NULL, /* VERIFY(10) */
|
||||
{0, 0x2f, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, NULL, NULL, /* VERIFY(10) */
|
||||
{10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7,
|
||||
0, 0, 0, 0, 0, 0} },
|
||||
{1, 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_DIRECT_IO, resp_read_dt0,
|
||||
vl_iarr, {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0,
|
||||
0xff, 0xff, 0xff, 0xff} },/* VARIABLE LENGTH, READ(32) */
|
||||
{1, 0x56, 0, F_D_OUT, NULL, reserve_iarr, /* RESERVE(10) */
|
||||
{ARRAY_SIZE(vl_iarr), 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_MEDIA_IO,
|
||||
resp_read_dt0, vl_iarr, /* VARIABLE LENGTH, READ(32) */
|
||||
{32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0, 0xff, 0xff,
|
||||
0xff, 0xff} },
|
||||
{ARRAY_SIZE(reserve_iarr), 0x56, 0, F_D_OUT,
|
||||
NULL, reserve_iarr, /* RESERVE(10) <no response function> */
|
||||
{10, 0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
|
||||
0} },
|
||||
{1, 0x57, 0, F_D_OUT, NULL, release_iarr, /* RELEASE(10) */
|
||||
{ARRAY_SIZE(release_iarr), 0x57, 0, F_D_OUT,
|
||||
NULL, release_iarr, /* RELEASE(10) <no response function> */
|
||||
{10, 0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
|
||||
0} },
|
||||
/* 20 */
|
||||
@ -550,21 +565,23 @@ static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEMENT + 1] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x1d, F_D_OUT, 0, NULL, NULL, /* SEND DIAGNOSTIC */
|
||||
{6, 0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x42, 0, F_D_OUT | FF_DIRECT_IO, resp_unmap, NULL, /* UNMAP */
|
||||
{0, 0x42, 0, F_D_OUT | FF_MEDIA_IO, resp_unmap, NULL, /* UNMAP */
|
||||
{10, 0x1, 0, 0, 0, 0, 0x3f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x53, 0, F_D_IN | F_D_OUT | FF_DIRECT_IO, resp_xdwriteread_10,
|
||||
/* 25 */
|
||||
{0, 0x53, 0, F_D_IN | F_D_OUT | FF_MEDIA_IO, resp_xdwriteread_10,
|
||||
NULL, {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
|
||||
0, 0, 0, 0, 0, 0} },
|
||||
0, 0, 0, 0, 0, 0} }, /* XDWRITEREAD(10) */
|
||||
{0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
|
||||
{10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
|
||||
0, 0, 0, 0} }, /* WRITE_BUFFER */
|
||||
{1, 0x41, 0, F_D_OUT_MAYBE | FF_DIRECT_IO, resp_write_same_10,
|
||||
write_same_iarr, {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff,
|
||||
0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
|
||||
{0, 0x35, 0, F_DELAY_OVERR | FF_DIRECT_IO, NULL, NULL, /* SYNC_CACHE */
|
||||
{ARRAY_SIZE(write_same_iarr), 0x41, 0, F_D_OUT_MAYBE | FF_MEDIA_IO,
|
||||
resp_write_same_10, write_same_iarr, /* WRITE SAME(10) */
|
||||
{10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0,
|
||||
0, 0, 0, 0, 0} },
|
||||
{0, 0x35, 0, F_DELAY_OVERR | FF_MEDIA_IO, NULL, NULL, /* SYNC_CACHE */
|
||||
{10, 0x7, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
|
||||
0, 0, 0, 0} },
|
||||
{0, 0x89, 0, F_D_OUT | FF_DIRECT_IO, resp_comp_write, NULL,
|
||||
{0, 0x89, 0, F_D_OUT | FF_MEDIA_IO, resp_comp_write, NULL,
|
||||
{16, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
|
||||
0, 0xff, 0x3f, 0xc7} }, /* COMPARE AND WRITE */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user