#ifndef _SYS_CMLB_IMPL_H
#define _SYS_CMLB_IMPL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/cmlb.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#define FDISK_PARTS (FD_NUMPART + MAX_EXT_PARTS)
#if defined(_SUNOS_VTOC_8)
#define NSDMAP (NDKMAP + 1)
#elif defined(_SUNOS_VTOC_16)
#define NSDMAP (NDKMAP + FDISK_PARTS + 1)
#else
#error "No VTOC format defined."
#endif
#define MAXPART (NSDMAP + 1)
#define WD_NODE 7
#define P0_RAW_DISK (NDKMAP)
#if defined(__i386) || defined(__amd64)
#define FDISK_P1 (NDKMAP+1)
#define FDISK_P2 (NDKMAP+2)
#define FDISK_P3 (NDKMAP+3)
#define FDISK_P4 (NDKMAP+4)
#endif
#define CMLB_LOGMASK_ERROR 0x00000001
#define CMLB_LOGMASK_INFO 0x00000002
#define CMLB_LOGMASK_TRACE 0x00000004
#define CMLB_TRACE 0x00000001
#define CMLB_INFO 0x00000002
#define CMLB_ERROR 0x00000004
#define CMLB_MUTEX(cl) (&((cl)->cl_mutex))
#define CMLB_DEVINFO(cl) ((cl)->cl_devi)
#define CMLB_LABEL(cl) (ddi_driver_name((cl->cl_devi)))
#define ISREMOVABLE(cl) (cl->cl_is_removable)
#define ISCD(cl) (cl->cl_device_type == DTYPE_RODIRECT)
#define ISHOTPLUGGABLE(cl) (cl->cl_is_hotpluggable)
#define CMLBUNIT_SHIFT (CMLBUNIT_DFT_SHIFT)
#define CMLBPART_MASK ((1 << CMLBUNIT_SHIFT) - 1)
#define CMLBUNIT(dev, shift) (getminor((dev)) >> (shift))
#define CMLBPART(dev) (getminor((dev)) & CMLBPART_MASK)
#define CMLB_LABEL_IS_VALID 0
#define CMLB_LABEL_IS_INVALID 1
#define CMLB_2TB_BLOCKS 0xffffffff
#define CMLB_1TB_BLOCKS 0x7fffffff
#define CMLB_EXTVTOC_LIMIT CMLB_2TB_BLOCKS
#define CMLB_OLDVTOC_LIMIT CMLB_1TB_BLOCKS
struct fmap {
ulong_t fmap_start;
ulong_t fmap_nblk;
uchar_t fmap_systid;
};
typedef enum {
CMLB_INITED = 0,
CMLB_ATTACHED
} cmlb_state_t;
typedef enum
{
CMLB_LABEL_UNDEF = 0,
CMLB_LABEL_VTOC,
CMLB_LABEL_EFI
} cmlb_label_t;
#define CMLB_ALLOW_2TB_WARN 0x1
typedef struct cmlb_lun {
dev_info_t *cl_devi;
struct dk_vtoc cl_vtoc;
struct dk_geom cl_g;
diskaddr_t cl_blockcount;
uint32_t cl_tgt_blocksize;
diskaddr_t cl_solaris_size;
uint_t cl_solaris_offset;
struct dk_map cl_map[MAXPART];
diskaddr_t cl_offset[MAXPART];
struct fmap cl_fmap[FDISK_PARTS];
uchar_t cl_asciilabel[LEN_DKL_ASCII];
struct cmlb_geom cl_lgeom;
struct cmlb_geom cl_pgeom;
ushort_t cl_dkg_skew;
cmlb_label_t cl_def_labeltype;
cmlb_label_t cl_last_labeltype;
cmlb_label_t cl_cur_labeltype;
cmlb_label_t cl_label_from_media;
cmlb_state_t cl_state;
boolean_t cl_f_geometry_is_valid;
int cl_sys_blocksize;
kmutex_t cl_mutex;
boolean_t cl_is_removable;
boolean_t cl_is_hotpluggable;
int cl_alter_behavior;
char *cl_node_type;
int cl_device_type;
int cl_reserved;
cmlb_tg_ops_t *cmlb_tg_ops;
#if defined(__i386) || defined(__amd64)
int cl_update_ext_minor_nodes;
int cl_logical_drive_count;
#endif
uint8_t cl_msglog_flag;
} cmlb_lun_t;
_NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cmlb_tg_ops))
_NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_devi))
_NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_removable))
_NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_is_hotpluggable))
_NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_node_type))
_NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_sys_blocksize))
_NOTE(SCHEME_PROTECTS_DATA("stable data", cmlb_lun::cl_alter_behavior))
_NOTE(SCHEME_PROTECTS_DATA("private data", cmlb_geom))
_NOTE(SCHEME_PROTECTS_DATA("safe sharing", cmlb_lun::cl_f_geometry_is_valid))
_NOTE(MUTEX_PROTECTS_DATA(cmlb_lun::cl_mutex, cmlb_lun::cl_vtoc))
#define DK_TG_READ(ihdlp, bufaddr, start_block, reqlength, tg_cookie)\
(ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_READ, \
bufaddr, start_block, reqlength, tg_cookie)
#define DK_TG_WRITE(ihdlp, bufaddr, start_block, reqlength, tg_cookie)\
(ihdlp->cmlb_tg_ops->tg_rdwr)(CMLB_DEVINFO(ihdlp), TG_WRITE,\
bufaddr, start_block, reqlength, tg_cookie)
#define DK_TG_GETPHYGEOM(ihdlp, phygeomp, tg_cookie) \
(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETPHYGEOM,\
(void *)phygeomp, tg_cookie)
#define DK_TG_GETVIRTGEOM(ihdlp, virtgeomp, tg_cookie) \
(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETVIRTGEOM,\
(void *)virtgeomp, tg_cookie)
#define DK_TG_GETCAP(ihdlp, capp, tg_cookie) \
(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETCAPACITY,\
capp, tg_cookie)
#define DK_TG_GETBLOCKSIZE(ihdlp, lbap, tg_cookie) \
(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp),\
TG_GETBLOCKSIZE, lbap, tg_cookie)
#define DK_TG_GETATTRIBUTE(ihdlp, attributep, tg_cookie) \
(ihdlp->cmlb_tg_ops->tg_getinfo)(CMLB_DEVINFO(ihdlp), TG_GETATTR,\
attributep, tg_cookie)
#ifdef __cplusplus
}
#endif
#endif