kopia lustrzana https://gitlab.com/sane-project/backends
OS/2 changes: Removed semaphore code and
increased MAX_DATA to 64k (from "Franz Bakan" <fbakan@gmx.net>). Henning Meier-Geinitz <henning@meier-geinitz.de>DEVEL_2_0_BRANCH-1
rodzic
99f4f0c4fc
commit
c91858cf87
|
@ -148,7 +148,6 @@
|
||||||
# define INCL_DOS
|
# define INCL_DOS
|
||||||
# define INCL_DOSDEVICES
|
# define INCL_DOSDEVICES
|
||||||
# define INCL_DOSDEVIOCTL
|
# define INCL_DOSDEVIOCTL
|
||||||
# define INCL_DOSSEMAPHORES
|
|
||||||
# define INCL_DOSMEMMGR
|
# define INCL_DOSMEMMGR
|
||||||
# include <os2.h>
|
# include <os2.h>
|
||||||
# include "os2_srb.h"
|
# include "os2_srb.h"
|
||||||
|
@ -237,6 +236,10 @@ static char lastrcmd[16]; /* hold command block of last read command */
|
||||||
# define MAX_DATA (128*1024)
|
# define MAX_DATA (128*1024)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if USE == OS2_INTERFACE
|
||||||
|
# define MAX_DATA (64*1024)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef MAX_DATA
|
#ifndef MAX_DATA
|
||||||
# define MAX_DATA (32*1024)
|
# define MAX_DATA (32*1024)
|
||||||
|
@ -440,7 +443,6 @@ KillDomainServer (void)
|
||||||
#if USE == OS2_INTERFACE
|
#if USE == OS2_INTERFACE
|
||||||
|
|
||||||
/* Driver info: */
|
/* Driver info: */
|
||||||
static HEV postSema = 0; /* Event Semaphore for posting SRB completion */
|
|
||||||
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 */
|
||||||
|
@ -464,7 +466,6 @@ open_aspi (void)
|
||||||
{
|
{
|
||||||
ULONG rc;
|
ULONG rc;
|
||||||
ULONG ActionTaken;
|
ULONG ActionTaken;
|
||||||
USHORT openSemaReturn;
|
|
||||||
USHORT lockSegmentReturn;
|
USHORT lockSegmentReturn;
|
||||||
unsigned long cbreturn;
|
unsigned long cbreturn;
|
||||||
unsigned long cbParam;
|
unsigned long cbParam;
|
||||||
|
@ -485,13 +486,11 @@ open_aspi (void)
|
||||||
aspi_ref_count++; /* increment internal usage counter */
|
aspi_ref_count++; /* increment internal usage counter */
|
||||||
return 1; /* Already open. */
|
return 1; /* Already open. */
|
||||||
}
|
}
|
||||||
rc = DosAllocMem (&aspi_buf, sanei_scsi_max_request_size,
|
aspi_buf = _tcalloc(sanei_scsi_max_request_size, 1);
|
||||||
OBJ_TILE | PAG_READ | PAG_WRITE | PAG_COMMIT);
|
if (aspi_buf == NULL)
|
||||||
if (rc)
|
{ DBG(1, "sanei_scsi_open_aspi: _tcalloc failed");
|
||||||
{
|
return 0;
|
||||||
DBG (1, "open_aspi: can't allocate memory\n");
|
}
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
rc = DosOpen ((PSZ) "aspirou$", /* open driver */
|
rc = DosOpen ((PSZ) "aspirou$", /* open driver */
|
||||||
&driver_handle,
|
&driver_handle,
|
||||||
&ActionTaken,
|
&ActionTaken,
|
||||||
|
@ -506,23 +505,6 @@ open_aspi (void)
|
||||||
DBG (1, "open_aspi: opening failed.\n");
|
DBG (1, "open_aspi: opening failed.\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
rc = DosCreateEventSem (NULL, &postSema, /* create event semaphore */
|
|
||||||
DC_SEM_SHARED, 0);
|
|
||||||
if (rc)
|
|
||||||
{
|
|
||||||
/* DosCreateEventSem failed */
|
|
||||||
DBG (1, "open_aspi: couldn't create semaphore.\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
rc = DosDevIOCtl (driver_handle, 0x92, 0x03, /* pass semaphore handle */
|
|
||||||
(void *) &postSema, sizeof (HEV), /* to driver */
|
|
||||||
&cbParam, (void *) &openSemaReturn,
|
|
||||||
sizeof (USHORT), &cbreturn);
|
|
||||||
if (rc || openSemaReturn)
|
|
||||||
{
|
|
||||||
DBG (1, "open_aspi: couldn't set semaphore.\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Lock aspi_buf. */
|
/* Lock aspi_buf. */
|
||||||
rc = DosDevIOCtl (driver_handle, 0x92, 0x04, /* pass aspi_buf pointer */
|
rc = DosDevIOCtl (driver_handle, 0x92, 0x04, /* pass aspi_buf pointer */
|
||||||
|
@ -532,7 +514,7 @@ open_aspi (void)
|
||||||
if (rc || lockSegmentReturn)
|
if (rc || lockSegmentReturn)
|
||||||
{
|
{
|
||||||
/* DosDevIOCtl failed */
|
/* DosDevIOCtl failed */
|
||||||
DBG (1, "open_aspi: Can't lock buffer.\n");
|
DBG (1, "sanei_scsi_open_aspi: Can't lock buffer. rc= %d \n",rc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,8 +620,6 @@ open_aspi (void)
|
||||||
rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
|
rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
|
||||||
(void *) &SRBlock, sizeof (SRB), &cbParam,
|
(void *) &SRBlock, sizeof (SRB), &cbParam,
|
||||||
(void *) &SRBlock, sizeof (SRB), &cbreturn);
|
(void *) &SRBlock, sizeof (SRB), &cbreturn);
|
||||||
DosWaitEventSem (postSema, -1);
|
|
||||||
DosResetEventSem (postSema, &rc);
|
|
||||||
len = ((char *) aspi_buf)[4]; /* additional length */
|
len = ((char *) aspi_buf)[4]; /* additional length */
|
||||||
|
|
||||||
/* query id string */
|
/* query id string */
|
||||||
|
@ -663,8 +643,6 @@ open_aspi (void)
|
||||||
rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
|
rc = DosDevIOCtl (driver_handle, 0x92, 0x02,
|
||||||
(void *) &SRBlock, sizeof (SRB), &cbParam,
|
(void *) &SRBlock, sizeof (SRB), &cbParam,
|
||||||
(void *) &SRBlock, sizeof (SRB), &cbreturn);
|
(void *) &SRBlock, sizeof (SRB), &cbreturn);
|
||||||
DosWaitEventSem (postSema, -1);
|
|
||||||
DosResetEventSem (postSema, &rc);
|
|
||||||
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);
|
||||||
|
@ -717,14 +695,11 @@ close_aspi (void)
|
||||||
if (aspi_ref_count)
|
if (aspi_ref_count)
|
||||||
return; /* wait for usage==0 */
|
return; /* wait for usage==0 */
|
||||||
|
|
||||||
if (postSema)
|
|
||||||
DosCloseEventSem (postSema); /* Close event semaphore. */
|
|
||||||
postSema = 0;
|
|
||||||
if (driver_handle) /* Close driver. */
|
if (driver_handle) /* Close driver. */
|
||||||
DosClose (driver_handle);
|
DosClose (driver_handle);
|
||||||
driver_handle = 0;
|
driver_handle = 0;
|
||||||
if (aspi_buf) /* Free buffer. */
|
if (aspi_buf) /* Free buffer. */
|
||||||
DosFreeMem (aspi_buf);
|
_tfree (aspi_buf);
|
||||||
aspi_buf = 0;
|
aspi_buf = 0;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
@ -3569,7 +3544,6 @@ sanei_scsi_cmd2 (int fd,
|
||||||
unsigned long cbreturn;
|
unsigned long cbreturn;
|
||||||
unsigned long cbParam;
|
unsigned long cbParam;
|
||||||
SRB srb; /* SCSI Request Block */
|
SRB srb; /* SCSI Request Block */
|
||||||
ULONG count = 0; /* For semaphore. */
|
|
||||||
/* xxx obsolete size_t cdb_size;
|
/* xxx obsolete size_t cdb_size;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -3587,12 +3561,14 @@ sanei_scsi_cmd2 (int fd,
|
||||||
/* xxx obsolete assert (cdb_size == src_size);
|
/* xxx obsolete assert (cdb_size == src_size);
|
||||||
*/
|
*/
|
||||||
srb.u.cmd.data_len = *dst_size;
|
srb.u.cmd.data_len = *dst_size;
|
||||||
|
DBG (1, "sanei_scsi_cmd: Reading srb.u.cmd.data_len= %lu\n",srb.u.cmd.data_len); /* fraba */
|
||||||
srb.flags |= SRB_Read;
|
srb.flags |= SRB_Read;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Writing. */
|
/* Writing. */
|
||||||
srb.u.cmd.data_len = src_size;
|
srb.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 */
|
||||||
/* xxx obsolete assert (cdb_size <= src_size);
|
/* xxx obsolete assert (cdb_size <= src_size);
|
||||||
*/
|
*/
|
||||||
assert (srb.u.cmd.data_len <= sanei_scsi_max_request_size);
|
assert (srb.u.cmd.data_len <= sanei_scsi_max_request_size);
|
||||||
|
@ -3615,13 +3591,7 @@ sanei_scsi_cmd2 (int fd,
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
DBG (1, "sanei_scsi_cmd: DosDevIOCtl failed.\n");
|
DBG (1, "sanei_scsi_cmd: DosDevIOCtl failed. rc= %d \n",rc);
|
||||||
return SANE_STATUS_IO_ERROR;
|
|
||||||
}
|
|
||||||
if (DosWaitEventSem (postSema, -1) || /* wait forever for sema. */
|
|
||||||
DosResetEventSem (postSema, &count)) /* reset semaphore. */
|
|
||||||
{
|
|
||||||
DBG (1, "sanei_scsi_cmd: semaphore failure.\n");
|
|
||||||
return SANE_STATUS_IO_ERROR;
|
return SANE_STATUS_IO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3637,9 +3607,17 @@ sanei_scsi_cmd2 (int fd,
|
||||||
if (srb.status != SRB_Done ||
|
if (srb.status != SRB_Done ||
|
||||||
srb.u.cmd.ha_status != SRB_NoError ||
|
srb.u.cmd.ha_status != SRB_NoError ||
|
||||||
srb.u.cmd.target_status != SRB_NoStatus) {
|
srb.u.cmd.target_status != SRB_NoStatus) {
|
||||||
DBG (1, "sanei_scsi_cmd: command 0x%02x failed.\n", srb.u.cmd.cdb_st[0]);
|
DBG (1, "sanei_scsi_cmd: command 0x%02x failed.\n"
|
||||||
|
"srb.status= 0x%02x\n"
|
||||||
|
"srb.u.chm.ha_status= 0x%02x\n"
|
||||||
|
"srb.u.cmd.target_status= 0x%02x\n",
|
||||||
|
srb.u.cmd.cdb_st[0],
|
||||||
|
srb.status,
|
||||||
|
srb.u.cmd.ha_status,
|
||||||
|
srb.u.cmd.target_status);
|
||||||
return SANE_STATUS_IO_ERROR;
|
return SANE_STATUS_IO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dst_size && *dst_size) /* Reading? */
|
if (dst_size && *dst_size) /* Reading? */
|
||||||
memcpy ((char *) dst, aspi_buf, *dst_size);
|
memcpy ((char *) dst, aspi_buf, *dst_size);
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
|
|
Ładowanie…
Reference in New Issue