Files
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

582 lines
18 KiB
C

/* @(#)ipi3.h 1.1 7/30/92 19:51:58 SMI */
/*
* IPI-3 command packets, response packets, and parameters
*/
#ifndef _ipi3_h
#define _ipi3_h
/*
* Common header for all IPI-3 packets.
*/
struct ipi3header {
u_short hdr_pktlen; /* command packet length
(not including length) */
u_short hdr_refnum; /* unique command reference number */
u_char hdr_opcode; /* command opcode */
u_char hdr_mods; /* common and opcode modifiers */
u_char hdr_slave; /* slave (controller) address */
u_char hdr_facility; /* facility (drive) address */
};
#define IPI_HDRLEN (sizeof(struct ipi3header) - sizeof(u_short))
/*
* Response packet header.
*/
struct ipi3resp {
u_short hdr_pktlen; /* response packet length
(not including length) */
u_short hdr_refnum; /* unique command reference number */
u_char hdr_opcode; /* command opcode */
u_char hdr_mods; /* common and opcode modifiers */
u_char hdr_slave; /* slave (controller) address */
u_char hdr_facility; /* facility (drive) address */
u_short hdr_maj_stat; /* major response status */
};
/*
* Command Opcodes.
*/
#define IP_NOP 0x00 /* Nop */
#define IP_ATTRIBUTES 0x02 /* set, report, or load slave attributes */
#define IP_REPORT_STAT 0x03 /* Report Addressee Status */
#define IP_PORT_ADDR 0x04 /* Port Address */
#define IP_OPER_MODE 0x07 /* Set Operating mode of facility */
#define IP_READ 0x10 /* Read */
#define IP_WRITE 0x20 /* Write */
#define IP_FORMAT 0x28 /* Format */
#define IP_REALLOC 0x33 /* Reallocate Defect */
#define IP_ALLOC_RESTOR 0x34 /* Allocate restore */
#define IP_POS_CTL 0x41 /* Position Control */
#define IP_REPORT_POS 0x42 /* Report Position */
#define IP_READ_BUF 0x52 /* Read Buffer */
#define IP_WRITE_BUF 0x62 /* Write Buffer */
#define IP_SLAVE_DIAG 0x80 /* Perform Slave Diagnostics */
#define IP_FACIL_DIAG 0x81 /* Perform Facility Diagnostics */
#define IP_READ_DEFLIST 0x82 /* Read Defect List */
#define IP_WRITE_DEFLIST 0x83 /* Write Defect List */
#define IP_READ_ERRLOG 0x84 /* Read Error Log */
#define IP_DIAG_CTL 0x90 /* Diagnostic Control */
#define IP_ASYNC_RESP 0xff /* opcode in asynchronous response */
/*
* Common Opcode modifiers.
*
* Sequential (0x20 )and Ordered (0x30) commands are not supported.
*/
#define IP_CM_PRI 0x40 /* Priority command */
#define IP_CM_CHAIN 0x10 /* Chained command */
/*
* Opcode modifiers for Transfer Commands
*/
#define IP_OM_BLOCK 0x01 /* count and length are in blocks */
#define IP_OM_RAW 0x02 /* data recovery off */
/*
* Opcode modifiers for Attributes commands.
*/
#define IP_OM_REPORT 0 /* report attributes */
#define IP_OM_INIT 1 /* initialize attributes */
#define IP_OM_RESTORE 2 /* restore attributes */
#define IP_OM_LOAD 9 /* load attributes */
#define IP_OM_SAVE 0xa /* save attributes */
/*
* Opcode modifiers for Report Addressee Status.
*/
#define IP_OM_PORT_QUERY 4 /* return port mask */
#define IP_OM_STATUS 2 /* report status (vendor unique) */
#define IP_OM_CONDITION 1 /* return condition */
/*
* Response type in major status.
* Only these are supported.
*/
#define IP_RTYP(x) ((x) & 0xf0) /* extract type */
#define IP_MAJ_CODE(x) ((x) & 0xff0f) /* extract major type */
#define IP_RT_CCR 0x10 /* command completion response */
#define IP_RT_ASYNC 0x40 /* asychronous response */
#define IP_RT_XFER 0x50 /* transfer notification (never seen by host) */
/*
* Flags in response major status.
*/
#define IP_MS_CMDEXC 0x8000 /* command exception */
#define IP_MS_MCHEXC 0x4000 /* machine exception */
#define IP_MS_APEXC 0x2000 /* alternate port exception */
#define IP_MS_INTREQ 0x1000 /* intervention required */
#define IP_MS_MSG 0x0800 /* message/microcode exception */
#define IP_MS_VENDOR 0x0400 /* vendor unique */
#define IP_MS_SUCCESS 0x0008 /* successful */
#define IP_MS_INCOMP 0x0004 /* incomplete */
#define IP_MS_COND 0x0002 /* conditional success */
#define IP_MS_ABORT 0x0001 /* aborted */
/*
* Parameters
*
* All parameters start with a one byte length followed by a one byte ID.
* A length of zero indicates a padding byte for alignment in the sender.
* On receipt, parameters may be on any boundary, which must be dealt with
* if the machine has alignment restrictions.
*/
/*
* Message/Microcode exception parameter (0x13 or 0x23).
*/
struct msg_ucode_parm {
u_short mu_flags; /* 1-2 error flags - see below */
u_short reserved; /* 3-4 reserved */
union { /* 5-n extended substatus */
struct {
u_short mu_fru; /* 5-6 Field-Replaceable Unit ID */
char mu_msg[1]; /* 7-n ASCII message */
} mu_m;
} mu_u;
};
/*
* Message/Microcode error flags
*/
#define IPMU_UDAT_NA 0x8000 /* microcode data not accepted */
#define IPMU_REQ_IML 0x4000 /* request master to IML slave */
#define IPMU_CANT_IML 0x2000 /* slave unable to IML */
#define IPMU_MSG 0x1000 /* message */
#define IPMU_UC_ERR 0x0800 /* microcode execution error */
#define IPMU_FAIL_MSG 0x0400 /* failure message */
#define IPMU_PORT_DSBL 0x0200 /* port disable pending */
#define IPMU_PORT_RESP 0x0100 /* port response */
#define IPMU_FAC_STAT 0x0080 /* facility status */
/*
* Transfer Notification Parm (0x30).
* Holds the read/write buffer address in DVMA space.
* This is only used for some string controllers and drivers, notably
* the Sun Panther VME-attached string controller.
*/
struct xnote_parm {
caddr_t bufadr; /* DVMA buffer address */
};
/*
* Command Extent Parm (0x31). Defines the tranfer count and start address
* (expressed as a logical block offset from the start of the disk) for the
* transfer.
*/
struct cmdx_parm {
u_long cx_count; /* transfer count (bytes or blocks) */
u_long cx_addr; /* data address (bytes or blocks) */
};
/*
* Response Extent Parm (0x32). In response this gives the residual count
* in blocks or octets and the address of the next block or octet to be
* transferred.
*/
struct respx_parm {
u_long rx_resid; /* residual count */
u_long rx_addr; /* address to resume transfer */
};
/*
* Block Size Parm (0x3b). Defines physical block size for format, etc.
*/
struct bsize_parm {
u_long blk_size;
};
/*
* Transfer Parm (0x3c). Options for data transfer commands. Currently used
* only by WRITE to do a "write with verify".
*/
struct xfer_parm {
u_char xferopt; /* see bits below */
};
#define XFER_PARM 0x3c
#define XFER_VERIFY 0x80 /* verify */
#define XFER_VOLUME 0x40 /* transfer applies to entire volume */
#define XFER_CERTIFY 0x20 /* certify area after format */
#define XFER_STOP_ERR 0x10 /* stop transfer on data error */
#define XFER_COMP_SLAVE 0x02 /* compare with slave buffer */
#define XFER_COMP_HOST 0x01 /* comparee with master's buffer */
/*
* Vendor ID parameter (0x50). Supply vendor specific info. Extra fields are
* supplied for future expansion. This parameter is read-only.
*/
struct vendor_parm {
char manuf[16]; /* Manufacturer's ID (SUNMICRO) */
char model[8]; /* Model # (PANTHER) */
u_char rev[4]; /* revision level */
u_char uniq_id[8]; /* Controller Unique ID (serial #) */
u_char switset[4]; /* Switch Settings */
u_char man_data[24]; /* Manufacturer's data */
};
/*
* Diagnostic Number parameter (for Diagnostic Control Op) (0x50).
*/
struct ipi_diag_num {
u_short dn_diag_num; /* diagnostic number */
};
#define IPDN_DUMP 1 /* dump firmware to first ready drive */
/*
* Size of DataBlocks parameter (0x51). Default is 512.
*/
struct datbsize_parm {
int dblksize;
};
/*
* Size of Physical Blocks parameter (0x52). Always the same as DataBlocks.
*/
struct physbsize_parm {
int pblksize;
};
/*
* Total Number of Disk Data Blocks parameter (0x53). The starting address
* field is always zero.
*/
struct numdatblks_parm {
int bperpart; /* Blocks per Partition */
int bpercyl; /* Blocks per Cylinder */
int bpertrk; /* Blocks per Track */
int strtadr; /* Starting Address */
};
/*
* Total Number of Disk Physical Blocks parameter (0x54). The starting
* address field is always zero.
*/
struct numphyblks_parm {
int bperpart; /* Blocks per Partition */
int bpercyl; /* Blocks per Cylinder */
int bpertrk; /* Blocks per Track */
int strtadr; /* Starting Address */
};
/*
* Data Block Sizes Supported parameter (0x55). Define the size (in bytes) of
* a data block. Default is 512.
*/
struct datbss_parm {
int mindatbs; /* Min data block size */
int maxdatbs; /* Max data block size */
int incsize; /* Increment size */
};
/*
* Physical Block Sizes Supported parameter (0x56). Define the size (in
* bytes) of a physical block. Default is 512.
*/
struct phybss_parm {
int mindatbs; /* Min data block size */
int maxdatbs; /* Max data block size */
int incsize; /* Increment size */
};
/*
* Pad with Fill Characters parameter (0x5a). The slave uses the value in
* this field when it needs to pad data. The default is 0xfb87.
*/
struct pad_parm {
char filler[4]; /* Fill characters */
};
/*
* Physical Disk Configuration parameter (0x5f).
*/
struct physdk_parm {
u_int pp_last_cyl; /* Address of last data cylinder */
u_int pp_deflist_cyl; /* defect list cylinder */
u_short pp_nheads; /* heads per cylinder*/
u_short pp_nsects; /* fixed sectors per revolution */
u_int pp_nbytes; /* bytes per track */
u_int pp_sinseek; /* single cylinder seek time (usec) */
u_int pp_avgseek; /* average cylinder seek time (usec) */
u_int pp_maxseek; /* maximum cylinder seek time (usec) */
u_int pp_rotper; /* rotational period (usec) */
u_int pp_hdswit; /* head switch time (usec) */
u_int pp_wrrec; /* write to read recovery time (usec) */
u_char pp_model[4]; /* model number in ASCII */
};
/*
* Non-Standard Physical Disk Configuration parameter (0x5f).
* The CDC CM-3 controller uses this format.
*/
struct physdk_parm_cm3 {
u_int pp_last_cyl; /* Address of last data cylinder */
u_int pp_deflist_cyl; /* defect list cylinder */
u_short pp_nheads; /* heads per cylinder*/
u_int pp_nsects; /* fixed sectors per revolution */
u_int pp_nbytes; /* bytes per track */
u_int pp_sinseek; /* single cylinder seek time (usec) */
u_int pp_avgseek; /* average cylinder seek time (usec) */
u_int pp_maxseek; /* maximum cylinder seek time (usec) */
u_int pp_rotper; /* rotational period (usec) */
u_int pp_hdswit; /* head switch time (usec) */
u_int pp_wrrec; /* write to read recovery time (usec) */
u_char pp_model[4]; /* model number in ASCII */
};
/*
* Addressee Configuration parameter (0x65). Define the operating
* characteristics of the addressee (controller).
*/
struct addr_conf_parm {
u_int ac_bufsize; /* size of slave buffer in bytes */
u_int ac_cmdbufsize; /* Command buffer size in bytes */
u_short ac_max_cmdlen; /* Max len of cmd packet */
u_short ac_max_resplen; /* Max len of response packet */
u_char ac_acc_perm_ext; /* Max access permit extents */
u_char ac_min_queue; /* minimum queued cmds per device */
u_char ac_max_queue; /* maximum queued cmds per device */
u_char ac_stk_size; /* size in bytes of command stack */
};
/*
* Slave Configuration (bit significant) parameter (0x66). Define the
* operating characteristics of the slave (facility) using bit fields.
*/
struct slavconf_bs_parm {
u_char slavebits[4]; /* slave config bit fields (defines
* below) */
};
/*
* Slave Configuration (Fields) parameter (0x67). Define the operating
* characteristics of the slave (facility) using fields.
*/
struct slavconf_fld_parm {
u_char spare1[3];
u_char nparts; /* number of data partitions per facility (1) */
u_char spare2[4];
u_char maxextent; /* max number of extents */
u_char spare3[5];
char fattched[8]; /* number of facitilies attached */
};
/*
* Facilities Attached to Slave parameter (0x68).
* Identifies the facilities (disks) attached to the slave.
* Repeats as necessary to define all facilities.
*/
struct fat_parm {
u_char fa_addr; /* Facility Address */
u_char fa_class; /* Facility Class */
u_char fa_type; /* Facility Type */
u_char reserved; /* reserved */
};
/*
* Request Parm parameter (0x6c).
*
* Specifies parameters desired and how they are to be provided.
*
* The parameter can be provided as data, (i.e. DMA'ed like a normal
* data operation). Panther requires a Length Parameter in this case to
* declare the length of the buffer.
*
* The other method for obtaining parameters is to ask for them to be sent
* back in the IPI-3 response packet.
*/
struct reqparm_parm {
u_char rp_spec; /* specify how to respond */
u_char rp_parm; /* ID of requested parameter */
};
/*
* Bitdefs for REQUEST PARM parameter
*/
#define RESP_AS_DATA 0x80 /* Send back as data */
#define RESP_AS_PKT 0x40 /* Send back as a response packet */
#define RESP_LEN_PARM 0x20 /* provide parameter length parameter */
#define RESP_AS_NDATA 0x10 /* naked parameters as data */
/*
* Parm Length parameter (0x6d). This is used with the Request Parm parameter
* to specify how long a response transferred as data will be.
* This is usually set to 8k by the user (format) program.
*/
struct parmlen_parm {
u_long parmlen; /* Length of parameter in bytes */
};
/*
* Slave Reconfiguration parameter - Bit Significant (0x6e).
* Define the reconfigurable attributes of the slave.
*/
struct reconf_bs_parm {
u_char sr_cs_error : 1; /* report cond success on error retry */
u_char sr_cs_data : 1; /* report CS on data correction */
u_char sr_inh_ext_substat : 1; /* inhibit extended substatus */
u_char sr_phys_sel_syn : 1; /* physical selection of synonyms */
u_char sr_auto_realloc : 1; /* auto realloc on excessive retrys */
u_char sr_seek_alg : 1; /* seek algorithm on */
u_char sr_inh_resp_succ : 1; /* inhibit response on success */
u_char : 1; /* reserved */
u_char sr_tnp_req : 1; /* transfer notification required */
u_char sr_inh_slv_msg : 1; /* inhibit slave messages */
u_char sr_inh_unant_pause : 1; /* inhibit unanticipated pauses */
u_char sr_dis_err_rcvry : 1; /* disable all error recovery */
u_char sr_log_unexp_cl1 : 1; /* log unexpected class 1 events */
u_char sr_dis_cl1x : 1; /* discard class 1 transitions */
u_char sr_stream_xfer : 1; /* data streaming data transfers */
u_char sr_inlk_xfer : 1; /* interlock data transfers */
u_char sr_inh_resp_npbusy : 1; /* inhibit resp P-busy to not P-busy */
u_char : 7; /* reserved */
};
/*
* Slave Reconfiguration parameter - Fields (0x6f). Define the reconfigurable
* attributes of the slave.
*/
struct reconf_fld_parm {
u_char resrv1[8]; /* Reserved */
short maxbincmd; /* Maximum bytes in command packet */
short maxbinrsp; /* Maximum bytes in response packet */
u_char resrv2[8];
int burstsize; /* DMA burst length in bytes (128) */
u_char resrv3[8];
};
/*
* Panther Reconfiguration parameter (0xD0). Put vendor unique stuff here.
*/
struct panreconf_parm {
u_char rahead; /* Read-Ahead enabled flag */
u_char burstlate; /* Inter-Burst latency */
short breqlevl; /* VME Bus Request level */
short vecnum; /* Interrupt Vector Number */
short shmemoff; /* Offset from base I/O addr for
* shared mem */
char resrv1[14]; /* Reserved */
};
/*
* Entire command for read/write operation. This makes it cheaper to
* build since this version is so common.
*/
struct ipi_rdwr_cmd {
struct ipi3header hdr; /* header */
long pad_len_id; /* pad, len, id */
struct cmdx_parm cmdx; /* extent parameter */
};
/*
* Read write command for host adapters that require transfer notification.
*/
struct ipi_rdwr_cmdx {
struct ipi3header hdr; /* header */
long pad_len_idx; /* pad, len, id */
struct xnote_parm xnote; /* transfer notification parameter */
long pad_len_id; /* pad, len, id */
struct cmdx_parm cmdx; /* extent parameter */
};
/*
* Format command.
* The block size parameter is not used for Panther.
*/
struct ipi_format_cmd {
struct ipi3header fc_hdr; /* header */
u_short fc_filler; /* zeros */
u_char fc_bsize_len; /* parameter length (5) */
u_char fc_bsize_id; /* parameter ID */
struct bsize_parm fc_bsize_parm; /* block size parameter */
};
/*
* Parameter IDs.
*/
/*
* Major status parameters for slave.
*/
#define IPI_S_VEND 0x12 /* vendor unique */
#define IPI_S_MESSAGE 0x13 /* message/microcode exception */
#define IPI_S_INTREQ 0x14 /* intervention required */
#define IPI_S_ALTPORT 0x15 /* alternate port exception */
#define IPI_S_MCH_EXC 0x16 /* machine exception */
#define IPI_S_CMD_EXC 0x17 /* command exception */
#define IPI_S_ABORT 0x18 /* command aborted */
#define IPI_S_COND_SUCC 0x19 /* conditional success */
#define IPI_S_INCOMP 0x1a /* incomplete */
/*
* Major status parameters for facility.
*/
#define IPI_F_VEND 0x22 /* vendor unique */
#define IPI_F_MESSAGE 0x23 /* message/microcode exception */
#define IPI_F_INTREQ 0x24 /* intervention required */
#define IPI_F_ALTPORT 0x25 /* alternate port exception */
#define IPI_F_MCH_EXC 0x26 /* machine exception */
#define IPI_F_CMD_EXC 0x27 /* command exception */
#define IPI_F_ABORT 0x28 /* command aborted */
#define IPI_F_COND_SUCC 0x29 /* conditional success */
#define IPI_F_INCOMP 0x2a /* incomplete */
/*
* Common parameters
*/
#define XFER_NOTIFY 0x30 /* transfer notification (VME addr) */
#define CMD_EXTENT 0x31 /* command extent (count + block addr ) */
#define RESP_EXTENT 0x32 /* response extent (residual count and addr) */
#define BSIZE_PARM 0x3b /* block size */
/* ATTRIBUTES Parameters */
#define ATTR_VENDOR 0x50 /* vendor ID */
#define ATTR_LOG_BSIZE 0x51 /* logical data block size */
#define ATTR_PHYS_BSIZE 0x52 /* physical data block size */
#define ATTR_LOG_GEOM 0x53 /* layout of blocks on disk */
#define ATTR_PHYS_GEOM 0x54 /* layout of blocks on disk */
#define ATTR_LOG_SUP 0x55 /* logical block sizes supported */
#define ATTR_PHYS_SUP 0x56 /* physical block sizes supported */
#define ATTR_FILL_PAT 0x5a /* fill pattern */
#define ATTR_PHYSDK 0x5f /* physical disk configuration */
#define ATTR_ADDR_CONF 0x65 /* addresssee configuration */
#define ATTR_FAC_ATTACH 0x68 /* facilities attached */
#define ATTR_REQPARM 0x6c /* request parameters */
#define ATTR_PARMLEN 0x6d /* length of parameter list */
#define ATTR_SLVCNF_BIT 0x6e /* slave configuration - bits supported */
#define ATTR_SLVCNF_FLD 0x6f /* slave configuration - fields supported */
#define ATTR_PANTHER 0xd0 /* panther-unique parameter? -later */
/*
* Read/Write Defect list Parameters
*/
#define DEFLIST_DBLOCK 0x55 /* defective datablock */
#define DEFLIST_TRACK 0x56 /* track defects list parameter */
#define DEFLIST_SECTOR 0x57 /* sector defects list parameter */
/*
* Diagnostic Control Parameters.
*/
#define IPI_DIAG_NUM 0x50 /* diagnostic number parameter */
#endif /* _ipi3_h_ */