1/*	$NetBSD: ascvar.h,v 1.10 2005/12/11 12:24:00 christos Exp $	*/
2
3
4/*
5 * State kept for each active SCSI device.
6 */
7struct script;
8
9typedef struct scsi_state {
10	struct script *script;	/* saved script while processing error */
11	int	statusByte;	/* status byte returned during STATUS_PHASE */
12	int	error;		/* errno to pass back to device driver */
13	u_char	*dmaBufAddr;	/* DMA buffer address */
14	int	dmalen;		/* amount to transfer in this chunk */
15	int	dmaresid;	/* amount not transfered if chunk suspended */
16	int	buflen;		/* total remaining amount of data to transfer */
17	char	*buf;		/* current pointer within scsicmd->buf */
18	int	flags;		/* see below */
19	int	msglen;		/* number of message bytes to read */
20	int	msgcnt;		/* number of message bytes received */
21	u_char	sync_period;	/* DMA synchronous period */
22	u_char	sync_offset;	/* DMA synchronous xfer offset or 0 if async */
23	u_char	msg_out;	/* next MSG_OUT byte to send */
24	u_char	msg_in[16];	/* buffer for multibyte messages */
25} State;
26
27/* state flags */
28#define DISCONN		0x001	/* true if currently disconnected from bus */
29#define DMA_IN_PROGRESS	0x002	/* true if data DMA started */
30#define DMA_IN		0x004	/* true if reading from SCSI device */
31#define DMA_RESUME	0x008	/* true if DMA was interrupted by disc. */
32#define DMA_OUT		0x010	/* true if writing to SCSI device */
33#define DID_SYNC	0x020	/* true if synchronous offset was negotiated */
34#define TRY_SYNC	0x040	/* true if try neg. synchronous offset */
35#define PARITY_ERR	0x080	/* true if parity error seen */
36#define CHECK_SENSE	0x100	/* true if doing sense command */
37
38
39/*
40 * State kept for each active SCSI host interface (53C94).
41 */
42
43struct asc_softc {
44	struct device sc_dev;			/* us as a device */
45
46	bus_space_tag_t sc_bst;
47	bus_space_handle_t sc_bsh;
48	bus_space_handle_t sc_scsi_bsh;
49	bus_dma_tag_t sc_dmat;
50	bus_dmamap_t sc_dmamap;
51
52	asc_regmap_t	*regs;		/* chip address */
53	volatile int	*dmar;		/* DMA address register address */
54	int		sc_id;		/* SCSI ID of this interface */
55	int		myidmask;	/* ~(1 << myid) */
56	int		state;		/* current SCSI connection state */
57	int		target;		/* target SCSI ID if busy */
58	struct script	*script;	/* next expected interrupt & action */
59	ScsiCmd		*cmd[ASC_NCMD];	/* active command indexed by SCSI ID */
60	State		st[ASC_NCMD];	/* state info for each active command */
61	/* Start DMA routine */
62	int  (*dma_start)(struct asc_softc *asc,
63				struct scsi_state *state,
64				void *cp, int flag, int len, int off);
65	/* End DMA routine */
66	void	(*dma_end)(struct asc_softc *asc,
67				struct scsi_state *state, int flag);
68
69	u_char		*dma_next;
70	int		dma_xfer;	/* DMA len still to go */
71	int		min_period;	/* Min transfer period clk/byte */
72	int		max_period;	/* Max transfer period clk/byte */
73	int		ccf;		/* CCF, whatever that really is? */
74	int		timeout_250;	/* 250ms timeout */
75	int		tb_ticks;	/* 4ns. ticks/tb channel ticks */
76};
77typedef struct asc_softc *asc_softc_t;
78
79#define	ASC_STATE_IDLE		0	/* idle state */
80#define	ASC_STATE_BUSY		1	/* selecting or currently connected */
81#define ASC_STATE_TARGET	2	/* currently selected as target */
82#define ASC_STATE_RESEL		3	/* currently waiting for reselect */
83
84
85#define ASC_SPEED_25_MHZ	250
86#define ASC_SPEED_12_5_MHZ	125
87
88void	ascattach(struct asc_softc *asc, int bus_speed);
89int	asc_intr(void *asc);
90
91/*
92 * DMA operations.
93 */
94#define	ASCDMA_READ	1
95#define	ASCDMA_WRITE	2
96