root/usr/src/uts/common/sys/scsi/generic/sas.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 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
/*
 * SAS Common Structures and Definitions
 * sas2r14, simplified/reduced
 */
#ifndef _SAS_H
#define _SAS_H
#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/sysmacros.h>
/*
 * SAS Address Frames
 * Trailing 4 byte CRC not included.
 */
typedef struct {
        DECL_BITFIELD3(
            address_frame_type          :4,
            device_type                 :3,
            reserved0                   :1);
        DECL_BITFIELD2(
            reason                      :4,
            reserved1                   :4);
        DECL_BITFIELD5(
            restricted0                 :1,
            smp_ini_port                :1,
            stp_ini_port                :1,
            ssp_ini_port                :1,
            reserved2                   :4);
        DECL_BITFIELD5(
            restricted1                 :1,
            smp_tgt_port                :1,
            stp_tgt_port                :1,
            ssp_tgt_port                :1,
            reserved3                   :4);
        uint8_t         device_name[8];
        uint8_t         sas_address[8];
        uint8_t         phy_identifier;
        DECL_BITFIELD4(
            break_reply_capable         :1,
            requested_inside_zpsds      :1,
            inside_zpsds_persistent     :1,
            reserved4                   :5);
        uint8_t         reserved5[6];
} sas_identify_af_t;

typedef struct {
        DECL_BITFIELD3(
            address_frame_type          :4,
            protocol                    :3,
            ini_port                    :1);
        DECL_BITFIELD2(
            connection_rate             :4,
            features                    :4);
        uint16_t        itag;                   /* initiator connection tag */
        uint8_t         sas_dst[8];             /* destination sas address */
        uint8_t         sas_src[8];             /* source sas address */
        uint8_t         src_zone_group;         /* source zone group  */
        uint8_t         path_block_count;       /* pathway blocked count */
        uint16_t        arb_wait_time;          /* arbitration wait time */
        uint8_t         compat[4];              /* 'more' compatible features */
} sas_open_af_t;

#define SAS_AF_IDENTIFY                 0
#define SAS_AF_OPEN                     1

#define SAS_IF_DTYPE_ENDPOINT           1
#define SAS_IF_DTYPE_EDGE               2
#define SAS_IF_DTYPE_FANOUT             3       /* obsolete */

#define SAS_OF_PROTO_SMP                0
#define SAS_OF_PROTO_SSP                1
#define SAS_OF_PROTO_STP                2

#define SAS_SSP_SUPPORT                 0x8
#define SAS_STP_SUPPORT                 0x4
#define SAS_SMP_SUPPORT                 0x2


#define SAS_CONNRATE_1_5_GBPS           0x8
#define SAS_CONNRATE_3_0_GBPS           0x9
#define SAS_CONNRATE_6_0_GBPS           0xA

#define SAS_SATA_SUPPORT                0x1
#define SAS_ATTACHED_NAME_OFFSET        52      /* SAS-2 only */

/*
 * SSP Definitions
 */
typedef struct {
        uint8_t         lun[8];
        uint8_t         reserved0;
        DECL_BITFIELD3(
            task_attribute      :2,
            command_priority    :4,
            enable_first_burst  :1);
        uint8_t         reserved1;
        DECL_BITFIELD2(
            reserved2           :2,
            addi_cdb_len        :6);
        uint8_t         cdb[16];
        /* additional cdb bytes go here, followed by 4 byte CRC */
} sas_ssp_cmd_iu_t;

#define SAS_CMD_TASK_ATTR_SIMPLE        0x00
#define SAS_CMD_TASK_ATTR_HEAD          0x01
#define SAS_CMD_TASK_ATTR_ORDERED       0x02
#define SAS_CMD_TASK_ATTR_ACA           0x04

typedef struct {
        uint8_t         reserved0[8];
        uint16_t        status_qualifier;
        DECL_BITFIELD2(
            datapres            :2,
            reserved1           :6);
        uint8_t         status;
        uint8_t         reserved2[4];
        uint32_t        sense_data_length;
        uint32_t        response_data_length;
        uint8_t         rspd[];
        /* response data followed by sense data goes here */
} sas_ssp_rsp_iu_t;

/* length of bytes up to response data */
#define SAS_RSP_HDR_SIZE                24

#define SAS_RSP_DATAPRES_NO_DATA        0x00
#define SAS_RSP_DATAPRES_RESPONSE_DATA  0x01
#define SAS_RSP_DATAPRES_SENSE_DATA     0x02

/*
 * When the RSP IU is type RESPONSE_DATA,
 * the first 4 bytes of response data should
 * be a Big Endian representation of one of
 * these codes.
 */
#define SAS_RSP_TMF_COMPLETE            0x00
#define SAS_RSP_INVALID_FRAME           0x02
#define SAS_RSP_TMF_NOT_SUPPORTED       0x04
#define SAS_RSP_TMF_FAILED              0x05
#define SAS_RSP_TMF_SUCCEEDED           0x08
#define SAS_RSP_TMF_INCORRECT_LUN       0x09
#define SAS_RSP_OVERLAPPED_OIPTTA       0x0A

/*
 * Task Management Functions- should be in a SAM definition file
 */
#define SAS_ABORT_TASK                  0x01
#define SAS_ABORT_TASK_SET              0x02
#define SAS_CLEAR_TASK_SET              0x04
#define SAS_LOGICAL_UNIT_RESET          0x08
#define SAS_I_T_NEXUS_RESET             0x10
#define SAS_CLEAR_ACA                   0x40
#define SAS_QUERY_TASK                  0x80
#define SAS_QUERY_TASK_SET              0x81
#define SAS_QUERY_UNIT_ATTENTION        0x82

/*
 * PHY size changed from SAS1.1 to SAS2.
 */
#define SAS_PHYNUM_MAX                  127
#define SAS_PHYNUM_MASK                 0x7f

#define SAS2_PHYNUM_MAX                 254
#define SAS2_PHYNUM_MASK                0xff


/*
 * Maximum SMP payload size, including CRC
 */
#define SAS_SMP_MAX_PAYLOAD             1032
#ifdef  __cplusplus
}
#endif
#endif  /* _SAS_H */