Bug fix: Old MMC-1 drives were rejected because of mode page 2Ah length
This commit is contained in:
parent
3013dd0856
commit
09efaa21bc
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2009.06.02.172201"
|
#define Cdrskin_timestamP "2009.06.03.085637"
|
||||||
|
@ -291,7 +291,7 @@ void spc_allow(struct burn_drive *d)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ts A70518 : Do not call with *alloc_len < 8
|
ts A70518 - A90603 : Do not call with *alloc_len < 10
|
||||||
*/
|
*/
|
||||||
/** flag&1= do only inquire alloc_len */
|
/** flag&1= do only inquire alloc_len */
|
||||||
static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
|
static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
|
||||||
@ -308,7 +308,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
|
|||||||
/* ts A61225 : 1 = report about post-MMC-1 speed descriptors */
|
/* ts A61225 : 1 = report about post-MMC-1 speed descriptors */
|
||||||
static int speed_debug = 0;
|
static int speed_debug = 0;
|
||||||
|
|
||||||
if (*alloc_len < 8)
|
if (*alloc_len < 10)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* ts A90602 : Clearing mdata before command execution */
|
/* ts A90602 : Clearing mdata before command execution */
|
||||||
@ -347,15 +347,20 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
|
|||||||
in MMC-3 6.3.11 there are at least 28 bytes plus a variable length
|
in MMC-3 6.3.11 there are at least 28 bytes plus a variable length
|
||||||
set of speed descriptors. In MMC-5 E.11 it is declared "legacy".
|
set of speed descriptors. In MMC-5 E.11 it is declared "legacy".
|
||||||
*/
|
*/
|
||||||
|
/* ts A90603 :
|
||||||
|
SPC-1 8.3.3 enumerates mode page format bytes from 0 to n and
|
||||||
|
defines Page Length as (n-1).
|
||||||
|
*/
|
||||||
page_length = page[1];
|
page_length = page[1];
|
||||||
old_alloc_len = *alloc_len;
|
old_alloc_len = *alloc_len;
|
||||||
*alloc_len = page_length + 8;
|
*alloc_len = page_length + 10;
|
||||||
if (flag & 1)
|
if (flag & 1)
|
||||||
return !was_error;
|
return !was_error;
|
||||||
if (page_length + 8 > old_alloc_len)
|
if (page_length + 10 > old_alloc_len)
|
||||||
page_length = old_alloc_len - 8;
|
page_length = old_alloc_len - 10;
|
||||||
if (page_length < 22) {
|
|
||||||
/* ts A90602 */
|
/* ts A90602 : 20 to asserts page[21]. (see SPC-1 8.3.3) */
|
||||||
|
if (page_length < 20) {
|
||||||
m->valid = -1;
|
m->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);
|
||||||
@ -400,7 +405,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
|
|||||||
mmc_get_configuration(d);
|
mmc_get_configuration(d);
|
||||||
|
|
||||||
/* ts A61225 : end of MMC-1 , begin of MMC-3 */
|
/* ts A61225 : end of MMC-1 , begin of MMC-3 */
|
||||||
if (page_length < 32) /* no write speed descriptors ? */
|
if (page_length < 30) /* no write speed descriptors ? */
|
||||||
goto try_mmc_get_performance;
|
goto try_mmc_get_performance;
|
||||||
|
|
||||||
m->cur_write_speed = page[28] * 256 + page[29];
|
m->cur_write_speed = page[28] * 256 + page[29];
|
||||||
@ -424,12 +429,12 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_write_speeds; i++) {
|
for (i = 0; i < num_write_speeds; i++) {
|
||||||
speed = page[32 + 4*i + 2] * 256 + page[32 + 4*i + 3];
|
speed = page[32 + 4 * i + 2] * 256 + page[32 + 4 * i + 3];
|
||||||
|
|
||||||
if (speed_debug)
|
if (speed_debug)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"LIBBURN_DEBUG: write speed #%d = %d kB/s (rc %d)\n",
|
"LIBBURN_DEBUG: write speed #%d = %d kB/s (rc %d)\n",
|
||||||
i, speed, page[32 + 4*i +1] & 7);
|
i, speed, page[32 + 4 * i + 1] & 7);
|
||||||
|
|
||||||
/* ts A61226 */
|
/* ts A61226 */
|
||||||
ret = burn_speed_descriptor_new(&(d->mdata->speed_descriptors),
|
ret = burn_speed_descriptor_new(&(d->mdata->speed_descriptors),
|
||||||
@ -442,7 +447,7 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
|
|||||||
strcpy(sd->profile_name,
|
strcpy(sd->profile_name,
|
||||||
d->current_profile_text);
|
d->current_profile_text);
|
||||||
}
|
}
|
||||||
sd->wrc = (( page[32 + 4*i +1] & 7 ) == 1 );
|
sd->wrc = (( page[32 + 4 * i + 1] & 7 ) == 1 );
|
||||||
sd->write_speed = speed;
|
sd->write_speed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,7 +475,7 @@ try_mmc_get_performance:;
|
|||||||
|
|
||||||
void spc_sense_caps(struct burn_drive *d)
|
void spc_sense_caps(struct burn_drive *d)
|
||||||
{
|
{
|
||||||
int alloc_len, start_len = 22, ret;
|
int alloc_len, start_len = 30, ret;
|
||||||
|
|
||||||
if (mmc_function_spy(d, "sense_caps") <= 0)
|
if (mmc_function_spy(d, "sense_caps") <= 0)
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user