/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos720 src/bos/kernel/sys/POWER/serdasd.h 1.11                         */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1991,1993              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
/* @(#)13	1.11  src/bos/kernel/sys/POWER/serdasd.h, sysxdisk, bos720 7/6/97 17:20:56 */
#ifndef _H_SERDASD
#define _H_SERDASD
/*
 * COMPONENT_NAME: (SYSXDISK) Serial Dasd Subsytem
 *
 * FUNCTIONS:  Header File for Serial Dasd Subsytem
 *
 * ORIGINS: 27
 *
 * (C) COPYRIGHT International Business Machines Corp. 1991,1993
 * All Rights Reserved
 * Licensed Materials - Property of IBM
 *
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */

#include <sys/scsi.h>
#include <sys/scdisk.h>
#include <sys/ddconc.h>


/***************************************************************************/
/*                      OPENX EXTENDED PARAMETERS                          */
/***************************************************************************/ 

/* These are in addition to those defined in scsi.h */
#define SD_NO_RESERVE	SC_NO_RESERVE        /* Don't reserve DASD on open */
#define SD_DAEMON	SC_RESV_05	     /* Daemon open                */


/***************************************************************************/
/*                             IOCTLS                                      */
/***************************************************************************/ 

#define SD_SCSICMD		DKIOCMD	  /* SCSI Pass Thru Command        */
#define SD_RESET		0x71      /* Reset                         */
#define SD_ADAP_DOWNLOAD	0x72      /* Adapter Microcode Download    */
#define SD_ADAP_TRACE_SNAPSHOT	0x73	  /* Adapter Trace Snapshot        */ 
#define SD_ADAP_QUERY_TRACE     0x74      /* Adapter Query Trace           */
#define SD_ADAP_INQUIRY       	0x75      /* Adapter Inquiry               */
#define SD_SET_ADAP_PARMS	0x76      /* Set Adapter Parameters        */
#define SD_QUERY_DEVICE		0x77      /* Query Device                  */
#define SD_READ_ADAP_ID		0x78	  /* Read Adapter POS ID           */
#define SD_GET_EVENT		0x79      /* Get first Asynch event        */
#define SD_DAEMON_ERROR         0x7a      /* For daemon to errlog events   */
#define SD_MBOX			0x7B      /* Pass Thru Mailbox             */
#define SD_SET_FENCE		0x7C      /* Set fence for a DASD          */
#define SD_CLEAR_FENCE		0x7D      /* Clear fence for a DASD        */


/***************************************************************************/
/*                       MISCELLANEOUS DEFINES                             */
/***************************************************************************/ 





/* Additional SCSI commands */
#define SD_WRITE_SAME		0x41		/* Write Same SCSI Command */
#define SD_FENCE_OP_CODE        0xD0            /* Pseudo scsi fence cmd   */

/* Fence command modifiers  */

#define SD_FENCE_MASK_SWAP      0x01      /* Mask and swap Fence Command   */
#define SD_FENCE_COMPARE_SWAP   0x02      /* Compare and swap Fence Command*/

/* Support Operations for the SCSI_SEND_DIAGNOSTIC command */
#define SD_WRITE_VPD		0x80	  /* Write DASD Product VPD        */
#define SD_RESET_DASD		0x81	  /* Reset DASD                    */
#define SD_SET_TRACE_SNAPSHOT	0x82	  /* Set trace snapshot parameters */
#define SD_PREPARE_TRACE_STATUS 0x83	  /* Prepare Trace Status          */
#define SD_PREPARE_TRACE_DUMP	0x84	  /* Prepare Trace Dump            */
#define SD_SELF_TEST_BIT	0x04	  /* Self Test bit of cmd byte 1   */

/* Adapter POS ID */
#define SD_ADAP_ID		0x788F	  /* POS ID of adapter             */

/* Device type identifiers */
#define	SD_ADAPTER		0x00
#define SD_CONTROLLER		0x01
#define SD_DASD			0x02

/* Adapter VPD size */
#define SD_ADAP_VPD_SIZE	255

/*
 *  Adapter query trace length
 */
#define SD_ADAP_DUMP_LENGTH     0x1200

/***************************************************************************/
/*                       ADAPTER STATUS BYTE CODES                         */
/***************************************************************************/ 

