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