OS/2 specific changes: memory for SRB now is allocated using _tcalloc()

instead of allocating on stack to avoid crossing 64k borders due to
restrictions of 16-bit device-driver.  Cosmetic changes and some casts to
reduce compiler-warnings. Patch from Franz Bakan <fbakan@gmx.net>.
merge-requests/1/head
Henning Geinitz 2003-03-16 11:04:19 +00:00
rodzic 86a3214291
commit 293a629d7c
2 zmienionych plików z 146 dodań i 127 usunięć

Wyświetl plik

@ -1,3 +1,11 @@
2003-03-16 Henning Meier-Geinitz <henning@meier-geinitz.de>
* sanei/sanei_scsi.c: OS/2 specific changes: memory for SRB now is
allocated using _tcalloc() instead of allocating on stack to avoid
crossing 64k borders due to restrictions of 16-bit device-driver.
Cosmetic changes and some casts to reduce compiler-warnings. Patch
from Franz Bakan <fbakan@gmx.net>.
2003-03-10 Oliver Schirrmeister <oschirr@abm.de> 2003-03-10 Oliver Schirrmeister <oschirr@abm.de>
* backend/fujitsu.c backund/fujitsu-scsi.h backend/fujitsu.h * backend/fujitsu.c backund/fujitsu-scsi.h backend/fujitsu.h

Wyświetl plik

