Prepared for possible demise of mode page 2A

This commit is contained in:
Thomas Schmitt 2014-02-05 19:20:08 +00:00
parent 4ad4f8b9e2
commit f138cfd899
9 changed files with 75 additions and 61 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2014.02.05.185801" #define Cdrskin_timestamP "2014.02.05.191839"

View File

@ -643,7 +643,6 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
if (d->drive_role == 1) { if (d->drive_role == 1) {
mvalid = 0; mvalid = 0;
if (d->mdata != NULL) if (d->mdata != NULL)
if (d->mdata->valid > 0)
mvalid = 1; mvalid = 1;
if (!mvalid) { if (!mvalid) {
libdax_msgs_submit(libdax_messenger, libdax_msgs_submit(libdax_messenger,

View File

@ -263,8 +263,9 @@ int burn_drive_inquire_media(struct burn_drive *d)
/* ts A71128 : run read_disc_info() for any recognizeable profile */ /* ts A71128 : run read_disc_info() for any recognizeable profile */
if (d->current_profile > 0 || d->current_is_guessed_profile || if (d->current_profile > 0 || d->current_is_guessed_profile ||
d->mdata->cdr_write || d->mdata->cdrw_write || (d->mdata->p2a_valid > 0 &&
d->mdata->dvdr_write || d->mdata->dvdram_write) { (d->mdata->cdr_write || d->mdata->cdrw_write ||
d->mdata->dvdr_write || d->mdata->dvdram_write)) ) {
#define Libburn_knows_correct_state_after_loaD 1 #define Libburn_knows_correct_state_after_loaD 1
#ifdef Libburn_knows_correct_state_after_loaD #ifdef Libburn_knows_correct_state_after_loaD
@ -647,7 +648,7 @@ struct burn_drive *burn_drive_finish_enum(struct burn_drive *d)
t->released = 1; t->released = 1;
} else { } else {
/* ts A90602 */ /* ts A90602 */
d->mdata->valid = -1; d->mdata->p2a_valid = -1;
sprintf(msg, "Unable to grab scanned drive %s", d->devname); sprintf(msg, "Unable to grab scanned drive %s", d->devname);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002016f, LIBDAX_MSGS_SEV_DEBUG, 0x0002016f, LIBDAX_MSGS_SEV_DEBUG,
@ -1227,7 +1228,7 @@ static int drive_getcaps(struct burn_drive *d, struct burn_drive_info *out)
a ssert(d->mdata); a ssert(d->mdata);
#endif #endif
if(d->idata->valid <= 0 || d->mdata->valid <= 0) if(d->idata->valid <= 0)
return 0; return 0;
id = (struct burn_scsi_inquiry_data *)d->idata; id = (struct burn_scsi_inquiry_data *)d->idata;
@ -1240,6 +1241,8 @@ static int drive_getcaps(struct burn_drive *d, struct burn_drive_info *out)
strip_spaces(out->revision); strip_spaces(out->revision);
strncpy(out->location, d->devname, 16); strncpy(out->location, d->devname, 16);
out->location[16] = '\0'; out->location[16] = '\0';
if (d->mdata->p2a_valid > 0) {
out->buffer_size = d->mdata->buffer_size; out->buffer_size = d->mdata->buffer_size;
out->read_dvdram = !!d->mdata->dvdram_read; out->read_dvdram = !!d->mdata->dvdram_read;
out->read_dvdr = !!d->mdata->dvdr_read; out->read_dvdr = !!d->mdata->dvdr_read;
@ -1252,6 +1255,13 @@ static int drive_getcaps(struct burn_drive *d, struct burn_drive_info *out)
out->write_cdrw = !!d->mdata->cdrw_write; out->write_cdrw = !!d->mdata->cdrw_write;
out->write_simulate = !!d->mdata->simulate; out->write_simulate = !!d->mdata->simulate;
out->c2_errors = !!d->mdata->c2_pointers; out->c2_errors = !!d->mdata->c2_pointers;
} else {
out->buffer_size = out->read_dvdram = out->read_dvdr = 0;
out->read_dvdrom = out->read_cdr = out->read_cdrw = 0;
out->write_dvdram = out->write_dvdr = out->write_cdr = 0;
out->write_cdrw = out->write_simulate = out->c2_errors = 0;
}
out->drive = d; out->drive = d;
#ifdef Libburn_dummy_probe_write_modeS #ifdef Libburn_dummy_probe_write_modeS
@ -1570,23 +1580,17 @@ void burn_sectors_to_msf(int sectors, int *m, int *s, int *f)
int burn_drive_get_read_speed(struct burn_drive *d) int burn_drive_get_read_speed(struct burn_drive *d)
{ {
if(d->mdata->valid <= 0)
return 0;
return d->mdata->max_read_speed; return d->mdata->max_read_speed;
} }
int burn_drive_get_write_speed(struct burn_drive *d) int burn_drive_get_write_speed(struct burn_drive *d)
{ {
if(d->mdata->valid <= 0)
return 0;
return d->mdata->max_write_speed; return d->mdata->max_write_speed;
} }
/* ts A61021 : New API function */ /* ts A61021 : New API function */
int burn_drive_get_min_write_speed(struct burn_drive *d) int burn_drive_get_min_write_speed(struct burn_drive *d)
{ {
if(d->mdata->valid <= 0)
return 0;
return d->mdata->min_write_speed; return d->mdata->min_write_speed;
} }
@ -2525,7 +2529,8 @@ int burn_disc_read_atip(struct burn_drive *d)
if(d->drive_role != 1) if(d->drive_role != 1)
return 0; return 0;
if ((d->current_profile == -1 || d->current_is_cd_profile) if ((d->current_profile == -1 || d->current_is_cd_profile)
&& (d->mdata->cdrw_write || d->current_profile != 0x08)) { && ((d->mdata->p2a_valid > 0 && d->mdata->cdrw_write) ||
d->current_profile != 0x08)) {
d->read_atip(d); d->read_atip(d);
/* >>> some control of success would be nice :) */ /* >>> some control of success would be nice :) */
} else { } else {
@ -2754,8 +2759,6 @@ int burn_speed_descriptor_copy(struct burn_speed_descriptor *from,
/* ts A61226 : free dynamically allocated sub data of struct scsi_mode_data */ /* ts A61226 : free dynamically allocated sub data of struct scsi_mode_data */
int burn_mdata_free_subs(struct scsi_mode_data *m) int burn_mdata_free_subs(struct scsi_mode_data *m)
{ {
if(!m->valid)
return 0;
burn_speed_descriptor_destroy(&(m->speed_descriptors), 1); burn_speed_descriptor_destroy(&(m->speed_descriptors), 1);
return 1; return 1;
} }
@ -2769,8 +2772,6 @@ int burn_drive_get_speedlist(struct burn_drive *d,
struct burn_speed_descriptor *sd, *csd = NULL; struct burn_speed_descriptor *sd, *csd = NULL;
(*speed_list) = NULL; (*speed_list) = NULL;
if(d->mdata->valid <= 0)
return 0;
for (sd = d->mdata->speed_descriptors; sd != NULL; sd = sd->next) { for (sd = d->mdata->speed_descriptors; sd != NULL; sd = sd->next) {
ret = burn_speed_descriptor_new(&csd, NULL, csd, 0); ret = burn_speed_descriptor_new(&csd, NULL, csd, 0);
if (ret <= 0) if (ret <= 0)
@ -2794,8 +2795,6 @@ int burn_drive_get_best_speed(struct burn_drive *d, int speed_goal,
if (speed_goal < 0) if (speed_goal < 0)
best_speed = 2000000000; best_speed = 2000000000;
*best_descr = NULL; *best_descr = NULL;
if(d->mdata->valid <= 0)
return 0;
for (sd = d->mdata->speed_descriptors; sd != NULL; sd = sd->next) { for (sd = d->mdata->speed_descriptors; sd != NULL; sd = sd->next) {
if (flag & 1) if (flag & 1)
speed = sd->read_speed; speed = sd->read_speed;
@ -2939,7 +2938,8 @@ int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
o->multi_session = o->multi_track = 0; o->multi_session = o->multi_track = 0;
else if(wt == BURN_WRITE_NONE || wt == BURN_WRITE_SAO || else if(wt == BURN_WRITE_NONE || wt == BURN_WRITE_SAO ||
wt == BURN_WRITE_TAO) wt == BURN_WRITE_TAO)
o->might_simulate = !!d->mdata->simulate; o->might_simulate = !!(d->mdata->p2a_valid > 0 &&
d->mdata->simulate);
} else if (d->current_profile == 0x11 || d->current_profile == 0x14 || } else if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
d->current_profile == 0x15) { d->current_profile == 0x15) {
/* DVD-R , sequential DVD-RW , DVD-R/DL Sequential */ /* DVD-R , sequential DVD-RW , DVD-R/DL Sequential */

View File

@ -594,6 +594,11 @@ struct burn_drive_info
to inquire a device file address. ^^^^^ ALWAYS ^^^^^^^*/ to inquire a device file address. ^^^^^ ALWAYS ^^^^^^^*/
char location[17]; char location[17];
/* DEPRECATION:
Start of information from mode page 2Ah which is declared
obsolete by MMC-5. Do not rely on this, if you can get a
meaningful reply from burn_drive_get_all_profiles()
*/
/** Can the drive read DVD-RAM discs */ /** Can the drive read DVD-RAM discs */
unsigned int read_dvdram:1; unsigned int read_dvdram:1;
/** Can the drive read DVD-R discs */ /** Can the drive read DVD-R discs */
@ -622,6 +627,9 @@ struct burn_drive_info
/** The size of the drive's buffer (in kilobytes) */ /** The size of the drive's buffer (in kilobytes) */
int buffer_size; int buffer_size;
/* End of DEPRECATION */
/** /**
* The supported block types in tao mode. * The supported block types in tao mode.
* They should be tested with the desired block type. * They should be tested with the desired block type.

View File

@ -1523,7 +1523,8 @@ static int mmc_read_toc_al(struct burn_drive *d, int *alloc_len)
SanDisk Cruzer U3 memory stick stalls on format 2. SanDisk Cruzer U3 memory stick stalls on format 2.
Format 0 seems to be more conservative with read-only drives. Format 0 seems to be more conservative with read-only drives.
*/ */
if (!(d->mdata->cdrw_write || d->current_profile != 0x08)) { if (!((d->mdata->p2a_valid > 0 && d->mdata->cdrw_write) ||
d->current_profile != 0x08)) {
ret = mmc_read_toc_fmt0(d); ret = mmc_read_toc_fmt0(d);
goto ex; goto ex;
} }
@ -4636,6 +4637,13 @@ fprintf(stderr, "libburn_EXPERIMENTAL: block_type = %d, pd[4]= %u\n",
memcpy(pd + 33, isrc_text, 12); memcpy(pd + 33, isrc_text, 12);
} }
} }
if (d->mdata->write_page_valid <= 0) {
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
"mmc_compose_mode_page_5: No mode page 05 was read",
0, 0);
return 0;
}
return 1; return 1;
} }

View File

@ -44,7 +44,8 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
opts->toc_entry = NULL; opts->toc_entry = NULL;
opts->toc_entries = 0; opts->toc_entries = 0;
opts->simulate = 0; opts->simulate = 0;
opts->underrun_proof = drive->mdata->underrun_proof; opts->underrun_proof = drive->mdata->p2a_valid > 0 &&
drive->mdata->underrun_proof;
opts->perform_opc = 1; opts->perform_opc = 1;
opts->obs = -1; opts->obs = -1;
@ -172,17 +173,6 @@ void burn_write_opts_set_format(struct burn_write_opts *opts, int format)
int burn_write_opts_set_simulate(struct burn_write_opts *opts, int sim) int burn_write_opts_set_simulate(struct burn_write_opts *opts, int sim)
{ {
/* <<< ts A70529 :
One cannot predict the ability to simulate from page 05h
information alone. This check is now done later in
function burn_write_opts_auto_write_type().
if (opts->drive->mdata->simulate) {
opts->simulate = sim;
return 1;
}
return 0;
*/
opts->simulate = !!sim; opts->simulate = !!sim;
return 1; return 1;
} }
@ -190,9 +180,8 @@ int burn_write_opts_set_simulate(struct burn_write_opts *opts, int sim)
int burn_write_opts_set_underrun_proof(struct burn_write_opts *opts, int burn_write_opts_set_underrun_proof(struct burn_write_opts *opts,
int underrun_proof) int underrun_proof)
{ {
if (opts->drive->mdata->valid <= 0) if (opts->drive->mdata->p2a_valid <= 0 ||
return 0; opts->drive->mdata->underrun_proof) {
if (opts->drive->mdata->underrun_proof) {
opts->underrun_proof = underrun_proof; opts->underrun_proof = underrun_proof;
return 1; return 1;
} }

View File

@ -492,13 +492,13 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
out.idata = calloc(1, sizeof(struct burn_scsi_inquiry_data)); out.idata = calloc(1, sizeof(struct burn_scsi_inquiry_data));
out.idata->valid = 0; out.idata->valid = 0;
out.mdata = calloc(1, sizeof(struct scsi_mode_data)); out.mdata = calloc(1, sizeof(struct scsi_mode_data));
out.mdata->valid = 0;
if (out.idata == NULL || out.mdata == NULL) { if (out.idata == NULL || out.mdata == NULL) {
libdax_msgs_submit(libdax_messenger, -1, 0x00020108, libdax_msgs_submit(libdax_messenger, -1, 0x00020108,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH, LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Could not allocate new drive object", 0, 0); "Could not allocate new drive object", 0, 0);
return; return;
} }
out.mdata->p2a_valid = 0;
memset(&out.params, 0, sizeof(struct params)); memset(&out.params, 0, sizeof(struct params));
t = burn_drive_register(&out); t = burn_drive_register(&out);

View File

@ -440,7 +440,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
/* ts A90602 : Clearing mdata before command execution */ /* ts A90602 : Clearing mdata before command execution */
m = d->mdata; m = d->mdata;
m->valid = 0; m->p2a_valid = 0;
burn_mdata_free_subs(m); burn_mdata_free_subs(m);
memset(buf, 0, sizeof(struct buffer)); memset(buf, 0, sizeof(struct buffer));
@ -457,7 +457,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
d->issue_command(d, c); d->issue_command(d, c);
if (c->error) { if (c->error) {
memset(buf, 0, sizeof(struct buffer)); memset(buf, 0, sizeof(struct buffer));
m->valid = -1; m->p2a_valid = -1;
was_error = 1; was_error = 1;
} }
@ -468,7 +468,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
if (block_descr_len + 8 + 2 > *alloc_len) { if (block_descr_len + 8 + 2 > *alloc_len) {
if (block_descr_len + 8 + 2 > BUFFER_SIZE || !(flag & 1)) { if (block_descr_len + 8 + 2 > BUFFER_SIZE || !(flag & 1)) {
m->valid = -1; m->p2a_valid = -1;
sprintf(msg, sprintf(msg,
"MODE SENSE page 2A with oversized Block Descriptors: %s : %d", "MODE SENSE page 2A with oversized Block Descriptors: %s : %d",
d->devname, block_descr_len); d->devname, block_descr_len);
@ -476,6 +476,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
0x0002016e, LIBDAX_MSGS_SEV_DEBUG, 0x0002016e, LIBDAX_MSGS_SEV_DEBUG,
LIBDAX_MSGS_PRIO_LOW, msg, 0, 0); LIBDAX_MSGS_PRIO_LOW, msg, 0, 0);
{ret = 0; goto ex;} {ret = 0; goto ex;}
} }
*alloc_len = block_descr_len + 10; *alloc_len = block_descr_len + 10;
{ret = 2; goto ex;} {ret = 2; goto ex;}
@ -508,7 +509,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
/* ts A90602 : page_length N asserts page[N+1]. (see SPC-1 8.3.3) */ /* ts A90602 : page_length N asserts page[N+1]. (see SPC-1 8.3.3) */
/* ts B11031 : qemu drive has a page_length of 18 */ /* ts B11031 : qemu drive has a page_length of 18 */
if (page_length < 18) { if (page_length < 18) {
m->valid = -1; m->p2a_valid = -1;
sprintf(msg, "MODE SENSE page 2A too short: %s : %d", sprintf(msg, "MODE SENSE page 2A too short: %s : %d",
d->devname, page_length); d->devname, page_length);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
@ -550,7 +551,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
m->max_end_lba = 0; m->max_end_lba = 0;
if (!was_error) if (!was_error)
m->valid = 1; m->p2a_valid = 1;
/* ts A61225 : end of MMC-1 , begin of MMC-3 */ /* ts A61225 : end of MMC-1 , begin of MMC-3 */
if (page_length < 30) /* no write speed descriptors ? */ if (page_length < 30) /* no write speed descriptors ? */
@ -719,6 +720,8 @@ void spc_select_error_params(struct burn_drive *d,
scsi_init_command(c, SPC_MODE_SELECT, sizeof(SPC_MODE_SELECT)); scsi_init_command(c, SPC_MODE_SELECT, sizeof(SPC_MODE_SELECT));
c->retry = 1; c->retry = 1;
if (d->mdata->retry_page_valid <= 0)
d->mdata->retry_page_length = 0;
c->opcode[8] = 8 + 2 + d->mdata->retry_page_length; c->opcode[8] = 8 + 2 + d->mdata->retry_page_length;
c->page = buf; c->page = buf;
c->page->bytes = 0; c->page->bytes = 0;
@ -834,6 +837,8 @@ void spc_select_write_params(struct burn_drive *d, struct burn_session *s,
o->block_type,spc_block_type(o->block_type)); o->block_type,spc_block_type(o->block_type));
*/ */
if (d->mdata->write_page_valid <= 0)
d->mdata->write_page_length = 0;
alloc_len = 8 + 2 + d->mdata->write_page_length; alloc_len = 8 + 2 + d->mdata->write_page_length;
memset(&(buf->data), 0, alloc_len); memset(&(buf->data), 0, alloc_len);
@ -1083,7 +1088,11 @@ int burn_scsi_setup_drive(struct burn_drive *d, int bus_no, int host_no,
return -1; return -1;
} }
d->idata->valid = 0; d->idata->valid = 0;
d->mdata->valid = 0; d->mdata->p2a_valid = 0;
d->mdata->max_read_speed = 0;
d->mdata->cur_read_speed = 0;
d->mdata->max_write_speed = 0;
d->mdata->cur_write_speed = 0;
d->mdata->speed_descriptors = NULL; d->mdata->speed_descriptors = NULL;
if (!(flag & 1)) { if (!(flag & 1)) {
ret = spc_setup_drive(d); ret = spc_setup_drive(d);

View File

@ -89,6 +89,7 @@ struct burn_scsi_inquiry_data
struct scsi_mode_data struct scsi_mode_data
{ {
int p2a_valid;
int buffer_size; int buffer_size;
int dvdram_read; int dvdram_read;
int dvdram_write; int dvdram_write;
@ -100,8 +101,13 @@ struct scsi_mode_data
int cdr_read; int cdr_read;
int cdr_write; int cdr_write;
int simulate; int simulate;
int c2_pointers;
int underrun_proof;
int max_read_speed; int max_read_speed;
int cur_read_speed;
int max_write_speed; int max_write_speed;
int cur_write_speed;
/* ts A61021 */ /* ts A61021 */
int min_write_speed; int min_write_speed;
@ -112,15 +118,10 @@ struct scsi_mode_data
int max_end_lba; int max_end_lba;
struct burn_speed_descriptor *speed_descriptors; struct burn_speed_descriptor *speed_descriptors;
int cur_read_speed;
int cur_write_speed;
int retry_page_length; int retry_page_length;
int retry_page_valid; int retry_page_valid;
int write_page_length; int write_page_length;
int write_page_valid; int write_page_valid;
int c2_pointers;
int valid;
int underrun_proof;
}; };