1 /* @(#)scsitransp.h 1.54 03/05/03 Copyright 1995 J. Schilling */ 2 /* 3 * Definitions for commands that use functions from scsitransp.c 4 * 5 * Copyright (c) 1995 J. Schilling 6 */ 7 /* 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2, or (at your option) 11 * any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License along with 19 * this program; see the file COPYING. If not, write to the Free Software 20 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 21 */ 22 23 #ifndef _SCG_SCSITRANSP_H 24 #define _SCG_SCSITRANSP_H 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 typedef struct scg_scsi SCSI; 31 32 typedef struct { 33 int scsibus; /* SCSI bus # for next I/O */ 34 int target; /* SCSI target # for next I/O */ 35 int lun; /* SCSI lun # for next I/O */ 36 } scg_addr_t; 37 38 #ifndef _SCG_SCGOPS_H 39 #include <scg/scgops.h> 40 #endif 41 42 typedef int (*scg_cb_t) __PR((void *)); 43 44 struct scg_scsi { 45 scg_ops_t *ops; /* Ptr to low level SCSI transport ops */ 46 int fd; /* File descriptor for next I/O */ 47 scg_addr_t addr; /* SCSI address for next I/O */ 48 int flags; /* Libscg flags (see below) */ 49 int dflags; /* Drive specific flags (see below) */ 50 int kdebug; /* Kernel debug value for next I/O */ 51 int debug; /* Debug value for SCSI library */ 52 int silent; /* Be silent if value > 0 */ 53 int verbose; /* Be verbose if value > 0 */ 54 int overbose; /* Be verbose in open() if value > 0 */ 55 int disre_disable; 56 int deftimeout; 57 int noparity; /* Do not use SCSI parity fo next I/O */ 58 int dev; /* from scsi_cdr.c */ 59 struct scg_cmd *scmd; 60 char *cmdname; 61 char *curcmdname; 62 BOOL running; 63 int error; /* libscg error number */ 64 65 long maxdma; /* Max DMA limit for this open instance */ 66 long maxbuf; /* Cur DMA buffer limit for this inst. */ 67 /* This is the size behind bufptr */ 68 struct timeval *cmdstart; 69 struct timeval *cmdstop; 70 const char **nonstderrs; 71 void *local; /* Local data from the low level code */ 72 void *bufbase; /* needed for scsi_freebuf() */ 73 void *bufptr; /* DMA buffer pointer for appl. use */ 74 char *errstr; /* Error string for scsi_open/sendmcd */ 75 char *errbeg; /* Pointer to begin of not flushed data */ 76 char *errptr; /* Actual write pointer into errstr */ 77 void *errfile; /* FILE to write errors to. NULL for not*/ 78 /* writing and leaving errs in errstr */ 79 scg_cb_t cb_fun; 80 void *cb_arg; 81 82 struct scsi_inquiry *inq; 83 struct scsi_capacity *cap; 84 }; 85 86 /* 87 * Macros for accessing members of the scg address structure. 88 * scg_settarget() is the only function that is allowed to modify 89 * the values of the SCSI address. 90 */ 91 #define scg_scsibus(scgp) (scgp)->addr.scsibus 92 #define scg_target(scgp) (scgp)->addr.target 93 #define scg_lun(scgp) (scgp)->addr.lun 94 95 /* 96 * Flags for struct SCSI: 97 */ 98 /* NONE yet */ 99 100 /* 101 * Drive specific flags for struct SCSI: 102 */ 103 #define DRF_MODE_DMA_OVR 0x0001 /* Drive gives DMA overrun */ 104 /* on mode sense */ 105 106 #define SCSI_ERRSTR_SIZE 4096 107 108 /* 109 * Libscg error codes: 110 */ 111 #define SCG_ERRBASE 1000000 112 #define SCG_NOMEM 1000001 113 114 /* 115 * Function codes for scg_version(): 116 */ 117 #define SCG_VERSION 0 /* libscg or transport version */ 118 #define SCG_AUTHOR 1 /* Author of above */ 119 #define SCG_SCCS_ID 2 /* SCCS id of above */ 120 #define SCG_RVERSION 10 /* Remote transport version */ 121 #define SCG_RAUTHOR 11 /* Remote transport author */ 122 #define SCG_RSCCS_ID 12 /* Remote transport SCCS ID */ 123 #define SCG_KVERSION 20 /* Kernel transport version */ 124 125 /* 126 * Function codes for scg_reset(): 127 */ 128 #define SCG_RESET_NOP 0 /* Test if reset is supported */ 129 #define SCG_RESET_TGT 1 /* Reset Target only */ 130 #define SCG_RESET_BUS 2 /* Reset complete SCSI Bus */ 131 132 /* 133 * Helpers for the error buffer in SCSI* 134 */ 135 #define scg_errsize(scgp) ((scgp)->errptr - (scgp)->errstr) 136 #define scg_errrsize(scgp) (SCSI_ERRSTR_SIZE - scg_errsize(scgp)) 137 138 /* 139 * From scsitransp.c: 140 */ 141 extern char *scg_version __PR((SCSI *scgp, int what)); 142 extern int scg__open __PR((SCSI *scgp, char *device)); 143 extern int scg__close __PR((SCSI *scgp)); 144 extern BOOL scg_havebus __PR((SCSI *scgp, int)); 145 extern int scg_initiator_id __PR((SCSI *scgp)); 146 extern int scg_isatapi __PR((SCSI *scgp)); 147 extern int scg_reset __PR((SCSI *scgp, int what)); 148 extern void *scg_getbuf __PR((SCSI *scgp, long)); 149 extern void scg_freebuf __PR((SCSI *scgp)); 150 extern long scg_bufsize __PR((SCSI *scgp, long)); 151 extern void scg_setnonstderrs __PR((SCSI *scgp, const char **)); 152 extern BOOL scg_yes __PR((char *)); 153 extern int scg_cmd __PR((SCSI *scgp)); 154 extern void scg_vhead __PR((SCSI *scgp)); 155 extern int scg_svhead __PR((SCSI *scgp, char *buf, int maxcnt)); 156 extern int scg_vtail __PR((SCSI *scgp)); 157 extern int scg_svtail __PR((SCSI *scgp, int *retp, char *buf, int maxcnt)); 158 extern void scg_vsetup __PR((SCSI *scgp)); 159 extern int scg_getresid __PR((SCSI *scgp)); 160 extern int scg_getdmacnt __PR((SCSI *scgp)); 161 extern BOOL scg_cmd_err __PR((SCSI *scgp)); 162 extern void scg_printerr __PR((SCSI *scgp)); 163 #ifdef EOF /* stdio.h has been included */ 164 extern void scg_fprinterr __PR((SCSI *scgp, FILE *f)); 165 #endif 166 extern int scg_sprinterr __PR((SCSI *scgp, char *buf, int maxcnt)); 167 extern int scg__sprinterr __PR((SCSI *scgp, char *buf, int maxcnt)); 168 extern void scg_printcdb __PR((SCSI *scgp)); 169 extern int scg_sprintcdb __PR((SCSI *scgp, char *buf, int maxcnt)); 170 extern void scg_printwdata __PR((SCSI *scgp)); 171 extern int scg_sprintwdata __PR((SCSI *scgp, char *buf, int maxcnt)); 172 extern void scg_printrdata __PR((SCSI *scgp)); 173 extern int scg_sprintrdata __PR((SCSI *scgp, char *buf, int maxcnt)); 174 extern void scg_printresult __PR((SCSI *scgp)); 175 extern int scg_sprintresult __PR((SCSI *scgp, char *buf, int maxcnt)); 176 extern void scg_printstatus __PR((SCSI *scgp)); 177 extern int scg_sprintstatus __PR((SCSI *scgp, char *buf, int maxcnt)); 178 #ifdef EOF /* stdio.h has been included */ 179 extern void scg_fprbytes __PR((FILE *, char *, unsigned char *, int)); 180 extern void scg_fprascii __PR((FILE *, char *, unsigned char *, int)); 181 #endif 182 extern void scg_prbytes __PR((char *, unsigned char *, int)); 183 extern void scg_prascii __PR((char *, unsigned char *, int)); 184 extern int scg_sprbytes __PR((char *buf, int maxcnt, char *, unsigned char *, int)); 185 extern int scg_sprascii __PR((char *buf, int maxcnt, char *, unsigned char *, int)); 186 #ifdef EOF /* stdio.h has been included */ 187 extern void scg_fprsense __PR((FILE *f, unsigned char *, int)); 188 #endif 189 extern void scg_prsense __PR((unsigned char *, int)); 190 extern int scg_sprsense __PR((char *buf, int maxcnt, unsigned char *, int)); 191 extern int scg_cmd_status __PR((SCSI *scgp)); 192 extern int scg_sense_key __PR((SCSI *scgp)); 193 extern int scg_sense_code __PR((SCSI *scgp)); 194 extern int scg_sense_qual __PR((SCSI *scgp)); 195 #ifdef _SCG_SCSIREG_H 196 #ifdef EOF /* stdio.h has been included */ 197 extern void scg_fprintdev __PR((FILE *, struct scsi_inquiry *)); 198 #endif 199 extern void scg_printdev __PR((struct scsi_inquiry *)); 200 #endif 201 extern int scg_printf __PR((SCSI *scgp, const char *form, ...)); 202 extern int scg_errflush __PR((SCSI *scgp)); 203 #ifdef EOF /* stdio.h has been included */ 204 extern int scg_errfflush __PR((SCSI *scgp, FILE *f)); 205 #endif 206 207 /* 208 * From scsierrmsg.c: 209 */ 210 extern const char *scg_sensemsg __PR((int, int, int, 211 const char **, char *, int maxcnt)); 212 #ifdef _SCG_SCSISENSE_H 213 extern int scg__errmsg __PR((SCSI *scgp, char *obuf, int maxcnt, 214 struct scsi_sense *, 215 struct scsi_status *, 216 int)); 217 #endif 218 219 /* 220 * From scsiopen.c: 221 */ 222 #ifdef EOF /* stdio.h has been included */ 223 extern int scg_help __PR((FILE *f)); 224 #endif 225 extern SCSI *scg_open __PR((char *scsidev, char *errs, int slen, int odebug, int be_verbose)); 226 extern int scg_close __PR((SCSI * scgp)); 227 extern void scg_settimeout __PR((SCSI * scgp, int timeout)); 228 extern SCSI *scg_smalloc __PR((void)); 229 extern void scg_sfree __PR((SCSI *scgp)); 230 231 /* 232 * From scgsettarget.c: 233 */ 234 extern int scg_settarget __PR((SCSI *scgp, int scsibus, int target, int lun)); 235 236 /* 237 * From scsi-remote.c: 238 */ 239 extern scg_ops_t *scg_remote __PR((void)); 240 241 /* 242 * From scsihelp.c: 243 */ 244 #ifdef EOF /* stdio.h has been included */ 245 extern void __scg_help __PR((FILE *f, char *name, char *tcomment, 246 char *tind, 247 char *tspec, 248 char *texample, 249 BOOL mayscan, 250 BOOL bydev)); 251 #endif 252 253 #ifdef __cplusplus 254 } 255 #endif 256 257 #endif /* _SCG_SCSITRANSP_H */ 258