diff -uNr linux-2.4.21/drivers/scsi/scsi_obsolete.c linux-2.4.21.ppc_large_timeout/drivers/scsi/scsi_obsolete.c --- linux-2.4.21/drivers/scsi/scsi_obsolete.c 2003-08-25 10:47:05.000000000 +0200 +++ linux-2.4.21.ppc_large_timeout/drivers/scsi/scsi_obsolete.c 2003-08-25 11:23:56.000000000 +0200 @@ -118,9 +118,19 @@ #define ABORT_TIMEOUT SCSI_TIMEOUT #define RESET_TIMEOUT SCSI_TIMEOUT #else -#define SENSE_TIMEOUT (5*HZ/10) -#define RESET_TIMEOUT (5*HZ/10) -#define ABORT_TIMEOUT (5*HZ/10) +/* + * FIXME XXX bump the timeout for some odd devices + * This is not an arch specific bug, after all + */ +#ifdef __powerpc64__ +#define SENSE_TIMEOUT (20*HZ) +#define RESET_TIMEOUT (2*HZ) +#define ABORT_TIMEOUT (25*HZ) +#else +#define SENSE_TIMEOUT (3*HZ/2) +#define RESET_TIMEOUT (HZ) +#define ABORT_TIMEOUT (3*HZ/2) +#endif #endif diff -uNr linux-2.4.21/drivers/scsi/scsi_scan.c linux-2.4.21.ppc_large_timeout/drivers/scsi/scsi_scan.c --- linux-2.4.21/drivers/scsi/scsi_scan.c 2003-08-25 10:48:26.000000000 +0200 +++ linux-2.4.21.ppc_large_timeout/drivers/scsi/scsi_scan.c 2003-08-25 11:24:02.000000000 +0200 @@ -271,6 +271,17 @@ */ static unsigned int max_report_luns = 511; +/* Some AChip ARC765 based DVD-ROM's take 15 or more seconds + * to reset. A scan will fail if made right after a reset. + * It's completely broken device behaviour: SCSI specification + * says devices need to be able to respond to INQUIRY always + * (after a selection timeout ... of 250ms). + */ +#ifdef __powerpc64__ +static unsigned int scsi_inq_timeout = SCSI_TIMEOUT/HZ+25; +#else +static unsigned int scsi_inq_timeout = SCSI_TIMEOUT/HZ+4; +#endif #ifdef MODULE @@ -299,6 +309,9 @@ MODULE_PARM_DESC(max_report_luns, "REPORT LUNS maximum number of LUNS received (should be" " between 1 and 16383)"); + +MODULE_PARM(scsi_inq_timeout, "i"); +MODULE_PARM_DESC(scsi_inq_timeout, "Timeout (in seconds) waiting for devices to answer INQUIRY. Default is 6. Some non-compliant devices need more."); #else static int __init scsi_luns_setup(char *str) @@ -433,6 +446,22 @@ __setup("max_report_luns=", scsi_max_reportluns_setup); +static int __init scsi_inq_timeout_setup(char *str) +{ + unsigned int tmp; + + if (get_option(&str, &tmp) == 1) { + scsi_inq_timeout = tmp; + return 1; + } else { + printk("scsi_inq_timeout_setup: usage scsi_inq_timeout=n " + "(n is in seconds and should be between 0 and 20)\n"); + return 0; + } +} + +__setup("scsi_inq_timeout=", scsi_inq_timeout_setup); + #endif static void print_inquiry(unsigned char *data) @@ -939,7 +967,7 @@ */ memset (scsi_result, 0, 256); - send_inquiry(SRpnt, scsi_result, inq_lun, SCSI_TIMEOUT+4*HZ, 36); + send_inquiry(SRpnt, scsi_result, inq_lun, HZ/2+scsi_inq_timeout*HZ, 36); /* * Now that we don't do TEST_UNIT_READY anymore, we must be prepared @@ -968,7 +996,7 @@ if (inq_len > 36 && ((unsigned char)scsi_result[2] & 0x7f) >= 3) send_inquiry(SRpnt, scsi_result, inq_lun, - SCSI_TIMEOUT+4*HZ, inq_len); + (1+scsi_inq_timeout)*HZ/2, inq_len); /* We don't care about the result, actually, if the first INQUIRY * has been successful. */