@ -452,6 +452,7 @@ KillDomainServer (void)
static HFILE driver_handle = 0; /* file handle for device driver */ static HFILE driver_handle = 0; /* file handle for device driver */
static PVOID aspi_buf = 0; /* Big data buffer locked by driver. */ static PVOID aspi_buf = 0; /* Big data buffer locked by driver. */
static int aspi_ref_count = 0; /* # of fds using ASPI */ static int aspi_ref_count = 0; /* # of fds using ASPI */
static SRB *PSRBlock = 0; /* SCSI Request Block */
static char tmpAspi[MAXPATHLEN]; /* scsi chain scan */ static char tmpAspi[MAXPATHLEN]; /* scsi chain scan */
#define INQUIRY 0x12 #define INQUIRY 0x12
#define set_inquiry_return_size(icb,val) icb[0x04]=val #define set_inquiry_return_size(icb,val) icb[0x04]=val
@ -473,10 +474,8 @@ open_aspi (void)
ULONG rc; ULONG rc;
ULONG ActionTaken; ULONG ActionTaken;
USHORT lockSegmentReturn; USHORT lockSegmentReturn;
unsigned long cbreturn; unsigned long cbreturn = 0;
unsigned long cbParam; unsigned long cbParam = 0;
SRB SRBlock; /* SCSI Request Block */
int i, num_adapters; /* no. of scsi adapters installed */ int i, num_adapters; /* no. of scsi adapters installed */
char *devtypes[] = char *devtypes[] =
@ -494,9 +493,16 @@ open_aspi (void)
} }
aspi_buf = _tcalloc(sanei_scsi_max_request_size, 1); aspi_buf = _tcalloc(sanei_scsi_max_request_size, 1);
if (aspi_buf == NULL) if (aspi_buf == NULL)
{ DBG(1, "sanei_scsi_open_aspi: _tcalloc failed"); { DBG(1, "sanei_scsi_open_aspi: _tcalloc aspi_buf failed");
return 0; return 0;
} }
PSRBlock = _tcalloc(sizeof(SRB), 1);
if (PSRBlock == NULL)
{ DBG(1, "sanei_scsi_open_aspi: _tcalloc PSRBlock failed");
return 0;
}
rc = DosOpen ((PSZ) "aspirou$", /* open driver */ rc = DosOpen ((PSZ) "aspirou$", /* open driver */
&driver_handle, &driver_handle,
&ActionTaken, &ActionTaken,
@ -520,27 +526,27 @@ open_aspi (void)
if (rc || lockSegmentReturn) if (rc || lockSegmentReturn)
{ {
/* DosDevIOCtl failed */ /* DosDevIOCtl failed */
DBG (1, "sanei_scsi_open_aspi: Can't lock buffer. rc= %d \n",rc); DBG (1, "sanei_scsi_open_aspi: Can't lock buffer. rc= %lu \n",rc);
return 0; return 0;
} }
/* query number of installed adapters */ /* query number of installed adapters */
memset (&SRBlock, 0, sizeof (SRBlock)); memset (PSRBlock, 0, sizeof (SRB));
SRBlock.cmd = SRB_Inquiry; /* host adapter inquiry */ PSRBlock->cmd = SRB_Inquiry; /* host adapter inquiry */
SRBlock.ha_num = 0; /* host adapter number */ PSRBlock->ha_num = 0; /* host adapter number */
SRBlock.flags = 0; /* no flags set */ PSRBlock->flags = 0; /* no flags set */
rc = DosDevIOCtl (driver_handle, 0x92, 0x02, rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
(void *) &SRBlock, sizeof (SRB), &cbParam, (void *) PSRBlock, sizeof (SRB), &cbParam,
(void *) &SRBlock, sizeof (SRB), &cbreturn); (void *) PSRBlock, sizeof (SRB), &cbreturn);
num_adapters = SRBlock.u.inq.num_ha; num_adapters = PSRBlock->u.inq.num_ha;
DBG (1, "OS/2: installed adapters %d\n", num_adapters); DBG (1, "OS/2: installed adapters %d\n", num_adapters);
DBG (1, "OS/2: ASPI manager is '%s'\n", SRBlock.u.inq.aspimgr_id); DBG (1, "OS/2: ASPI manager is '%s'\n", PSRBlock->u.inq.aspimgr_id);
DBG (1, "OS/2: host adapter is '%s'\n", SRBlock.u.inq.host_id); DBG (1, "OS/2: host adapter is '%s'\n", PSRBlock->u.inq.host_id);
DBG (1, "OS/2: unique id is '%s'\n", SRBlock.u.inq.unique_id); DBG (1, "OS/2: unique id is '%s'\n", PSRBlock->u.inq.unique_id);
strcpy (tmpAspi, "asXXXXXX"); strcpy (tmpAspi, "asXXXXXX");
mktemp (tmpAspi); mktemp (tmpAspi);
@ -558,97 +564,97 @@ open_aspi (void)
{ {
int id; int id;
/* query adapter name */ /* query adapter name */
memset (&SRBlock, 0, sizeof (SRBlock)); memset (PSRBlock, 0, sizeof (SRB));
SRBlock.cmd = SRB_Inquiry; /* host adapter inquiry */ PSRBlock->cmd = SRB_Inquiry; /* host adapter inquiry */
SRBlock.ha_num = i; /* host adapter number */ PSRBlock->ha_num = i; /* host adapter number */
SRBlock.flags = 0; /* no flags set */ PSRBlock->flags = 0; /* no flags set */
rc = DosDevIOCtl (driver_handle, 0x92, 0x02, rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
(void *) &SRBlock, sizeof (SRB), &cbParam, (void *) PSRBlock, sizeof (SRB), &cbParam,
(void *) &SRBlock, sizeof (SRB), &cbreturn); (void *) PSRBlock, sizeof (SRB), &cbreturn);
DBG (1, "OS/2: adapter#%02d '%s'\n", i, SRBlock.u.inq.host_id); DBG (1, "OS/2: adapter#%02d '%s'\n", i, PSRBlock->u.inq.host_id);
/* scan scsi chain (need 15 for wide?) */ /* scan scsi chain (need 15 for wide?) */
for (id = 0; id < 7; id++) for (id = 0; id < 7; id++)
{ {
unsigned char len; unsigned char len;
unsigned char vendor[9]; char vendor[9];
unsigned char product[17]; char product[17];
unsigned char version[5]; char version[5];
unsigned char *pp; char *pp;
memset (&SRBlock, 0, sizeof (SRBlock)); memset (PSRBlock, 0, sizeof (SRB));
SRBlock.cmd = SRB_Device; /* get device type */ PSRBlock->cmd = SRB_Device; /* get device type */
SRBlock.ha_num = i; /* host adapter number */ PSRBlock->ha_num = i; /* host adapter number */
SRBlock.flags = 0; /* no flags set */ PSRBlock->flags = 0; /* no flags set */
SRBlock.u.dev.target = id; /* target id */ PSRBlock->u.dev.target = id; /* target id */
SRBlock.u.dev.lun = 0; /* target LUN */ PSRBlock->u.dev.lun = 0; /* target LUN */
rc = DosDevIOCtl (driver_handle, 0x92, 0x02, rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
(void *) &SRBlock, sizeof (SRB), &cbParam, (void *) PSRBlock, sizeof (SRB), &cbParam,
(void *) &SRBlock, sizeof (SRB), &cbreturn); (void *) PSRBlock, sizeof (SRB), &cbreturn);
DBG (1, "OS/2: id#%02d status=%02xh\n", DBG (1, "OS/2: id#%02d status=%02xh\n",
id, SRBlock.status); id, PSRBlock->status);
/* skip if device not connected */ /* skip if device not connected */
if (SRBlock.status == SRB_BadDevice) if (PSRBlock->status == SRB_BadDevice)
continue; continue;
DBG (1, "OS/2: type is '%s'\n", DBG (1, "OS/2: type is '%s'\n",
SRBlock.u.dev.devtype < sizeof (devtypes) / sizeof (char *)? PSRBlock->u.dev.devtype < sizeof (devtypes) / sizeof (char *)?
devtypes[SRBlock.u.dev.devtype] : "unknown device"); devtypes[PSRBlock->u.dev.devtype] : "unknown device");
/* query adapter string id */ /* query adapter string id */
memset (&SRBlock, 0, sizeof (SRBlock)); memset (PSRBlock, 0, sizeof (SRB));
SRBlock.cmd = SRB_Command; /* execute SCSI command */ PSRBlock->cmd = SRB_Command; /* execute SCSI command */
SRBlock.ha_num = i; /* host adapter number */ PSRBlock->ha_num = i; /* host adapter number */
SRBlock.flags = SRB_Read | SRB_Post; /* data transfer, posting */ PSRBlock->flags = SRB_Read | SRB_Post; /* data transfer, posting */
SRBlock.u.cmd.target = id; /* Target SCSI ID */ PSRBlock->u.cmd.target = id; /* Target SCSI ID */
SRBlock.u.cmd.lun = 0; /* Target SCSI LUN */ PSRBlock->u.cmd.lun = 0; /* Target SCSI LUN */
SRBlock.u.cmd.data_len = 5; /* # of bytes transferred */ PSRBlock->u.cmd.data_len = 5; /* # of bytes transferred */
SRBlock.u.cmd.sense_len = 16; /* length of sense buffer */ PSRBlock->u.cmd.sense_len = 32; /* length of sense buffer */
SRBlock.u.cmd.data_ptr = NULL; /* pointer to data buffer */ PSRBlock->u.cmd.data_ptr = NULL; /* pointer to data buffer */
SRBlock.u.cmd.link_ptr = NULL; /* pointer to next SRB */ PSRBlock->u.cmd.link_ptr = NULL; /* pointer to next SRB */
SRBlock.u.cmd.cdb_len = 6; /* SCSI command length */ PSRBlock->u.cmd.cdb_len = 6; /* SCSI command length */
SRBlock.u.cmd.cdb_st[0] = INQUIRY; /* inquiry command */ PSRBlock->u.cmd.cdb_st[0] = INQUIRY; /* inquiry command */
SRBlock.u.cmd.cdb_st[1] = 0; /* ?? length */ PSRBlock->u.cmd.cdb_st[1] = 0; /* ?? length */
SRBlock.u.cmd.cdb_st[2] = 0; /* transfer length MSB */ PSRBlock->u.cmd.cdb_st[2] = 0; /* transfer length MSB */
SRBlock.u.cmd.cdb_st[3] = 0; /* transfer length */ PSRBlock->u.cmd.cdb_st[3] = 0; /* transfer length */
SRBlock.u.cmd.cdb_st[4] = 5; /* transfer length LSB */ PSRBlock->u.cmd.cdb_st[4] = 5; /* transfer length LSB */
SRBlock.u.cmd.cdb_st[5] = 0; PSRBlock->u.cmd.cdb_st[5] = 0;
rc = DosDevIOCtl (driver_handle, 0x92, 0x02, rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
(void *) &SRBlock, sizeof (SRB), &cbParam, (void *) PSRBlock, sizeof (SRB), &cbParam,
(void *) &SRBlock, sizeof (SRB), &cbreturn); (void *) PSRBlock, sizeof (SRB), &cbreturn);
len = ((char *) aspi_buf)[4]; /* additional length */ len = ((char *) aspi_buf)[4]; /* additional length */
/* query id string */ /* query id string */
memset (&SRBlock, 0, sizeof (SRBlock)); memset (PSRBlock, 0, sizeof (SRB));
SRBlock.cmd = SRB_Command; /* execute SCSI command */ PSRBlock->cmd = SRB_Command; /* execute SCSI command */
SRBlock.ha_num = i; /* host adapter number */ PSRBlock->ha_num = i; /* host adapter number */
SRBlock.flags = SRB_Read | SRB_Post; /* data transfer, posting */ PSRBlock->flags = SRB_Read | SRB_Post; /* data transfer, posting */
SRBlock.u.cmd.target = id; /* Target SCSI ID */ PSRBlock->u.cmd.target = id; /* Target SCSI ID */
SRBlock.u.cmd.lun = 0; /* Target SCSI LUN */ PSRBlock->u.cmd.lun = 0; /* Target SCSI LUN */
SRBlock.u.cmd.data_len = 5 + len; /* # of bytes transferred */ PSRBlock->u.cmd.data_len = 5 + len; /* # of bytes transferred */
SRBlock.u.cmd.sense_len = 16; /* length of sense buffer */ PSRBlock->u.cmd.sense_len = 32; /* length of sense buffer */
SRBlock.u.cmd.data_ptr = NULL; /* pointer to data buffer */ PSRBlock->u.cmd.data_ptr = NULL; /* pointer to data buffer */
SRBlock.u.cmd.link_ptr = NULL; /* pointer to next SRB */ PSRBlock->u.cmd.link_ptr = NULL; /* pointer to next SRB */
SRBlock.u.cmd.cdb_len = 6; /* SCSI command length */ PSRBlock->u.cmd.cdb_len = 6; /* SCSI command length */
SRBlock.u.cmd.cdb_st[0] = 0x12; /* inquiry command */ PSRBlock->u.cmd.cdb_st[0] = 0x12; /* inquiry command */
SRBlock.u.cmd.cdb_st[1] = 0; /* ?? length */ PSRBlock->u.cmd.cdb_st[1] = 0; /* ?? length */
SRBlock.u.cmd.cdb_st[2] = 0; /* transfer length MSB */ PSRBlock->u.cmd.cdb_st[2] = 0; /* transfer length MSB */
SRBlock.u.cmd.cdb_st[3] = 0; /* transfer length */ PSRBlock->u.cmd.cdb_st[3] = 0; /* transfer length */
SRBlock.u.cmd.cdb_st[4] = 5 + len; /* transfer length LSB */ PSRBlock->u.cmd.cdb_st[4] = 5 + len; /* transfer length LSB */
SRBlock.u.cmd.cdb_st[5] = 0; PSRBlock->u.cmd.cdb_st[5] = 0;
rc = DosDevIOCtl (driver_handle, 0x92, 0x02, rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
(void *) &SRBlock, sizeof (SRB), &cbParam, (void *) PSRBlock, sizeof (SRB), &cbParam,
(void *) &SRBlock, sizeof (SRB), &cbreturn); (void *) PSRBlock, sizeof (SRB), &cbreturn);
DBG (1, "OS/2 '%s'\n", (char *) aspi_buf + 8); DBG (1, "OS/2 '%s'\n", (char *) aspi_buf + 8);
/* write data */ /* write data */
get_inquiry_vendor ((char *) aspi_buf, vendor); get_inquiry_vendor ((char *) aspi_buf, vendor);
@ -668,7 +674,7 @@ open_aspi (void)
pp = product; pp = product;
do do
{ {
if (isspace (*pp)) if (isspace ((int) *pp))
*pp = '_'; *pp = '_';
} }
while (*++pp); while (*++pp);
@ -708,6 +714,10 @@ close_aspi (void)
_tfree (aspi_buf); _tfree (aspi_buf);
aspi_buf = 0; aspi_buf = 0;
if (PSRBlock)
_tfree (PSRBlock);
PSRBlock = 0;
errno = 0; errno = 0;
if (unlink (tmpAspi)) /* remove scsi descriptions */ if (unlink (tmpAspi)) /* remove scsi descriptions */
DBG( 2, "OS/2: error#%d while removing temporary '%s'\n", errno, tmpAspi); DBG( 2, "OS/2: error#%d while removing temporary '%s'\n", errno, tmpAspi);
@ -852,7 +862,7 @@ sanei_scsi_open (const char *dev, int *fdp,
#endif #endif
#if USE == OS2_INTERFACE #if USE == OS2_INTERFACE
if (sscanf (dev, "b%dt%dl%d", &bus, &target, &lun) != 3) if (sscanf (dev, "b%ut%ul%u", &bus, &target, &lun) != 3)
{ {
DBG (1, "sanei_scsi_open: device name %s is not valid\n", dev); DBG (1, "sanei_scsi_open: device name %s is not valid\n", dev);
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
@ -3606,7 +3616,7 @@ sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
{ {
strncpy (param[i].u.str, string, 32); strncpy (param[i].u.str, string, 32);
param[i].u.str[31] = '\0'; param[i].u.str[31] = '\0';
while (*string && !isspace (*string)) while (*string && !isspace ((int) *string))
++string; ++string;
} }
string = sanei_config_skip_whitespace (string); string = sanei_config_skip_whitespace (string);
@ -3658,9 +3668,6 @@ sanei_scsi_cmd2 (int fd,
ULONG rc; /* Returns. */ ULONG rc; /* Returns. */
unsigned long cbreturn; unsigned long cbreturn;
unsigned long cbParam; unsigned long cbParam;
SRB srb; /* SCSI Request Block */
/* xxx obsolete size_t cdb_size;
*/
if (aspi_buf == NULL) /* avoid SIGSEGV in memcpy() when calling if (aspi_buf == NULL) /* avoid SIGSEGV in memcpy() when calling
sanei_scsi_cmd2() while aspi-driver is closed */ sanei_scsi_cmd2() while aspi-driver is closed */
{ {
@ -3668,74 +3675,78 @@ sanei_scsi_cmd2 (int fd,
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
memset ((char *) &srb, 0, sizeof (srb)); /* Okay, I'm paranoid. */ if (PSRBlock == NULL) /* avoid SIGSEGV in memcpy() when calling
/* xxx obsolete cdb_size = CDB_SIZE (*(u_char *) src);*/ /* Size of command block. */ sanei_scsi_cmd2() while aspi-driver is closed */
srb.cmd = SRB_Command; /* execute SCSI cmd */ {
srb.ha_num = fd_info[fd].bus; /* host adapter number */ DBG (1, "sanei_scsi_cmd: Error no device (PSRBlock == NULL)\n");
srb.u.cmd.target = fd_info[fd].target; /* Target SCSI ID */ return SANE_STATUS_INVAL;
srb.u.cmd.lun = fd_info[fd].lun; /* Target SCSI LUN */ }
srb.flags = SRB_Post; /* posting enabled */
memset (PSRBlock, 0, sizeof (SRB)); /* Okay, I'm paranoid. */
PSRBlock->cmd = SRB_Command; /* execute SCSI cmd */
PSRBlock->ha_num = fd_info[fd].bus; /* host adapter number */
PSRBlock->u.cmd.target = fd_info[fd].target; /* Target SCSI ID */
PSRBlock->u.cmd.lun = fd_info[fd].lun; /* Target SCSI LUN */
PSRBlock->flags = SRB_Post; /* posting enabled */
if (dst_size && *dst_size) if (dst_size && *dst_size)
{ {
/* Reading. */ /* Reading. */
assert (*dst_size <= sanei_scsi_max_request_size); assert (*dst_size <= (size_t) sanei_scsi_max_request_size);
/* xxx obsolete assert (cdb_size == src_size); PSRBlock->u.cmd.data_len = *dst_size;
*/ DBG (1, "sanei_scsi_cmd: Reading PSRBlock->u.cmd.data_len= %lu\n",
srb.u.cmd.data_len = *dst_size; PSRBlock->u.cmd.data_len);
DBG (1, "sanei_scsi_cmd: Reading srb.u.cmd.data_len= %lu\n",srb.u.cmd.data_len); /* fraba */ PSRBlock->flags |= SRB_Read;
srb.flags |= SRB_Read;
} }
else else
{ {
/* Writing. */ /* Writing. */
srb.u.cmd.data_len = src_size; PSRBlock->u.cmd.data_len = src_size;
DBG (1, "sanei_scsi_cmd: Writing srb.u.cmd.data_len= %lu\n",srb.u.cmd.data_len); /* fraba */ DBG (1, "sanei_scsi_cmd: Writing PSRBlock->u.cmd.data_len= %lu\n",
/* xxx obsolete assert (cdb_size <= src_size); PSRBlock->u.cmd.data_len);
*/ assert (PSRBlock->u.cmd.data_len <= (unsigned long) sanei_scsi_max_request_size);
assert (srb.u.cmd.data_len <= sanei_scsi_max_request_size); if (PSRBlock->u.cmd.data_len)
if (srb.u.cmd.data_len) PSRBlock->flags |= SRB_Write;
srb.flags |= SRB_Write;
else else
srb.flags |= SRB_NoTransfer; PSRBlock->flags |= SRB_NoTransfer;
memcpy (aspi_buf, (char *) src, srb.u.cmd.data_len); memcpy (aspi_buf, src, PSRBlock->u.cmd.data_len);
} }
srb.u.cmd.sense_len = 16; /* length of sense buffer */ PSRBlock->u.cmd.sense_len = 32; /* length of sense buffer */
srb.u.cmd.data_ptr = NULL; /* pointer to data buffer already registered */ PSRBlock->u.cmd.data_ptr = NULL; /* pointer to data buffer already registered */
srb.u.cmd.link_ptr = NULL; /* pointer to next SRB */ PSRBlock->u.cmd.link_ptr = NULL; /* pointer to next SRB */
srb.u.cmd.cdb_len = cmd_size; /* SCSI command length */ PSRBlock->u.cmd.cdb_len = cmd_size; /* SCSI command length */
memcpy (&srb.u.cmd.cdb_st[0], (char *) cmd, cmd_size); memcpy (PSRBlock->u.cmd.cdb_st, cmd, cmd_size);
/* Do the command. */ /* Do the command. */
rc = DosDevIOCtl (driver_handle, 0x92, 0x02, (void *) &srb, rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
sizeof (SRB), &cbParam, (void *) PSRBlock, sizeof (SRB), &cbParam,
(void *) &srb, sizeof (SRB), &cbreturn); (void *) PSRBlock, sizeof (SRB), &cbreturn);
if (rc) if (rc)
{ {
DBG (1, "sanei_scsi_cmd: DosDevIOCtl failed. rc= %d \n",rc); DBG (1, "sanei_scsi_cmd: DosDevIOCtl failed. rc= %lu \n",rc);
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }
/* Get sense data if available. */ /* Get sense data if available. */
if ((srb.status == SRB_Aborted || srb.status == SRB_Error) && if ((PSRBlock->status == SRB_Aborted || PSRBlock->status == SRB_Error) &&
srb.u.cmd.target_status == SRB_CheckStatus PSRBlock->u.cmd.target_status == SRB_CheckStatus
&& fd_info[fd].sense_handler != 0) && fd_info[fd].sense_handler != 0)
{ {
SANEI_SCSI_Sense_Handler s_handler = fd_info[fd].sense_handler; SANEI_SCSI_Sense_Handler s_handler = fd_info[fd].sense_handler;
return (*s_handler) (fd, &srb.u.cmd.cdb_st[cmd_size], return (*s_handler) (fd, &PSRBlock->u.cmd.cdb_st[cmd_size],
fd_info[fd].sense_handler_arg); fd_info[fd].sense_handler_arg);
} }
if (srb.status != SRB_Done || if (PSRBlock->status != SRB_Done ||
srb.u.cmd.ha_status != SRB_NoError || PSRBlock->u.cmd.ha_status != SRB_NoError ||
srb.u.cmd.target_status != SRB_NoStatus) { PSRBlock->u.cmd.target_status != SRB_NoStatus) {
DBG (1, "sanei_scsi_cmd: command 0x%02x failed.\n" DBG (1, "sanei_scsi_cmd: command 0x%02x failed.\n"
"srb.status= 0x%02x\n" "PSRBlock->status= 0x%02x\n"
"srb.u.chm.ha_status= 0x%02x\n" "PSRBlock->u.chm.ha_status= 0x%02x\n"
"srb.u.cmd.target_status= 0x%02x\n", "PSRBlock->u.cmd.target_status= 0x%02x\n",
srb.u.cmd.cdb_st[0], PSRBlock->u.cmd.cdb_st[0],
srb.status, PSRBlock->status,
srb.u.cmd.ha_status, PSRBlock->u.cmd.ha_status,
srb.u.cmd.target_status); PSRBlock->u.cmd.target_status);
return SANE_STATUS_IO_ERROR; return SANE_STATUS_IO_ERROR;
} }