root/usr/src/uts/common/sys/fibre-channel/ulp/fcp_util.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _FCP_UTIL_H
#define _FCP_UTIL_H



#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/types.h>


#define FCP_TGT_INQUIRY         0x01
#define FCP_TGT_CREATE          0x02
#define FCP_TGT_DELETE          0x04
#define FCP_TGT_SEND_SCSI       0x08
#define FCP_STATE_COUNT         0x10
#define FCP_GET_TARGET_MAPPINGS 0x11

struct  fcp_ioctl {
        minor_t         fp_minor;
        uint32_t        listlen;
        caddr_t         list;
};

struct  device_data {
        la_wwn_t        dev_pwwn;
        int             dev_status;
        int             dev_lun_cnt;
        uchar_t         dev0_type;
};

struct fcp_scsi_cmd {
        uint32_t        scsi_fc_port_num;
        la_wwn_t        scsi_fc_pwwn;
        uint32_t        scsi_fc_status;
        uint32_t        scsi_fc_rspcode;
        uchar_t         scsi_pkt_state;
        uchar_t         scsi_pkt_action;
        uint32_t        scsi_pkt_reason;
        uint64_t        scsi_lun;
        uint32_t        scsi_flags;
        uint32_t        scsi_timeout;
        caddr_t         scsi_cdbbufaddr;
        uint32_t        scsi_cdblen;
        caddr_t         scsi_bufaddr;
        uint32_t        scsi_buflen;
        int32_t         scsi_bufresid;
        uint32_t        scsi_bufstatus;
        caddr_t         scsi_rqbufaddr;
        uint32_t        scsi_rqlen;
        int32_t         scsi_rqresid;
};

typedef struct fc_hba_mapping_entry {
    char                        targetDriver[MAXPATHLEN];
    uint32_t                    d_id;
    uint32_t                    busNumber;
    uint32_t                    targetNumber;
    uint32_t                    osLUN;
    uint64_t                    samLUN;
    la_wwn_t                    NodeWWN;
    la_wwn_t                    PortWWN;
    uint8_t                     guid[256];
} fc_hba_mapping_entry_t;

#define FC_HBA_TARGET_MAPPINGS_VERSION          1
typedef struct fc_hba_target_mappings {
    uint32_t                    version;
    uint32_t                    numLuns;
    uint64_t                    reserved;
    fc_hba_mapping_entry_t      entries[1];
} fc_hba_target_mappings_t;

/*
 * flags for scsi_flags field of fcp_scsi_cmd structure
 */
#define FCP_SCSI_READ   0x0001  /* get data from device */


#if defined(_SYSCALL32)
/*
 * 32 bit variant of fcp_ioctl and fcp_scsi_cmd
 * used only in the driver.
 */

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif

struct  fcp32_ioctl {
        minor_t         fp_minor;
        uint32_t        listlen;
        caddr32_t       list;
};

struct fcp32_scsi_cmd {
        uint32_t        scsi_fc_port_num;
        la_wwn_t        scsi_fc_pwwn;
        uint32_t        scsi_fc_status;
        uint32_t        scsi_fc_rspcode;
        uchar_t         scsi_pkt_state;
        uchar_t         scsi_pkt_action;
        uint32_t        scsi_pkt_reason;
        uint64_t        scsi_lun;
        uint32_t        scsi_flags;
        uint32_t        scsi_timeout;
        caddr32_t       scsi_cdbbufaddr;
        uint32_t        scsi_cdblen;
        caddr32_t       scsi_bufaddr;
        uint32_t        scsi_buflen;
        int32_t         scsi_bufresid;
        uint32_t        scsi_bufstatus;
        caddr32_t       scsi_rqbufaddr;
        uint32_t        scsi_rqlen;
        int32_t         scsi_rqresid;
};

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif

#define FCP32_SCSI_CMD_TO_FCP_SCSI_CMD(cmd32, cmd)                      \
        (cmd)->scsi_fc_port_num = (cmd32)->scsi_fc_port_num;            \
        bcopy(&((cmd32)->scsi_fc_pwwn), &((cmd)->scsi_fc_pwwn),         \
                        sizeof ((cmd)->scsi_fc_pwwn));                  \
        (cmd)->scsi_fc_status   = (cmd32)->scsi_fc_status;              \
        (cmd)->scsi_fc_rspcode  = (cmd32)->scsi_fc_rspcode;             \
        (cmd)->scsi_pkt_state   = (cmd32)->scsi_pkt_state;              \
        (cmd)->scsi_pkt_action  = (cmd32)->scsi_pkt_action;             \
        (cmd)->scsi_pkt_reason  = (cmd32)->scsi_pkt_reason;             \
        (cmd)->scsi_lun         = (cmd32)->scsi_lun;                    \
        (cmd)->scsi_flags       = (cmd32)->scsi_flags;                  \
        (cmd)->scsi_timeout     = (cmd32)->scsi_timeout;                \
        (cmd)->scsi_cdbbufaddr  = (caddr_t)(long)(cmd32)->scsi_cdbbufaddr; \
        (cmd)->scsi_cdblen      = (cmd32)->scsi_cdblen;                 \
        (cmd)->scsi_bufaddr     = (caddr_t)(long)(cmd32)->scsi_bufaddr; \
        (cmd)->scsi_buflen      = (cmd32)->scsi_buflen;                 \
        (cmd)->scsi_bufresid    = (cmd32)->scsi_bufresid;               \
        (cmd)->scsi_bufstatus   = (cmd32)->scsi_bufstatus;              \
        (cmd)->scsi_rqbufaddr   = (caddr_t)(long)(cmd32)->scsi_rqbufaddr; \
        (cmd)->scsi_rqlen       = (cmd32)->scsi_rqlen;                  \
        (cmd)->scsi_rqresid     = (cmd32)->scsi_rqresid;

#define FCP_SCSI_CMD_TO_FCP32_SCSI_CMD(cmd, cmd32)                      \
        (cmd32)->scsi_fc_port_num = (cmd)->scsi_fc_port_num;            \
        bcopy(&((cmd)->scsi_fc_pwwn), &((cmd32)->scsi_fc_pwwn),         \
                        sizeof ((cmd32)->scsi_fc_pwwn));                \
        (cmd32)->scsi_fc_status = (cmd)->scsi_fc_status;                \
        (cmd32)->scsi_fc_rspcode = (cmd)->scsi_fc_rspcode;              \
        (cmd32)->scsi_pkt_state = (cmd)->scsi_pkt_state;                \
        (cmd32)->scsi_pkt_action = (cmd)->scsi_pkt_action;              \
        (cmd32)->scsi_pkt_reason = (cmd)->scsi_pkt_reason;              \
        (cmd32)->scsi_lun       = (cmd)->scsi_lun;                      \
        (cmd32)->scsi_flags     = (cmd)->scsi_flags;                    \
        (cmd32)->scsi_timeout   = (cmd)->scsi_timeout;                  \
        (cmd32)->scsi_cdbbufaddr = (caddr32_t)(long)(cmd)->scsi_cdbbufaddr; \
        (cmd32)->scsi_cdblen    = (cmd)->scsi_cdblen;                   \
        (cmd32)->scsi_bufaddr   = (caddr32_t)(long)(cmd)->scsi_bufaddr; \
        (cmd32)->scsi_buflen    = (cmd)->scsi_buflen;                   \
        (cmd32)->scsi_bufresid  = (cmd)->scsi_bufresid;                 \
        (cmd32)->scsi_bufstatus = (cmd)->scsi_bufstatus;                \
        (cmd32)->scsi_rqbufaddr = (caddr32_t)(long)(cmd)->scsi_rqbufaddr; \
        (cmd32)->scsi_rqlen     = (cmd)->scsi_rqlen;                    \
        (cmd32)->scsi_rqresid   = (cmd)->scsi_rqresid;

#endif /* _SYSCALL32 */

#if !defined(__lint)
_NOTE(SCHEME_PROTECTS_DATA("Unshared Data", device_data))
_NOTE(SCHEME_PROTECTS_DATA("Unshared Data", fcp_scsi_cmd))
#endif /* __lint */

#ifdef  __cplusplus
}
#endif

#endif  /* _FCP_UTIL_H */