Forgot mcc.c with the previous commit

This commit is contained in:
Thomas Schmitt 2012-11-29 11:25:54 +00:00
parent 0728d855d5
commit 2df7f3d5d5
2 changed files with 125 additions and 14 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2012.11.29.111344" #define Cdrskin_timestamP "2012.11.29.112506"

View File

@ -236,6 +236,11 @@ static unsigned char MMC_READ_CAPACITY[] =
static unsigned char MMC_READ_DISC_STRUCTURE[] = static unsigned char MMC_READ_DISC_STRUCTURE[] =
{ 0xAD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; { 0xAD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/* ts B21125 : An alternatvie to BEh READ CD
*/
static unsigned char MMC_READ_CD_MSF[] =
{ 0xB9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
static int mmc_function_spy_do_tell = 0; static int mmc_function_spy_do_tell = 0;
int mmc_function_spy(struct burn_drive *d, char * text) int mmc_function_spy(struct burn_drive *d, char * text)
@ -2329,8 +2334,9 @@ ex:;
} }
int mmc_eval_read_error(struct burn_drive *d, struct command *c, int mmc_eval_read_error(struct burn_drive *d, struct command *c, char *what,
char *what, int start, int len, int flag) int start_m, int start_s, int start_f,
int end_m, int end_s, int end_f, int flag)
{ {
char *msg = NULL; char *msg = NULL;
int key, asc, ascq, silent; int key, asc, ascq, silent;
@ -2340,8 +2346,14 @@ int mmc_eval_read_error(struct burn_drive *d, struct command *c,
msg = calloc(1, 256); msg = calloc(1, 256);
if (msg != NULL) { if (msg != NULL) {
sprintf(msg, if (start_s < 0 || start_f < 0 || end_s < 0 || end_f < 0) {
"SCSI error on %s(%d,%d): ", what, start, len); sprintf(msg,
"SCSI error on %s(%d,%d): ", what, start_m, end_m);
} else {
sprintf(msg, "SCSI error on %s(%dm%ds%df,%dm%ds%df): ",
what,
start_m, start_s, start_f, end_m, end_s, end_f);
}
scsi_error_msg(d, c->sense, 14, msg + strlen(msg), scsi_error_msg(d, c->sense, 14, msg + strlen(msg),
&key, &asc, &ascq); &key, &asc, &ascq);
silent = (d->silent_on_scsi_error == 1); silent = (d->silent_on_scsi_error == 1);
@ -2361,6 +2373,84 @@ int mmc_eval_read_error(struct burn_drive *d, struct command *c,
} }
/* ts B21119 : Derived from older mmc_read_sectors()
@param flag bit0= set DAP bit (also with o->dap_bit)
*/
int mmc_read_cd_msf(struct burn_drive *d,
int start_m, int start_s, int start_f,
int end_m, int end_s, int end_f,
int sec_type, int main_ch,
const struct burn_read_opts *o, struct buffer *buf, int flag)
{
int req, ret, dap_bit;
int report_recovered_errors = 0, subcodes_audio = 0, subcodes_data = 0;
struct command *c;
c = &(d->casual_command);
mmc_start_if_needed(d, 0);
if (mmc_function_spy(d, "mmc_read_cd_msf") <= 0)
return -1;
dap_bit = flag & 1;
if (o != NULL) {
report_recovered_errors = o->report_recovered_errors;
subcodes_audio = o->subcodes_audio;
subcodes_data = o->subcodes_data;
dap_bit |= o->dap_bit;
}
scsi_init_command(c, MMC_READ_CD_MSF, sizeof(MMC_READ_CD_MSF));
c->retry = 1;
c->opcode[1] = ((sec_type & 7) << 2) | ((!!dap_bit) << 1);
c->opcode[3] = start_m;
c->opcode[4] = start_s;
c->opcode[5] = start_f;
c->opcode[6] = end_m;
c->opcode[7] = end_s;
c->opcode[8] = end_f;
req = main_ch & 0xf8;
/* ts A61106 : LG GSA-4082B dislikes this. key=5h asc=24h ascq=00h
if (d->busy == BURN_DRIVE_GRABBING || report_recovered_errors)
req |= 2;
*/
c->opcode[9] = req;
c->opcode[10] = 0;
/* always read the subcode, throw it away later, since we don't know
what we're really reading
*/
/* >>> ts B21125 : This is very obscure:
MMC-3 has sub channel selection 001b as "RAW"
MMC-5 does neither mention 001b nor "RAW".
And why should a non-grabbed drive get here ?
*/
if (d->busy == BURN_DRIVE_GRABBING || subcodes_audio || subcodes_data)
c->opcode[10] = 1;
/* <<< ts B21125 : test with sub channel selection 100b
no data, only sub channel
c->opcode[9] = 0;
c->opcode[10] = 4;
Did not help either with reading before LBA -150
*/
/* <<< ts B21125 : test with sub channel selection 001b and no user data
c->opcode[9] = 0;
c->opcode[10] = 1;
*/
c->page = buf;
c->dir = FROM_DRIVE;
d->issue_command(d, c);
ret = mmc_eval_read_error(d, c, "read_cd_msf",
start_m, start_s, start_f,
end_m, end_s, end_f, 0);
return ret;
}
/* ts B21119 : Derived from older mmc_read_sectors() /* ts B21119 : Derived from older mmc_read_sectors()
@param flag bit0= set DAP bit (also with o->dap_bit) @param flag bit0= set DAP bit (also with o->dap_bit)
*/ */
@ -2372,18 +2462,25 @@ int mmc_read_cd(struct burn_drive *d, int start, int len,
int report_recovered_errors = 0, subcodes_audio = 0, subcodes_data = 0; int report_recovered_errors = 0, subcodes_audio = 0, subcodes_data = 0;
struct command *c; struct command *c;
/* # define Libburn_read_cd_by_msF 1 */
#ifdef Libburn_read_cd_by_msF
int start_m, start_s, start_f, end_m, end_s, end_f;
burn_lba_to_msf(start, &start_m, &start_s, &start_f);
burn_lba_to_msf(start + len, &end_m, &end_s, &end_f);
ret = mmc_read_cd_msf(d, start_m, start_s, start_f,
end_m, end_s, end_f,
sec_type, main_ch, o, buf, flag);
return ret;
#endif /* Libburn_read_cd_by_msF */
c = &(d->casual_command); c = &(d->casual_command);
mmc_start_if_needed(d, 0); mmc_start_if_needed(d, 0);
if (mmc_function_spy(d, "mmc_read_cd") <= 0) if (mmc_function_spy(d, "mmc_read_cd") <= 0)
return -1; return -1;
/* ts A61009 : to be ensured by callers */
/* a ssert(len >= 0); */
/* if the drive isn't busy, why the hell are we here? */
/* ts A61006 : i second that question */
/* a ssert(d->busy); */
dap_bit = flag & 1; dap_bit = flag & 1;
if (o != NULL) { if (o != NULL) {
report_recovered_errors = o->report_recovered_errors; report_recovered_errors = o->report_recovered_errors;
@ -2416,18 +2513,32 @@ int mmc_read_cd(struct burn_drive *d, int start, int len,
req |= 2; req |= 2;
*/ */
c->opcode[9] = req;
c->opcode[10] = 0; c->opcode[10] = 0;
/* always read the subcode, throw it away later, since we don't know /* always read the subcode, throw it away later, since we don't know
what we're really reading what we're really reading
*/
/* >>> ts B21125 : This is very obscure:
MMC-3 has sub channel selection 001b as "RAW"
MMC-5 does neither mention 001b nor "RAW".
And why should a non-grabbed drive get here ?
*/ */
if (d->busy == BURN_DRIVE_GRABBING || subcodes_audio || subcodes_data) if (d->busy == BURN_DRIVE_GRABBING || subcodes_audio || subcodes_data)
c->opcode[10] = 1; c->opcode[10] = 1;
c->opcode[9] = req; /* <<< ts B21125 : test with sub channel selection 100b
c->opcode[10] = 4;
*/
/* <<< ts B21125 : test with sub channel selection 001b and no user data
c->opcode[9] = 0;
c->opcode[10] = 1;
*/
c->page = buf; c->page = buf;
c->dir = FROM_DRIVE; c->dir = FROM_DRIVE;
d->issue_command(d, c); d->issue_command(d, c);
ret = mmc_eval_read_error(d, c, "read_cd", start, len, 0); ret = mmc_eval_read_error(d, c, "read_cd", start, -1, -1,
len, -1, -1, 0);
return ret; return ret;
} }