#define SD_SCSI_STATUS		0x00    /* Controller SCSI Status          */
#define SD_CTRL_STATUS		0x01    /* Special Controller Status       */
#define SD_CMD_TO_ACTIVE_TAG	0x02	/* Command to an active tag        */
#define SD_DNLD_ADAP_BUSY	0x03    /* Download with adapter not quiet */
#define SD_ILLEGAL_ADAP_CMD	0x04	/* Illegal Adapter Command         */
#define SD_CTRL_NOT_RESPONDING	0x05	/* Controller not responding       */
#define SD_UNIT_POWERED_ON	0x06	/* Unit Powered On                 */
#define SD_TIME_OUT		0x07	/* Time out (only for query device */
#define SD_OPEN_LINK		0x08    /* open link / ctrl powered down   */
#define SD_RESET_PURGE_TAG	0x09    /* Tag purged following reset      */
#define SD_UNEXP_SCSI_STATUS	0x0A	/* unexpected SCSI status          */
#define SD_UNEXP_CTRL_STATUS	0x0B	/* unexpected special status       */
#define SD_DATA_DMA_FAIL	0x0C	/* Data DMA Failed                 */
#define SD_MB_DMA_FAIL		0x0D	/* Mailbox DMA failed              */
#define SD_INVALID_MB_PTR	0x0E	/* Invalid Mailbox Pointer         */
#define SD_DMA_COUNT_ERROR	0x0F	/* DMA Count Error                 */
#define SD_BAD_CTRL_ADDRESS	0x10	/* out of range controller address */
#define SD_QUIESCE_TIME_OUT	0x11	/* quiesce time out                */
#define SD_RECOV_LINK_ERROR	0x12    /* recoverable link error          */
#define SD_DNLD_MC_CHKSUM_FAIL	0x13	/* Download microcode checksum fail*/
#define SD_MSG_TO_INACTIVE_TAG	0x14	/* Message to an inactive tag      */
#define SD_MSG_WRONG_LINK	0x15	/* Message on wrong link           */
#define SD_INVALID_LINK_MSG	0x16	/* Invalid link message            */
#define SD_LINK_ERROR		0x17	/* Unrecoverable link error        */
#define SD_INVALID_ADAP_PARMS	0x18	/* Invalid adapter parameters      */
#define SD_INVALID_TAG		0x19	/* Invalid Tag                     */
#define SD_DMA_DISABLED		0x1D	/* DMA disabled, retrying          */
#define SD_ASYNCHRONOUS_EVENT	0x1F	/* Asynchronous event occured      */
#define SD_WBUFF_STARTED	0x20	/* Write Buffer Started            */
#define SD_MB_TERM_INTERN_RST	0x21	/* MB terminated by internal reset */
#define SD_ADAP_HDW_ERROR	0x22	/* Adapter Hardware Error          */
#define SD_TRACE_DATA_DMA_ERR	0x24	/* Trace data DMA error            */
#define SD_SYSTEM_DMA_HUNG	0x25	/* system DMA hung                 */
#define SD_TRACE_SUPERCEDED	0x26    /* snapshot conditions superceded  */
#define SD_PREV_TRC_DUMP_BUSY	0x27	/* Previous Trace Dump Busy        */

#define SD_DD_PURGED_TAG	0x01   /* Device driver failed command    */

/***************************************************************************/
/*                       CONTROLLER STATUS BYTE CODES                      */
/***************************************************************************/ 

#define	SD_ABORTED_CMD		0x81	 /* aborted command                */
#define SD_INVALID_QC		0x82	 /* invalid queue control          */
#define SD_PURG_OS		0x83	 /* purged after outstanding sense */
#define SD_PURG_EPOW		0x84     /* purged after EPOW              */
#define SD_WBUFF_INPROG		0x87	 /* Write Buffer in Progress       */
#define SD_INVALID_MSG		0x88	 /* invalid message                */
#define SD_INVALID_MB		0x89	 /* Invalid Mailbox                */
#define SD_NO_VALID_DELAY	0x8A	 /* No Valid Delay                 */


/***************************************************************************/
/*                       SCSI STATUS BYTE CODES                            */
/***************************************************************************/ 

#define SD_GOOD		SC_GOOD_STATUS	  /* target completed successfully */
#define SD_CHECK	SC_CHECK_CONDITION /* target is reporting an error,*/
				       /* exception, or abnormal condition */
