summaryrefslogtreecommitdiff
path: root/include/sane/sanei_scsi.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/sane/sanei_scsi.h')
-rw-r--r--include/sane/sanei_scsi.h329
1 files changed, 329 insertions, 0 deletions
diff --git a/include/sane/sanei_scsi.h b/include/sane/sanei_scsi.h
new file mode 100644
index 0000000..d69fd0f
--- /dev/null
+++ b/include/sane/sanei_scsi.h
@@ -0,0 +1,329 @@
+/* sane - Scanner Access Now Easy.
+ Copyright (C) 1996, 1997 David Mosberger-Tang
+ This file is part of the SANE package.
+
+ SANE is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ SANE is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with sane; see the file COPYING. If not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice.
+*/
+
+/** @file sanei_scsi.h
+ * Generic interface to SCSI drivers.
+ * @sa sanei_usb.h, sanei_ab306.h,sanei_lm983x.h, sanei_pa4s2.h, sanei_pio.h,
+ * and man sane-scsi(5) for user-oriented documentation
+ */
+
+#ifndef sanei_scsi_h
+#define sanei_scsi_h
+
+#include <sys/types.h>
+
+#include <sane/sane.h>
+#include <sane/config.h>
+
+/** Sense handler
+ *
+ * The sense handler can be implemented in backends. It's for deciding
+ * which sense codes should be considered an error and which shouldn't.
+ *
+ * @param fd file descriptor
+ * @param sense_buffer pointer to buffer containing sense codes
+ * @param arg pointer to data buffer
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success (sense isn't regarded as error)
+ * - any other status if sense code is regarded as error
+ */
+typedef SANE_Status (*SANEI_SCSI_Sense_Handler) (int fd,
+ u_char *sense_buffer,
+ void *arg);
+/** Maximum size of a SCSI request
+ */
+extern int sanei_scsi_max_request_size;
+
+/** Find SCSI devices.
+ *
+ * Find each SCSI device that matches the pattern specified by the
+ * arguments. String arguments can be "omitted" by passing NULL,
+ * integer arguments can be "omitted" by passing -1.
+ *
+ * Example: vendor="HP" model=NULL, type=NULL, bus=3, id=-1, lun=-1 would
+ * attach all HP devices on SCSI bus 3.
+ *
+ * @param vendor
+ * @param model
+ * @param type
+ * @param bus
+ * @param channel
+ * @param id
+ * @param lun
+ * @param attach callback invoked once for each device, dev is the real devicename (passed to attach callback)
+ *
+ */
+extern void sanei_scsi_find_devices (const char *vendor, const char *model,
+ const char *type,
+ int bus, int channel, int id, int lun,
+ SANE_Status (*attach) (const char *dev));
+
+
+/** Open a SCSI device
+ *
+ * Opens a SCSI device by its device filename and returns a file descriptor.
+ * If it's necessary to adjust the SCSI buffer size, use
+ * sanei_scsi_open_extended().
+ *
+ * @param device_name name of the devicefile, e.g. "/dev/sg0"
+ * @param fd file descriptor
+ * @param sense_handler called whenever the SCSI driver returns a sense buffer
+ * @param sense_arg pointer to data for the sense handler
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_ACCESS_DENIED - if the file couldn't be accessed due to
+ * permissions
+ * - SANE_STATUS_NO_MEM - if malloc failed (not enough memory)
+ * - SANE_STATUS_INVAL - if the filename was invalid or an unknown error occured
+ *
+ * @sa sanei_scsi_open_extended(), HAVE_SANEI_SCSI_OPEN_EXTENDED
+ */
+extern SANE_Status sanei_scsi_open (const char * device_name, int * fd,
+ SANEI_SCSI_Sense_Handler sense_handler,
+ void *sense_arg);
+
+/** Open a SCSI device and set the buffer size
+ *
+ * The extended open call allows a backend to ask for a specific buffer
+ * size. sanei_scsi_open_extended() tries to allocate a buffer of the size
+ * given by *buffersize upon entry to this function. If
+ * sanei_scsi_open_extended returns successfully, *buffersize contains the
+ * available buffer size. This value may be both smaller or larger than the
+ * value requested by the backend; it can even be zero. The backend must
+ * decide, if it got enough buffer memory to work.
+ *
+ * Note that the value of *buffersize may differ for different files.
+ *
+ * @param device_name name of the devicefile, e.g. "/dev/sg0"
+ * @param fd file descriptor
+ * @param sense_handler called whenever the SCSI driver returns a sense buffer
+ * @param sense_arg pointer to data for the sense handler
+ * @param buffersize size of the SCAI request buffer (in bytes)
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_ACCESS_DENIED - if the file couldn't be accessed due to
+ * permissions
+ * - SANE_STATUS_NO_MEM - if malloc failed (not enough memory)
+ * - SANE_STATUS_INVAL - if the filename was invalid or an unknown error occured
+ *
+ * @sa sanei_scsi_open(), HAVE_SANEI_SCSI_OPEN_EXTENDED
+ */
+extern SANE_Status sanei_scsi_open_extended (
+ const char * device_name, int * fd,
+ SANEI_SCSI_Sense_Handler sense_handler,
+ void *sense_arg, int *buffersize);
+
+/** Do we have sanei_scsi_open_extended()?
+ *
+ * Let backends decide, which open call to use: if
+ * HAVE_SANEI_SCSI_OPEN_EXTENDED is defined, sanei_scsi_open_extended may be
+ * used. May also be used to decide, if sanei_scsi_req_flush_all or
+ * sanei_scsi_req_flush_all_extended() should be used.
+ *
+ * @sa sanei_scsi_open(), sanei_scsi_open_extended()
+*/
+#define HAVE_SANEI_SCSI_OPEN_EXTENDED
+
+/** Enqueue SCSI command
+ *
+ * One or more scsi commands can be enqueued by calling sanei_scsi_req_enter().
+ *
+ * NOTE: Some systems may not support multiple outstanding commands. On such
+ * systems, sanei_scsi_req_enter() may block. In other words, it is not proper
+ * to assume that enter() is a non-blocking routine.
+ *
+ * @param fd file descriptor
+ * @param src pointer to the SCSI command and associated write data (if any)
+ * @param src_size length of the command and data
+ * @param dst pointer to a buffer in which data is returned; NULL if no data is
+ * returned
+ * @param dst_size on input, the size of the buffer pointed to by dst, on exit,
+ * set to the number of bytes returned in the buffer (which is less than or equal
+ * to the buffer size; may be NULL if no data is expected
+ * @param idp pointer to a void* that uniquely identifies the entered request
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_IO_ERROR - if an error was received from the SCSI driver
+ * - SANE_STATUS_NO_MEM - if malloc failed (not enough memory)
+ * - SANE_STATUS_INVAL - if a locking or an unknown error occured
+ * @sa sanei_scsi_req_enter2()
+ *
+*/
+extern SANE_Status sanei_scsi_req_enter (int fd,
+ const void * src, size_t src_size,
+ void * dst, size_t * dst_size,
+ void **idp);
+
+/** Enqueue SCSI command and separated data
+ *
+ * Same as sanei_scsi_req_enter(), but with separate buffers for the SCSI
+ * command and for the data to be sent to the device.
+ *
+ * With sanei_scsi_req_enter(), the length of te SCSI command block must be
+ * guessed. While that works in most cases, Canon scanners for example use the
+ * vendor specific commands 0xd4, 0xd5 and 0xd6. The Canon scanners want to
+ * get 6 byte command blocks for these commands, but sanei_scsi_req_enter() and
+ * sanei_scsi_cmd() send 12 bytes.
+ *
+ * If dst_size and *dst_size are non-zero, a "read command" (ie, data transfer
+ * from the device to the host) is assumed.
+ *
+ * @param fd file descriptor
+ * @param cmd pointer to SCSI command
+ * @param cmd_size size of the command
+ * @param src pointer to the buffer with data to be sent to the scanner
+ * @param src_size size of src buffer
+ * @param dst pointer to a buffer in which data is returned; NULL if no data is
+ * returned
+ * @param dst_size on input, the size of the buffer pointed to by dst, on exit,
+ * set to the number of bytes returned in the buffer (which is less than or equal
+ * to the buffer size; may be NULL if no data is expected
+ * @param idp pointer to a void* that uniquely identifies the entered request
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_IO_ERROR - if an error was received from the SCSI driver
+ * - SANE_STATUS_NO_MEM - if malloc failed (not enough memory)
+ * - SANE_STATUS_INVAL - if a locking or an unknown error occured
+ * @sa sanei_scsi_req_enter()
+ */
+extern 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);
+
+/** Wait for SCSI command
+ *
+ * Wait for the completion of the SCSI command with id ID.
+ *
+ * @param id id used in sanei_scsi_req_enter()
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_DEVICE_BUSY - if the device is busy (try again later)
+ * - SANE_STATUS_IO_ERROR - if an error was received from the SCSI driver
+*/
+extern SANE_Status sanei_scsi_req_wait (void *id);
+
+/** Send SCSI command
+ *
+ * This is a convenience function that is equivalent to a pair of
+ * sanei_scsi_req_enter()/sanei_scsi_req_wait() calls.
+ *
+ * @param fd file descriptor
+ * @param src pointer to the SCSI command and associated write data (if any)
+ * @param src_size length of the command and data
+ * @param dst pointer to a buffer in which data is returned; NULL if no data is
+ * returned
+ * @param dst_size on input, the size of the buffer pointed to by dst, on exit,
+ * set to the number of bytes returned in the buffer (which is less than or equal
+ * to the buffer size; may be NULL if no data is expected
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_IO_ERROR - if an error was received from the SCSI driver
+ * - SANE_STATUS_NO_MEM - if malloc failed (not enough memory)
+ * - SANE_STATUS_INVAL - if a locking or an unknown error occured
+ *
+ * @sa sanei_scsi_cmd2(), sanei_scsi_req_enter(), sanei_scsi_req_wait()
+ */
+extern SANE_Status sanei_scsi_cmd (int fd,
+ const void * src, size_t src_size,
+ void * dst, size_t * dst_size);
+
+/** Send SCSI command and separated data
+ *
+ * This is a convenience function that is equivalent to a pair of
+ * sanei_scsi_req_enter2()/sanei_scsi_req_wait() calls.
+ *
+ * @param fd file descriptor
+ * @param cmd pointer to SCSI command
+ * @param cmd_size size of the command
+ * @param src pointer to the buffer with data to be sent to the scanner
+ * @param src_size size of src buffer
+ * @param dst pointer to a buffer in which data is returned; NULL if no data is
+ * returned
+ * @param dst_size on input, the size of the buffer pointed to by dst, on exit,
+ * set to the number of bytes returned in the buffer (which is less than or equal
+ * to the buffer size; may be NULL if no data is expected
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_IO_ERROR - if an error was received from the SCSI driver
+ * - SANE_STATUS_NO_MEM - if malloc failed (not enough memory)
+ * - SANE_STATUS_INVAL - if a locking or an unknown error occured
+ *
+ * @sa sanei_scsi_cmd(), sanei_scsi_req_enter(), sanei_scsi_req_wait()
+ */
+extern 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);
+
+/** Flush queue
+ *
+ * Flush all pending SCSI commands. This function work only, if zero or one
+ * SCSI file handles are open.
+ *
+ * @sa sanei_scsi_req_flush_all_extended()
+*/
+extern void sanei_scsi_req_flush_all (void);
+
+/** Flush queue for handle
+ *
+ * Flush all SCSI commands pending for one handle
+ *
+ * @param fd file descriptor
+ *
+ * @sa sanei_scsi_req_flush_all()
+ */
+extern void sanei_scsi_req_flush_all_extended (int fd);
+
+/** Close a SCSI device
+ *
+ * @param fd file descriptor
+ *
+ */
+extern void sanei_scsi_close (int fd);
+
+#endif /* sanei_scsi_h */