xref: /dflybsd-src/sys/dev/raid/twa/tw_cl_share.h (revision 1e0dd9dd32a69a1d3bbe6a9e41c3a63aae59fb4d)
1df54c2f9SSascha Wildner /*
2df54c2f9SSascha Wildner  * Copyright (c) 2004-07 Applied Micro Circuits Corporation.
3df54c2f9SSascha Wildner  * Copyright (c) 2004-05 Vinod Kashyap
4df54c2f9SSascha Wildner  * All rights reserved.
5df54c2f9SSascha Wildner  *
6df54c2f9SSascha Wildner  * Redistribution and use in source and binary forms, with or without
7df54c2f9SSascha Wildner  * modification, are permitted provided that the following conditions
8df54c2f9SSascha Wildner  * are met:
9df54c2f9SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
10df54c2f9SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
11df54c2f9SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
12df54c2f9SSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
13df54c2f9SSascha Wildner  *    documentation and/or other materials provided with the distribution.
14df54c2f9SSascha Wildner  *
15df54c2f9SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16df54c2f9SSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17df54c2f9SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18df54c2f9SSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19df54c2f9SSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20df54c2f9SSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21df54c2f9SSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22df54c2f9SSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23df54c2f9SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24df54c2f9SSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25df54c2f9SSascha Wildner  * SUCH DAMAGE.
26df54c2f9SSascha Wildner  *
274fbf05f9SSascha Wildner  *	$FreeBSD: src/sys/dev/twa/tw_cl_share.h,v 1.8 2010/08/30 19:15:04 delphij Exp $
28df54c2f9SSascha Wildner  */
29df54c2f9SSascha Wildner 
30df54c2f9SSascha Wildner /*
31df54c2f9SSascha Wildner  * AMCC'S 3ware driver for 9000 series storage controllers.
32df54c2f9SSascha Wildner  *
33df54c2f9SSascha Wildner  * Author: Vinod Kashyap
34df54c2f9SSascha Wildner  * Modifications by: Adam Radford
35df54c2f9SSascha Wildner  * Modifications by: Manjunath Ranganathaiah
36df54c2f9SSascha Wildner  */
37df54c2f9SSascha Wildner 
38df54c2f9SSascha Wildner 
39df54c2f9SSascha Wildner 
40df54c2f9SSascha Wildner #ifndef TW_CL_SHARE_H
41df54c2f9SSascha Wildner 
42df54c2f9SSascha Wildner #define TW_CL_SHARE_H
43df54c2f9SSascha Wildner 
44df54c2f9SSascha Wildner 
45df54c2f9SSascha Wildner /*
46df54c2f9SSascha Wildner  * Macros, structures and functions shared between OSL and CL,
47df54c2f9SSascha Wildner  * and defined by CL.
48df54c2f9SSascha Wildner  */
49df54c2f9SSascha Wildner 
50df54c2f9SSascha Wildner #define TW_CL_NULL			((TW_VOID *)0)
51df54c2f9SSascha Wildner #define TW_CL_TRUE			1
52df54c2f9SSascha Wildner #define TW_CL_FALSE			0
53df54c2f9SSascha Wildner 
54df54c2f9SSascha Wildner #define TW_CL_VENDOR_ID			0x13C1	/* 3ware vendor id */
55df54c2f9SSascha Wildner #define TW_CL_DEVICE_ID_9K		0x1002	/* 9000 PCI series device id */
56df54c2f9SSascha Wildner #define TW_CL_DEVICE_ID_9K_X		0x1003	/* 9000 PCI-X series device id */
57df54c2f9SSascha Wildner #define TW_CL_DEVICE_ID_9K_E		0x1004  /* 9000 PCIe series device id */
58df54c2f9SSascha Wildner #define TW_CL_DEVICE_ID_9K_SA		0x1005	/* 9000 PCIe SAS series device id */
59df54c2f9SSascha Wildner 
60df54c2f9SSascha Wildner #define TW_CL_BAR_TYPE_IO		1	/* I/O base address */
61df54c2f9SSascha Wildner #define TW_CL_BAR_TYPE_MEM		2	/* memory base address */
62df54c2f9SSascha Wildner #define TW_CL_BAR_TYPE_SBUF		3	/* SBUF base address */
63df54c2f9SSascha Wildner 
64df54c2f9SSascha Wildner #ifdef TW_OSL_ENCLOSURE_SUPPORT
65df54c2f9SSascha Wildner #define TW_CL_MAX_NUM_UNITS		65	/* max # of units we support
66df54c2f9SSascha Wildner 						-- enclosure target id is 64 */
67df54c2f9SSascha Wildner #else /* TW_OSL_ENCLOSURE_SUPPORT */
68df54c2f9SSascha Wildner #define TW_CL_MAX_NUM_UNITS		32	/* max # of units we support */
69df54c2f9SSascha Wildner #endif /* TW_OSL_ENCLOSURE_SUPPORT */
70df54c2f9SSascha Wildner 
71df54c2f9SSascha Wildner #define TW_CL_MAX_NUM_LUNS		16	/* max # of LUN's we support */
72df54c2f9SSascha Wildner #define TW_CL_MAX_IO_SIZE		0x20000	/* 128K */
73df54c2f9SSascha Wildner 
74df54c2f9SSascha Wildner /*
75df54c2f9SSascha Wildner  * Though we can support 256 simultaneous requests, we advertise as capable
76df54c2f9SSascha Wildner  * of supporting only 255, since we want to keep one CL internal request
77df54c2f9SSascha Wildner  * context packet always available for internal requests.
78df54c2f9SSascha Wildner  */
79df54c2f9SSascha Wildner #define TW_CL_MAX_SIMULTANEOUS_REQUESTS	256	/* max simult reqs supported */
80df54c2f9SSascha Wildner 
81df54c2f9SSascha Wildner #define TW_CL_MAX_32BIT_SG_ELEMENTS	109	/* max 32-bit sg elements */
82df54c2f9SSascha Wildner #define TW_CL_MAX_64BIT_SG_ELEMENTS	72	/* max 64-bit sg elements */
83df54c2f9SSascha Wildner 
84df54c2f9SSascha Wildner 
85df54c2f9SSascha Wildner /* Possible values of ctlr->flags */
86df54c2f9SSascha Wildner #define TW_CL_64BIT_ADDRESSES	(1<<0) /* 64 bit cmdpkt & SG addresses */
87df54c2f9SSascha Wildner #define TW_CL_64BIT_SG_LENGTH	(1<<1) /* 64 bit SG length */
88df54c2f9SSascha Wildner #define TW_CL_START_CTLR_ONLY	(1<<2) /* Start ctlr only */
89df54c2f9SSascha Wildner #define TW_CL_STOP_CTLR_ONLY	(1<<3) /* Stop ctlr only */
90df54c2f9SSascha Wildner #define TW_CL_DEFERRED_INTR_USED (1<<5) /* OS Layer uses deferred intr */
91df54c2f9SSascha Wildner 
92df54c2f9SSascha Wildner /* Possible error values from the Common Layer. */
93df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_SUCCESS			0
94df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_GENERAL_FAILURE		(1<<0)
95df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_INVALID_TARGET		(1<<1)
96df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_INVALID_LUN		(1<<2)
97df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_SCSI_ERROR		(1<<3)
98df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_AUTO_SENSE_VALID		(1<<4)
99df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_BUS_RESET			(1<<5)
100df54c2f9SSascha Wildner #define TW_CL_ERR_REQ_UNABLE_TO_SUBMIT_COMMAND	(1<<6)
101df54c2f9SSascha Wildner 
102df54c2f9SSascha Wildner 
103df54c2f9SSascha Wildner /* Possible values of req_pkt->flags */
104df54c2f9SSascha Wildner #define TW_CL_REQ_RETRY_ON_BUSY		(1<<0)
105df54c2f9SSascha Wildner #define TW_CL_REQ_CALLBACK_FOR_SGLIST	(1<<1)
106df54c2f9SSascha Wildner 
107df54c2f9SSascha Wildner 
108df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_CONTROLLER_ERROR	3
109df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_CONTROLLER_EVENT	4
110df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_COMMON_LAYER_ERROR	21
111df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_COMMON_LAYER_EVENT	22
112df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_FREEBSD_DRIVER	5
113df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_FREEBSD_OS		8
114df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_WINDOWS_DRIVER	7
115df54c2f9SSascha Wildner #define TW_CL_MESSAGE_SOURCE_WINDOWS_OS		10
116df54c2f9SSascha Wildner 
117df54c2f9SSascha Wildner #define TW_CL_SEVERITY_ERROR		0x1
118df54c2f9SSascha Wildner #define TW_CL_SEVERITY_WARNING		0x2
119df54c2f9SSascha Wildner #define TW_CL_SEVERITY_INFO		0x3
120df54c2f9SSascha Wildner #define TW_CL_SEVERITY_DEBUG		0x4
121df54c2f9SSascha Wildner 
122df54c2f9SSascha Wildner #define TW_CL_SEVERITY_ERROR_STRING	"ERROR"
123df54c2f9SSascha Wildner #define TW_CL_SEVERITY_WARNING_STRING	"WARNING"
124df54c2f9SSascha Wildner #define TW_CL_SEVERITY_INFO_STRING	"INFO"
125df54c2f9SSascha Wildner #define TW_CL_SEVERITY_DEBUG_STRING	"DEBUG"
126df54c2f9SSascha Wildner 
127df54c2f9SSascha Wildner 
128df54c2f9SSascha Wildner 
129df54c2f9SSascha Wildner /*
130df54c2f9SSascha Wildner  * Structure, a pointer to which is used as the controller handle in
131df54c2f9SSascha Wildner  * communications between the OS Layer and the Common Layer.
132df54c2f9SSascha Wildner  */
133df54c2f9SSascha Wildner struct tw_cl_ctlr_handle {
134df54c2f9SSascha Wildner 	TW_VOID	*osl_ctlr_ctxt;	/* OSL's ctlr context */
135df54c2f9SSascha Wildner 	TW_VOID	*cl_ctlr_ctxt;	/* CL's ctlr context */
136df54c2f9SSascha Wildner };
137df54c2f9SSascha Wildner 
138df54c2f9SSascha Wildner 
139df54c2f9SSascha Wildner /*
140df54c2f9SSascha Wildner  * Structure, a pointer to which is used as the request handle in
141df54c2f9SSascha Wildner  * communications between the OS Layer and the Common Layer.
142df54c2f9SSascha Wildner  */
143df54c2f9SSascha Wildner struct tw_cl_req_handle {
144df54c2f9SSascha Wildner 	TW_VOID	*osl_req_ctxt;	/* OSL's request context */
145df54c2f9SSascha Wildner 	TW_VOID	*cl_req_ctxt;	/* CL's request context */
146df54c2f9SSascha Wildner 	TW_UINT8 is_io;		/* Only freeze/release simq for IOs */
147df54c2f9SSascha Wildner };
148df54c2f9SSascha Wildner 
149df54c2f9SSascha Wildner 
150df54c2f9SSascha Wildner /* Structure used to describe SCSI requests to CL. */
151df54c2f9SSascha Wildner struct tw_cl_scsi_req_packet {
152df54c2f9SSascha Wildner 	TW_UINT32	unit;		/* unit # to send cmd to */
153df54c2f9SSascha Wildner 	TW_UINT32	lun;		/* LUN to send cmd to */
154df54c2f9SSascha Wildner 	TW_UINT8	*cdb;		/* ptr to SCSI cdb */
155df54c2f9SSascha Wildner 	TW_UINT32	cdb_len;	/* # of valid cdb bytes */
156df54c2f9SSascha Wildner 	TW_UINT32	sense_len;	/* # of bytes of valid sense info */
157df54c2f9SSascha Wildner 	TW_UINT8	*sense_data;	/* ptr to sense data, if any */
158df54c2f9SSascha Wildner 	TW_UINT32	scsi_status;	/* SCSI status returned by fw */
159df54c2f9SSascha Wildner 	TW_UINT32	sgl_entries;	/* # of SG descriptors */
160df54c2f9SSascha Wildner 	TW_UINT8	*sg_list;	/* ptr to SG list */
161df54c2f9SSascha Wildner };
162df54c2f9SSascha Wildner 
163df54c2f9SSascha Wildner 
164df54c2f9SSascha Wildner /* Structure used to describe pass through command packets to CL. */
165df54c2f9SSascha Wildner struct tw_cl_passthru_req_packet {
166df54c2f9SSascha Wildner 	TW_UINT8	*cmd_pkt;	/* ptr to passthru cmd pkt */
167df54c2f9SSascha Wildner 	TW_UINT32	cmd_pkt_length;	/* size of cmd pkt */
168df54c2f9SSascha Wildner 	TW_UINT32	sgl_entries;	/* # of SG descriptors */
169df54c2f9SSascha Wildner 	TW_UINT8	*sg_list;	/* ptr to SG list */
170df54c2f9SSascha Wildner };
171df54c2f9SSascha Wildner 
172df54c2f9SSascha Wildner 
173df54c2f9SSascha Wildner /* Request packet submitted to the Common Layer, by the OS Layer. */
174df54c2f9SSascha Wildner struct tw_cl_req_packet {
175df54c2f9SSascha Wildner 	TW_UINT32	cmd;		/* Common Layer cmd */
176df54c2f9SSascha Wildner 	TW_UINT32	flags;		/* flags describing request */
177df54c2f9SSascha Wildner 	TW_UINT32	status;		/* Common Layer returned status */
178df54c2f9SSascha Wildner 	TW_VOID		(*tw_osl_callback)(struct tw_cl_req_handle *req_handle);
179df54c2f9SSascha Wildner 			/* OSL routine to be called by CL on req completion */
180df54c2f9SSascha Wildner 	TW_VOID		(*tw_osl_sgl_callback)(
181df54c2f9SSascha Wildner 			struct tw_cl_req_handle *req_handle, TW_VOID *sg_list,
182df54c2f9SSascha Wildner 			TW_UINT32 *num_sgl_entries);
183df54c2f9SSascha Wildner 			/* OSL callback to get SG list. */
184df54c2f9SSascha Wildner 
185df54c2f9SSascha Wildner 	union {
186df54c2f9SSascha Wildner 		struct tw_cl_scsi_req_packet		scsi_req; /* SCSI req */
187df54c2f9SSascha Wildner 		struct tw_cl_passthru_req_packet	pt_req;/*Passthru req*/
188df54c2f9SSascha Wildner 	} gen_req_pkt;
189df54c2f9SSascha Wildner };
190df54c2f9SSascha Wildner 
191df54c2f9SSascha Wildner 
192df54c2f9SSascha Wildner #pragma pack(1)
193df54c2f9SSascha Wildner /*
194df54c2f9SSascha Wildner  * Packet that describes an AEN/error generated by the controller,
195df54c2f9SSascha Wildner  * Common Layer, or even the OS Layer.
196df54c2f9SSascha Wildner  */
197df54c2f9SSascha Wildner struct tw_cl_event_packet {
198df54c2f9SSascha Wildner 	TW_UINT32	sequence_id;
199df54c2f9SSascha Wildner 	TW_UINT32	time_stamp_sec;
200df54c2f9SSascha Wildner 	TW_UINT16	aen_code;
201df54c2f9SSascha Wildner 	TW_UINT8	severity;
202df54c2f9SSascha Wildner 	TW_UINT8	retrieved;
203df54c2f9SSascha Wildner 	TW_UINT8	repeat_count;
204df54c2f9SSascha Wildner 	TW_UINT8	parameter_len;
205df54c2f9SSascha Wildner 	TW_UINT8	parameter_data[98];
206df54c2f9SSascha Wildner 	TW_UINT32	event_src;
207df54c2f9SSascha Wildner 	TW_UINT8	severity_str[20];
208df54c2f9SSascha Wildner };
209df54c2f9SSascha Wildner #pragma pack()
210df54c2f9SSascha Wildner 
211df54c2f9SSascha Wildner 
212df54c2f9SSascha Wildner /* Structure to link 2 adjacent elements in a list. */
213df54c2f9SSascha Wildner struct tw_cl_link {
214df54c2f9SSascha Wildner 	struct tw_cl_link	*next;
215df54c2f9SSascha Wildner 	struct tw_cl_link	*prev;
216df54c2f9SSascha Wildner };
217df54c2f9SSascha Wildner 
218df54c2f9SSascha Wildner 
219df54c2f9SSascha Wildner #pragma pack(1)
220df54c2f9SSascha Wildner /* Scatter/Gather list entry with 32 bit addresses. */
221df54c2f9SSascha Wildner struct tw_cl_sg_desc32 {
222df54c2f9SSascha Wildner 	TW_UINT32	address;
223df54c2f9SSascha Wildner 	TW_UINT32	length;
224df54c2f9SSascha Wildner };
225df54c2f9SSascha Wildner 
226df54c2f9SSascha Wildner 
227df54c2f9SSascha Wildner /* Scatter/Gather list entry with 64 bit addresses. */
228df54c2f9SSascha Wildner struct tw_cl_sg_desc64 {
229df54c2f9SSascha Wildner 	TW_UINT64	address;
230df54c2f9SSascha Wildner 	TW_UINT32	length;
231df54c2f9SSascha Wildner };
232df54c2f9SSascha Wildner 
233df54c2f9SSascha Wildner #pragma pack()
234df54c2f9SSascha Wildner 
235df54c2f9SSascha Wildner 
236df54c2f9SSascha Wildner /* Byte swap functions.  Valid only if running on big endian platforms. */
237df54c2f9SSascha Wildner #ifdef TW_OSL_BIG_ENDIAN
238df54c2f9SSascha Wildner 
239df54c2f9SSascha Wildner #define TW_CL_SWAP16_WITH_CAST(x)					\
240df54c2f9SSascha Wildner 	((x << 8) | (x >> 8))
241df54c2f9SSascha Wildner 
242df54c2f9SSascha Wildner 
243df54c2f9SSascha Wildner #define TW_CL_SWAP32_WITH_CAST(x)					\
244df54c2f9SSascha Wildner 	((x << 24) | ((x << 8) & (0xFF0000)) |				\
245df54c2f9SSascha Wildner 	((x >> 8) & (0xFF00)) | (x >> 24))
246df54c2f9SSascha Wildner 
247df54c2f9SSascha Wildner 
248df54c2f9SSascha Wildner #define TW_CL_SWAP64_WITH_CAST(x)					\
249df54c2f9SSascha Wildner 	((((TW_UINT64)(TW_CL_SWAP32(((TW_UINT32 *)(&(x)))[1]))) << 32) |\
250df54c2f9SSascha Wildner 	((TW_UINT32)(TW_CL_SWAP32(((TW_UINT32 *)(&(x)))[0]))))
251df54c2f9SSascha Wildner 
252df54c2f9SSascha Wildner 
253df54c2f9SSascha Wildner #else /* TW_OSL_BIG_ENDIAN */
254df54c2f9SSascha Wildner 
255df54c2f9SSascha Wildner #define TW_CL_SWAP16_WITH_CAST(x)	x
256df54c2f9SSascha Wildner #define TW_CL_SWAP32_WITH_CAST(x)	x
257df54c2f9SSascha Wildner #define TW_CL_SWAP64_WITH_CAST(x)	x
258df54c2f9SSascha Wildner 
259df54c2f9SSascha Wildner #endif /* TW_OSL_BIG_ENDIAN */
260df54c2f9SSascha Wildner 
261df54c2f9SSascha Wildner #define TW_CL_SWAP16(x)		TW_CL_SWAP16_WITH_CAST((TW_UINT16)(x))
262df54c2f9SSascha Wildner #define TW_CL_SWAP32(x)		TW_CL_SWAP32_WITH_CAST((TW_UINT32)(x))
263df54c2f9SSascha Wildner #define TW_CL_SWAP64(x)		TW_CL_SWAP64_WITH_CAST((TW_UINT64)(x))
264df54c2f9SSascha Wildner 
265df54c2f9SSascha Wildner 
266df54c2f9SSascha Wildner /* Queue manipulation functions. */
267df54c2f9SSascha Wildner 
268df54c2f9SSascha Wildner /* Initialize a queue. */
269df54c2f9SSascha Wildner #define TW_CL_Q_INIT(head)	do {		\
270df54c2f9SSascha Wildner 	(head)->prev = (head)->next = head;	\
271df54c2f9SSascha Wildner } while (0)
272df54c2f9SSascha Wildner 
273df54c2f9SSascha Wildner 
274df54c2f9SSascha Wildner /* Insert an item at the head of the queue. */
275df54c2f9SSascha Wildner #define TW_CL_Q_INSERT_HEAD(head, item)	do {	\
276df54c2f9SSascha Wildner 	(item)->next = (head)->next;		\
277df54c2f9SSascha Wildner 	(item)->prev = head;			\
278df54c2f9SSascha Wildner 	(head)->next->prev = item;		\
279df54c2f9SSascha Wildner 	(head)->next = item;			\
280df54c2f9SSascha Wildner } while (0)
281df54c2f9SSascha Wildner 
282df54c2f9SSascha Wildner 
283df54c2f9SSascha Wildner /* Insert an item at the tail of the queue. */
284df54c2f9SSascha Wildner #define	TW_CL_Q_INSERT_TAIL(head, item)	do {	\
285df54c2f9SSascha Wildner 	(item)->next = head;			\
286df54c2f9SSascha Wildner 	(item)->prev = (head)->prev;		\
287df54c2f9SSascha Wildner 	(head)->prev->next = item;		\
288df54c2f9SSascha Wildner 	(head)->prev = item;			\
289df54c2f9SSascha Wildner } while (0)
290df54c2f9SSascha Wildner 
291df54c2f9SSascha Wildner 
292df54c2f9SSascha Wildner /* Remove an item from the head of the queue. */
293df54c2f9SSascha Wildner #define TW_CL_Q_REMOVE_ITEM(head, item)	do {	\
294df54c2f9SSascha Wildner 	(item)->prev->next = (item)->next;	\
295df54c2f9SSascha Wildner 	(item)->next->prev = (item)->prev;	\
296df54c2f9SSascha Wildner } while (0)
297df54c2f9SSascha Wildner 
298df54c2f9SSascha Wildner 
299df54c2f9SSascha Wildner /* Retrieve the item at the head of the queue. */
300df54c2f9SSascha Wildner #define TW_CL_Q_FIRST_ITEM(head)		\
301df54c2f9SSascha Wildner 	(((head)->next != head) ? ((head)->next) : TW_CL_NULL)
302df54c2f9SSascha Wildner 
303df54c2f9SSascha Wildner 
304df54c2f9SSascha Wildner /* Retrieve the item at the tail of the queue. */
305df54c2f9SSascha Wildner #define TW_CL_Q_LAST_ITEM(head)			\
306df54c2f9SSascha Wildner 	(((head)->prev != head) ? ((head)->prev) : TW_CL_NULL)
307df54c2f9SSascha Wildner 
308df54c2f9SSascha Wildner 
309df54c2f9SSascha Wildner /* Retrieve the item next to a given item in the queue. */
310df54c2f9SSascha Wildner #define TW_CL_Q_NEXT_ITEM(head, item)		\
311df54c2f9SSascha Wildner 	(((item)->next != head) ? ((item)->next) : TW_CL_NULL)
312df54c2f9SSascha Wildner 
313df54c2f9SSascha Wildner 
314df54c2f9SSascha Wildner /* Retrieve the item previous to a given item in the queue. */
315df54c2f9SSascha Wildner #define TW_CL_Q_PREV_ITEM(head, item)		\
316df54c2f9SSascha Wildner 	(((item)->prev != head) ? ((item)->prev) : TW_CL_NULL)
317df54c2f9SSascha Wildner 
318df54c2f9SSascha Wildner 
319df54c2f9SSascha Wildner /* Determine the offset of a field from the head of the structure it is in. */
320df54c2f9SSascha Wildner #define	TW_CL_STRUCT_OFFSET(struct_type, field)	\
321df54c2f9SSascha Wildner 	(TW_INT8 *)(&((struct_type *)0)->field)
322df54c2f9SSascha Wildner 
323df54c2f9SSascha Wildner 
324df54c2f9SSascha Wildner /*
325df54c2f9SSascha Wildner  * Determine the address of the head of a structure, given the address of a
326df54c2f9SSascha Wildner  * field within it.
327df54c2f9SSascha Wildner  */
328df54c2f9SSascha Wildner #define TW_CL_STRUCT_HEAD(addr, struct_type, field)	\
329df54c2f9SSascha Wildner 	(struct_type *)((TW_INT8 *)addr -		\
330df54c2f9SSascha Wildner 	TW_CL_STRUCT_OFFSET(struct_type, field))
331df54c2f9SSascha Wildner 
332df54c2f9SSascha Wildner 
333df54c2f9SSascha Wildner 
334df54c2f9SSascha Wildner #ifndef TW_BUILDING_API
335df54c2f9SSascha Wildner 
336df54c2f9SSascha Wildner #include "tw_osl_inline.h"
337df54c2f9SSascha Wildner 
338df54c2f9SSascha Wildner 
339df54c2f9SSascha Wildner 
340df54c2f9SSascha Wildner /*
341df54c2f9SSascha Wildner  * The following are extern declarations of OS Layer defined functions called
342df54c2f9SSascha Wildner  * by the Common Layer.  If any function has been defined as a macro in
343df54c2f9SSascha Wildner  * tw_osl_share.h, we will not make the extern declaration here.
344df54c2f9SSascha Wildner  */
345df54c2f9SSascha Wildner 
346df54c2f9SSascha Wildner #ifndef tw_osl_breakpoint
347df54c2f9SSascha Wildner /* Allows setting breakpoints in the CL code for debugging purposes. */
348df54c2f9SSascha Wildner extern TW_VOID	tw_osl_breakpoint(TW_VOID);
349df54c2f9SSascha Wildner #endif
350df54c2f9SSascha Wildner 
351df54c2f9SSascha Wildner 
3524fbf05f9SSascha Wildner #ifndef tw_osl_timeout
3534fbf05f9SSascha Wildner /* Start OS timeout() routine after controller reset sequence */
3544fbf05f9SSascha Wildner extern TW_VOID	tw_osl_timeout(struct tw_cl_req_handle *req_handle);
3554fbf05f9SSascha Wildner #endif
3564fbf05f9SSascha Wildner 
3574fbf05f9SSascha Wildner #ifndef tw_osl_untimeout
3584fbf05f9SSascha Wildner /* Stop OS timeout() routine during controller reset sequence */
3594fbf05f9SSascha Wildner extern TW_VOID	tw_osl_untimeout(struct tw_cl_req_handle *req_handle);
360df54c2f9SSascha Wildner #endif
361df54c2f9SSascha Wildner 
362df54c2f9SSascha Wildner 
363df54c2f9SSascha Wildner #ifndef tw_osl_cur_func
364df54c2f9SSascha Wildner /* Text name of current function. */
365df54c2f9SSascha Wildner extern TW_INT8	*tw_osl_cur_func(TW_VOID);
366df54c2f9SSascha Wildner #endif
367df54c2f9SSascha Wildner 
368df54c2f9SSascha Wildner 
369df54c2f9SSascha Wildner #ifdef TW_OSL_DEBUG
370df54c2f9SSascha Wildner #ifndef tw_osl_dbg_printf
371df54c2f9SSascha Wildner /* Print to syslog/event log/debug console, as applicable. */
372df54c2f9SSascha Wildner extern TW_INT32 tw_osl_dbg_printf(struct tw_cl_ctlr_handle *ctlr_handle,
373df54c2f9SSascha Wildner 	const TW_INT8 *fmt, ...);
374df54c2f9SSascha Wildner #endif
375df54c2f9SSascha Wildner #endif /* TW_OSL_DEBUG */
376df54c2f9SSascha Wildner 
377df54c2f9SSascha Wildner 
378df54c2f9SSascha Wildner #ifndef tw_osl_delay
379df54c2f9SSascha Wildner /* Cause a delay of usecs micro-seconds. */
380df54c2f9SSascha Wildner extern TW_VOID	tw_osl_delay(TW_INT32 usecs);
381df54c2f9SSascha Wildner #endif
382df54c2f9SSascha Wildner 
383df54c2f9SSascha Wildner 
384df54c2f9SSascha Wildner #ifndef tw_osl_destroy_lock
385df54c2f9SSascha Wildner /* Create/initialize a lock for CL's use. */
386df54c2f9SSascha Wildner extern TW_VOID	tw_osl_destroy_lock(struct tw_cl_ctlr_handle *ctlr_handle,
387df54c2f9SSascha Wildner 	TW_LOCK_HANDLE *lock);
388df54c2f9SSascha Wildner #endif
389df54c2f9SSascha Wildner 
390df54c2f9SSascha Wildner 
391df54c2f9SSascha Wildner #ifndef tw_osl_free_lock
392df54c2f9SSascha Wildner /* Free a previously held lock. */
393df54c2f9SSascha Wildner extern TW_VOID	tw_osl_free_lock(struct tw_cl_ctlr_handle *ctlr_handle,
394df54c2f9SSascha Wildner 	TW_LOCK_HANDLE *lock);
395df54c2f9SSascha Wildner #endif
396df54c2f9SSascha Wildner 
397df54c2f9SSascha Wildner 
398df54c2f9SSascha Wildner #ifndef tw_osl_get_local_time
399*1e0dd9ddSSascha Wildner /* Get local time. */
400df54c2f9SSascha Wildner extern TW_TIME	tw_osl_get_local_time(TW_VOID);
401df54c2f9SSascha Wildner #endif
402df54c2f9SSascha Wildner 
403df54c2f9SSascha Wildner 
404df54c2f9SSascha Wildner #ifndef tw_osl_get_lock
405df54c2f9SSascha Wildner /* Acquire a lock. */
406df54c2f9SSascha Wildner extern TW_VOID	tw_osl_get_lock(struct tw_cl_ctlr_handle *ctlr_handle,
407df54c2f9SSascha Wildner 	TW_LOCK_HANDLE *lock);
408df54c2f9SSascha Wildner #endif
409df54c2f9SSascha Wildner 
410df54c2f9SSascha Wildner 
411df54c2f9SSascha Wildner #ifndef tw_osl_init_lock
412df54c2f9SSascha Wildner /* Create/initialize a lock for CL's use. */
413df54c2f9SSascha Wildner extern TW_VOID	tw_osl_init_lock(struct tw_cl_ctlr_handle *ctlr_handle,
414df54c2f9SSascha Wildner 	TW_INT8 *lock_name, TW_LOCK_HANDLE *lock);
415df54c2f9SSascha Wildner #endif
416df54c2f9SSascha Wildner 
417df54c2f9SSascha Wildner 
418df54c2f9SSascha Wildner #ifndef tw_osl_memcpy
419df54c2f9SSascha Wildner /* Copy 'size' bytes from 'src' to 'dest'. */
420df54c2f9SSascha Wildner extern TW_VOID	tw_osl_memcpy(TW_VOID *src, TW_VOID *dest, TW_INT32 size);
421df54c2f9SSascha Wildner #endif
422df54c2f9SSascha Wildner 
423df54c2f9SSascha Wildner 
424df54c2f9SSascha Wildner #ifndef tw_osl_memzero
425df54c2f9SSascha Wildner /* Zero 'size' bytes starting at 'addr'. */
426df54c2f9SSascha Wildner extern TW_VOID	tw_osl_memzero(TW_VOID *addr, TW_INT32 size);
427df54c2f9SSascha Wildner #endif
428df54c2f9SSascha Wildner 
429df54c2f9SSascha Wildner 
430df54c2f9SSascha Wildner #ifndef tw_osl_notify_event
431df54c2f9SSascha Wildner /* Notify OSL of a controller/CL (or even OSL) event. */
432df54c2f9SSascha Wildner extern TW_VOID	tw_osl_notify_event(struct tw_cl_ctlr_handle *ctlr_handle,
433df54c2f9SSascha Wildner 	struct tw_cl_event_packet *event);
434df54c2f9SSascha Wildner #endif
435df54c2f9SSascha Wildner 
436df54c2f9SSascha Wildner 
437df54c2f9SSascha Wildner #ifdef TW_OSL_PCI_CONFIG_ACCESSIBLE
438df54c2f9SSascha Wildner #ifndef tw_osl_read_pci_config
439df54c2f9SSascha Wildner /* Read 'size' bytes from 'offset' in the PCI config space. */
440df54c2f9SSascha Wildner extern TW_UINT32 tw_osl_read_pci_config(
441df54c2f9SSascha Wildner 	struct tw_cl_ctlr_handle *ctlr_handle, TW_INT32 offset, TW_INT32 size);
442df54c2f9SSascha Wildner #endif
443df54c2f9SSascha Wildner #endif /* TW_OSL_PCI_CONFIG_ACCESSIBLE */
444df54c2f9SSascha Wildner 
445df54c2f9SSascha Wildner 
446df54c2f9SSascha Wildner #ifndef tw_osl_read_reg
447df54c2f9SSascha Wildner /* Read 'size' bytes at 'offset' from base address of this controller. */
448df54c2f9SSascha Wildner extern TW_UINT32 tw_osl_read_reg(struct tw_cl_ctlr_handle *ctlr_handle,
449df54c2f9SSascha Wildner 	TW_INT32 offset, TW_INT32 size);
450df54c2f9SSascha Wildner #endif
451df54c2f9SSascha Wildner 
452df54c2f9SSascha Wildner 
453df54c2f9SSascha Wildner #ifndef tw_osl_scan_bus
454df54c2f9SSascha Wildner /* Request OSL for a bus scan. */
455df54c2f9SSascha Wildner extern TW_VOID	tw_osl_scan_bus(struct tw_cl_ctlr_handle *ctlr_handle);
456df54c2f9SSascha Wildner #endif
457df54c2f9SSascha Wildner 
458df54c2f9SSascha Wildner 
459df54c2f9SSascha Wildner #ifdef TW_OSL_CAN_SLEEP
460df54c2f9SSascha Wildner #ifndef tw_osl_sleep
461df54c2f9SSascha Wildner /* Sleep for 'timeout' ms or until woken up (by tw_osl_wakeup). */
462df54c2f9SSascha Wildner extern TW_INT32	tw_osl_sleep(struct tw_cl_ctlr_handle *ctlr_handle,
463df54c2f9SSascha Wildner 	TW_SLEEP_HANDLE *sleep_handle, TW_INT32 timeout);
464df54c2f9SSascha Wildner #endif
465df54c2f9SSascha Wildner #endif /* TW_OSL_CAN_SLEEP */
466df54c2f9SSascha Wildner 
467df54c2f9SSascha Wildner 
468df54c2f9SSascha Wildner #ifndef tw_osl_sprintf
469df54c2f9SSascha Wildner /* Standard sprintf. */
470df54c2f9SSascha Wildner extern TW_INT32	tw_osl_sprintf(TW_INT8 *dest, const TW_INT8 *fmt, ...);
471df54c2f9SSascha Wildner #endif
472df54c2f9SSascha Wildner 
473df54c2f9SSascha Wildner 
474df54c2f9SSascha Wildner #ifndef tw_osl_strcpy
475df54c2f9SSascha Wildner /* Copy string 'src' to 'dest'. */
476df54c2f9SSascha Wildner extern TW_INT8	*tw_osl_strcpy(TW_INT8 *dest, TW_INT8 *src);
477df54c2f9SSascha Wildner #endif
478df54c2f9SSascha Wildner 
479df54c2f9SSascha Wildner 
480df54c2f9SSascha Wildner #ifndef tw_osl_strlen
481df54c2f9SSascha Wildner /* Return length of string pointed at by 'str'. */
482df54c2f9SSascha Wildner extern TW_INT32	tw_osl_strlen(TW_VOID *str);
483df54c2f9SSascha Wildner #endif
484df54c2f9SSascha Wildner 
485df54c2f9SSascha Wildner #ifndef tw_osl_vsprintf
486df54c2f9SSascha Wildner /* Standard vsprintf. */
4873ee759e7SSascha Wildner extern TW_INT32	tw_osl_vsprintf(TW_INT8 *dest, const TW_INT8 *fmt, va_list ap)
4883ee759e7SSascha Wildner 		    __printflike(2, 0);
489df54c2f9SSascha Wildner #endif
490df54c2f9SSascha Wildner 
491df54c2f9SSascha Wildner 
492df54c2f9SSascha Wildner #ifdef TW_OSL_CAN_SLEEP
493df54c2f9SSascha Wildner #ifndef tw_osl_wakeup
494df54c2f9SSascha Wildner /* Wake up a thread sleeping by a call to tw_osl_sleep. */
495df54c2f9SSascha Wildner extern TW_VOID	tw_osl_wakeup(struct tw_cl_ctlr_handle *ctlr_handle,
496df54c2f9SSascha Wildner 	TW_SLEEP_HANDLE *sleep_handle);
497df54c2f9SSascha Wildner #endif
498df54c2f9SSascha Wildner #endif /* TW_OSL_CAN_SLEEP */
499df54c2f9SSascha Wildner 
500df54c2f9SSascha Wildner 
501df54c2f9SSascha Wildner #ifdef TW_OSL_PCI_CONFIG_ACCESSIBLE
502df54c2f9SSascha Wildner #ifndef tw_osl_write_pci_config
503df54c2f9SSascha Wildner /* Write 'value' of 'size' bytes at 'offset' in the PCI config space. */
504df54c2f9SSascha Wildner extern TW_VOID	tw_osl_write_pci_config(struct tw_cl_ctlr_handle *ctlr_handle,
505df54c2f9SSascha Wildner 	TW_INT32 offset, TW_INT32 value, TW_INT32 size);
506df54c2f9SSascha Wildner #endif
507df54c2f9SSascha Wildner #endif /* TW_OSL_PCI_CONFIG_ACCESSIBLE */
508df54c2f9SSascha Wildner 
509df54c2f9SSascha Wildner 
510df54c2f9SSascha Wildner #ifndef tw_osl_write_reg
511df54c2f9SSascha Wildner /*
512df54c2f9SSascha Wildner  * Write 'value' of 'size' (max 4) bytes at 'offset' from base address of
513df54c2f9SSascha Wildner  * this controller.
514df54c2f9SSascha Wildner  */
515df54c2f9SSascha Wildner extern TW_VOID	tw_osl_write_reg(struct tw_cl_ctlr_handle *ctlr_handle,
516df54c2f9SSascha Wildner 	TW_INT32 offset, TW_INT32 value, TW_INT32 size);
517df54c2f9SSascha Wildner #endif
518df54c2f9SSascha Wildner 
519df54c2f9SSascha Wildner 
520df54c2f9SSascha Wildner 
521df54c2f9SSascha Wildner /* Functions in the Common Layer */
522df54c2f9SSascha Wildner 
523df54c2f9SSascha Wildner /* Creates and queues AEN's.  Also notifies OS Layer. */
524df54c2f9SSascha Wildner extern TW_VOID tw_cl_create_event(struct tw_cl_ctlr_handle *ctlr_handle,
525df54c2f9SSascha Wildner 	TW_UINT8 queue_event, TW_UINT8 event_src, TW_UINT16 event_code,
526df54c2f9SSascha Wildner 	TW_UINT8 severity, TW_UINT8 *severity_str, TW_UINT8 *event_desc,
527df54c2f9SSascha Wildner 	TW_UINT8 *event_specific_desc, ...);
528df54c2f9SSascha Wildner 
529df54c2f9SSascha Wildner /* Indicates whether a ctlr is supported by CL. */
530df54c2f9SSascha Wildner extern TW_INT32	tw_cl_ctlr_supported(TW_INT32 vendor_id, TW_INT32 device_id);
531df54c2f9SSascha Wildner 
532df54c2f9SSascha Wildner 
533df54c2f9SSascha Wildner /* Submit a firmware cmd packet. */
534df54c2f9SSascha Wildner extern TW_INT32	tw_cl_fw_passthru(struct tw_cl_ctlr_handle *ctlr_handle,
535df54c2f9SSascha Wildner 	struct tw_cl_req_packet *req_pkt, struct tw_cl_req_handle *req_handle);
536df54c2f9SSascha Wildner 
537df54c2f9SSascha Wildner 
538df54c2f9SSascha Wildner /* Find out how much memory CL needs. */
539df54c2f9SSascha Wildner extern TW_INT32	tw_cl_get_mem_requirements(
540df54c2f9SSascha Wildner 	struct tw_cl_ctlr_handle *ctlr_handle, TW_UINT32 flags,
541df54c2f9SSascha Wildner 	TW_INT32 device_id, TW_INT32 max_simult_reqs, TW_INT32 max_aens,
542df54c2f9SSascha Wildner 	TW_UINT32 *alignment, TW_UINT32 *sg_size_factor,
543df54c2f9SSascha Wildner 	TW_UINT32 *non_dma_mem_size, TW_UINT32 *dma_mem_size
544df54c2f9SSascha Wildner 	);
545df54c2f9SSascha Wildner 
546df54c2f9SSascha Wildner 
547df54c2f9SSascha Wildner /* Return PCI BAR info. */
548df54c2f9SSascha Wildner extern TW_INT32 tw_cl_get_pci_bar_info(TW_INT32 device_id, TW_INT32 bar_type,
549df54c2f9SSascha Wildner 	TW_INT32 *bar_num, TW_INT32 *bar0_offset, TW_INT32 *bar_size);
550df54c2f9SSascha Wildner 
551df54c2f9SSascha Wildner 
552df54c2f9SSascha Wildner /* Initialize Common Layer for a given controller. */
553df54c2f9SSascha Wildner extern TW_INT32	tw_cl_init_ctlr(struct tw_cl_ctlr_handle *ctlr_handle,
554df54c2f9SSascha Wildner 	TW_UINT32 flags, TW_INT32 device_id, TW_INT32 max_simult_reqs,
555df54c2f9SSascha Wildner 	TW_INT32 max_aens, TW_VOID *non_dma_mem, TW_VOID *dma_mem,
556df54c2f9SSascha Wildner 	TW_UINT64 dma_mem_phys
557df54c2f9SSascha Wildner 	);
558df54c2f9SSascha Wildner 
559df54c2f9SSascha Wildner 
5604fbf05f9SSascha Wildner extern TW_VOID  tw_cl_set_reset_needed(struct tw_cl_ctlr_handle *ctlr_handle);
5614fbf05f9SSascha Wildner extern TW_INT32 tw_cl_is_reset_needed(struct tw_cl_ctlr_handle *ctlr_handle);
5624fbf05f9SSascha Wildner extern TW_INT32 tw_cl_is_active(struct tw_cl_ctlr_handle *ctlr_handle);
5634fbf05f9SSascha Wildner 
564df54c2f9SSascha Wildner /* CL's interrupt handler. */
565df54c2f9SSascha Wildner extern TW_INT32	tw_cl_interrupt(struct tw_cl_ctlr_handle *ctlr_handle);
566df54c2f9SSascha Wildner 
567df54c2f9SSascha Wildner 
568df54c2f9SSascha Wildner /* CL's ioctl handler. */
569df54c2f9SSascha Wildner extern TW_INT32	tw_cl_ioctl(struct tw_cl_ctlr_handle *ctlr_handle,
570df54c2f9SSascha Wildner 	u_long cmd, TW_VOID *buf);
571df54c2f9SSascha Wildner 
572df54c2f9SSascha Wildner 
573df54c2f9SSascha Wildner #ifdef TW_OSL_DEBUG
574df54c2f9SSascha Wildner /* Print CL's state/statistics for a controller. */
575df54c2f9SSascha Wildner extern TW_VOID	tw_cl_print_ctlr_stats(struct tw_cl_ctlr_handle *ctlr_handle);
576df54c2f9SSascha Wildner 
577df54c2f9SSascha Wildner /* Prints CL internal details of a given request. */
578df54c2f9SSascha Wildner extern TW_VOID	tw_cl_print_req_info(struct tw_cl_req_handle *req_handle);
579df54c2f9SSascha Wildner #endif /* TW_OSL_DEBUG */
580df54c2f9SSascha Wildner 
581df54c2f9SSascha Wildner 
582df54c2f9SSascha Wildner /* Soft reset controller. */
583df54c2f9SSascha Wildner extern TW_INT32	tw_cl_reset_ctlr(struct tw_cl_ctlr_handle *ctlr_handle);
584df54c2f9SSascha Wildner 
585df54c2f9SSascha Wildner 
586df54c2f9SSascha Wildner #ifdef TW_OSL_DEBUG
587df54c2f9SSascha Wildner /* Reset CL's statistics for a controller. */
588df54c2f9SSascha Wildner extern TW_VOID	tw_cl_reset_stats(struct tw_cl_ctlr_handle *ctlr_handle);
589df54c2f9SSascha Wildner #endif /* TW_OSL_DEBUG */
590df54c2f9SSascha Wildner 
591df54c2f9SSascha Wildner 
592df54c2f9SSascha Wildner /* Stop a controller. */
593df54c2f9SSascha Wildner extern TW_INT32	tw_cl_shutdown_ctlr(struct tw_cl_ctlr_handle *ctlr_handle,
594df54c2f9SSascha Wildner 	TW_UINT32 flags);
595df54c2f9SSascha Wildner 
596df54c2f9SSascha Wildner 
597df54c2f9SSascha Wildner /* Submit a SCSI I/O request. */
598df54c2f9SSascha Wildner extern TW_INT32	tw_cl_start_io(struct tw_cl_ctlr_handle *ctlr_handle,
599df54c2f9SSascha Wildner 	struct tw_cl_req_packet *req_pkt, struct tw_cl_req_handle *req_handle);
600df54c2f9SSascha Wildner 
601df54c2f9SSascha Wildner 
602df54c2f9SSascha Wildner #endif /* TW_BUILDING_API */
603df54c2f9SSascha Wildner 
604df54c2f9SSascha Wildner #endif /* TW_CL_SHARE_H */
605