#define SD_RES_CONFLICT	SC_RESERVATION_CONFLICT	/* LUN is reserved by other*/
					        /* initiator */
#define SD_QUEUE_FULL	0x28   		/* Not an error, but controller's  */
				                          /* queue is full */
#define SD_FENCED_OUT   0x3E             /* fenced out                     */

/***************************************************************************/
/*                        STRUCTURES                                       */
/***************************************************************************/

/*
 * Adapter Error Log Structure
 */
struct sd_adap_error_df {
        uint    error_id;                       /* error type id             */
        char    resource_name[ERR_NAMESIZE];    /* dds resource name         */
        ushort  unit_err_code;                  /* UEC                       */
        uchar   validity;                       /* validity byte             */

#define SD_POS5_VALID           0x01            /* POS5 data valid           */
#define SD_ALERT_VALID          0x02            /* Alert contents valid      */
#define SD_DMA_RC_VALID         0x04            /* System DMA rc valid       */
#define SD_CHANNEL_STATUS_VALID 0x08            /* Channel Status valid      */

        uchar   pos_reg_5;                      /* contents of POS reg 5     */
        ulong   alert_reg;                      /* contents of Alert Reg     */
        uint    sys_dma_rc;                     /* return code from sys dma  */
        uint    chan_status_reg;                /* Channel status register   */
};

/*
 * Serial DASD Subsytem specific IOCTL Parameter structure
 */

struct sd_ioctl_parms {
        uint                data_length;    /* length of data for transfer */
        char                *buffer;        /* pointer to data buffer      */
        uint                time_out;       /* time out value for this cmd */
	                                    /* in seconds                  */
        uchar               reset_type;     /* Full Reset or Quiesce       */
#define SD_RESET_OP		0x00
#define SD_QUIESCE_OP		0x01
#define SD_DASD_RESET		0x02

        uchar               status_validity;            
#define SD_NO_STATUS		0x00        /* successful completion      */
#define SD_VALID_ADAP_STATUS   	0x01	    /* Adapter Status is valid    */
#define SD_VALID_CTRL_STATUS  	0x02	    /* Controller Status is valid */
#define SD_DRIVER_STATUS        0x04        /* Device Status only         */
        uchar               adapter_status; /* Adapter Status byte        */
        uchar               controller_status;  /* Controller Status byte */
        uint                resvd1;         /* reserved, various uses     */
        uint                resvd2;         /* reserved, various uses     */
        uint                resvd3;         /* reserved, various uses     */
        uint                resvd4;         /* reserved, various uses     */
        uint                resvd5;         /* reserved, various uses     */
        uint                resvd6;         /* reserved, various uses     */
        uint                resvd7;         /* reserved, various uses     */
};

#ifdef _KERNEL
/*
 * NOTE: This structure is not supported for use by applications. It is only
 *       for internal device driver use.
 *
 * 
 * Serial DASD Subsytem specific IOCTL Parameter structure used 
 * internally by device driver to support 64-bit applications.
 */

struct sd_ioctl_parms64 {
        uint                data_length;    /* length of data for transfer */
        ptr64               buffer;         /* pointer to data buffer      */
        uint                time_out;       /* time out value for this cmd */
	                                    /* in seconds                  */
        uchar               reset_type;     /* Full Reset or Quiesce       */

	/* see sd_ioctl_parms for defines under reset_type */

        uchar               status_validity;   
         
	/* see sd_ioctl_parms for defines under status validity */

        uchar               adapter_status; /* Adapter Status byte        */
        uchar               controller_status;  /* Controller Status byte */
        uint                resvd1;         /* reserved, various uses     */
        uint                resvd2;         /* reserved, various uses     */
        uint                resvd3;         /* reserved, various uses     */
        uint                resvd4;         /* reserved, various uses     */
        uint                resvd5;         /* reserved, various uses     */
        uint                resvd6;         /* reserved, various uses     */
        uint                resvd7;         /* reserved, various uses     */
};

#endif
/*
 * Structure to address data returned by fence command.
 */

struct sd_fence_info
{
    ushort fence_posn;                      /* fence position indicator    */
    ushort fence_oldvalue;                  /* old value of fence register */
};

/*
 * Serial DASD Subsytem SCSI like Pass-through Ioctl Structure
 */
