1141cc406Sopenharmony_ci#ifdef _AIX
2141cc406Sopenharmony_ci#include "../include/lalloca.h" /* MUST come first for AIX! */
3141cc406Sopenharmony_ci#endif
4141cc406Sopenharmony_ci#undef BACKEND_NAME
5141cc406Sopenharmony_ci#define BACKEND_NAME epson_scsi
6141cc406Sopenharmony_ci#include "../include/sane/config.h"
7141cc406Sopenharmony_ci#include "../include/sane/sanei_debug.h"
8141cc406Sopenharmony_ci#include "../include/sane/sanei_scsi.h"
9141cc406Sopenharmony_ci#include "epson_scsi.h"
10141cc406Sopenharmony_ci
11141cc406Sopenharmony_ci#include "../include/lalloca.h"
12141cc406Sopenharmony_ci
13141cc406Sopenharmony_ci#ifdef HAVE_STDDEF_H
14141cc406Sopenharmony_ci#include <stddef.h>
15141cc406Sopenharmony_ci#endif
16141cc406Sopenharmony_ci
17141cc406Sopenharmony_ci#ifdef HAVE_STDLIB_H
18141cc406Sopenharmony_ci#include <stdlib.h>
19141cc406Sopenharmony_ci#endif
20141cc406Sopenharmony_ci
21141cc406Sopenharmony_ci#ifdef NEED_SYS_TYPES_H
22141cc406Sopenharmony_ci#include <sys/types.h>
23141cc406Sopenharmony_ci#endif
24141cc406Sopenharmony_ci
25141cc406Sopenharmony_ci#include <string.h>             /* for memset and memcpy */
26141cc406Sopenharmony_ci#include <stdio.h>
27141cc406Sopenharmony_ci
28141cc406Sopenharmony_ci/*
29141cc406Sopenharmony_ci * sense handler for the sanei_scsi_XXX comands
30141cc406Sopenharmony_ci */
31141cc406Sopenharmony_ciSANE_Status
32141cc406Sopenharmony_cisanei_epson_scsi_sense_handler (int scsi_fd, u_char * result, void *arg)
33141cc406Sopenharmony_ci{
34141cc406Sopenharmony_ci  /* to get rid of warnings */
35141cc406Sopenharmony_ci  (void) scsi_fd;
36141cc406Sopenharmony_ci  (void) arg;
37141cc406Sopenharmony_ci
38141cc406Sopenharmony_ci  if (result[0] && result[0] != 0x70)
39141cc406Sopenharmony_ci  {
40141cc406Sopenharmony_ci    DBG (2, "sense_handler() : sense code = 0x%02x\n", result[0]);
41141cc406Sopenharmony_ci    return SANE_STATUS_IO_ERROR;
42141cc406Sopenharmony_ci  }
43141cc406Sopenharmony_ci  else
44141cc406Sopenharmony_ci  {
45141cc406Sopenharmony_ci    return SANE_STATUS_GOOD;
46141cc406Sopenharmony_ci  }
47141cc406Sopenharmony_ci}
48141cc406Sopenharmony_ci
49141cc406Sopenharmony_ci/*
50141cc406Sopenharmony_ci *
51141cc406Sopenharmony_ci *
52141cc406Sopenharmony_ci */
53141cc406Sopenharmony_ciSANE_Status
54141cc406Sopenharmony_cisanei_epson_scsi_inquiry (int fd, int page_code, void *buf, size_t * buf_size)
55141cc406Sopenharmony_ci{
56141cc406Sopenharmony_ci  u_char cmd[6];
57141cc406Sopenharmony_ci  int status;
58141cc406Sopenharmony_ci
59141cc406Sopenharmony_ci  memset (cmd, 0, 6);
60141cc406Sopenharmony_ci  cmd[0] = INQUIRY_COMMAND;
61141cc406Sopenharmony_ci  cmd[2] = page_code;
62141cc406Sopenharmony_ci  cmd[4] = *buf_size > 255 ? 255 : *buf_size;
63141cc406Sopenharmony_ci  status = sanei_scsi_cmd (fd, cmd, sizeof cmd, buf, buf_size);
64141cc406Sopenharmony_ci
65141cc406Sopenharmony_ci  return status;
66141cc406Sopenharmony_ci}
67141cc406Sopenharmony_ci
68141cc406Sopenharmony_ci/*
69141cc406Sopenharmony_ci *
70141cc406Sopenharmony_ci *
71141cc406Sopenharmony_ci */
72141cc406Sopenharmony_ciint
73141cc406Sopenharmony_cisanei_epson_scsi_read (int fd, void *buf, size_t buf_size,
74141cc406Sopenharmony_ci                       SANE_Status * status)
75141cc406Sopenharmony_ci{
76141cc406Sopenharmony_ci  u_char cmd[6];
77141cc406Sopenharmony_ci
78141cc406Sopenharmony_ci  memset (cmd, 0, 6);
79141cc406Sopenharmony_ci  cmd[0] = READ_6_COMMAND;
80141cc406Sopenharmony_ci  cmd[2] = buf_size >> 16;
81141cc406Sopenharmony_ci  cmd[3] = buf_size >> 8;
82141cc406Sopenharmony_ci  cmd[4] = buf_size;
83141cc406Sopenharmony_ci
84141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD ==
85141cc406Sopenharmony_ci      (*status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), buf, &buf_size)))
86141cc406Sopenharmony_ci    return buf_size;
87141cc406Sopenharmony_ci
88141cc406Sopenharmony_ci  return 0;
89141cc406Sopenharmony_ci}
90141cc406Sopenharmony_ci
91141cc406Sopenharmony_ci/*
92141cc406Sopenharmony_ci *
93141cc406Sopenharmony_ci *
94141cc406Sopenharmony_ci */
95141cc406Sopenharmony_ciint
96141cc406Sopenharmony_cisanei_epson_scsi_write (int fd, const void *buf, size_t buf_size,
97141cc406Sopenharmony_ci                        SANE_Status * status)
98141cc406Sopenharmony_ci{
99141cc406Sopenharmony_ci  u_char *cmd;
100141cc406Sopenharmony_ci
101141cc406Sopenharmony_ci  cmd = alloca (8 + buf_size);
102141cc406Sopenharmony_ci  memset (cmd, 0, 8);
103141cc406Sopenharmony_ci  cmd[0] = WRITE_6_COMMAND;
104141cc406Sopenharmony_ci  cmd[2] = buf_size >> 16;
105141cc406Sopenharmony_ci  cmd[3] = buf_size >> 8;
106141cc406Sopenharmony_ci  cmd[4] = buf_size;
107141cc406Sopenharmony_ci  memcpy (cmd + 8, buf, buf_size);
108141cc406Sopenharmony_ci
109141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD ==
110141cc406Sopenharmony_ci      (*status = sanei_scsi_cmd2 (fd, cmd, 6, cmd + 8, buf_size, NULL, NULL)))
111141cc406Sopenharmony_ci    return buf_size;
112141cc406Sopenharmony_ci
113141cc406Sopenharmony_ci  return 0;
114141cc406Sopenharmony_ci}
115