Redo when TEST UNIT READY failed

Redo when read returns with 0 bytes (non-SCSI only)
merge-requests/1/head
Peter Kirchgessner 2003-10-09 19:34:57 +00:00
rodzic 3e5bec5925
commit 2549e5bf8c
1 zmienionych plików z 56 dodań i 18 usunięć

Wyświetl plik

@ -42,6 +42,15 @@
HP Scanner Control Language (SCL).
*/
/*
$Log$
Revision 1.12 2003/10/09 19:34:57 kig-guest
Redo when TEST UNIT READY failed
Redo when read returns with 0 bytes (non-SCSI only)
*/
/*
#define STUBS
extern int sanei_debug_hp;*/
@ -166,32 +175,52 @@ hp_nonscsi_read (HpScsi this, hp_byte_t *data, size_t *len, HpConnect connect,
int UNUSEDARG isResponse)
{int n = -1;
static int retries = -1;
size_t save_len = *len;
SANE_Status status = SANE_STATUS_GOOD;
if (*len <= 0) return SANE_STATUS_GOOD;
switch (connect)
if (retries < 0) /* Read environment */
{char *eptr = getenv ("SANE_HP_RDREDO");
retries = 1; /* Set default value */
if (eptr != NULL)
{
if (sscanf (eptr, "%d", &retries) != 1) retries = 1; /* Restore default */
else if (retries < 0) retries = 0; /* Allow no retries here */
}
}
for (;;) /* Retry on EOF */
{
case HP_CONNECT_DEVICE:
n = read (this->fd, data, *len);
break;
switch (connect)
{
case HP_CONNECT_DEVICE:
n = read (this->fd, data, *len);
break;
case HP_CONNECT_PIO:
n = sanei_pio_read (this->fd, data, *len);
break;
case HP_CONNECT_PIO:
n = sanei_pio_read (this->fd, data, *len);
break;
case HP_CONNECT_USB:
status = sanei_usb_read_bulk ((SANE_Int)this->fd, (SANE_Byte *)data, len);
n = *len;
break;
case HP_CONNECT_USB:
status = sanei_usb_read_bulk((SANE_Int)this->fd, (SANE_Byte *)data, len);
n = *len;
break;
case HP_CONNECT_RESERVE:
n = -1;
break;
case HP_CONNECT_RESERVE:
n = -1;
break;
default:
n = -1;
break;
default:
n = -1;
break;
}
if ((n != 0) || (retries <= 0)) break;
retries--;
usleep (100*1000); /* sleep 0.1 seconds */
*len = save_len; /* Restore value */
}
if (n == 0) return SANE_STATUS_EOF;
@ -386,13 +415,22 @@ sanei_hp_scsi_new (HpScsi * newp, const char * devname)
DBG(3, "vendor=%s, model=%s, rev=%s\n", vendor, model, rev);
}
DBG(3, "scsi_new: sending TEST_UNIT_READY\n");
status = sanei_scsi_cmd(new->fd, tur_cmd, 6, 0, 0);
if (FAILED(status))
{
DBG(1, "hp_scsi_open: test unit ready failed (%s)\n",
sane_strstatus(status));
usleep (500*1000); /* Wait 0.5 seconds */
DBG(3, "scsi_new: sending TEST_UNIT_READY second time\n");
status = sanei_scsi_cmd(new->fd, tur_cmd, 6, 0, 0);
}
if (FAILED(status))
{
DBG(1, "hp_scsi_open: test unit ready failed (%s)\n",
sane_strstatus(status));
sanei_scsi_close(new->fd);
sanei_hp_free(new);
return status; /* Fix problem with non-scanner devices */