/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos720 src/bos/kernel/sys/tapedd.h 1.26.5.2                            */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1989,1995              */
/* 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                                                     */
/* @(#)20 1.26.5.2 src/bos/kernel/sys/tapedd.h, sysxtape, bos720 7/14/11 17:38:48 */
#ifndef _H_TAPEDD
#define  _H_TAPEDD
#include <sys/pm.h>
/*
 * COMPONENT_NAME: (INCSYS) SCSI Tape Device Driver Include File
 *
 * FUNCTIONS: NONE
 *
 * ORIGINS: 27, 83
 *
 * (C) COPYRIGHT International Business Machines Corp. 1989, 2002
 * 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.
 *
 * LEVEL 1, 5 Years Bull Confidential Information
 */

/************************************************************************/
/*									*/
/*  NOTE:	This header file contains the definition of the		*/
/*              structures which are passed from the tape device driver */
/*              to the SCSI adapter driver.  Also contained are         */
/*              structures passed by the application for ioctl          */
/*              execution.                                              */
/*                                                                      */
/************************************************************************/

struct tape_device_df;
struct file;

/************************************************************************/
/* SCSI Status Block Values                                             */
/************************************************************************/
#define TAPE_GOOD_CMPLTN     0x00
#define TAPE_CHK_CONDITION   0x02
#define TAPE_COND_GOOD       0x04
#define TAPE_BUSY            0x08
#define TAPE_IMMED_GOOD      0x10
#define TAPE_IMMED_COND_GOOD 0x14
#define TAPE_RES_CONFLICT    0x18
#define TAPE_CMD_TIMEDOUT    0xff          /* no scsi status available */
#ifdef DEBUG
#define DKprintf(args) if (tape_debug) printf args
#endif

/************************************************************************/
/* Device driver internal trace table information.                      */
/************************************************************************/
/*
 * Debug Trace length
 */
#ifdef DEBUG
#define TRACE_TABLE_PTR      ">TRACEP<"
#define TRACE_LABEL_SIZE        9
#define TRCLNGTH                1000    /* Length of of each Tape Trace      */
                                        /* Buffer.                           */
#define TRCLNGTH_PTR            10      /* Number of Tape Trace table        */
                                        /* buffers that we point to.         */
#endif

/*
 * Debug Trace Table Structure
 */
#ifdef DEBUG
struct tape_trace {
#define TAPE_TRC_STR_LENGTH       8
        char    desc[TAPE_TRC_STR_LENGTH];  /* ASCII descrip of this entry   */
        char    type[3];                    /* ASCII desrip of entry or exit */
        char    count;                      /* which of several entries      */
#ifdef __64BIT_KERNEL
        uint    pad1;
#endif
        ulong   word1;                      /*  meaning depends on the desc  */
        ulong   word2;                      /*  meaning depends on the desc  */
        ulong   word3;                      /*  meaning depends on the desc  */
        ulong   word4;                      /*  meaning depends on the desc  */
        ulong   word5;                      /*  meaning depends on the desc  */
#ifdef __64BIT_KERNEL
        ulong    pad2;
#endif
};
#endif

/************************************************************************/
/* X3.131 SCSI Standard Sense Key Values                                */
/************************************************************************/
#define TAPE_NO_SENSE                0x00
#define TAPE_RECOVERED_ERROR         0x01
#define TAPE_NOT_READY               0x02
#define TAPE_MEDIUM_ERROR            0x03
#define TAPE_HARDWARE_ERROR          0x04
#define TAPE_ILLEGAL_REQUEST         0x05
#define TAPE_UNIT_ATTENTION          0x06
#define TAPE_DATA_PROTECT            0x07
#define TAPE_BLANK_CHECK             0x08
#define TAPE_VENDOR_UNIQUE           0x09
#define TAPE_COPY_ABORTED            0x0A
#define TAPE_ABORTED_COMMAND         0x0B
#define TAPE_EQUAL_CMD               0x0C
#define TAPE_VOLUME_OVERFLOW         0x0D
#define TAPE_MISCOMPARE              0x0E

