abel deuring wrote:
>
> SANE_Status sanei_scsi_req_enter2 (int fd,
> const void * cmd, size_t cmd_size,
> const void * src, size_t src_size,
> void * dst, size_t * dst_size,
> void **idp);
>
> SANE_Status sanei_scsi_cmd2 (int fd,
> const void * cmd, size_t cmd_size,
> const void * src, size_t src_size,
> void * dst, size_t * dst_size);
>
> These functions would work like sanei_scsi_req_enter and sanei_scsi_cmd,
> except that *src now contains only the "real data" to be sent to the
> device, while *cmd contains the SCSI command.
>
> I could write an implementation for Linux during the next days, but I
> would like to hear if there are other things missing. And of course it
> does not make very much sense to write only the Linux part...
ok, attached are diff outputs against sane-1.0.2 for sanei/sanei_scsi.c,
include/sane/sanei_scsi.h, backend/canon-scsi.c and backend/sharp.c.
The modifications introduce the functions
SANE_Status sanei_scsi_req_enter2 (int fd,
const void * cmd, size_t cmd_size,
const void * src, size_t src_size,
void * dst, size_t * dst_size,
void **idp)
SANE_Status sanei_scsi_req_cmd2 (int fd,
const void * cmd, size_t cmd_size,
const void * src, size_t src_size,
void * dst, size_t * dst_size)
Because the SCSI command block and the data to be written to the device
are now in different locations, there is no longer the need to guess the
command length. This should avoid the need to patch the Linux kernel in
order to use Canon scanners.
I changed these functions for _all_ operating systems. But since I am
not able to test these changes except for Linux, and since I donīt want
to mess up Saneīs SCSI library, I did not upload them to the CVS
server.
But of course I would appreciate tests of the modified SCSI library for
the different OSes. Because the old functions sanei_scsi_cmd and
sanei_scsi_req_enter now call the new functions sanei_scsi_cmd2 resp.
sanei_scsi_enter2, every backend for a SCSI scanner can be used for
these tests.
The patch for canon-scsi.c uses the new function sanei_scsi_cmd2, where
the vendor specfic SCSI commands are called. I am not sure, if I got the
changes to the three affected functions (define_scan_mode,
get_scan_mode, set_adf_mode) right, especially in define_scan_mode. I
donīt have a Canon scanner at hand, so it is possible that the actual
patch even makes things worse...
The patch to the Sharp backend simply replaces sanei_scsi_cmd with
sanei_scsi_cmd2 at a few points. It doesnīt introduce any new
functionality, but should simply show, that the new function actually
works.
The part "#if USE == BSD_INTERFACE" of sanei_scsi.c contains in line
2288 a comment, where I did not understand the original source: The size
of the data block (without the SCSI command block) to be send to the
device was src_size, not src_size - cdb_size, so that the kernel might
read past the end of the data, in my understanding. Whatsoever, my
changes declare a shorter data block, so either I fixed a bug, or I
introduced one.
Regarding the part "#if USE == OPENSTEP", starting at line 2484, it
seems that the Openstep SG driver (or hoewever it is called) must guess
the length of the SCSI command: There was and is not statement that sets
something like "hdr.sr_cdb_size". Is that correct? If it is, is there a
need to set the CDB length for vendor specific commands?
Abel
-- Source code, list archive, and docs: http://www.mostang.com/sane/ To unsubscribe: echo unsubscribe sane-devel | mail majordomo@mostang.com
This archive was generated by hypermail 2b29 : Sun May 07 2000 - 11:44:26 PDT