sanei/sanei_scci.c doc/sanei-scsi.man:

default timeout for SCSI commmands is now 120 seconds; added
the environment variable SANE_SCSICMD_TIMEOUT to override
the default value.

Abel
DEVEL_2_0_BRANCH-1
Abel Deuring 2002-09-04 22:13:44 +00:00
rodzic 45bf928a3c
commit 9659512302
2 zmienionych plików z 36 dodań i 20 usunięć

Wyświetl plik

@ -303,6 +303,11 @@ variable controls the debug level for the generic SCSI I/O subsystem. E.g., a
value of 128 requests all debug output to be printed by the backend. A value value of 128 requests all debug output to be printed by the backend. A value
of 255 also prints kernel messages from the SCSI subsystem (where available). of 255 also prints kernel messages from the SCSI subsystem (where available).
Smaller levels reduce verbosity. Smaller levels reduce verbosity.
.TP
.B SANE_SCSICMD_TIMEOUT
sets the timeout value for SCSI commands in seconds. Overriding the default
value of 120 seconds should only be necessary for very slow scanners.
.SH "SEE ALSO" .SH "SEE ALSO"
sane(7), sane\-find\-scanner(1), sane\-"backendname"(5), sane\-usb(5) sane(7), sane\-find\-scanner(1), sane\-"backendname"(5), sane\-usb(5)
.SH AUTHOR .SH AUTHOR

Wyświetl plik