/************************************************************************/
/* Misc. Defines                                                        */
/************************************************************************/
#define TAPE_MAX_RETRY       4          /* maximum error retry count */
#define TAPE_MAXREQUEST      262144     /* maximum transfer allowed  */
#define DEVNO_OVERLAY        0x1FFF     /* overlay for clear dev flag*/
#define TAPE_NOREW_ON_CLOSE  0x01       /* bit check for no rewind   */
#define TAPE_RETEN_ON_OPEN   0x02       /* bit check for retention   */
#define TAPE_DENSITY2        0x04       /* chk for density 2 setting */
#define TAPE_REVERSE         0x01       /* tape motion subroutine flg*/
#define TAPE_FORWARD         0x02       /* tape motion subroutine flg*/
#define TAPE_RECORD          0x01       /* tape motion subroutine flg*/
#define TAPE_FILEMARK        0x02       /* tape motion subroutine flg*/
#define TAPE_WAKEUP          0x01       /* tape iodone subroutine flg*/
#define TAPE_NOWAKEUP        0x02       /* tape iodone subroutine flg*/
#define TAPE_ADAPTER_ERROR   0x01       /* flag used by error proc.  */
#define TAPE_SCSI_ERROR      0x02       /* flag used by error proc.  */
#define TAPE_NOBUFF          0x01       /* device buffers not used   */
#define TAPE_BUFFERED        0x02       /* use device buffers for wrt*/
#define TAPE_COMP_PAGE       0x0F       /* Mode Sel. Comp. Page no.  */
#define TAPE_RETEN_PAGE      0x20       /* Mode Sel. Reten Page no.  */

/************************************************************************/
/* Structure used for power management support                          */
/************************************************************************/
struct tape_pm_handle {
	struct pm_handle        pmh;      /* power management structure */
	struct tape_device_df   *device_ptr;
	int     pm_device_id;             /* PM device id               */
};

/************************************************************************/
/* Structure used for watchdog timer support                            */
/************************************************************************/
struct tape_watchdog {
	struct watchdog         watch_timer; /* watchdog timer structure */
	struct tape_device_df   *device_ptr;
};
/************************************************************************/
/* Error information thresholds for tapes                               */
/************************************************************************/
struct tape_error_df { /* error count fields (see below for error type) */
	uint            write_recovered_error;
	uint            read_recovered_error;
	uint            medium_error;
	uint            hardware_error;
	uint            aborted_cmd_error;
};

/************************************************************************/
/* Initialization information on individual tapes                       */
/************************************************************************/
struct tape_ddi_df  {
	uchar           resource_name[16]; /* name for this device    */
	dev64_t         adapter_devno;  /* adapter major/minor number */
	uchar           scsi_id;                /* SCSI Id for tape   */
	uchar           lun_id;                 /* SCSI LUN for tape  */
	uchar           mode;                   /* mode for tape      */
	uchar           dev_type;               /* device type        */
#define TAPE_8MM            0x01
#define TAPE_9TRACK         0x02
#define TAPE_QUARTER        0x03
#define TAPE_OTHER          0x04
#define TAPE_8MM5GB         0x05
#define TAPE_QIC525         0x06
#define TAPE_QIC1200        0x07
#define TAPE_4MM2GB         0x08
#define TAPE_3490E          0x0a
#define TAPE_4MM4GB         0x0b
#define TAPE_SCSD           0x0c
#define TAPE_STK            0x0d
						/* filemark with var. */
	uchar           ecc_flag;               /* reserved           */
	uchar           extend_filemarks;       /* use long or short  */
	uchar           retention_support;      /* drive supports reten */
	uchar           retention_flag;         /* retention on reset */
	uchar           res_sup;                /* res/rel cmds ok    */
	uchar           density_set1;           /* setting for density*/
	uchar           density_set2;           /* setting for density*/
	uchar           ret_error;              /* ret error on reset */
	uchar           compression_flag;       /* turn compression on*/
	uchar		comp_avail_flag;	/* compress available */
	uchar           autoloader_flag;        /* turn autoloader on */
	uchar           saveparms_flag;         /* Supports save parms*/
	uint            var_blocksize;          /* variable blocksize */
	uint            blocksize;              /* blocksize for tape */
	uint            min_read_error;         /* min. count for log.*/
						/* recovered errors   */
	uint            min_write_error;        /* min. count for log.*/
						/* recovered errors   */
	uint            read_ratio;             /* for rec. errors    */
	uint            write_ratio;            /* for rec. errors    */
	uint            mode_data_length;       /* length of mode data*/
	uint		delay;			/* retry delay (ost)  */
	uint		readwrite;		/* timeout value (ost)*/
	uint		erase_to;		/* erase timeout value*/
	uint		load_to;  		/* load timeout value */
	uint		locate_to;  		/* locate timeout val */
	uint		rewind_to;  		/* rewind timeout val */
	uint		space_to;		/* space timeout value*/
	uint		wrfm_to;  		/* write fm timeout   */
	uchar           mode_select_data[256];  /* mode select data   */
	struct		tape_pm_handle tape_pm_ptr; /* for tape power */ 
						/* management handler */
};

