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

221 lines
5.6 KiB
C

#ident "@(#)mode.h 1.1 92/07/30 SMI"
/*
* Copyright (c) 1989, 1990 by Sun Microsystems Inc.
*/
#ifndef _scsi_generic_mode_h
#define _scsi_generic_mode_h
/*
*
* Defines and Structures for SCSI Mode Sense/Select data - generic
*
*/
/*
* Structures and defines common for all device types
*/
/*
* Mode Sense/Select Header.
*
* Mode Sense/Select data consists of a header, followed by zero or more
* block descriptors, followed by zero or more mode pages.
*
*/
struct mode_header {
u_char length; /* number of bytes following */
u_char medium_type; /* device specific */
u_char device_specific; /* device specfic parameters */
u_char bdesc_length; /* length of block descriptor(s), if any */
};
#define MODE_HEADER_LENGTH (sizeof (struct mode_header))
/*
* Block Descriptor. Zero, one, or more may normally follow the mode header.
*
* The density code is device specific.
*
* The 24-bit value described by blks_{hi, mid, lo} describes the number of
* blocks which this block descriptor applies to. A value of zero means
* 'the rest of the blocks on the device'.
*
* The 24-bit value described by blksize_{hi, mid, lo} describes the blocksize
* (in bytes) applicable for this block descriptor. For Sequential Access
* devices, if this value is zero, the block size will be derived from
* the transfer length in I/O operations.
*
*/
struct block_descriptor {
u_char density_code; /* device specific */
u_char blks_hi; /* hi */
u_char blks_mid; /* mid */
u_char blks_lo; /* low */
u_char reserved; /* reserved */
u_char blksize_hi; /* hi */
u_char blksize_mid; /* mid */
u_char blksize_lo; /* low */
};
/*
* Define a macro to take an address of a mode header to the address
* of the nth (0..n) block_descriptor, or NULL if there either aren't any
* block descriptors or the nth block descriptor doesn't exist.
*/
#define BLOCK_DESCRIPTOR_ADDR(mhdr, bdnum) \
((mhdr)->bdesc_length && ((unsigned)(bdnum)) < \
((mhdr)->bdesc_length/(sizeof (struct block_descriptor)))) ? \
((struct block_descriptor *)(((u_long)(mhdr))+MODE_HEADER_LENGTH+ \
((bdnum) * sizeof (struct block_descriptor)))) : \
((struct block_descriptor *) 0)
/*
* Mode page header. Zero or more Mode Pages follow either the block
* descriptors (if any), or the Mode Header.
*
* The 'ps' bit must be zero for mode select operations.
*
*/
struct mode_page {
u_char ps :1, /* 'Parameter Saveable' bit */
:1, /* reserved */
code :6; /* page code number */
u_char length; /* length of bytes to follow */
/*
* Mode Page specific data follows right after this...
*/
};
/*
* Define a macro to retrieve the first mode page. Could be more
* general (for multiple mode pages).
*/
#define MODE_PAGE_ADDR(mhdr, type) \
((type *)(((u_long)(mhdr))+MODE_HEADER_LENGTH+(mhdr)->bdesc_length))
/*
* Page codes, as defined in the proposed SCSI-2 specification,
* Revision 10c, 3/9/90.
*
* Page codes follow the following backwards compatible specification:
*
* Code Value(s) What
* ----------------------------------------------------------------------
* 0x00 Vendor Unique (does not require page format)
*
* 0x02, 0x09, 0x0A pages for all Device Types
*
* 0x01, 0x03-0x08, pages for specific Device Type
* 0x0B-0x1F
*
* 0x20-0x3E Vendor Unique (requires page format)
*
* 0x3F Return all pages (valid for Mode Sense only)
*
*/
/*
* Page codes and page length values (all device types)
*/
#define MODEPAGE_DISCO_RECO 0x02
#define MODEPAGE_PDEVICE 0x09
#define MODEPAGE_CTRL_MODE 0x0A
#define MODEPAGE_ALLPAGES 0x3F
/*
* Mode Select/Sense page structures (for all device types)
*/
/*
* Disconnect/Reconnect Page
*/
struct mode_disco_reco {
struct mode_page mode_page; /* common mode page header */
u_char buffer_full_ratio; /* write, how full before reconnect? */
u_char buffer_empty_ratio; /* read, how full before reconnect? */
u_short bus_inactivity_limit; /* how much bus quiet time for BSY- */
u_short disconect_time_limit; /* min to remain disconnected */
u_short connect_time_limit; /* min to remain connected */
u_short max_burst_size; /* max data burst size */
u_char : 6,
dtdc : 2; /* data transfer disconenct control */
u_char reserved[3];
};
#define DTDC_DATADONE 0x01 /*
* Target may not disconnect once
* data transfer is started until
* all data successfully transferred.
*/
#define DTDC_CMDDONE 0x03 /*
* Target may not disconnect once
* data transfer is started until
* command completed.
*/
/*
* Peripheral Device Page
*/
struct mode_pdevice {
struct mode_page mode_page; /* common mode page header */
u_short if_ident; /* interface identifier */
u_char reserved[4]; /* reserved */
u_char vendor_uniqe[1]; /* vendor unique data */
};
#define PDEV_SCSI 0x0000 /* scsi interface */
#define PDEV_SMD 0x0001 /* SMD interface */
#define PDEV_ESDI 0x0002 /* ESDI interface */
#define PDEV_IPI2 0x0003 /* IPI-2 interface */
#define PDEV_IPI3 0x0004 /* IPI-3 interface */
/*
* Control Mode Page
*/
struct mode_control {
struct mode_page mode_page; /* common mode page header */
u_char : 7,
rlec : 1; /* Report Log Exception bit */
u_char que_mod : 4, /* Queue algorithm modifier */
: 2,
que_err : 1, /* Queue error */
qdisable: 1; /* Queue disable */
u_char eeca : 1,
: 4,
raenp : 1,
uaaenp : 1,
eanp : 1;
u_char reserved;
u_short ready_aen_holdoff;
};
#define CTRL_QMOD_RESTRICT 0x0
#define CTRL_QMOD_UNRESTRICT 0x1
/*
* Include known generic device specific mode definitions and structures
*/
#include <scsi/generic/dad_mode.h>
/*
* Include implementation specific mode information
*/
#include <scsi/impl/mode.h>
#endif /* !_scsi_generic_mode_h */