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

262 lines
9.6 KiB
C

/* @(#)idvar.h 1.1 7/30/92 */
/*
* Copyright (c) 1989 by Sun Microsystems, Inc.
*/
#ifndef _idvar_h
#define _idvar_h
#include <sun/dkio.h>
/*
* Define MULT_MAJOR if code for multiple major numbers should be included.
* With an 8-bit minor number and 8 sections per disk, only 32 disks can
* be supported per major device number. If MULT_MAJ is defined, the
* driver supports multiple major numbers so that more disks can be supported.
* All this can go away if the minor number field size is increased.
*/
#ifndef MULT_MAJOR
#define MULT_MAJOR 1 /* handle multiple major devices */
#endif
#ifdef MULT_MAJOR
#define NMAJOR 256 /* maximum number of major devices */
#define NDEV_PER_MAJOR 256 /* number of devices per major device */
#define NO_MAJOR (NMAJOR-1) /* illegal value for translation */
#define ID_CMINOR(dev) (cmajor_lookup[major(dev)]*NDEV_PER_MAJOR + minor(dev))
#define ID_BMINOR(dev) (bmajor_lookup[major(dev)]*NDEV_PER_MAJOR + minor(dev))
#define ID_BLKDEV(dev) (makedev(cmajor_trans[major(dev)], minor(dev)))
#else /* no MULT_MAJOR */
#define ID_CMINOR(dev) minor(dev)
#define ID_BMINOR(dev) minor(dev)
#define ID_BLKDEV(dev) (dev)
#endif /* MULT_MAJOR */
#define ID_NLPART NDKMAP /* # of logical partitions */
#define ID_CUNIT(dev) ID_UNIT(ID_CMINOR(dev))
#define ID_BUNIT(dev) ID_UNIT(ID_BMINOR(dev))
#define ID_UNIT(dev) ((unsigned)(dev)/ID_NLPART) /* dev already mapped */
#define ID_LPART(dev) ((unsigned)(dev)%ID_NLPART)
#define NOLPART (-1) /* used for non-partition commands */
#define ID_SECSIZE 512 /* sector size assumed by dump */
#define ID_POLL_TIMEOUT (30000000) /* poll timeout in microseconds */
#define ID_MAXBUFSIZE (63 * 1024) /* Maximum ioctl command buffer size */
/*
* Macro to convert a unit number into IPI channel/slave/facility address.
*/
#define ID_CHAN(unit) ((unit) >> 7)
#define ID_SLAVE(unit) ((unit) >> 4 & 7)
#define ID_FAC(unit) ((unit) & 0xf)
#define ID_MAKE_UNIT(c,s,f) ((c) << 7 | (s) << 4 | (f))
#define ID_CSF(unit) \
IPI_MAKE_ADDR(ID_CHAN(unit), ID_SLAVE(unit), ID_FAC(unit))
/*
* Convert the unit number to the IPI address of it's controller.
*/
#define ID_CTLR_CSF(unit) \
IPI_MAKE_ADDR(ID_CHAN(unit), ID_SLAVE(unit), IPI_NO_ADDR)
/*
* Unit number printable in hex. Looks like device name format.
*/
#define ID_CSF_PRINT(unit) \
(ID_CHAN(unit) << 8 | ID_SLAVE(unit) << 4 | ID_FAC(unit))
/*
* Although IPI-2 only allows 8 drives per channel, some controllers may have
* multiple IPI-2 ports.
*/
#define IDC_NUNIT 16 /* max # of units per controller */
/*
* Recovery control structure.
*/
struct id_rec_state {
char rec_state; /* recovery states */
char rec_substate; /* recovery substates */
short rec_data; /* data for current recovery state */
long rec_history; /* recovery history: a bit per state */
long rec_flags; /* flags for recovery requests */
};
/*
* Recovery states.
* These definitions must be consistent with the id_next_state table
* initialization in id.c.
* The corresponding bit in c_rec_history is set after each state.
* The maximum is 32 states because of c_rec_history size.
*/
#define IDR_NORMAL 0 /* not in recovery mode */
#define IDR_TEST_BOARD 1 /* testing channel board */
#define IDR_RST_BOARD 2 /* resetting channel board */
#define IDR_TEST_CHAN 3 /* testing channel */
#define IDR_RST_CHAN 4 /* resetting channel */
#define IDR_TEST_CTLR 5 /* testing controller */
#define IDR_RST_CTLR 6 /* resetting controler */
#define IDR_GET_XFR 7 /* get transfer settings */
#define IDR_SET_XFR 8 /* set transfer settings */
#define IDR_STAT_CTLR 9 /* report status of controller */
#define IDR_ID_CTLR 10 /* get vendor ID of controller */
#define IDR_ATTR_CTLR 11 /* get attributes of controller */
#define IDR_SET_XFR1 12 /* set transfer settings */
#define IDR_ABORT 13 /* abort commands */
#define IDR_RETRY 14 /* re-issuing commands */
#define IDR_REC_FAIL 15 /* recovery failed */
#define IDR_RST_CTLR1 16 /* reset controller */
#define IDR_GET_XFR1 17 /* get transfer settings */
#define IDR_SET_XFR2 18 /* set transfer settings */
#define IDR_STAT_CTLR1 19 /* report addressee status */
#define IDR_ID_CTLR1 20 /* get vendor ID */
#define IDR_ATTR_CTLR1 21 /* get attributes */
#define IDR_SET_XFR3 22 /* set transfer settings */
#define IDR_STAT_UNIT 23 /* stat device */
#define IDR_ATTR_UNIT 24 /* get device attributes */
#define IDR_READ_LABEL 25 /* read label */
#define IDR_UNIT_NORMAL 26 /* unit recovery successfully complete */
#define IDR_UNIT_FAILED 27 /* unit recovery failed */
#define IDR_SATTR_CTLR1 28 /* set controller attributes - recovery */
#define IDR_SATTR_CTLR2 29 /* set controller attributes - initialization */
#define IDR_IDLE_CTLR 30 /* wait for controller to go idle */
#define IDR_DUMP_CTLR 31 /* dump controller firmware to disk */
/*
* Controller structure
*/
struct id_ctlr {
struct id_unit *c_unit[IDC_NUNIT]; /* unit pointers */
/* 40 */
u_int c_flags; /* state information */
int c_ipi_addr; /* channel/slave/facility address */
short c_cmd_q; /* number of outstanding commands */
short c_max_q; /* limit on outstanding commands */
int c_cmd_q_len; /* length of outstanding commands */
/* 50 */
int c_max_q_len; /* command buffer size (bytes) */
short c_rw_cmd_len; /* length of single read/write cmd */
u_short c_ctlr; /* controller number (as in idc%d) */
u_short c_max_cmdlen; /* maximum command packet length */
u_short c_max_resplen; /* maximum response packet length */
u_char c_idle_time; /* seconds since a command completion */
u_char c_max_parms; /* maximum args for request parameter */
u_char c_ctype; /* Controller type (see dkio.h) */
u_char c_intpri; /* interrupt priority */
/* 60 */
char c_xfer_mode[2]; /* buffer for get transfer mode */
u_short c_fac_flags; /* bit per facility attached */
struct ipiq *c_retry_q; /* requests waiting retry */
struct id_rec_state c_recover; /* recovery state */
/* 74 */
struct reconf_bs_parm c_reconf_bs_parm; /* slave reconfiguration parm */
};
/*
* Flags for controller.
*/
#define ID_C_PRESENT 1 /* initialized */
#define ID_NO_BLK_SIZE 2 /* doesn't support blk size parm for format */
#define ID_SEEK_ALG 4 /* controller does head scheduling */
#define ID_NO_RECONF 8 /* slave reconfiguration attr not supported */
#define ID_CTLR_VERIFY 0x10 /* controller can do write verification */
#define ID_CTLR_WAIT 0x20 /* a unit is waiting for controller queue lim */
/* 0xffffff00 bits 31-8 reserved. flags from ipi_error.h */
/*
* Unit structure.
*/
struct id_unit {
struct id_ctlr *un_ctlr; /* controller */
int un_ipi_addr; /* IPI channel/slave/facility address */
u_int un_flags; /* state information */
short un_cmd_q; /* number of outstanding commands */
u_short un_unit; /* unit number (as in id%x) */
u_int un_phys_bsize; /* physical block size */
u_int un_log_bsize; /* logical block size */
u_int un_log_bshift; /* shift amount for block size divide */
u_int un_first_block; /* starting block number */
struct ipiq *un_wait_q; /* partly setup request */
short un_dk; /* index for iostats (-1 if no stats) */
u_char un_idle_time; /* seconds since a command completion */
u_char un_wchkmap; /* write check flags per partition */
struct dk_label *un_lp; /* label (allocated only during read) */
struct id_rec_state un_recover; /* recovery state */
struct diskhd un_bufs; /* queued buffers */
struct dk_diag un_diag; /* diagnostic information */
struct dk_geom un_g; /* disk geometry info */
/*
* Logical partition information.
*/
struct un_lpart {
struct dk_map un_map; /* first cylinder and block count */
u_int un_blkno; /* first block for partition */
} un_lpart[NDKMAP];
};
/*
* Flags for unit.
*/
#define ID_UN_PRESENT 1 /* device map and geometry initialized */
#define ID_ATTACHED 2 /* attached */
#define ID_LABEL_VALID 4 /* label read and valid */
#define ID_FORMATTED 8 /* drive appears to have been formatted */
#define ID_LOCKED 0x10 /* locked for exclusive use by ioctl command */
#define ID_WANTED 0x20 /* ioctl command waiting for exclusive use */
/* 0xffffff00 bits 31-8 reserved. flags from ipi_error.h */
/*
* Modes for id_send_cmd().
*/
#define ID_SYNCH 0 /* wait for I/O to complete before returning */
#define ID_ASYNCH 1 /* do I/O asynchronously */
#define ID_ASYNCHWAIT 2 /* do I/O asynchronously, sleep until done */
/*
* Flags in ipiq (see ipi_driver.h)
*/
#define IP_DIAGNOSE IP_DD_FLAG0 /* conditional success is an error */
#define IP_SILENT IP_DD_FLAG1 /* suppress messages about errors */
#define IP_WAKEUP IP_DD_FLAG2 /* wakeup on q after completion */
#define IP_ABS_BLOCK IP_DD_FLAG3 /* for ioctl rdwr - no block mapping */
#define IP_BYTE_EXT IP_DD_FLAG4 /* extent is in bytes, not blocks */
#define IP_WCHK IP_DD_FLAG5 /* read after write to verify this op */
#define IP_WCHK_READ IP_DD_FLAG6 /* this op was read to check write */
/*
* Fields used in ipiq (see ipi_driver.h)
*/
#define q_errblk q_dev_data[0] /* block containing error */
#define q_related(q) ((struct ipiq *)((q)->q_dev_data[1])) /* "other" q */
/*
* Error codes.
*
* The error code has three parts, the media/nonmedia flag, the DK severity
* (from sun/dkio.h) and the id-driver error code.
*/
#define IDE_CODE(media, sev, err) ((media) << 15 | (sev) << 8 | (err))
#define IDE_MEDIA(code) ((code) & (1<<15))
#define IDE_SEV(code) (((code) >> 8) & 0xf)
#define IDE_ERRNO(code) ((code) & 0xff)
#define IDE_NOERROR 0
#define IDE_FATAL IDE_CODE(0, DK_FATAL, 1) /* unspecified bad */
#define IDE_CORR IDE_CODE(1, DK_CORRECTED, 2) /* corrected data err */
#define IDE_UNCORR IDE_CODE(1, DK_FATAL, 3) /* hard data error */
#define IDE_DATA_RETRIED IDE_CODE(1, DK_RECOVERED, 4) /* media retried OK */
#define IDE_RETRIED IDE_CODE(0, DK_RECOVERED, 5) /* retried OK */
#endif /* !_idvar_h */