/************************************************************************/
/* Driver Operation descriptor block (includes sc_buf)                  */
/************************************************************************/
struct tape_cmd {
	struct sc_buf           scbuf;
	uchar                   flags;         /* operation flags        */
#define TAPECMD_BUSY      0x01
	uchar                   retry_flag;    /* retry this command?    */
	uchar                   retry_count;   /* number of retrys to do */
	uchar                   tape_position;
#define TAPE_FILEMARK_ERROR  0x01              /* filemark encounterd    */
#define TAPE_ENDOFTAPE_ERROR 0x02              /* EOT encountered        */
#define TAPE_BEGOFTAPE_ERROR 0x04              /* BOT encountered        */
#define TAPE_OVERFLOW_ERROR  0x08              /* buffer write failed    */
#define TAPE_ILI_ERROR       0x10              /* illegal length error   */
#define TAPE_ENDOFDATA_ERROR 0x20              /* end of data on read    */
	uchar                   type;
#define TAPE_RESET_CMD       0x01              /* device/bus reset occur */
#define TAPE_REQSENSE_CMD    0x02              /* req. sense info avail. */
#define TAPE_DIAG_CMD        0x03              /* diag cmd in progress   */
#define TAPE_OTHER_CMD       0x04              /* general cmd in progress*/
#define TAPE_SPECIAL_CMD     0x05              /* special cmd - no retry */
	uchar                   last_state;     /* Last state for error. */
	struct tape_device_df   *device_ptr;
};

/************************************************************************/
/* Request Sense Data Block                                             */
/************************************************************************/
struct req_sense_info  {            /* defined by device specification */
       uchar          err_code;
       uchar          rsvd0;
       uchar          sense_key;
       uchar          sense_byte0;
       uchar          sense_byte1;
       uchar          sense_byte2;
       uchar          sense_byte3;
       uchar          add_sense_length;
       uchar          add_sense_byte0;
       uchar          add_sense_byte1;
       uchar          add_sense_byte2;
       uchar          add_sense_byte3;
       uchar          add_sense_key;
       uchar          extended_byte1;
       uchar          extended_byte2;
       uchar          extended_byte3;
       uchar          extended_byte4;
       uchar          extended_byte5;
       uchar          extended_byte6;
       uchar          extended_byte7;
       uchar          extended_byte8;
       uchar          extended_byte9;
       uchar          extended_byte10;
       uchar          extended_byte11;
       uchar          extended_byte12;
       uchar          extended_byte13;
       uchar          extended_byte14;
       uchar          extended_byte15;
       uchar          extended_byte16;
       uchar          rsvd8[228];
};
/************************************************************************/
/* Information for entire driver                                        */
/************************************************************************/
struct tape_info {
        int               config_cnt;      /* Configuration count          */
        int               open_cnt;        /* Number devices open          */
        lock_t            lock;            /* Lock Word                    */
        struct cdt        *cdt;            /* Component dump table ptr     */
};

/************************************************************************/
/* Information on individual tapes                                      */
/************************************************************************/
struct tape_device_df {
	dev64_t         devno;  /* What device number           */
	uchar           mode;   /* Current op mode of device    */
#define TAPE_DIAGNOSTIC 0x01    /* Diagnostic mode for device   */
#define TAPE_NORMAL     0x02    /* Normal mode for device       */

	uchar           cmd_state;      /* Current device state */
#define TAPE_TUR          0x01          /* test unit ready in progress */
#define TAPE_LOAD         0x02          /* load command in progress */
#define TAPE_RESERVE      0x03          /* reserve in progress */
#define TAPE_RELEASE      0x04          /* release in progress */
#define TAPE_SENSE        0x05          /* mode sense in progress */
#define TAPE_SELECT       0x06          /* mode select in progress */
#define TAPE_IO           0x07          /* read/write in progress */
#define TAPE_IOCTL        0x08          /* ioctl call in progress */
#define TAPE_REQ_SENSE    0x09          /* request sense in progress */
#define TAPE_GENERAL      0x0A          /* other command in progress */
#define TAPE_SIGNALRCV    0x0B          /* signal rcvd to halt command */

	uchar              flags;       /* flags for tape operation     */
#define TAPE_FLAG_OVERLAY        0x04   /* overlay to clear on reverse  */
#define TAPE_DUMP_DEVICE         0x01   /* tape is inited as a dump dev */
#define TAPE_OPENING_DEVICE      0x02   /* tape is being opened         */
#define TAPE_READ_ONLY           0x04   /* tape is read only            */
#define TAPE_OFFLINE             0x08   /* tape has failed, no more cmds*/
#define TAPE_FILEMARK_DETECT     0x10   /* a filemark has been detected */
#define TAPE_ENDOFTAPE_DETECT    0x20   /* end of tape encountered      */
#define TAPE_REQSENSE_AVAIL      0x40   /* alternate buffer command out */
#define TAPE_NO_DELAY            0x80   /* Do not retry when not ready. */
	uchar              flags2;      /* flags for tape operation     */
#define TAPE_LOAD_REQUIRED       0x01   /* unit attention rec. on open  */
#define TAPE_RESET_PARAMS        0x02   /* a reset of ecc and blocksize */
#define TAPE_LOADER_READY        0x04   /* tape is available in 3490e 	*/
#define TAPE_SHORTREAD_OK        0x08   /* var-block read < blk len ok  */
#define TAPE_NOSOFT_CHK          0x10   /* var-block read < blk len ok  */
#define TAPE_DISABLE_EOF         0x20   /* disable eof detection        */

