Test sense key, sense code and additional sense code on invalid page.

This commit is contained in:
R. Bernstein
2010-02-09 21:30:39 -05:00
parent 57407e65a2
commit 31b8a4e4fd

View File

@@ -106,17 +106,18 @@ test_get_disc_erasable(const CdIo_t *p_cdio, const char *psz_source,
*/ */
static void static void
test_print_status_sense(int i_status, int sense_valid, test_print_status_sense(int i_status, int sense_valid,
cdio_mmc_request_sense_t *p_sense, unsigned int i_flag) cdio_mmc_request_sense_t *p_sense_reply,
unsigned int i_flag)
{ {
if (!(i_flag & 1)) if (!(i_flag & 1))
return; return;
fprintf(stderr, "return= %d , sense(%d)", i_status, sense_valid); fprintf(stderr, "return= %d , sense(%d)", i_status, sense_valid);
if (sense_valid >= 14) if (sense_valid >= 14)
fprintf(stderr, ": KEY=%s (%1.1X), ASC= %2.2X , ASCQ= %2.2X", fprintf(stderr, ": KEY=%s (%1.1X), ASC= %2.2X , ASCQ= %2.2X",
mmc_sense_key2str[p_sense->sense_key], mmc_sense_key2str[p_sense_reply->sense_key],
p_sense->sense_key, p_sense_reply->sense_key,
p_sense->asc, p_sense_reply->asc,
p_sense->ascq); p_sense_reply->ascq);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
@@ -230,7 +231,8 @@ test_load_eject(CdIo_t *p_cdio, int *sense_avail,
or other driver_return_code_t or other driver_return_code_t
*/ */
static driver_return_code_t static driver_return_code_t
test_mode_sense(CdIo_t *p_cdio, int *sense_avail,unsigned char sense_reply[18], test_mode_sense(CdIo_t *p_cdio, int *sense_avail,
unsigned char sense_reply[18],
int page_code, int subpage_code, int alloc_len, int page_code, int subpage_code, int alloc_len,
unsigned char *buf, int *i_size, unsigned int i_flag) unsigned char *buf, int *i_size, unsigned int i_flag)
{ {
@@ -575,7 +577,7 @@ test_write(char *drive_path, unsigned int i_flag)
{ {
int sense_avail = 0, ret, sense_valid, i_size, alloc_len = 10, verbose; int sense_avail = 0, ret, sense_valid, i_size, alloc_len = 10, verbose;
int old_log_level; int old_log_level;
unsigned char sense[18], buf[10]; unsigned char sense_reply[18], buf[10];
CdIo_t *p_cdio; CdIo_t *p_cdio;
@@ -622,7 +624,7 @@ test_write(char *drive_path, unsigned int i_flag)
if (scsi_tuple == NULL) { if (scsi_tuple == NULL) {
if (demand_scsi_tuple) { if (demand_scsi_tuple) {
fprintf(stderr, "Error: cdio_get_arg(\"scsi-tuple\") returns NULL.\n"); fprintf(stderr, "Error: cdio_get_arg(\"scsi-tuple\") returns NULL.\n");
{ret = 6; goto ex;} ret = 6; goto ex;
} else if (i_flag & 1) } else if (i_flag & 1)
fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n"); fprintf(stderr, "cdio_get_arg(\"scsi-tuple\") returns NULL.\n");
} else if (i_flag & 1) } else if (i_flag & 1)
@@ -632,24 +634,43 @@ test_write(char *drive_path, unsigned int i_flag)
/* Test availability of sense reply in case of unready drive. /* Test availability of sense reply in case of unready drive.
E.g. if the tray is already ejected. E.g. if the tray is already ejected.
*/ */
ret = test_test_unit_ready(p_cdio, &sense_avail, sense, !!verbose); ret = test_test_unit_ready(p_cdio, &sense_avail, sense_reply, !!verbose);
if (ret != 0 && sense_avail < 18) { if (ret != 0 && sense_avail < 18) {
fprintf(stderr, fprintf(stderr,
"Error: Drive not ready. Only %d sense bytes. Expected >= 18.\n", "Error: Drive not ready. Only %d sense bytes. Expected >= 18.\n",
sense_avail); sense_avail);
{ret = 2; goto ex;} ret = 2; goto ex;
} }
/* Cause sense reply failure by requesting inappropriate mode page 3Eh */ /* Cause sense reply failure by requesting inappropriate mode page 3Eh */
ret = test_mode_sense(p_cdio, &sense_avail, sense, ret = test_mode_sense(p_cdio, &sense_avail, sense_reply,
0x3e, 0, alloc_len, buf, &i_size, !!verbose); 0x3e, 0, alloc_len, buf, &i_size, !!verbose);
if (ret != 0 && sense_avail < 18) { if (ret != 0 && sense_avail < 18) {
fprintf(stderr, fprintf(stderr,
"Error: Deliberately illegal command yields only %d sense bytes. Expected >= 18.\n", "Error: Deliberately illegal command yields only %d sense bytes. Expected >= 18.\n",
sense_avail); sense_avail);
{ret = 2; goto ex;} ret = 3; goto ex;
} else {
cdio_mmc_request_sense_t *p_sense_reply =
(cdio_mmc_request_sense_t *) sense_reply;
if (p_sense_reply->sense_key != 5) {
fprintf(stderr,
"Error: Sense key should be 5, got %d\n",
p_sense_reply->sense_key);
ret = 3; goto ex;
} else if (p_sense_reply->asc != 0x24) {
fprintf(stderr,
"Error: Sense code should be 24, got %d\n",
p_sense_reply->asc);
ret = 4; goto ex;
} else if (p_sense_reply->ascq != 0) {
fprintf(stderr,
"Error: Sense code should be 24, got %d\n",
p_sense_reply->ascq);
ret = 4; goto ex;
}
} }
if (emul_lack_of_wperm) { /* To check behavior with lack of w-permission */ if (emul_lack_of_wperm) { /* To check behavior with lack of w-permission */
fprintf(stderr, fprintf(stderr,
@@ -702,8 +723,9 @@ test_write(char *drive_path, unsigned int i_flag)
} }
/* How are we, finally ? */ /* How are we, finally ? */
ret = test_test_unit_ready(p_cdio, &sense_valid, sense, !!verbose); ret = test_test_unit_ready(p_cdio, &sense_valid, sense_reply, !!verbose);
if ((i_flag & 1) && ret != 0 && sense[2] == 2 && sense[12] == 0x3a) if ((i_flag & 1) && ret != 0 && sense_reply[2] == 2 &&
sense_reply[12] == 0x3a)
fprintf(stderr, "test_unit_ready: Note: No loaded media detected.\n"); fprintf(stderr, "test_unit_ready: Note: No loaded media detected.\n");
ret = 0; ret = 0;
} }