@ -77,9 +77,6 @@
#define SCO_UW71_INTERFACE 15 #define SCO_UW71_INTERFACE 15
#define SOLARIS_USCSI_INTERFACE 16 #define SOLARIS_USCSI_INTERFACE 16
/* time out for SCSI commands in seconds */
#define SANE_SCSICMD_TIMEOUT 60
#if defined (HAVE_SCSI_SG_H) #if defined (HAVE_SCSI_SG_H)
# define USE LINUX_INTERFACE # define USE LINUX_INTERFACE
# include <scsi/sg.h> # include <scsi/sg.h>
@ -248,6 +245,8 @@ static char lastrcmd[16]; /* hold command block of last read command */
# define MAX_DATA (32*1024) # define MAX_DATA (32*1024)
#endif #endif
/* default timeout value: 120 seconds */
static int sane_scsicmd_timeout = 120;
int sanei_scsi_max_request_size = MAX_DATA; int sanei_scsi_max_request_size = MAX_DATA;
#if USE == LINUX_INTERFACE #if USE == LINUX_INTERFACE
/* the following #defines follow Douglas Gilbert's sample code /* the following #defines follow Douglas Gilbert's sample code
@ -790,19 +789,32 @@ sanei_scsi_open (const char *dev, int *fdp,
u_int bus = 0, target = 0, lun = 0, fake_fd = 0; u_int bus = 0, target = 0, lun = 0, fake_fd = 0;
char *real_dev = 0; char *real_dev = 0;
void *pdata = 0; void *pdata = 0;
int fd; char *cc, *cc1;
int fd, i;
#if USE == LINUX_INTERFACE #if USE == LINUX_INTERFACE
static int first_time = 1; static int first_time = 1;
#endif #endif
cc = getenv("SANE_SCSICMD_TIMEOUT");
if (cc)
{
i = strtol(cc, &cc1, 10);
/* 20 minutes are hopefully enough as a timeout value ;) */
if (cc != cc1 && i > 0 && i <= 1200)
{
sane_scsicmd_timeout = i;
}
else
{
DBG(1, "sanei_scsi_open: timeout value must be between 1 and 1200 seconds\n");
}
}
DBG_INIT (); DBG_INIT ();
#if USE == LINUX_INTERFACE #if USE == LINUX_INTERFACE
if (first_time) if (first_time)
{ {
char *cc, *cc1;
int i;
first_time = 0; first_time = 0;
/* Try to determine a reliable value for sanei_scsi_max_request_size: /* Try to determine a reliable value for sanei_scsi_max_request_size:
@ -1137,7 +1149,7 @@ sanei_scsi_open (const char *dev, int *fdp,
disconnect... ;-( */ disconnect... ;-( */
{ {
int timeout; int timeout;
timeout = SANE_SCSICMD_TIMEOUT * HZ; /* how about 1 minute? ;-) */ timeout = sane_scsicmd_timeout * HZ;
ioctl (fd, SG_SET_TIMEOUT, &timeout); ioctl (fd, SG_SET_TIMEOUT, &timeout);
} }
#endif #endif
@ -1962,8 +1974,7 @@ sanei_scsi_req_enter2 (int fd,
memcpy(req->sgdata.sg3.data, cmd, cmd_size); memcpy(req->sgdata.sg3.data, cmd, cmd_size);
(const void*) req->sgdata.sg3.hdr.cmdp = req->sgdata.sg3.data; (const void*) req->sgdata.sg3.hdr.cmdp = req->sgdata.sg3.data;
req->sgdata.sg3.hdr.sbp = &(req->sgdata.sg3.sense_buffer[0]); req->sgdata.sg3.hdr.sbp = &(req->sgdata.sg3.sense_buffer[0]);
/* 1 minute should be ok even for slow scanners */ req->sgdata.sg3.hdr.timeout = 1000 * sane_scsicmd_timeout;
req->sgdata.sg3.hdr.timeout = 1000 * SANE_SCSICMD_TIMEOUT;
#ifdef ENABLE_SCSI_DIRECTIO #ifdef ENABLE_SCSI_DIRECTIO
/* for the adventurous: If direct IO is used, /* for the adventurous: If direct IO is used,
the kernel locks the buffer. This can lead to conflicts, the kernel locks the buffer. This can lead to conflicts,
@ -2654,7 +2665,7 @@ sanei_scsi_cmd2 (int fd,
hdr.databuf = (char *) src; hdr.databuf = (char *) src;
hdr.datalen = src_size; hdr.datalen = src_size;
} }
hdr.timeout = SANE_SCSICMD_TIMEOUT * 1000; /* 1 minute timeout */ hdr.timeout = sane_scsicmd_timeout * 1000;
hdr.cmdlen = cmd_size; hdr.cmdlen = cmd_size;
hdr.senselen = sizeof (hdr.sense); hdr.senselen = sizeof (hdr.sense);
@ -2753,7 +2764,7 @@ SANE_Status sanei_scsi_cmd2(int fd,
/* dxfer_len */ data_len, /* dxfer_len */ data_len,
/* sense_len */ SSD_FULL_SIZE, /* sense_len */ SSD_FULL_SIZE,
/* cdb_len */ cmd_size, /* cdb_len */ cmd_size,
/* timeout */ SANE_SCSICMD_TIMEOUT * 1000); /* timeout */ sane_scsicmd_timeout * 1000);
/* Run the command */ /* Run the command */
errno = 0; errno = 0;
@ -2984,7 +2995,7 @@ sanei_scsi_cmd2 (int fd,
hdr.data_length = src_size; hdr.data_length = src_size;
} }
hdr.cdb_length = cmd_size; hdr.cdb_length = cmd_size;
hdr.max_msecs = SANE_SCSICMD_TIMEOUT * 1000; /* 1 minute timeout */ hdr.max_msecs = sane_scsicmd_timeout * 1000;
if (ioctl (fd, SIOC_IO, &hdr) < 0) if (ioctl (fd, SIOC_IO, &hdr) < 0)
{ {
DBG (1, "sanei_scsi_cmd: ioctl(SIOC_IO) failed: %s\n", DBG (1, "sanei_scsi_cmd: ioctl(SIOC_IO) failed: %s\n",
@ -3038,7 +3049,7 @@ sanei_scsi_cmd2 (int fd,
hdr.sr_addr = (char *) src; hdr.sr_addr = (char *) src;
hdr.sr_dma_max = src_size; hdr.sr_dma_max = src_size;
} }
hdr.sr_ioto = SANE_SCSICMD_TIMEOUT; /* I/O timeout in seconds */ hdr.sr_ioto = sane_scsicmd_timeout;
if (ioctl (fd, SGIOCREQ, &hdr) == -1) if (ioctl (fd, SGIOCREQ, &hdr) == -1)
{ {
@ -3072,7 +3083,7 @@ sanei_scsi_cmd2 (int fd,
sr.sr_dma_dir = SR_DMA_RD; sr.sr_dma_dir = SR_DMA_RD;
sr.sr_addr = (char*) &sense_reply; sr.sr_addr = (char*) &sense_reply;
sr.sr_dma_max = sizeof (struct esense_reply); sr.sr_dma_max = sizeof (struct esense_reply);
sr.sr_ioto = SANE_SCSICMD_TIMEOUT; sr.sr_ioto = sane_scsicmd_timeout;
sr.sr_cdb_length = 6; sr.sr_cdb_length = 6;
ioctl (fd, SGIOCREQ, &sr); ioctl (fd, SGIOCREQ, &sr);
@ -3141,7 +3152,7 @@ sanei_scsi_cmd2 (int fd,
ccb.cam_data_ptr = (u_char *) src; ccb.cam_data_ptr = (u_char *) src;
ccb.cam_dxfer_len = src_size; ccb.cam_dxfer_len = src_size;
} }
ccb.cam_timeout = SANE_SCSICMD_TIMEOUT; /* set timeout in seconds */ ccb.cam_timeout = sane_scsicmd_timeout;
ccb.cam_cdb_len = cmd_size; ccb.cam_cdb_len = cmd_size;
memcpy (&ccb.cam_cdb_io.cam_cdb_bytes[0], cmd, cmd_size); memcpy (&ccb.cam_cdb_io.cam_cdb_bytes[0], cmd, cmd_size);
@ -3323,7 +3334,7 @@ sanei_scsi_cmd2 (int fd,
sb_ptr->SCB.sc_mode = SCB_READ; sb_ptr->SCB.sc_mode = SCB_READ;
} }
} }
sb_ptr->SCB.sc_time = SANE_SCSICMD_TIMEOUT * 1000; /* 1 min timeout */ sb_ptr->SCB.sc_time = sane_scsicmd_timeout * 1000;
DBG(1, "sanei_scsi_cmd: sc_mode = %d, sc_cmdsz = %d, sc_datasz = %d\n", DBG(1, "sanei_scsi_cmd: sc_mode = %d, sc_cmdsz = %d, sc_datasz = %d\n",
sb_ptr->SCB.sc_mode, sb_ptr->SCB.sc_cmdsz, sb_ptr->SCB.sc_datasz); sb_ptr->SCB.sc_mode, sb_ptr->SCB.sc_cmdsz, sb_ptr->SCB.sc_datasz);
{ {
@ -3998,7 +4009,7 @@ sanei_scsi_cmd2 (int fd,
} }
scmd.cdb = (char *) cmd; scmd.cdb = (char *) cmd;
scmd.cdblen = cmd_size; scmd.cdblen = cmd_size;
scmd.timeval = SANE_SCSICMD_TIMEOUT; /* 1 minute timeout */ scmd.timeval = sane_scsicmd_timeout;
scmd.sense_buf = sense_buf; scmd.sense_buf = sense_buf;
scmd.senselen = sizeof (sense_buf); scmd.senselen = sizeof (sense_buf);
scmd.statusp = &status; scmd.statusp = &status;
@ -4088,7 +4099,7 @@ sanei_scsi_cmd2 (int fd,
#ifndef SC_BUSY #ifndef SC_BUSY
# define SC_BUSY 0x08 # define SC_BUSY 0x08
#endif #endif
#define DEF_TIMEOUT SANE_SCSICMD_TIMEOUT; /* 1 minute */ #define DEF_TIMEOUT sane_scsicmd_timeout;
/* Choosing one of the following DEF_SCG_FLG's SCG_DISRE_ENA allows /* Choosing one of the following DEF_SCG_FLG's SCG_DISRE_ENA allows
the SCSI driver to disconnect/reconnect. SCG_CMD_RETRY allows a the SCSI driver to disconnect/reconnect. SCG_CMD_RETRY allows a
@ -4238,7 +4249,7 @@ unit_ready (int fd)
#if USE == SOLARIS_USCSI_INTERFACE #if USE == SOLARIS_USCSI_INTERFACE
#define DEF_TIMEOUT SANE_SCSICMD_TIMEOUT; /* 1 minute */ #define DEF_TIMEOUT sane_scsicmd_timeout;
static int d_errs = 100; static int d_errs = 100;
typedef struct scsi_extended_sense extended_sense_t; typedef struct scsi_extended_sense extended_sense_t;