From 38994b62c04a8a4f8696229a34bca40062b18b25 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Tue, 2 Jun 2009 16:28:33 +0000 Subject: [PATCH] Rectified use of burn_drive.mdata->valid --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/async.c | 2 +- libburn/drive.c | 36 +++++++++++++++++++++++++----------- libburn/libdax_msgs.h | 3 ++- libburn/options.c | 2 +- libburn/spc.c | 25 ++++++++++++++++++------- 6 files changed, 48 insertions(+), 22 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 401d7cd..2360dab 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.05.17.144304" +#define Cdrskin_timestamP "2009.06.02.162841" diff --git a/libburn/async.c b/libburn/async.c index 753ba34..64b9a67 100644 --- a/libburn/async.c +++ b/libburn/async.c @@ -559,7 +559,7 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc) } /* ts A61007 : obsolete Assert in spc_select_write_params() */ - if (d->drive_role == 1 && !d->mdata->valid) { + if (d->drive_role == 1 && d->mdata->valid <= 0) { libdax_msgs_submit(libdax_messenger, d->global_index, 0x00020113, LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH, diff --git a/libburn/drive.c b/libburn/drive.c index 2165b65..0019ebf 100644 --- a/libburn/drive.c +++ b/libburn/drive.c @@ -418,6 +418,9 @@ int burn_drive_unregister(struct burn_drive *d) struct burn_drive *burn_drive_finish_enum(struct burn_drive *d) { struct burn_drive *t; + char msg[BURN_DRIVE_ADR_LEN + 160]; + int ret; + /* ts A60821 <<< debug: for tracing calls which might use open drive fds */ int mmc_function_spy(struct burn_drive *d, char * text); @@ -430,13 +433,19 @@ struct burn_drive *burn_drive_finish_enum(struct burn_drive *d) mmc_function_spy(NULL, "enumerate_common : -------- doing grab"); /* try to get the drive info */ - if (t->grab(t)) { + ret = t->grab(t); + if (ret) { burn_print(2, "getting drive info\n"); t->getcaps(t); t->unlock(t); t->released = 1; } else { - burn_print(2, "unable to grab new located drive\n"); + /* ts A90602 */ + d->mdata->valid = -1; + sprintf(msg, "Unable to grab scanned drive %s", d->devname); + libdax_msgs_submit(libdax_messenger, d->global_index, + 0x0002016f, LIBDAX_MSGS_SEV_DEBUG, + LIBDAX_MSGS_PRIO_LOW, msg, 0, 0); burn_drive_unregister(t); t = NULL; } @@ -855,7 +864,7 @@ static int drive_getcaps(struct burn_drive *d, struct burn_drive_info *out) a ssert(d->mdata); #endif - if (!d->idata->valid || !d->mdata->valid) + if(d->idata->valid <= 0 || d->mdata->valid <= 0) return 0; id = (struct burn_scsi_inquiry_data *)d->idata; @@ -978,10 +987,15 @@ int burn_drive_scan_sync(struct burn_drive_info *drives[], if (drive_array[i].global_index < 0) continue; /* invalid device */ - while (!drive_getcaps(&drive_array[i], - &(*drives)[*n_drives])) { + /* ts A90602 : This old loop is not plausible. See A70907. + while (!drive_getcaps(&drive_array[i], + &(*drives)[*n_drives])) { sleep(1); - } + } + */ + /* ts A90602 : A single call shall do (rather than a loop) */ + drive_getcaps(&drive_array[i], &(*drives)[*n_drives]); + (*n_drives)++; scanned[i / 8] |= 1 << (i % 8); } @@ -1140,14 +1154,14 @@ void burn_sectors_to_msf(int sectors, int *m, int *s, int *f) int burn_drive_get_read_speed(struct burn_drive *d) { - if(!d->mdata->valid) + if(d->mdata->valid <= 0) return 0; return d->mdata->max_read_speed; } int burn_drive_get_write_speed(struct burn_drive *d) { - if(!d->mdata->valid) + if(d->mdata->valid <= 0) return 0; return d->mdata->max_write_speed; } @@ -1155,7 +1169,7 @@ int burn_drive_get_write_speed(struct burn_drive *d) /* ts A61021 : New API function */ int burn_drive_get_min_write_speed(struct burn_drive *d) { - if(!d->mdata->valid) + if(d->mdata->valid <= 0) return 0; return d->mdata->min_write_speed; } @@ -2082,7 +2096,7 @@ int burn_drive_get_speedlist(struct burn_drive *d, struct burn_speed_descriptor *sd, *csd = NULL; (*speed_list) = NULL; - if(!d->mdata->valid) + if(d->mdata->valid <= 0) return 0; for (sd = d->mdata->speed_descriptors; sd != NULL; sd = sd->next) { ret = burn_speed_descriptor_new(&csd, NULL, csd, 0); @@ -2107,7 +2121,7 @@ int burn_drive_get_best_speed(struct burn_drive *d, int speed_goal, if (speed_goal < 0) best_speed = 2000000000; *best_descr = NULL; - if(!d->mdata->valid) + if(d->mdata->valid <= 0) return 0; for (sd = d->mdata->speed_descriptors; sd != NULL; sd = sd->next) { if (flag & 1) diff --git a/libburn/libdax_msgs.h b/libburn/libdax_msgs.h index cf48717..0b332f3 100644 --- a/libburn/libdax_msgs.h +++ b/libburn/libdax_msgs.h @@ -545,7 +545,8 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff 0x0002016a (FAILURE,HIGH) = No MMC transport adapter is present 0x0002016b (WARNING,HIGH) = No MMC transport adapter is present 0x0002016c (DEBUG,HIGH) = No MMC transport adapter is present - + 0x0002016e (DEBUG,HIGH) = MODE SENSE page 2A too short + 0x0002016f (DEBUG,HIGH) = Unable to grab scanned drive 0x00020170 (NOTE,HIGH) = Closing open session before writing new one 0x00020171 (NOTE,HIGH) = Closing BD-R with accidently open session diff --git a/libburn/options.c b/libburn/options.c index 501d17f..b48a1b5 100644 --- a/libburn/options.c +++ b/libburn/options.c @@ -143,7 +143,7 @@ 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 underrun_proof) { - if (!opts->drive->mdata->valid) + if (opts->drive->mdata->valid <= 0) return 0; if (opts->drive->mdata->underrun_proof) { opts->underrun_proof = underrun_proof; diff --git a/libburn/spc.c b/libburn/spc.c index 3955472..0e07c53 100644 --- a/libburn/spc.c +++ b/libburn/spc.c @@ -303,6 +303,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) unsigned char *page; struct command c; struct burn_speed_descriptor *sd; + char msg[BURN_DRIVE_ADR_LEN + 160]; /* ts A61225 : 1 = report about post-MMC-1 speed descriptors */ static int speed_debug = 0; @@ -310,6 +311,11 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) if (*alloc_len < 8) return 0; + /* ts A90602 : Clearing mdata before command execution */ + m = d->mdata; + m->valid = 0; + burn_mdata_free_subs(m); + memset(&buf, 0, sizeof(buf)); scsi_init_command(&c, SPC_MODE_SENSE, sizeof(SPC_MODE_SENSE)); /* @@ -328,12 +334,11 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) d->issue_command(d, &c); if (c.error) { memset(&buf, 0, sizeof(buf)); - d->mdata->valid = -1; + m->valid = -1; was_error = 1; } size = c.page->data[0] * 256 + c.page->data[1]; - m = d->mdata; page = c.page->data + 8; /* ts A61225 : @@ -349,11 +354,16 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) return !was_error; if (page_length + 8 > old_alloc_len) page_length = old_alloc_len - 8; - if (page_length < 22) + if (page_length < 22) { + /* ts A90602 */ + m->valid = -1; + sprintf(msg, "MODE SENSE page 2A too short: %s : %d", + d->devname, page_length); + libdax_msgs_submit(libdax_messenger, d->global_index, + 0x0002016e, LIBDAX_MSGS_SEV_DEBUG, + LIBDAX_MSGS_PRIO_LOW, msg, 0, 0); return 0; - - m->valid = 0; - burn_mdata_free_subs(m); + } m->buffer_size = page[12] * 256 + page[13]; m->dvdram_read = page[2] & 32; @@ -384,7 +394,8 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) m->min_end_lba = 0x7fffffff; m->max_end_lba = 0; - m->valid = 1; + if (!was_error) + m->valid = 1; mmc_get_configuration(d);