root/usr/src/uts/sun/sys/socal_cq_defs.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 1998 Sun Microsystems, Inc. All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_SOCAL_CQ_DEFS_H
#define _SYS_SOCAL_CQ_DEFS_H

#pragma ident   "%Z%%M% %I%     %E% SMI"

#ifdef __cplusplus
extern "C" {
#endif

#define SOC_CQE_PAYLOAD 60

/*
 * define the CQ_HEADER for the soc command queue.
 */

typedef struct  cq_hdr {
        uchar_t cq_hdr_count;
        uchar_t cq_hdr_type;
        uchar_t cq_hdr_flags;
        uchar_t cq_hdr_seqno;
} cq_hdr_t;

/*
 * Command Queue entry description.
 */

typedef struct cqe {
        uchar_t         cqe_payload[SOC_CQE_PAYLOAD];
        cq_hdr_t        cqe_hdr;
} cqe_t;

/*
 * CQ Entry types.
 */

#define CQ_TYPE_NOP             0x00
#define CQ_TYPE_OUTBOUND        0x01
#define CQ_TYPE_INBOUND         0x02
#define CQ_TYPE_SIMPLE          0x03
#define CQ_TYPE_IO_WRITE        0x04
#define CQ_TYPE_IO_READ         0x05
#define CQ_TYPE_UNSOLICITED     0x06
#define CQ_TYPE_BYPASS_DEV      0x06    /* supercedes unsolicited in SOC+ */
#define CQ_TYPE_DIAGNOSTIC      0x07
#define CQ_TYPE_OFFLINE         0x08
#define CQ_TYPE_ADD_POOL        0x09    /* SOC+ enhancement */
#define CQ_TYPE_DELETE_POOL     0x0a    /* SOC+ enhancement */
#define CQ_TYPE_ADD_BUFFER      0x0b    /* SOC+ enhancement */
#define CQ_TYPE_ADD_POOL_BUFFER 0x0c    /* SOC+ enhancement */
#define CQ_TYPE_REQUEST_ABORT   0x0d    /* SOC+ enhnacement */
#define CQ_TYPE_REQUEST_LIP     0x0e    /* SOC+ enhancement */
#define CQ_TYPE_REPORT_MAP      0x0f    /* SOC+ enhancement */
#define CQ_TYPE_RESPONSE        0x10
#define CQ_TYPE_INLINE          0x20

/*
 * CQ Entry Flags
 */

#define CQ_FLAG_CONTINUATION    0x01
#define CQ_FLAG_FULL            0x02
#define CQ_FLAG_BADHEADER       0x04
#define CQ_FLAG_BADPACKET       0x08

/*
 * CQ Descriptor Definition.
 */

typedef struct cq {
        uint32_t        cq_address;
        uchar_t         cq_in;
        uchar_t         cq_out;
        uchar_t         cq_last_index;
        uchar_t         cq_seqno;
} soc_cq_t;

/*
 * SOC header definition.
 */

typedef struct soc_hdr {
        uint_t          sh_request_token;
        ushort_t        sh_flags;
        uchar_t         sh_class;
        uchar_t         sh_seg_cnt;
        uint_t          sh_byte_cnt;
} soc_header_t;

/*
 * SOC header request packet definition.
 */

typedef struct soc_request {
        soc_header_t            sr_soc_hdr;
        fc_dataseg_t            sr_dataseg[3];
        fc_frame_header_t       sr_fc_frame_hdr;
        cq_hdr_t                sr_cqhdr;
} soc_request_t;

typedef soc_request_t soc_header_request_t;

/*
 * SOC header response packet definition.
 */

typedef struct soc_response {
        soc_header_t            sr_soc_hdr;
        uint_t                  sr_soc_status;
        fc_dataseg_t            sr_dataseg;
        uchar_t                 sr_reserved[10];
        ushort_t                sr_ncmds;
        fc_frame_header_t       sr_fc_frame_hdr;
        cq_hdr_t                sr_cqhdr;
} soc_response_t;

/*
 * SOC data request packet definition.
 */

typedef struct soc_data_request {
        soc_header_t            sdr_soc_hdr;
        fc_dataseg_t            sdr_dataseg[6];
        cq_hdr_t                sdr_cqhdr;
} soc_data_request_t;

/*
 * SOC+ (only) command-only packet definitiion
 */

typedef struct soc_cmdonly_request {
        soc_header_t    scr_soc_hdr;
        uchar_t         reserved[48];
        cq_hdr_t        scr_cqhdr;
} soc_cmdonly_request_t;

/*
 * SOC+ (only) diagnostic request packet definition
 */

typedef struct soc_diag_request {
        soc_header_t    sdr_soc_hdr;
        uint_t          sdr_diag_cmd;
        uchar_t         reserved[44];
        cq_hdr_t        sdr_cqhdr;
} soc_diag_request_t;

#define SOC_DIAG_NOP            0x00
#define SOC_DIAG_INT_LOOP       0x01
#define SOC_DIAG_EXT_LOOP       0x02
#define SOC_DIAG_REM_LOOP       0x03
#define SOC_DIAG_XRAM_TEST      0x04
#define SOC_DIAG_SOC_TEST       0x05
#define SOC_DIAG_HCB_TEST       0x06
#define SOC_DIAG_SOCLB_TEST     0x07
#define SOC_DIAG_SRDSLB_TEST    0x08
#define SOC_DIAG_EXTOE_TEST     0x09

/*
 * SOC+ (only) pool request packet definition
 */

typedef struct soc_pool_request {
        soc_header_t            spr_soc_hdr;
        uint_t          spr_pool_id;
        uint_t          spr_header_mask;
        uint_t          spr_buf_size;
        uint_t          spr_n_entries;
        uchar_t                 reserved[8];
        fc_frame_header_t       spr_fc_frame_hdr;
        cq_hdr_t                spr_cqhdr;
} soc_pool_request_t;

#define SOCPR_MASK_RCTL         0x800000
#define SOCPR_MASK_DID          0x700000
#define SOCPR_MASK_SID          0x070000
#define SOCPR_MASK_TYPE         0x008000
#define SOCPR_MASK_F_CTL        0x007000
#define SOCPR_MASK_SEQ_ID       0x000800
#define SOCPR_MASK_D_CTL        0x000400
#define SOCPR_MASK_SEQ_CNT      0x000300
#define SOCPR_MASK_OX_ID        0x0000f0
#define SOCPR_MASK_PARAMETER    0x0000f0


/*
 * Macros for flags field
 *
 * values used in both RSP's and REQ's
 */
#define SOC_PORT_B      0x0001  /* entry to/from SOC Port B */
#define SOC_FC_HEADER   0x0002  /* this entry contains an FC_HEADER */
/*
 *      REQ: this request is supplying buffers
 *      RSP: this pkt is unsolicited
 */
#define SOC_UNSOLICITED 0x0080

/*
 * values used only for REQ's
 */
#define SOC_NO_RESPONSE 0x0004 /* generate niether RSP nor INT */
#define SOC_NO_INTR     0x0008 /* generate RSP only */
#define SOC_XFER_RDY    0x0010 /* issue a XFRRDY packet for this cmd */
#define SOC_IGNORE_RO   0x0020 /* ignore FC_HEADER relative offset */
#define SOC_RESP_HEADER 0x0200  /* return frame header regardless of status */

/*
 * values used only for RSP's
 */
#define SOC_COMPLETE    0x0040 /* previous CMD completed. */
#define SOC_STATUS      0x0100 /* a SOC status change has occurred */

#define CQ_SUCCESS      0x0
#define CQ_FAILURE      0x1
#define CQ_FULL         0x2

#define CQ_REQUEST_0    0
#define CQ_REQUEST_1    1
#define CQ_REQUEST_2    2
#define CQ_REQUEST_3    3

#define CQ_RESPONSE_0   0
#define CQ_RESPONSE_1   1
#define CQ_RESPONSE_2   2
#define CQ_RESPONSE_3   3

#define CQ_SOLICITED_OK         CQ_RESPONSE_0
#define CQ_SOLICITED_BAD        CQ_RESPONSE_1
#define CQ_UNSOLICITED          CQ_RESPONSE_2


typedef struct soc_request_descriptor {
        soc_request_t   *srd_sp;
        uint_t          srd_sp_count;

        caddr_t         srd_cmd;
        uint_t          srd_cmd_count;

        caddr_t         srd_data;
        uint_t          srd_data_count;
} soc_request_desc_t;


#ifdef __cplusplus
}
#endif

#endif /* !_SYS_SOCAL_CQ_DEFS_H */