xref: /onnv-gate/usr/src/lib/scsi/libscsi/common/libscsi.h (revision 12126:60364f3f65c7)
16316Seschrock /*
26316Seschrock  * CDDL HEADER START
36316Seschrock  *
46316Seschrock  * The contents of this file are subject to the terms of the
56316Seschrock  * Common Development and Distribution License (the "License").
66316Seschrock  * You may not use this file except in compliance with the License.
76316Seschrock  *
86316Seschrock  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96316Seschrock  * or http://www.opensolaris.org/os/licensing.
106316Seschrock  * See the License for the specific language governing permissions
116316Seschrock  * and limitations under the License.
126316Seschrock  *
136316Seschrock  * When distributing Covered Code, include this CDDL HEADER in each
146316Seschrock  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156316Seschrock  * If applicable, add the following below this CDDL HEADER, with the
166316Seschrock  * fields enclosed by brackets "[]" replaced with your own identifying
176316Seschrock  * information: Portions Copyright [yyyy] [name of copyright owner]
186316Seschrock  *
196316Seschrock  * CDDL HEADER END
206316Seschrock  */
216316Seschrock 
226316Seschrock /*
23*12126SHyon.Kim@Sun.COM  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
246316Seschrock  */
256316Seschrock 
266316Seschrock #ifndef	_LIBSCSI_H
276316Seschrock #define	_LIBSCSI_H
286316Seschrock 
296316Seschrock #ifdef	__cplusplus
306316Seschrock extern "C" {
316316Seschrock #endif
326316Seschrock 
336316Seschrock #include <sys/types.h>
346316Seschrock #include <sys/sysmacros.h>
356316Seschrock #include <sys/scsi/impl/spc3_types.h>
366316Seschrock #include <stdarg.h>
376316Seschrock 
386316Seschrock #define	LIBSCSI_VERSION		1
396316Seschrock #define	LIBSCSI_STATUS_INVALID	((sam4_status_t)-1)
406316Seschrock #define	LIBSCSI_DEFAULT_ENGINE_PATH	"/usr/lib/scsi/plugins/scsi/engines"
416316Seschrock #define	LIBSCSI_DEFAULT_ENGINE	"uscsi"
426316Seschrock 
436316Seschrock /*
446316Seschrock  * Flags for action creation.  Selected to avoid overlap with the uscsi
456316Seschrock  * flags with similar or identical meaning.
466316Seschrock  */
476316Seschrock #define	LIBSCSI_AF_READ		0x80000000
486316Seschrock #define	LIBSCSI_AF_WRITE	0x40000000
496316Seschrock #define	LIBSCSI_AF_SILENT	0x20000000
506316Seschrock #define	LIBSCSI_AF_DIAGNOSE	0x10000000
516316Seschrock #define	LIBSCSI_AF_ISOLATE	0x08000000
526316Seschrock #define	LIBSCSI_AF_RQSENSE	0x04000000
536316Seschrock 
546316Seschrock typedef enum libscsi_errno {
556316Seschrock 	ESCSI_NONE,		/* no error */
566316Seschrock 	ESCSI_NOMEM,		/* no memory */
576316Seschrock 	ESCSI_ZERO_LENGTH,	/* zero-length allocation requested */
586316Seschrock 	ESCSI_VERSION,		/* library version mismatch */
596316Seschrock 	ESCSI_BADTARGET,	/* invalid target specification */
606316Seschrock 	ESCSI_BADCMD,		/* invalid SCSI command */
616316Seschrock 	ESCSI_BADENGINE,	/* engine library corrupt */
626316Seschrock 	ESCSI_NOENGINE,		/* engine library not found */
636316Seschrock 	ESCSI_ENGINE_INIT,	/* engine initialization failed */
646316Seschrock 	ESCSI_ENGINE_VER,	/* engine version mismatch */
656316Seschrock 	ESCSI_ENGINE_BADPATH,	/* engine path contains no usable components */
666316Seschrock 	ESCSI_BADFLAGS,		/* incorrect action flags */
676316Seschrock 	ESCSI_BOGUSFLAGS,	/* unknown flag value */
686316Seschrock 	ESCSI_BADLENGTH,	/* buffer length overflow */
696316Seschrock 	ESCSI_NEEDBUF,		/* missing required buffer */
706316Seschrock 	ESCSI_IO,		/* I/O operation failed */
716316Seschrock 	ESCSI_SYS,		/* system call failed */
726316Seschrock 	ESCSI_PERM,		/* insufficient permissions */
736316Seschrock 	ESCSI_RANGE,		/* parameter outside valid range */
746316Seschrock 	ESCSI_NOTSUP,		/* operation not supported */
756316Seschrock 	ESCSI_UNKNOWN,		/* error of unknown type */
766316Seschrock 	ESCSI_INQUIRY_FAILED,	/* initial inquiry command failed */
776316Seschrock 	ESCSI_MAX		/* maximum libscsi errno value */
786316Seschrock } libscsi_errno_t;
796316Seschrock 
806316Seschrock struct libscsi_hdl;
816316Seschrock typedef struct libscsi_hdl libscsi_hdl_t;
826316Seschrock 
836316Seschrock struct libscsi_target;
846316Seschrock typedef struct libscsi_target libscsi_target_t;
856316Seschrock 
866316Seschrock typedef struct libscsi_status {
876316Seschrock 	uint64_t lss_status;		/* SCSI status of this command */
886316Seschrock 	size_t lss_sense_len;		/* Length in bytes of sense data */
896316Seschrock 	uint8_t *lss_sense_data;	/* Pointer to sense data */
906316Seschrock } libscsi_status_t;
916316Seschrock 
926316Seschrock struct libscsi_action;
936316Seschrock typedef struct libscsi_action libscsi_action_t;
946316Seschrock 
956316Seschrock typedef struct libscsi_engine_ops {
966316Seschrock 	void *(*lseo_open)(libscsi_hdl_t *, const void *);
976316Seschrock 	void (*lseo_close)(libscsi_hdl_t *, void *);
986316Seschrock 	int (*lseo_exec)(libscsi_hdl_t *, void *, libscsi_action_t *);
996316Seschrock 	void (*lseo_target_name)(libscsi_hdl_t *, void *, char *, size_t);
1006316Seschrock } libscsi_engine_ops_t;
1016316Seschrock 
1026316Seschrock typedef struct libscsi_engine {
1036316Seschrock 	const char *lse_name;
1046316Seschrock 	uint_t lse_libversion;
1056316Seschrock 	const libscsi_engine_ops_t *lse_ops;
1066316Seschrock } libscsi_engine_t;
1076316Seschrock 
1086316Seschrock extern libscsi_hdl_t *libscsi_init(uint_t, libscsi_errno_t *);
1096316Seschrock extern void libscsi_fini(libscsi_hdl_t *);
1106316Seschrock 
1116316Seschrock extern libscsi_target_t *libscsi_open(libscsi_hdl_t *, const char *,
1126316Seschrock     const void *);
1136316Seschrock extern void libscsi_close(libscsi_hdl_t *, libscsi_target_t *);
1146316Seschrock extern libscsi_hdl_t *libscsi_get_handle(libscsi_target_t *);
1156316Seschrock 
1166316Seschrock extern const char *libscsi_vendor(libscsi_target_t *);
1176316Seschrock extern const char *libscsi_product(libscsi_target_t *);
1186316Seschrock extern const char *libscsi_revision(libscsi_target_t *);
1196316Seschrock 
1206316Seschrock extern libscsi_errno_t libscsi_errno(libscsi_hdl_t *);
1216316Seschrock extern const char *libscsi_errmsg(libscsi_hdl_t *);
1226316Seschrock extern const char *libscsi_strerror(libscsi_errno_t);
1236316Seschrock extern const char *libscsi_errname(libscsi_errno_t);
1246316Seschrock extern libscsi_errno_t libscsi_errcode(const char *);
1256316Seschrock 
1266316Seschrock extern libscsi_action_t *libscsi_action_alloc(libscsi_hdl_t *, spc3_cmd_t,
1276316Seschrock     uint_t, void *, size_t);
1286316Seschrock extern sam4_status_t libscsi_action_get_status(const libscsi_action_t *);
1296316Seschrock extern void libscsi_action_set_timeout(libscsi_action_t *, uint32_t);
1306316Seschrock extern uint32_t libscsi_action_get_timeout(const libscsi_action_t *);
1316316Seschrock extern uint_t libscsi_action_get_flags(const libscsi_action_t *);
1326316Seschrock extern uint8_t *libscsi_action_get_cdb(const libscsi_action_t *);
1336316Seschrock extern int libscsi_action_get_buffer(const libscsi_action_t *,
1346316Seschrock     uint8_t **, size_t *, size_t *);
1356316Seschrock extern int libscsi_action_get_sense(const libscsi_action_t *,
1366316Seschrock     uint8_t **, size_t *, size_t *);
1376316Seschrock extern int libscsi_action_parse_sense(const libscsi_action_t *, uint64_t *,
1386316Seschrock     uint64_t *, uint64_t *, diskaddr_t *);
1396316Seschrock extern void libscsi_action_set_status(libscsi_action_t *, sam4_status_t);
1406316Seschrock extern int libscsi_action_set_datalen(libscsi_action_t *, size_t);
1416316Seschrock extern int libscsi_action_set_senselen(libscsi_action_t *, size_t);
1426316Seschrock extern int libscsi_exec(libscsi_action_t *, libscsi_target_t *);
1436316Seschrock extern void libscsi_action_free(libscsi_action_t *);
1446316Seschrock 
1456316Seschrock extern const char *libscsi_sense_key_name(uint64_t);
1466316Seschrock extern const char *libscsi_sense_code_name(uint64_t, uint64_t);
1476316Seschrock 
1486316Seschrock /*
1496316Seschrock  * Interfaces for engine providers
1506316Seschrock  */
1516316Seschrock extern void *libscsi_alloc(libscsi_hdl_t *, size_t);
1526316Seschrock extern void *libscsi_zalloc(libscsi_hdl_t *, size_t);
1536316Seschrock extern char *libscsi_strdup(libscsi_hdl_t *, const char *);
1546316Seschrock extern void libscsi_free(libscsi_hdl_t *, void *);
1556316Seschrock extern libscsi_status_t *libscsi_status_alloc(libscsi_hdl_t *, size_t);
1566316Seschrock extern int libscsi_status_fill(libscsi_hdl_t *, libscsi_status_t *,
1576316Seschrock     uint16_t, size_t);
1586316Seschrock extern void libscsi_status_free(libscsi_hdl_t *, libscsi_status_t *);
1596316Seschrock 
1606316Seschrock extern int libscsi_set_errno(libscsi_hdl_t *, libscsi_errno_t);
1616316Seschrock extern int libscsi_verror(libscsi_hdl_t *, libscsi_errno_t, const char *,
1626316Seschrock     va_list);
1636316Seschrock extern int libscsi_error(libscsi_hdl_t *, libscsi_errno_t, const char *, ...);
1646316Seschrock 
1656316Seschrock typedef const libscsi_engine_t *(*libscsi_engine_init_f)(libscsi_hdl_t *);
1666316Seschrock 
1676316Seschrock /*
1686316Seschrock  * Generic SCSI utility functions.
1696316Seschrock  */
1706316Seschrock extern size_t libscsi_cmd_cdblen(libscsi_hdl_t *, uint8_t);
1716316Seschrock 
1726316Seschrock #ifdef	__cplusplus
1736316Seschrock }
1746316Seschrock #endif
1756316Seschrock 
1766316Seschrock #endif	/* _LIBSCSI_H */
177