	uchar              operation;   /* what action tape did last    */
#define TAPE_READ_ACTIVE         0x01   /* tape is currently reading    */
#define TAPE_WRITE_ACTIVE        0x02   /* tape is currently writing    */

	uchar              opened;      /* This tape is open            */
        uchar              powered_off; /* This tape is powered off     */
	uchar              open_mode;   /* mode this tape was opened for*/
	uchar              last_state;  /* Last state for error.        */
	uchar              async_flag;  /* do/don't use asynch data xfer*/
	uchar              sense_flag;  /* used for mode sense process  */
#define TAPE_SENSE_A             0x00   /* other scsi tape mode sense   */
#define TAPE_SENSE_B             0x01   /* other scsi tape mode sense   */
#define TAPE_SENSE_C             0x03   /* other scsi tape mode sense   */
#define TAPE_SENSE_D             0x04   /* other scsi tape mode sense   */
	uchar              mode_buf[255];      /* mode select info.     */
	uchar              save_ecc;    /* save area for configured ecc */
	uchar              tape_previously_open; /* special open flag   */
	uchar              filemark_save;  /* when filemarks are hit    */
	uchar              tape_page_supsen;  /* page format require    */
	uchar              tape_page_supsel;  /* page format require    */
	uchar              bytes_requested;   /* bytes for mode sense   */
	uchar              selection_set;     /* flag for mode params   */
	uchar              ret_error_flag;    /* flag for error return  */
	int                save_blocksize; /* save area for config. blk */
	int                max_xfer_size;/* maximun xfer size allowed   */
	uint               write_xfer_count;  /* count of bytes written */
	uint               write_block_count; /* count of blocks written*/
	uint               write_resid;       /* count of 1K blocks written*/
	uint               read_xfer_count;   /* count of bytes read    */
	uint               read_block_count;  /* count of blocks read   */
	uint               read_resid;        /* count of 1K blocks read*/
	uint               stackhead;
	int                initial_tape_blocks; /* count of blocks avail-*/
						/* able at open time     */
	struct file             *fp;    /* file pointer for scsi DD     */
	struct tape_cmd         *stack_ptr[4];
	struct req_sense_info   req_sense_buf;
	struct tape_ddi_df      tape_ddi;   /* ddi info for with device  */
	struct tape_error_df    tape_error; /* error threshold counters. */
	struct tape_watchdog    tape_watchdog_ptr;  /* for watchdog timer*/
	struct tape_cmd    cmd_1_ptr;         /* scsi command info       */
	struct tape_cmd    cmd_2_ptr;         /* scsi command info       */
	struct tape_cmd    reset_cmd_ptr;     /* reset command info      */
	struct tape_cmd    reqsense_cmd_ptr;  /* request sense cmd info. */
	struct tape_cmd    *cmd_outstanding;  /* waiting command         */
#ifdef DEBUG
        char trace_label[TRACE_LABEL_SIZE];/* Label in memory so trace  */
                                        /* table is easy to find        */
        struct tape_trace *st_trace;    /* Tape Trace Buffer            */
        long            st_trctop;    /* Pointer in Tape Trace buffer   */
                                      /* where next entry will go.      */
        int             st_trcindex;  /* Index into Tape Trace Buffer   */
#endif

	long            	 lock_word;   /* device lock word        */
#ifdef _POWER_MP
	Simple_lock 	         intr_lock;   /* interrupt-thread lock   */
#endif /* _POWER_MP */
};
/************************************************************************/
/* structure for STIOCTOP - streaming tape op command w/large data types*/
/************************************************************************/
struct  stop32   {
        short         st_op;          /* operations defined below */
#define STIOCTOP_ORG  0x001           /* for small data types */
#define STIOCTOP_LDT  0x101           /* for large data types */ 		
        daddr32_t     st_count;       /* how many of them */
};
struct  stop64   {
        short         st_op;          /* operations defined below */
        daddr64_t     st_count;       /* how many of them */
};
#endif  /* _H_TAPEDD */
