diff options
Diffstat (limited to 'drivers/scsi/scsi_debug.c')
| -rw-r--r-- | drivers/scsi/scsi_debug.c | 163 | 
1 files changed, 90 insertions, 73 deletions
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 11ef3f19490d..42b55d60e844 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -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 */  | 