struct sd_iocmd {
        uint   data_length;          /* Bytes of data to be transfered */
        char   *buffer;              /* Pointer to transfer data buffer */
        uint   timeout_value;        /* In seconds */
        uchar  status_validity;      /* 0 = no valid status */
	/* 1 = valid SCSI bus status only       */
	/* 2 = valid adapter status only        */
/* Addition to status_validity definitions for sc_iocmd in scsi.h */
#define SD_VALID_ALERTREG	0x04 /* Valid Alert Register Contents   */

        uchar  scsi_bus_status;      /* SCSI bus status (if valid) See  */
				     /* SCSI Status Byte Code defines   */
				     /* above.				*/
        uchar  adapter_status;       /* Adapter status (if valid), refer*/ 
				     /* to sc_buf definition 		*/
	uchar  resvd1;               /* Returned as the controller 	*/
				     /* status byte. See Controller	*/
				     /* Status Byte Codes defines above.*/
	uchar  resvd2;               /* Returned as the adapter 	*/
				     /* status byte. See Adapter	*/
				     /* Status Byte Codes defines above.*/
	uchar  resvd3;               /* reserved for future expansion 	*/
	uchar  resvd4;               /* reserved for future expansion 	*/     
        uchar  flags;                /* B_READ, B_WRITE 		*/
	uchar  resvd5;		     /* Specifies the address of the    */
				     /* device.				*/
	uchar  resvd6;               /* Queue Control 			*/
#define SD_Q_NONE	0x00	     /* Unqueued command      		*/
#define SD_Q_INVALID	0x40	     /* Invalid        			*/
#define SD_Q_ORDERED	0x80	     /* Ordered Command        		*/
#define SD_Q_UNORDERED	0xC0	     /* Unordered Command      		*/
	uchar  resvd7;               /* SCSI extension 			*/
#define SD_NO_EXT	0x00	     /* No extension            	*/
#define SD_SPLIT_WRITE	0x20	     /* Split Write Enabled     	*/
#define SD_SPLIT_READ	0x10	     /* Split Read Enabled      	*/

        uchar  command_length;       /* Length of SCSI command block */
        uchar  scsi_cdb[12];         /* SCSI command descriptor block */
};
#ifdef _KERNEL
/*
 * NOTE: This structure is not supported for use by applications. It is only
 *       for internal device driver use.
 *
 * 
 * Serial DASD Subsytem SCSI like Pass-through Ioctl Structure used 
 * internally by device driver to support 64-bit applications.
 */

struct sd_iocmd64 {
        uint   data_length;          /* Bytes of data to be transfered */
        ptr64  buffer;               /* Pointer to transfer data buffer */
        uint   timeout_value;        /* In seconds */
        uchar  status_validity;      /* 0 = no valid status */
	/* 1 = valid SCSI bus status only       */
	/* 2 = valid adapter status only        */
/* Addition to status_validity definitions for sc_iocmd in scsi.h */
        /* 0x04 = Valid Alert Register Contents   */

        uchar  scsi_bus_status;      /* SCSI bus status (if valid) See  */
				     /* SCSI Status Byte Code defines   */
				     /* above.				*/
        uchar  adapter_status;       /* Adapter status (if valid), refer*/ 
				     /* to sc_buf definition 		*/
	uchar  resvd1;               /* Returned as the controller 	*/
				     /* status byte. See Controller	*/
				     /* Status Byte Codes defines above.*/
	uchar  resvd2;               /* Returned as the adapter 	*/
				     /* status byte. See Adapter	*/
				     /* Status Byte Codes defines above.*/
	uchar  resvd3;               /* reserved for future expansion 	*/
	uchar  resvd4;               /* reserved for future expansion 	*/     
        uchar  flags;                /* B_READ, B_WRITE 		*/
	uchar  resvd5;		     /* Specifies the address of the    */
				     /* device.				*/
	uchar  resvd6;               /* Queue Control 			*/

     /* see sd_iocmd for defines under  resvd6 */

	uchar  resvd7;               /* SCSI extension 			*/

     /* see sd_iocmd for defines under  resvd7 */

        uchar  command_length;       /* Length of SCSI command block */
        uchar  scsi_cdb[12];         /* SCSI command descriptor block */
};

#endif
#endif /* _H_SERDASD */
