File: /usr/src/linux/drivers/fc4/socal.h

1     /* socal.h: Definitions for Sparc SUNW,socal (SOC+) Fibre Channel Sbus driver.
2      *
3      * Copyright (C) 1998,1999 Jakub Jelinek (jj@ultra.linux.cz)
4      */
5     
6     #ifndef __SOCAL_H
7     #define __SOCAL_H
8     
9     #include "fc.h"
10     #include "fcp.h"
11     #include "fcp_impl.h"
12     
13     /* Hardware register offsets and constants first {{{ */
14     #define CFG	0x00UL
15     #define SAE	0x04UL
16     #define CMD	0x08UL
17     #define IMASK	0x0cUL
18     #define REQP	0x10UL
19     #define RESP	0x14UL
20     
21     /* Config Register */
22     #define SOCAL_CFG_EXT_RAM_BANK_MASK	0x07000000
23     #define SOCAL_CFG_EEPROM_BANK_MASK	0x00030000
24     #define SOCAL_CFG_BURST64_MASK		0x00000700
25     #define SOCAL_CFG_SBUS_PARITY_TEST	0x00000020
26     #define SOCAL_CFG_SBUS_PARITY_CHECK	0x00000010
27     #define SOCAL_CFG_SBUS_ENHANCED		0x00000008
28     #define SOCAL_CFG_BURST_MASK		0x00000007
29     /* Bursts */
30     #define SOCAL_CFG_BURST_4		0x00000000
31     #define SOCAL_CFG_BURST_8		0x00000003
32     #define SOCAL_CFG_BURST_16		0x00000004
33     #define SOCAL_CFG_BURST_32		0x00000005
34     #define SOCAL_CFG_BURST_64		0x00000006
35     #define SOCAL_CFG_BURST_128		0x00000007
36     
37     /* Slave Access Error Register */
38     #define SOCAL_SAE_ALIGNMENT		0x00000004
39     #define SOCAL_SAE_UNSUPPORTED		0x00000002
40     #define SOCAL_SAE_PARITY		0x00000001
41     
42     /* Command & Status Register */
43     #define SOCAL_CMD_RSP_QALL		0x000f0000
44     #define SOCAL_CMD_RSP_Q0		0x00010000
45     #define SOCAL_CMD_RSP_Q1		0x00020000
46     #define SOCAL_CMD_RSP_Q2		0x00040000
47     #define SOCAL_CMD_RSP_Q3		0x00080000
48     #define SOCAL_CMD_REQ_QALL		0x00000f00
49     #define SOCAL_CMD_REQ_Q0		0x00000100
50     #define SOCAL_CMD_REQ_Q1		0x00000200
51     #define SOCAL_CMD_REQ_Q2		0x00000400
52     #define SOCAL_CMD_REQ_Q3		0x00000800
53     #define SOCAL_CMD_SAE			0x00000080
54     #define SOCAL_CMD_INTR_PENDING		0x00000008
55     #define SOCAL_CMD_NON_QUEUED		0x00000004
56     #define SOCAL_CMD_IDLE			0x00000002
57     #define SOCAL_CMD_SOFT_RESET		0x00000001
58     
59     /* Interrupt Mask Register */
60     #define SOCAL_IMASK_RSP_QALL		0x000f0000
61     #define SOCAL_IMASK_RSP_Q0		0x00010000
62     #define SOCAL_IMASK_RSP_Q1		0x00020000
63     #define SOCAL_IMASK_RSP_Q2		0x00040000
64     #define SOCAL_IMASK_RSP_Q3		0x00080000
65     #define SOCAL_IMASK_REQ_QALL		0x00000f00
66     #define SOCAL_IMASK_REQ_Q0		0x00000100
67     #define SOCAL_IMASK_REQ_Q1		0x00000200
68     #define SOCAL_IMASK_REQ_Q2		0x00000400
69     #define SOCAL_IMASK_REQ_Q3		0x00000800
70     #define SOCAL_IMASK_SAE			0x00000080
71     #define SOCAL_IMASK_NON_QUEUED		0x00000004
72     
73     #define SOCAL_INTR(s, cmd) \
74     	(((cmd & SOCAL_CMD_RSP_QALL) | ((~cmd) & SOCAL_CMD_REQ_QALL)) \
75     	 & s->imask)
76     	 
77     #define SOCAL_SETIMASK(s, i) \
78     do {	(s)->imask = (i); \
79     	sbus_writel((i), (s)->regs + IMASK); \
80     } while (0)
81     	
82     #define SOCAL_MAX_EXCHANGES		1024
83     
84     /* XRAM
85      *
86      * This is a 64KB register area.
87      * From the documentation, it seems like it is finally able to cope
88      * at least with 1,2,4 byte accesses for read and 2,4 byte accesses for write.
89      */
90      
91     /* Circular Queue */
92     
93     #define SOCAL_CQ_REQ_OFFSET	0x200
94     #define SOCAL_CQ_RSP_OFFSET	0x220
95     
96     typedef struct {
97     	u32			address;
98     	u8			in;
99     	u8			out;
100     	u8			last;
101     	u8			seqno;
102     } socal_hw_cq;
103     
104     #define SOCAL_PORT_A	0x0000	/* From/To Port A */
105     #define SOCAL_PORT_B	0x0001	/* From/To Port A */
106     #define SOCAL_FC_HDR	0x0002  /* Contains FC Header */
107     #define SOCAL_NORSP	0x0004  /* Don't generate response nor interrupt */
108     #define SOCAL_NOINT	0x0008  /* Generate response but not interrupt */
109     #define SOCAL_XFERRDY	0x0010  /* Generate XFERRDY */
110     #define SOCAL_IGNOREPARAM 0x0020 /* Ignore PARAM field in the FC header */
111     #define SOCAL_COMPLETE	0x0040  /* Command completed */
112     #define SOCAL_UNSOLICITED 0x0080 /* For request this is the packet to establish unsolicited pools, */
113     				/* for rsp this is unsolicited packet */
114     #define SOCAL_STATUS	0x0100	/* State change (on/off line) */
115     #define SOCAL_RSP_HDR	0x0200	/* Return frame header in any case */
116     
117     typedef struct {
118     	u32			token;
119     	u16			flags;
120     	u8			class;
121     	u8			segcnt;
122     	u32			bytecnt;
123     } socal_hdr;
124     
125     typedef struct {
126     	u32			base;
127     	u32			count;
128     } socal_data;
129     
130     #define SOCAL_CQTYPE_NOP	0x00
131     #define SOCAL_CQTYPE_OUTBOUND	0x01
132     #define SOCAL_CQTYPE_INBOUND	0x02
133     #define SOCAL_CQTYPE_SIMPLE	0x03
134     #define SOCAL_CQTYPE_IO_WRITE	0x04
135     #define SOCAL_CQTYPE_IO_READ	0x05
136     #define SOCAL_CQTYPE_UNSOLICITED 0x06
137     #define SOCAL_CQTYPE_BYPASS_DEV	0x06
138     #define SOCAL_CQTYPE_DIAG	0x07
139     #define SOCAL_CQTYPE_OFFLINE	0x08
140     #define SOCAL_CQTYPE_ADD_POOL	0x09
141     #define SOCAL_CQTYPE_DELETE_POOL 0x0a
142     #define SOCAL_CQTYPE_ADD_BUFFER	0x0b
143     #define SOCAL_CQTYPE_ADD_POOL_BUFFER 0x0c
144     #define SOCAL_CQTYPE_REQUEST_ABORT 0x0d
145     #define SOCAL_CQTYPE_REQUEST_LIP 0x0e
146     #define SOCAL_CQTYPE_REPORT_MAP	0x0f
147     #define SOCAL_CQTYPE_RESPONSE	0x10
148     #define SOCAL_CQTYPE_INLINE	0x20
149     
150     #define SOCAL_CQFLAGS_CONT	0x01
151     #define SOCAL_CQFLAGS_FULL	0x02
152     #define SOCAL_CQFLAGS_BADHDR	0x04
153     #define SOCAL_CQFLAGS_BADPKT	0x08
154     
155     typedef struct {
156     	socal_hdr		shdr;
157     	socal_data		data[3];
158     	fc_hdr			fchdr;
159     	u8			count;
160     	u8			type;
161     	u8			flags;
162     	u8			seqno;
163     } socal_req;
164     
165     #define SOCAL_OK		0
166     #define SOCAL_P_RJT		2
167     #define SOCAL_F_RJT		3
168     #define SOCAL_P_BSY		4
169     #define SOCAL_F_BSY		5
170     #define SOCAL_ONLINE		0x10
171     #define SOCAL_OFFLINE		0x11
172     #define SOCAL_TIMEOUT		0x12
173     #define SOCAL_OVERRUN		0x13
174     #define SOCAL_ONLINE_LOOP	0x14
175     #define SOCAL_OLD_PORT		0x15
176     #define SOCAL_AL_PORT		0x16
177     #define SOCAL_UNKOWN_CQ_TYPE	0x20
178     #define SOCAL_BAD_SEG_CNT	0x21
179     #define SOCAL_MAX_XCHG_EXCEEDED	0x22
180     #define SOCAL_BAD_XID		0x23
181     #define SOCAL_XCHG_BUSY		0x24
182     #define SOCAL_BAD_POOL_ID	0x25
183     #define SOCAL_INSUFFICIENT_CQES	0x26
184     #define SOCAL_ALLOC_FAIL	0x27
185     #define SOCAL_BAD_SID		0x28
186     #define SOCAL_NO_SEG_INIT	0x29
187     #define SOCAL_BAD_DID		0x2a
188     #define SOCAL_ABORTED		0x30
189     #define SOCAL_ABORT_FAILED	0x31
190     
191     typedef struct {
192     	socal_hdr		shdr;
193     	u32			status;
194     	socal_data		data;
195     	u8			xxx1[10];
196     	u16			ncmds;
197     	fc_hdr			fchdr;
198     	u8			count;
199     	u8			type;
200     	u8			flags;
201     	u8			seqno;
202     } socal_rsp;
203     
204     typedef struct {
205     	socal_hdr		shdr;
206     	u8			xxx1[48];
207     	u8			count;
208     	u8			type;
209     	u8			flags;
210     	u8			seqno;
211     } socal_cmdonly;
212     
213     #define SOCAL_DIAG_NOP		0x00
214     #define SOCAL_DIAG_INT_LOOP	0x01
215     #define SOCAL_DIAG_EXT_LOOP	0x02
216     #define SOCAL_DIAG_REM_LOOP	0x03
217     #define SOCAL_DIAG_XRAM_TEST	0x04
218     #define SOCAL_DIAG_SOC_TEST	0x05
219     #define SOCAL_DIAG_HCB_TEST	0x06
220     #define SOCAL_DIAG_SOCLB_TEST	0x07
221     #define SOCAL_DIAG_SRDSLB_TEST	0x08
222     #define SOCAL_DIAG_EXTOE_TEST	0x09
223     
224     typedef struct {
225     	socal_hdr		shdr;
226     	u32			cmd;
227     	u8			xxx1[44];
228     	u8			count;
229     	u8			type;
230     	u8			flags;
231     	u8			seqno;
232     } socal_diag_req;
233     
234     #define SOCAL_POOL_MASK_RCTL	0x800000
235     #define SOCAL_POOL_MASK_DID	0x700000
236     #define SOCAL_POOL_MASK_SID	0x070000
237     #define SOCAL_POOL_MASK_TYPE	0x008000
238     #define SOCAL_POOL_MASK_F_CTL	0x007000
239     #define SOCAL_POOL_MASK_SEQ_ID	0x000800
240     #define SOCAL_POOL_MASK_D_CTL	0x000400
241     #define SOCAL_POOL_MASK_SEQ_CNT	0x000300
242     #define SOCAL_POOL_MASK_OX_ID	0x0000f0
243     #define SOCAL_POOL_MASK_PARAM	0x00000f
244     
245     typedef struct {
246     	socal_hdr		shdr;
247     	u32			pool_id;
248     	u32			header_mask;
249     	u32			buf_size;
250     	u32			entries;
251     	u8			xxx1[8];
252     	fc_hdr			fchdr;
253     	u8			count;
254     	u8			type;
255     	u8			flags;
256     	u8			seqno;
257     } socal_pool_req;
258     
259     /* }}} */
260     
261     /* Now our software structures and constants we use to drive the beast {{{ */
262     
263     #define SOCAL_CQ_REQ0_SIZE	4
264     #define SOCAL_CQ_REQ1_SIZE	256
265     #define SOCAL_CQ_RSP0_SIZE	8
266     #define SOCAL_CQ_RSP1_SIZE	4
267     #define SOCAL_CQ_RSP2_SIZE	4
268     
269     #define SOCAL_SOLICITED_RSP_Q	0
270     #define SOCAL_SOLICITED_BAD_RSP_Q 1
271     #define SOCAL_UNSOLICITED_RSP_Q	2
272     
273     struct socal;
274     
275     typedef struct {
276     	/* This must come first */
277     	fc_channel		fc;
278     	struct socal		*s;
279     	u16			flags;
280     	u16			mask;
281     } socal_port; 
282     
283     typedef struct {
284     	socal_hw_cq		*hw_cq;	/* Related XRAM cq */
285     	socal_req		*pool;
286     	u8			in;
287     	u8			out;
288     	u8			last;
289     	u8			seqno;
290     } socal_cq;
291     
292     struct socal {
293     	socal_port		port[2]; /* Every SOCAL has one or two FC ports */
294     	socal_cq		req[4]; /* Request CQs */
295     	socal_cq		rsp[4]; /* Response CQs */
296     	int			socal_no;
297     	unsigned long		regs;
298     	unsigned long		xram;
299     	unsigned long		eeprom;
300     	fc_wwn			wwn;
301     	u32			imask;	/* Our copy of regs->imask */
302     	u32			cfg;	/* Our copy of regs->cfg */
303     	char			serv_params[80];
304     	struct socal		*next;
305     	int			curr_port; /* Which port will have priority to fcp_queue_empty */
306     
307     	socal_req *		req_cpu;
308     	u32			req_dvma;
309     };
310     
311     /* }}} */
312     
313     #endif /* !(__SOCAL_H) */
314