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

239 lines
8.1 KiB
C

/* @(#)ipi_driver.h 1.1 7/30/92 SMI */
/*
* Definitions for IPI-3 device drivers.
*/
#ifndef _ipi_driver_h
#define _ipi_driver_h
/*
* Macros to convert IPI device addresses to channel, slave, and facility
* numbers, and to form addresses from those numbers.
*
* For convenience, the channel, slave, and facility numbers are combined
* into a 32 bit address: 16 bit channel, 8 bit slave, 8 bit facility.
* The slave and facility numbers may be 0xff to indicate no slave or
* no facility is being addressed. If the facility is 0xff, the controller
* itself is being addressed.
*/
#define IPI_NO_ADDR (0xff)
#define IPI_NSLAVE 8 /* slaves per channel */
#define IPI_NFAC 16 /* max facilities per slave */
#define IPI_MAKE_ADDR(c,s,f) ((c)<<16|(s)<<8|(f))
#define IPI_CHAN(a) ((unsigned int)(a)>>16)
#define IPI_SLAVE(a) (((int)(a)>>8)&0xff)
#define IPI_FAC(a) ((int)(a)&0xff)
#define IPI_CTLR_ADDR(a) ((int)(a)|IPI_NO_ADDR)
/*
* IPI queue request element.
*
* This structure must be a multiple of 4 bytes long for intparms to work.
*
* Only the following fields can be modified by device drivers:
*
* q_dev driver can set anytime
* q_ctlr driver can set anytime. IPI layer inits to ctlr arg.
* q_dma_len driver can reduce to actual length to be transferred.
* q_buf points to buffer. Driver may modify.
* q_next driver can modify after completion or before start.
* q_time time limit. Driver may set after setup before start.
* q_result result/state of request - modify only after completion
*
* The following fields can be referenced but not modified by device drivers:
* q_cmd points to command packet which driver fills in.
* q_tnp points to transfer notification parameter data
* q_tnp_len length of transfer notification parameter data
* q_flag flags of request
* q_csf IPI address which was supplied at setup.
* q_resp points to response packet if any.
*/
struct ipiq {
/*
* The portion that driver is permitted to reference.
*/
struct ipi3header *q_cmd; /* command packet */
struct ipiq *q_next; /* next element in queue */
caddr_t q_dev; /* data for device driver */
caddr_t q_ctlr; /* data for device driver */
/* 10 */
struct buf *q_buf; /* block I/O buffer */
long q_time; /* timeout value in seconds */
u_short q_filler; /* fill for intparm alignment */
u_short q_refnum; /* command reference number of ipiq */
char *q_tnp; /* transfer notification parameter */
/* 20 */
u_char q_tnp_len; /* length of transfer notification */
u_char q_retry; /* number of times retry attempted */
u_char q_intclass; /* interrupt class (no driver access) */
u_char q_result; /* code summarizing response */
/*
* These fields are presented to the driver at interrupt time.
* They may be examined but not modified by the driver.
*/
long q_flag; /* flags for request */
struct ipi3resp *q_resp; /* response packet if any */
int q_csf; /* channel/slave/facility address */
/* 30 */
/*
* The portion that is reserved for host adaptor layer and the
* channel board drivers.
*/
void (*q_func)(); /* interrupt handler function */
caddr_t q_dma_info; /* DMA info for channel driver */
u_long q_dma_len; /* byte count of transfer. */
/* len can be reduced by dev driver */
struct ipi_chan *q_chan; /* channel */
/* 40 */
caddr_t q_cmd_pkt; /* kernel address of command packet */
caddr_t q_cmd_ioaddr; /* DVMA or phys addr of cmd packet */
int q_cmd_len; /* length of external packet */
struct ipiq *q_respq; /* ipiq containing response */
/* 50 */
void (*q_chan_func)(); /* channel routine for retry */
caddr_t q_ch_data; /* Channel driver data pointer */
long q_dev_data[2]; /* data for upper level device driver */
};
/*
* On completion of IPI channel commands, the interrupt handling function
* is called. It should be declared like this:
*
* ipi_handler(q)
* struct ipiq *q; request causing interrupt
*
* The result of the operation is summarized in q->q_result by one of the
* following values:
*/
#define IP_INPROGRESS 0 /* issued but not done yet */
#define IP_SUCCESS 1 /* successful completion */
#define IP_ERROR 2 /* error during transfer - see response */
#define IP_COMPLETE 3 /* complete but response needs analysis */
#define IP_OFFLINE 4 /* channel or device not available */
#define IP_INVAL 5 /* host software detected invalid command */
#define IP_MISSING 7 /* time limit expired - abort recommended */
#define IP_RETRY 8 /* channel system requests retry */
#define IP_RETRY_FAILED 9 /* retry limit exceeded */
#define IP_FREE 10 /* on free list */
#define IP_SETUP 11 /* setup for driver or internal use */
#define IP_ASYNC 12 /* asynchronous interrupt */
/*
* Flags in ipiq.
*/
#define IP_ABORTED 2 /* command aborted by driver */
#define IP_SYNC 4 /* driver will poll for interrupt */
#define IP_RESP_SUCCESS 8 /* store response on success */
#define IP_LOG_RESET 0x20 /* for reset_slave: do logical reset */
#define IP_NO_RETRY 0x40 /* do not retry this cmd on controller resets */
#define IP_NO_DMA_SETUP 0x80 /* DMA setup before ipi_setup (for dumps) */
#define IP_DD_FLAG0 0x1000 /* flags for device drivers to pass */
#define IP_DD_FLAG1 0x2000
#define IP_DD_FLAG2 0x4000
#define IP_DD_FLAG3 0x8000
#define IP_DD_FLAG4 0x10000
#define IP_DD_FLAG5 0x20000
#define IP_DD_FLAG6 0x40000
#define IP_DD_FLAG7 0x80000
#define IP_DD_FLAGS 0xff000 /* mask for driver flags */
/*
* Mask for driver-settable flags.
*/
#define IP_DRIVER_FLAGS \
(IP_SYNC | IP_RESP_SUCCESS \
| IP_NO_RETRY | IP_LOG_RESET | IP_NO_DMA_SETUP \
| IP_DD_FLAGS)
/*
* Special callback routine arguments for ipi_setup().
*/
#define IPI_NULL ((int (*)()) 0) /* return NULL if no resource free */
#define IPI_SLEEP ((int (*)()) 1) /* sleep until resources available */
/*
* Table of response handling functions.
* Terminated by zero entry in rt_parm_id.
* These tables are passed to ipi_parse_resp() with a pointer to the
* ipiq. The handling function for the parameters that are present
* are called with the ipiq and the parameter. They return after
* setting flags in the ipiq for use by the driver. The parameters
* may occur in any order.
* The table ends with a zero parameter ID. If that entry has a
* function pointer, that function is called to handle any parameters
* that aren't explicitly mentioned in the rest of the table.
*
* Call to ipi_parse_resp:
*
* ipi_parse_resp(q, table, arg)
* struct ipiq *q;
* struct ipi_resp_table *table;
* caddr_t arg;
*
* Handling function call:
*
* func(q, parm_id, parm, len, arg)
* struct ipiq *q;
* u_char *parm;
* int parm_id, len;
* caddr_t arg;
*/
struct ipi_resp_table {
char rt_parm_id; /* parameter ID (0 if end of table) */
char rt_min_len; /* minimum length of parameter */
int (*rt_func)(); /* handling function */
};
#define spl_ipi() (splvm())
#define spl_ipi_device(csf) (splvm())
/* XXX - this isn't done yet. spl_ipi */
/*
* Orders for slave recovery routines.
*/
#define IPR_RESET 0 /* slave reset required before proceding */
#define IPR_REINIT 1 /* reinitialize: logical slave reset required */
/*
* Miscellaneous constants
*/
#define IPI_RETRY_LIMIT 3 /* Number of retries before giving up */
/*
* Definitions for Get/Set transfer mode.
* These must match IPI-3 and IOCB declarations.
*/
#define IP_STREAM 1 /* Use data streaming for command/response */
#define IP_STREAM_20 2 /* Use 20 MB/sec streaming (otherwise 10) */
#define IP_INLK_CAP 0x04 /* Can send cmd/resp in interlocked mode */
#define IP_STREAM_CAP 0x08 /* Can send cmd/resp using streaming */
#define IP_STREAM_MODE 0x10 /* Now using streaming for cmd/resp */
/*
* Routines for device drivers.
*/
extern struct ipiq * ipi_setup();
extern void ipi_free();
extern int ipi_poll();
extern int ipi_device();
extern void ipi_start();
extern void ipi_test_board();
extern void ipi_reset_board();
extern void ipi_reset_chan();
extern void ipi_reset_slave();
extern void ipi_retry();
extern void ipi_get_xfer_mode();
extern void ipi_set_xfer_mode();
extern int ipi_alloc();
/*
* Routines for channel driver
*/
extern void ipi_parse_resp();
extern struct ipiq * ipi_lookup();
extern void ipi_complete();
#endif /* _ipi_driver_h */