1/*
2	Copyright 1999, Be Incorporated.   All Rights Reserved.
3	This file may be used under the terms of the Be Sample Code License.
4*/
5
6/*
7** 53c8xx Driver - Data structures and shared constants
8*/
9
10/* status codes signaled from SCRIPTS to driver */
11#define status_ready           0x10  // idle loop interrupted by driver
12#define status_reselected      0x11  // select or idle interrupted by reselection
13#define status_timeout         0x12  // select timed out
14#define status_selected        0x13  // select succeeded
15#define status_complete        0x14  // transaction completed
16#define status_disconnect      0x15  // device disconnected in the middle
17#define status_badstatus       0x16  // snafu in the status phase
18#define status_overrun         0x17  // data overrun occurred
19#define status_underrun        0x18  // data underrun occurred
20#define status_badphase        0x19  // weird phase transition occurred
21#define status_badmsg          0x1a  // bad msg received
22#define status_badextmsg       0x1b  // bad extended msg received
23#define status_selftest        0x1c  // used by selftest stub
24#define status_iocomplete      0x1d
25#define status_syncin          0x1e
26#define status_widein          0x1f
27#define status_ignore_residue  0x20
28
29/* status codes private to driver */
30#define status_inactive        0x00  // no request pending
31#define status_queued          0x01  // start request is in the startqueue
32#define status_selecting       0x02  // attempting to select
33#define status_active          0x03  // SCRIPTS is handling it
34#define status_waiting         0x04  // Waiting for reselection
35
36#define OP_NDATA_IN  0x09000000L
37#define OP_NDATA_OUT 0x08000000L
38#define OP_WDATA_IN  0x01000000L
39#define OP_WDATA_OUT 0x00000000L
40
41#define OP_END      0x98080000L
42#define ARG_END     (status_iocomplete)
43
44typedef struct
45{
46	uint32 count;
47	uint32 address;
48} SymInd;
49
50#define PATCH_DATAIN ((Ent_do_datain/4) + 1)
51#define PATCH_DATAOUT ((Ent_do_dataout/4) + 1)
52
53
54#define ctxt_device    0
55#define ctxt_sendmsg   1
56#define ctxt_recvmsg   2
57#define ctxt_extdmsg   3
58#define ctxt_syncmsg   4
59#define ctxt_status    5
60#define ctxt_command   6
61#define ctxt_widemsg   7
62#define ctxt_program   8
63
64typedef struct
65{
66	uchar _command[12];       /*  0 - 11 */
67	uchar _syncmsg[2];        /* 12 - 13 */
68	uchar _widemsg[2];        /* 14 - 15 */
69	uchar _sendmsg[8];        /* 16 - 23 */
70	uchar _recvmsg[1];        /*      24 */
71	uchar _extdmsg[1];        /*      25 */
72	uchar _status[1];         /*      26 */
73	uchar _padding[1];        /*      27 */
74
75	SymInd device;            /*      28 */
76	SymInd sendmsg;           /*      36 */
77	SymInd recvmsg;           /*      44 */
78	SymInd extdmsg;           /*      52 */
79	SymInd syncmsg;           /*      60 */
80	SymInd status;            /*      68 */
81	SymInd command;           /*      76 */
82	SymInd widemsg;           /*      84 */
83
84/* MUST be dword aligned! */
85	SymInd table[131];        /*      92 --- 129 entries, 1 eot, 1 scratch */
86} SymPriv;
87
88#define ADJUST_PRIV_TO_DSA    28
89#define ADJUST_PRIV_TO_TABLE  92
90
91typedef struct _SymTarg
92{
93	struct _Symbios *adapter;
94	struct _SymTarg *next;
95
96	uchar device[4];     /* symbios register defs for the device */
97	int sem_targ;        /* mutex allowing only one req per target */
98	int sem_done;        /* notification semaphore */
99	CCB_SCSIIO *ccb;     /* ccb for the current request for this target or NULL */
100
101	SymPriv *priv;	     /* priv data area within ccb */
102	uint32 priv_phys;    /* physical address of priv */
103	uint32 table_phys;   /* physical address of sgtable */
104	uint32 datain_phys;
105	uint32 dataout_phys;
106
107	int inbound;         /* read data from device */
108
109	uint32 period;       /* sync period */
110	uint32 offset;       /* sync offset */
111	uint32 wide;
112
113	uint32 flags;
114	uint32 status;
115	uint32 id;
116} SymTarg;
117
118#define tf_ask_sync   0x0001
119#define tf_ask_wide   0x0002
120#define tf_is_sync    0x0010
121#define tf_is_wide    0x0020
122#define tf_ignore     0x0100
123
124typedef struct _Symbios
125{
126	uint32 num;           /* card number */
127	uint32 iobase;        /* io base address */
128	uint32 irq;           /* assigned irq */
129
130	char *name;           /* device type name */
131	uint32 host_targ_id;
132	uint32 max_targ_id;
133	int reset;
134
135	int registered;
136
137	uint32 *script;       /* 1 page of on/offboard scripts ram */
138	uint32 sram_phys;     /* physical address thereof */
139
140	SymTarg targ[16];     /* one targ descriptor per target */
141	spinlock hwlock;      /* lock protecting register access */
142
143	SymTarg *startqueue;   /* target being started */
144	SymTarg *startqueuetail;
145	SymTarg *active;      /* target currently being interacted with */
146	                      /* null if IDLE, == startqueue if starting */
147
148	enum {
149		OFFLINE, IDLE, START, ACTIVE, TEST
150	} status;
151
152	struct {
153		uint period;    /* negotiated period */
154		uint  period_ns; /* configured period in ns */
155		uchar scntl3;    /* values for scntl3 SCF and CCF bits */
156		uchar sxfer;     /* values for xfer TP2-0 bits */
157	} syncinfo[16];
158	uint32 syncsize;     /* number of syncinfo entries to look at */
159	uint32 idmask;
160
161	uint32 scntl3;
162	uint32 sclk;         /* SCLK in KHz */
163	uint32 maxoffset;
164
165	uint32 op_in;
166	uint32 op_out;
167} Symbios;
168