tw_cl_share.h revision 144966
1144966Svkashyap/*
2144966Svkashyap * Copyright (c) 2004-05 Applied Micro Circuits Corporation.
3144966Svkashyap * Copyright (c) 2004-05 Vinod Kashyap
4144966Svkashyap * All rights reserved.
5144966Svkashyap *
6144966Svkashyap * Redistribution and use in source and binary forms, with or without
7144966Svkashyap * modification, are permitted provided that the following conditions
8144966Svkashyap * are met:
9144966Svkashyap * 1. Redistributions of source code must retain the above copyright
10144966Svkashyap *    notice, this list of conditions and the following disclaimer.
11144966Svkashyap * 2. Redistributions in binary form must reproduce the above copyright
12144966Svkashyap *    notice, this list of conditions and the following disclaimer in the
13144966Svkashyap *    documentation and/or other materials provided with the distribution.
14144966Svkashyap *
15144966Svkashyap * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16144966Svkashyap * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17144966Svkashyap * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18144966Svkashyap * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19144966Svkashyap * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20144966Svkashyap * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21144966Svkashyap * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22144966Svkashyap * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23144966Svkashyap * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24144966Svkashyap * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25144966Svkashyap * SUCH DAMAGE.
26144966Svkashyap *
27144966Svkashyap *	$FreeBSD: head/sys/dev/twa/tw_cl_share.h 144966 2005-04-12 22:07:11Z vkashyap $
28144966Svkashyap */
29144966Svkashyap
30144966Svkashyap/*
31144966Svkashyap * AMCC'S 3ware driver for 9000 series storage controllers.
32144966Svkashyap *
33144966Svkashyap * Author: Vinod Kashyap
34144966Svkashyap */
35144966Svkashyap
36144966Svkashyap
37144966Svkashyap
38144966Svkashyap#ifndef TW_CL_SHARE_H
39144966Svkashyap
40144966Svkashyap#define TW_CL_SHARE_H
41144966Svkashyap
42144966Svkashyap
43144966Svkashyap/*
44144966Svkashyap * Macros, structures and functions shared between OSL and CL,
45144966Svkashyap * and defined by CL.
46144966Svkashyap */
47144966Svkashyap
48144966Svkashyap
49144966Svkashyap#define TW_CL_VERSION_STRING		"1.00.00.007"
50144966Svkashyap
51144966Svkashyap#define TW_CL_NULL			((TW_VOID *)0)
52144966Svkashyap#define TW_CL_TRUE			1
53144966Svkashyap#define TW_CL_FALSE			0
54144966Svkashyap
55144966Svkashyap#define TW_CL_VENDOR_ID			0x13C1	/* 3ware vendor id */
56144966Svkashyap#define TW_CL_DEVICE_ID_9K		0x1002	/* 9000 series device id */
57144966Svkashyap
58144966Svkashyap#define TW_CL_MAX_NUM_UNITS		16	/* max # of units we support */
59144966Svkashyap#define TW_CL_MAX_NUM_LUNS		16	/* max # of LUN's we support */
60144966Svkashyap#define TW_CL_MAX_IO_SIZE		0x20000	/* 128K */
61144966Svkashyap
62144966Svkashyap/*
63144966Svkashyap * Though we can support 256 simultaneous requests, we advertise as capable
64144966Svkashyap * of supporting only 255, since we want to keep one CL internal request
65144966Svkashyap * context packet always available for internal requests.
66144966Svkashyap */
67144966Svkashyap#define TW_CL_MAX_SIMULTANEOUS_REQUESTS	0xFF	/* max simult reqs supported */
68144966Svkashyap
69144966Svkashyap#define TW_CL_MAX_32BIT_SG_ELEMENTS	109	/* max 32-bit sg elements */
70144966Svkashyap#define TW_CL_MAX_64BIT_SG_ELEMENTS	72	/* max 64-bit sg elements */
71144966Svkashyap
72144966Svkashyap
73144966Svkashyap/* Possible values of ctlr->flags */
74144966Svkashyap#define TW_CL_64BIT_ADDRESSES	(1<<0) /* 64 bit cmdpkt & SG addresses */
75144966Svkashyap#define TW_CL_64BIT_SG_LENGTH	(1<<1) /* 64 bit SG length */
76144966Svkashyap#define TW_CL_START_CTLR_ONLY	(1<<2) /* Start ctlr only */
77144966Svkashyap#define TW_CL_STOP_CTLR_ONLY	(1<<3) /* Stop ctlr only */
78144966Svkashyap#define TW_CL_FLASH_FIRMWARE	(1<<4) /* Flash firmware */
79144966Svkashyap
80144966Svkashyap/* Possible error values from the Common Layer. */
81144966Svkashyap#define TW_CL_ERR_REQ_SUCCESS			0
82144966Svkashyap#define TW_CL_ERR_REQ_GENERAL_FAILURE		(1<<0)
83144966Svkashyap#define TW_CL_ERR_REQ_INVALID_TARGET		(1<<1)
84144966Svkashyap#define TW_CL_ERR_REQ_INVALID_LUN		(1<<2)
85144966Svkashyap#define TW_CL_ERR_REQ_SCSI_ERROR		(1<<3)
86144966Svkashyap#define TW_CL_ERR_REQ_AUTO_SENSE_VALID		(1<<4)
87144966Svkashyap#define TW_CL_ERR_REQ_BUS_RESET			(1<<5)
88144966Svkashyap#define TW_CL_ERR_REQ_UNABLE_TO_SUBMIT_COMMAND	(1<<6)
89144966Svkashyap
90144966Svkashyap
91144966Svkashyap/* Possible values of req_pkt->flags */
92144966Svkashyap#ifndef TW_OSL_NON_DMA_MEM_ALLOC_PER_REQUEST
93144966Svkashyap#define TW_CL_REQ_RETRY_ON_BUSY		(1<<0)
94144966Svkashyap#endif /* TW_OSL_NON_DMA_MEM_ALLOC_PER_REQUEST */
95144966Svkashyap#define TW_CL_REQ_CALLBACK_FOR_SGLIST	(1<<1)
96144966Svkashyap
97144966Svkashyap
98144966Svkashyap#define TW_CL_MESSAGE_SOURCE_CONTROLLER_ERROR	3
99144966Svkashyap#define TW_CL_MESSAGE_SOURCE_CONTROLLER_EVENT	4
100144966Svkashyap#define TW_CL_MESSAGE_SOURCE_COMMON_LAYER_ERROR	21
101144966Svkashyap#define TW_CL_MESSAGE_SOURCE_COMMON_LAYER_EVENT	22
102144966Svkashyap#define TW_CL_MESSAGE_SOURCE_FREEBSD_DRIVER	5
103144966Svkashyap#define TW_CL_MESSAGE_SOURCE_FREEBSD_OS		8
104144966Svkashyap#define TW_CL_MESSAGE_SOURCE_WINDOWS_DRIVER	7
105144966Svkashyap#define TW_CL_MESSAGE_SOURCE_WINDOWS_OS		10
106144966Svkashyap
107144966Svkashyap#define TW_CL_SEVERITY_ERROR		0x1
108144966Svkashyap#define TW_CL_SEVERITY_WARNING		0x2
109144966Svkashyap#define TW_CL_SEVERITY_INFO		0x3
110144966Svkashyap#define TW_CL_SEVERITY_DEBUG		0x4
111144966Svkashyap
112144966Svkashyap#define TW_CL_SEVERITY_ERROR_STRING	"ERROR"
113144966Svkashyap#define TW_CL_SEVERITY_WARNING_STRING	"WARNING"
114144966Svkashyap#define TW_CL_SEVERITY_INFO_STRING	"INFO"
115144966Svkashyap#define TW_CL_SEVERITY_DEBUG_STRING	"DEBUG"
116144966Svkashyap
117144966Svkashyap
118144966Svkashyap#pragma pack(1)
119144966Svkashyap
120144966Svkashyap/*
121144966Svkashyap * Structure, a pointer to which is used as the controller handle in
122144966Svkashyap * communications between the OS Layer and the Common Layer.
123144966Svkashyap */
124144966Svkashyapstruct tw_cl_ctlr_handle {
125144966Svkashyap	TW_VOID	*osl_ctlr_ctxt;	/* OSL's ctlr context */
126144966Svkashyap	TW_VOID	*cl_ctlr_ctxt;	/* CL's ctlr context */
127144966Svkashyap};
128144966Svkashyap
129144966Svkashyap
130144966Svkashyap/*
131144966Svkashyap * Structure, a pointer to which is used as the request handle in
132144966Svkashyap * communications between the OS Layer and the Common Layer.
133144966Svkashyap */
134144966Svkashyapstruct tw_cl_req_handle {
135144966Svkashyap	TW_VOID	*osl_req_ctxt;	/* OSL's request context */
136144966Svkashyap	TW_VOID	*cl_req_ctxt;	/* CL's request context */
137144966Svkashyap};
138144966Svkashyap
139144966Svkashyap
140144966Svkashyap/* Structure used to describe SCSI requests to CL. */
141144966Svkashyapstruct tw_cl_scsi_req_packet {
142144966Svkashyap	TW_UINT32	unit;		/* unit # to send cmd to */
143144966Svkashyap	TW_UINT32	lun;		/* LUN to send cmd to */
144144966Svkashyap	TW_UINT8	*cdb;		/* ptr to SCSI cdb */
145144966Svkashyap	TW_UINT32	cdb_len;	/* # of valid cdb bytes */
146144966Svkashyap	TW_UINT32	sense_len;	/* # of bytes of valid sense info */
147144966Svkashyap	TW_UINT8	*sense_data;	/* ptr to sense data, if any */
148144966Svkashyap	TW_UINT32	scsi_status;	/* SCSI status returned by fw */
149144966Svkashyap	TW_UINT32	sgl_entries;	/* # of SG descriptors */
150144966Svkashyap	TW_UINT8	*sg_list;	/* ptr to SG list */
151144966Svkashyap};
152144966Svkashyap
153144966Svkashyap
154144966Svkashyap/* Structure used to describe pass through command packets to CL. */
155144966Svkashyapstruct tw_cl_passthru_req_packet {
156144966Svkashyap	TW_UINT8	*cmd_pkt;	/* ptr to passthru cmd pkt */
157144966Svkashyap	TW_UINT32	cmd_pkt_length;	/* size of cmd pkt */
158144966Svkashyap	TW_UINT32	sgl_entries;	/* # of SG descriptors */
159144966Svkashyap	TW_UINT8	*sg_list;	/* ptr to SG list */
160144966Svkashyap};
161144966Svkashyap
162144966Svkashyap
163144966Svkashyap/* Request packet submitted to the Common Layer, by the OS Layer. */
164144966Svkashyapstruct tw_cl_req_packet {
165144966Svkashyap	TW_UINT32	cmd;		/* Common Layer cmd */
166144966Svkashyap	TW_UINT32	flags;		/* flags describing request */
167144966Svkashyap	TW_UINT32	status;		/* Common Layer returned status */
168144966Svkashyap	TW_VOID		(*tw_osl_callback)(struct tw_cl_req_handle *req_handle);
169144966Svkashyap			/* OSL routine to be called by CL on req completion */
170144966Svkashyap	TW_VOID		(*tw_osl_sgl_callback)(
171144966Svkashyap			struct tw_cl_req_handle *req_handle, TW_VOID *sg_list,
172144966Svkashyap			TW_UINT32 *num_sgl_entries);
173144966Svkashyap			/* OSL callback to get SG list. */
174144966Svkashyap
175144966Svkashyap#ifdef TW_OSL_DMA_MEM_ALLOC_PER_REQUEST
176144966Svkashyap
177144966Svkashyap	TW_VOID		*dma_mem;
178144966Svkashyap	TW_UINT64	dma_mem_phys;
179144966Svkashyap
180144966Svkashyap#endif /* TW_OSL_DMA_MEM_ALLOC_PER_REQUEST */
181144966Svkashyap
182144966Svkashyap#ifdef TW_OSL_NON_DMA_MEM_ALLOC_PER_REQUEST
183144966Svkashyap
184144966Svkashyap	TW_VOID		*non_dma_mem;
185144966Svkashyap
186144966Svkashyap#endif /* TW_OSL_NON_DMA_MEM_ALLOC_PER_REQUEST */
187144966Svkashyap
188144966Svkashyap	union {
189144966Svkashyap		struct tw_cl_scsi_req_packet		scsi_req; /* SCSI req */
190144966Svkashyap		struct tw_cl_passthru_req_packet	pt_req;/*Passthru req*/
191144966Svkashyap	} gen_req_pkt;
192144966Svkashyap};
193144966Svkashyap
194144966Svkashyap
195144966Svkashyap/*
196144966Svkashyap * Packet that describes an AEN/error generated by the controller,
197144966Svkashyap * Common Layer, or even the OS Layer.
198144966Svkashyap */
199144966Svkashyapstruct tw_cl_event_packet {
200144966Svkashyap	TW_UINT32	sequence_id;
201144966Svkashyap	TW_UINT32	time_stamp_sec;
202144966Svkashyap	TW_UINT16	aen_code;
203144966Svkashyap	TW_UINT8	severity;
204144966Svkashyap	TW_UINT8	retrieved;
205144966Svkashyap	TW_UINT8	repeat_count;
206144966Svkashyap	TW_UINT8	parameter_len;
207144966Svkashyap	TW_UINT8	parameter_data[98];
208144966Svkashyap	TW_UINT32	event_src;
209144966Svkashyap	TW_UINT8	severity_str[20];
210144966Svkashyap};
211144966Svkashyap
212144966Svkashyap
213144966Svkashyap/* Structure to link 2 adjacent elements in a list. */
214144966Svkashyapstruct tw_cl_link {
215144966Svkashyap	struct tw_cl_link	*next;
216144966Svkashyap	struct tw_cl_link	*prev;
217144966Svkashyap};
218144966Svkashyap
219144966Svkashyap
220144966Svkashyap/* Scatter/Gather list entry with 32 bit addresses. */
221144966Svkashyapstruct tw_cl_sg_desc32 {
222144966Svkashyap	TW_UINT32	address;
223144966Svkashyap	TW_UINT32	length;
224144966Svkashyap};
225144966Svkashyap
226144966Svkashyap
227144966Svkashyap/* Scatter/Gather list entry with 64 bit addresses. */
228144966Svkashyapstruct tw_cl_sg_desc64 {
229144966Svkashyap	TW_UINT64	address;
230144966Svkashyap	TW_UINT32	length;
231144966Svkashyap};
232144966Svkashyap
233144966Svkashyap#pragma pack()
234144966Svkashyap
235144966Svkashyap
236144966Svkashyap/* Byte swap functions.  Valid only if running on big endian platforms. */
237144966Svkashyap#ifdef TW_OSL_BIG_ENDIAN
238144966Svkashyap
239144966Svkashyap#define TW_CL_SWAP16_WITH_CAST(x)					\
240144966Svkashyap	((x << 8) | (x >> 8))
241144966Svkashyap
242144966Svkashyap
243144966Svkashyap#define TW_CL_SWAP32_WITH_CAST(x)					\
244144966Svkashyap	((x << 24) | ((x << 8) & (0xFF0000)) |				\
245144966Svkashyap	((x >> 8) & (0xFF00)) | (x >> 24))
246144966Svkashyap
247144966Svkashyap
248144966Svkashyap#define TW_CL_SWAP64_WITH_CAST(x)					\
249144966Svkashyap	((((TW_UINT64)(TW_CL_SWAP32(((TW_UINT32 *)(&(x)))[1]))) << 32) |\
250144966Svkashyap	((TW_UINT32)(TW_CL_SWAP32(((TW_UINT32 *)(&(x)))[0]))))
251144966Svkashyap
252144966Svkashyap
253144966Svkashyap#else /* TW_OSL_BIG_ENDIAN */
254144966Svkashyap
255144966Svkashyap#define TW_CL_SWAP16_WITH_CAST(x)	x
256144966Svkashyap#define TW_CL_SWAP32_WITH_CAST(x)	x
257144966Svkashyap#define TW_CL_SWAP64_WITH_CAST(x)	x
258144966Svkashyap
259144966Svkashyap#endif /* TW_OSL_BIG_ENDIAN */
260144966Svkashyap
261144966Svkashyap#define TW_CL_SWAP16(x)		TW_CL_SWAP16_WITH_CAST((TW_UINT16)(x))
262144966Svkashyap#define TW_CL_SWAP32(x)		TW_CL_SWAP32_WITH_CAST((TW_UINT32)(x))
263144966Svkashyap#define TW_CL_SWAP64(x)		TW_CL_SWAP64_WITH_CAST((TW_UINT64)(x))
264144966Svkashyap
265144966Svkashyap
266144966Svkashyap/* Queue manipulation functions. */
267144966Svkashyap
268144966Svkashyap/* Initialize a queue. */
269144966Svkashyap#define TW_CL_Q_INIT(head)	do {		\
270144966Svkashyap	(head)->prev = (head)->next = head;	\
271144966Svkashyap} while (0)
272144966Svkashyap
273144966Svkashyap
274144966Svkashyap/* Insert an item at the head of the queue. */
275144966Svkashyap#define TW_CL_Q_INSERT_HEAD(head, item)	do {	\
276144966Svkashyap	(item)->next = (head)->next;		\
277144966Svkashyap	(item)->prev = head;			\
278144966Svkashyap	(head)->next->prev = item;		\
279144966Svkashyap	(head)->next = item;			\
280144966Svkashyap} while (0)
281144966Svkashyap
282144966Svkashyap
283144966Svkashyap/* Insert an item at the tail of the queue. */
284144966Svkashyap#define	TW_CL_Q_INSERT_TAIL(head, item)	do {	\
285144966Svkashyap	(item)->next = head;			\
286144966Svkashyap	(item)->prev = (head)->prev;		\
287144966Svkashyap	(head)->prev->next = item;		\
288144966Svkashyap	(head)->prev = item;			\
289144966Svkashyap} while (0)
290144966Svkashyap
291144966Svkashyap
292144966Svkashyap/* Remove an item from the head of the queue. */
293144966Svkashyap#define TW_CL_Q_REMOVE_ITEM(head, item)	do {	\
294144966Svkashyap	(item)->prev->next = (item)->next;	\
295144966Svkashyap	(item)->next->prev = (item)->prev;	\
296144966Svkashyap} while (0)
297144966Svkashyap
298144966Svkashyap
299144966Svkashyap/* Retrieve the item at the head of the queue. */
300144966Svkashyap#define TW_CL_Q_FIRST_ITEM(head)		\
301144966Svkashyap	(((head)->next != head) ? ((head)->next) : TW_CL_NULL)
302144966Svkashyap
303144966Svkashyap
304144966Svkashyap/* Retrieve the item at the tail of the queue. */
305144966Svkashyap#define TW_CL_Q_LAST_ITEM(head)			\
306144966Svkashyap	(((head)->prev != head) ? ((head)->prev) : TW_CL_NULL)
307144966Svkashyap
308144966Svkashyap
309144966Svkashyap/* Retrieve the item next to a given item in the queue. */
310144966Svkashyap#define TW_CL_Q_NEXT_ITEM(head, item)		\
311144966Svkashyap	(((item)->next != head) ? ((item)->next) : TW_CL_NULL)
312144966Svkashyap
313144966Svkashyap
314144966Svkashyap/* Retrieve the item previous to a given item in the queue. */
315144966Svkashyap#define TW_CL_Q_PREV_ITEM(head, item)		\
316144966Svkashyap	(((item)->prev != head) ? ((item)->prev) : TW_CL_NULL)
317144966Svkashyap
318144966Svkashyap
319144966Svkashyap/* Determine the offset of a field from the head of the structure it is in. */
320144966Svkashyap#define	TW_CL_STRUCT_OFFSET(struct_type, field)	\
321144966Svkashyap	(TW_INT8 *)(&((struct_type *)0)->field)
322144966Svkashyap
323144966Svkashyap
324144966Svkashyap/*
325144966Svkashyap * Determine the address of the head of a structure, given the address of a
326144966Svkashyap * field within it.
327144966Svkashyap */
328144966Svkashyap#define TW_CL_STRUCT_HEAD(addr, struct_type, field)	\
329144966Svkashyap	(struct_type *)((TW_INT8 *)addr -		\
330144966Svkashyap	TW_CL_STRUCT_OFFSET(struct_type, field))
331144966Svkashyap
332144966Svkashyap
333144966Svkashyap
334144966Svkashyap/*
335144966Svkashyap * The following are extern declarations of OS Layer defined functions called
336144966Svkashyap * by the Common Layer.  If any function has been defined as a macro in
337144966Svkashyap * tw_osl_share.h, we will not make the extern declaration here.
338144966Svkashyap */
339144966Svkashyap
340144966Svkashyap#ifndef tw_osl_breakpoint
341144966Svkashyap/* Allows setting breakpoints in the CL code for debugging purposes. */
342144966Svkashyapextern TW_VOID	tw_osl_breakpoint(TW_VOID);
343144966Svkashyap#endif
344144966Svkashyap
345144966Svkashyap
346144966Svkashyap#ifndef tw_osl_ctlr_ready
347144966Svkashyap/* Called on cmd interrupt.  Allows re-submission of any pending requests. */
348144966Svkashyapextern TW_VOID	tw_osl_ctlr_ready(struct tw_cl_ctlr_handle *ctlr_handle);
349144966Svkashyap#endif
350144966Svkashyap
351144966Svkashyap
352144966Svkashyap#ifndef tw_osl_cur_func
353144966Svkashyap/* Text name of current function. */
354144966Svkashyapextern TW_INT8	*tw_osl_cur_func(TW_VOID);
355144966Svkashyap#endif
356144966Svkashyap
357144966Svkashyap
358144966Svkashyap#ifdef TW_OSL_DEBUG
359144966Svkashyap#ifndef tw_osl_dbg_printf
360144966Svkashyap/* Print to syslog/event log/debug console, as applicable. */
361144966Svkashyapextern TW_INT32 tw_osl_dbg_printf(struct tw_cl_ctlr_handle *ctlr_handle,
362144966Svkashyap	const TW_INT8 *fmt, ...);
363144966Svkashyap#endif
364144966Svkashyap#endif /* TW_OSL_DEBUG */
365144966Svkashyap
366144966Svkashyap
367144966Svkashyap#ifndef tw_osl_delay
368144966Svkashyap/* Cause a delay of usecs micro-seconds. */
369144966Svkashyapextern TW_VOID	tw_osl_delay(TW_INT32 usecs);
370144966Svkashyap#endif
371144966Svkashyap
372144966Svkashyap
373144966Svkashyap#ifndef tw_osl_destroy_lock
374144966Svkashyap/* Create/initialize a lock for CL's use. */
375144966Svkashyapextern TW_VOID	tw_osl_destroy_lock(struct tw_cl_ctlr_handle *ctlr_handle,
376144966Svkashyap	TW_LOCK_HANDLE *lock);
377144966Svkashyap#endif
378144966Svkashyap
379144966Svkashyap
380144966Svkashyap#ifndef tw_osl_free_lock
381144966Svkashyap/* Free a previously held lock. */
382144966Svkashyapextern TW_VOID	tw_osl_free_lock(struct tw_cl_ctlr_handle *ctlr_handle,
383144966Svkashyap	TW_LOCK_HANDLE *lock);
384144966Svkashyap#endif
385144966Svkashyap
386144966Svkashyap
387144966Svkashyap#ifndef tw_osl_get_local_time
388144966Svkashyap/* Get local time. */
389144966Svkashyapextern TW_TIME	tw_osl_get_local_time(TW_VOID);
390144966Svkashyap#endif
391144966Svkashyap
392144966Svkashyap
393144966Svkashyap#ifndef tw_osl_get_lock
394144966Svkashyap/* Acquire a lock. */
395144966Svkashyapextern TW_VOID	tw_osl_get_lock(struct tw_cl_ctlr_handle *ctlr_handle,
396144966Svkashyap	TW_LOCK_HANDLE *lock);
397144966Svkashyap#endif
398144966Svkashyap
399144966Svkashyap
400144966Svkashyap#ifndef tw_osl_init_lock
401144966Svkashyap/* Create/initialize a lock for CL's use. */
402144966Svkashyapextern TW_VOID	tw_osl_init_lock(struct tw_cl_ctlr_handle *ctlr_handle,
403144966Svkashyap	TW_INT8 *lock_name, TW_LOCK_HANDLE *lock);
404144966Svkashyap#endif
405144966Svkashyap
406144966Svkashyap
407144966Svkashyap#ifndef tw_osl_memcpy
408144966Svkashyap/* Copy 'size' bytes from 'src' to 'dest'. */
409144966Svkashyapextern TW_VOID	tw_osl_memcpy(TW_VOID *src, TW_VOID *dest, TW_INT32 size);
410144966Svkashyap#endif
411144966Svkashyap
412144966Svkashyap
413144966Svkashyap#ifndef tw_osl_memzero
414144966Svkashyap/* Zero 'size' bytes starting at 'addr'. */
415144966Svkashyapextern TW_VOID	tw_osl_memzero(TW_VOID *addr, TW_INT32 size);
416144966Svkashyap#endif
417144966Svkashyap
418144966Svkashyap
419144966Svkashyap#ifndef tw_osl_notify_event
420144966Svkashyap/* Notify OSL of a controller/CL (or even OSL) event. */
421144966Svkashyapextern TW_VOID	tw_osl_notify_event(struct tw_cl_ctlr_handle *ctlr_handle,
422144966Svkashyap	struct tw_cl_event_packet *event);
423144966Svkashyap#endif
424144966Svkashyap
425144966Svkashyap
426144966Svkashyap#ifdef TW_OSL_PCI_CONFIG_ACCESSIBLE
427144966Svkashyap#ifndef tw_osl_read_pci_config
428144966Svkashyap/* Read 'size' bytes from 'offset' in the PCI config space. */
429144966Svkashyapextern TW_UINT32 tw_osl_read_pci_config(
430144966Svkashyap	struct tw_cl_ctlr_handle *ctlr_handle, TW_INT32 offset, TW_INT32 size);
431144966Svkashyap#endif
432144966Svkashyap#endif /* TW_OSL_PCI_CONFIG_ACCESSIBLE */
433144966Svkashyap
434144966Svkashyap
435144966Svkashyap#ifndef tw_osl_read_reg
436144966Svkashyap/* Read 'size' bytes at 'offset' from base address of this controller. */
437144966Svkashyapextern TW_UINT32 tw_osl_read_reg(struct tw_cl_ctlr_handle *ctlr_handle,
438144966Svkashyap	TW_INT32 offset, TW_INT32 size);
439144966Svkashyap#endif
440144966Svkashyap
441144966Svkashyap
442144966Svkashyap#ifndef tw_osl_scan_bus
443144966Svkashyap/* Request OSL for a bus scan. */
444144966Svkashyapextern TW_VOID	tw_osl_scan_bus(struct tw_cl_ctlr_handle *ctlr_handle);
445144966Svkashyap#endif
446144966Svkashyap
447144966Svkashyap
448144966Svkashyap#ifdef TW_OSL_CAN_SLEEP
449144966Svkashyap#ifndef tw_osl_sleep
450144966Svkashyap/* Sleep for 'timeout' ms or until woken up (by tw_osl_wakeup). */
451144966Svkashyapextern TW_INT32	tw_osl_sleep(struct tw_cl_ctlr_handle *ctlr_handle,
452144966Svkashyap	TW_SLEEP_HANDLE *sleep_handle, TW_INT32 timeout);
453144966Svkashyap#endif
454144966Svkashyap#endif /* TW_OSL_CAN_SLEEP */
455144966Svkashyap
456144966Svkashyap
457144966Svkashyap#ifndef tw_osl_sprintf
458144966Svkashyap/* Standard sprintf. */
459144966Svkashyapextern TW_INT32	tw_osl_sprintf(TW_INT8 *dest, const TW_INT8 *fmt, ...);
460144966Svkashyap#endif
461144966Svkashyap
462144966Svkashyap
463144966Svkashyap#ifndef tw_osl_strcpy
464144966Svkashyap/* Copy string 'src' to 'dest'. */
465144966Svkashyapextern TW_INT8	*tw_osl_strcpy(TW_INT8 *dest, TW_INT8 *src);
466144966Svkashyap#endif
467144966Svkashyap
468144966Svkashyap
469144966Svkashyap#ifndef tw_osl_strlen
470144966Svkashyap/* Return length of string pointed at by 'str'. */
471144966Svkashyapextern TW_INT32	tw_osl_strlen(TW_VOID *str);
472144966Svkashyap#endif
473144966Svkashyap
474144966Svkashyap
475144966Svkashyap#ifdef TW_OSL_CAN_SLEEP
476144966Svkashyap#ifndef tw_osl_wakeup
477144966Svkashyap/* Wake up a thread sleeping by a call to tw_osl_sleep. */
478144966Svkashyapextern TW_VOID	tw_osl_wakeup(struct tw_cl_ctlr_handle *ctlr_handle,
479144966Svkashyap	TW_SLEEP_HANDLE *sleep_handle);
480144966Svkashyap#endif
481144966Svkashyap#endif /* TW_OSL_CAN_SLEEP */
482144966Svkashyap
483144966Svkashyap
484144966Svkashyap#ifdef TW_OSL_PCI_CONFIG_ACCESSIBLE
485144966Svkashyap#ifndef tw_osl_write_pci_config
486144966Svkashyap/* Write 'value' of 'size' bytes at 'offset' in the PCI config space. */
487144966Svkashyapextern TW_VOID	tw_osl_write_pci_config(struct tw_cl_ctlr_handle *ctlr_handle,
488144966Svkashyap	TW_INT32 offset, TW_INT32 value, TW_INT32 size);
489144966Svkashyap#endif
490144966Svkashyap#endif /* TW_OSL_PCI_CONFIG_ACCESSIBLE */
491144966Svkashyap
492144966Svkashyap
493144966Svkashyap#ifndef tw_osl_write_reg
494144966Svkashyap/*
495144966Svkashyap * Write 'value' of 'size' (max 4) bytes at 'offset' from base address of
496144966Svkashyap * this controller.
497144966Svkashyap */
498144966Svkashyapextern TW_VOID	tw_osl_write_reg(struct tw_cl_ctlr_handle *ctlr_handle,
499144966Svkashyap	TW_INT32 offset, TW_INT32 value, TW_INT32 size);
500144966Svkashyap#endif
501144966Svkashyap
502144966Svkashyap
503144966Svkashyap
504144966Svkashyap/* Functions in the Common Layer */
505144966Svkashyap
506144966Svkashyap/* Creates and queues AEN's.  Also notifies OS Layer. */
507144966Svkashyapextern TW_VOID tw_cl_create_event(struct tw_cl_ctlr_handle *ctlr_handle,
508144966Svkashyap	TW_UINT8 queue_event, TW_UINT8 event_src, TW_UINT16 event_code,
509144966Svkashyap	TW_UINT8 severity, TW_UINT8 *severity_str, TW_UINT8 *event_desc,
510144966Svkashyap	TW_UINT8 *event_specific_desc, ...);
511144966Svkashyap
512144966Svkashyap/* Indicates whether a ctlr is supported by CL. */
513144966Svkashyapextern TW_INT32	tw_cl_ctlr_supported(TW_INT32 vendor_id, TW_INT32 device_id);
514144966Svkashyap
515144966Svkashyap
516144966Svkashyap/* Deferred interrupt handler. */
517144966Svkashyapextern TW_VOID	tw_cl_deferred_interrupt(struct tw_cl_ctlr_handle *ctlr_handle);
518144966Svkashyap
519144966Svkashyap
520144966Svkashyap/* Submit a firmware cmd packet. */
521144966Svkashyapextern TW_INT32	tw_cl_fw_passthru(struct tw_cl_ctlr_handle *ctlr_handle,
522144966Svkashyap	struct tw_cl_req_packet *req_pkt, struct tw_cl_req_handle *req_handle);
523144966Svkashyap
524144966Svkashyap
525144966Svkashyap/* Find out how much memory CL needs. */
526144966Svkashyapextern TW_INT32	tw_cl_get_mem_requirements(
527144966Svkashyap	struct tw_cl_ctlr_handle *ctlr_handle, TW_UINT32 flags,
528144966Svkashyap	TW_INT32 max_simult_reqs, TW_INT32 max_aens,
529144966Svkashyap	TW_UINT32 *alignment, TW_UINT32 *sg_size_factor,
530144966Svkashyap	TW_UINT32 *non_dma_mem_size, TW_UINT32 *dma_mem_size
531144966Svkashyap#ifdef TW_OSL_FLASH_FIRMWARE
532144966Svkashyap	, TW_UINT32 *flash_dma_mem_size
533144966Svkashyap#endif /* TW_OSL_FLASH_FIRMWARE */
534144966Svkashyap#ifdef TW_OSL_DMA_MEM_ALLOC_PER_REQUEST
535144966Svkashyap	, TW_UINT32 *per_req_dma_mem_size
536144966Svkashyap#endif /* TW_OSL_DMA_MEM_ALLOC_PER_REQUEST */
537144966Svkashyap#ifdef TW_OSL_NON_DMA_MEM_ALLOC_PER_REQUEST
538144966Svkashyap	, TW_UINT32 *per_req_non_dma_mem_size
539144966Svkashyap#endif /* TW_OSL_N0N_DMA_MEM_ALLOC_PER_REQUEST */
540144966Svkashyap	);
541144966Svkashyap
542144966Svkashyap
543144966Svkashyap/* Initialize Common Layer for a given controller. */
544144966Svkashyapextern TW_INT32	tw_cl_init_ctlr(struct tw_cl_ctlr_handle *ctlr_handle,
545144966Svkashyap	TW_UINT32 flags, TW_INT32 max_simult_reqs, TW_INT32 max_aens,
546144966Svkashyap	TW_VOID *non_dma_mem, TW_VOID *dma_mem, TW_UINT64 dma_mem_phys
547144966Svkashyap#ifdef TW_OSL_FLASH_FIRMWARE
548144966Svkashyap	, TW_VOID *flash_dma_mem, TW_UINT64 flash_dma_mem_phys
549144966Svkashyap#endif /* TW_OSL_FLASH_FIRMWARE */
550144966Svkashyap	);
551144966Svkashyap
552144966Svkashyap
553144966Svkashyap/* CL's interrupt handler. */
554144966Svkashyapextern TW_INT32	tw_cl_interrupt(struct tw_cl_ctlr_handle *ctlr_handle);
555144966Svkashyap
556144966Svkashyap
557144966Svkashyap/* CL's ioctl handler. */
558144966Svkashyapextern TW_INT32	tw_cl_ioctl(struct tw_cl_ctlr_handle *ctlr_handle,
559144966Svkashyap	TW_INT32 cmd, TW_VOID *buf);
560144966Svkashyap
561144966Svkashyap
562144966Svkashyap#ifdef TW_OSL_DEBUG
563144966Svkashyap/* Print CL's state/statistics for a controller. */
564144966Svkashyapextern TW_VOID	tw_cl_print_ctlr_stats(struct tw_cl_ctlr_handle *ctlr_handle);
565144966Svkashyap
566144966Svkashyap/* Prints CL internal details of a given request. */
567144966Svkashyapextern TW_VOID	tw_cl_print_req_info(struct tw_cl_req_handle *req_handle);
568144966Svkashyap#endif /* TW_OSL_DEBUG */
569144966Svkashyap
570144966Svkashyap
571144966Svkashyap/* Soft reset controller. */
572144966Svkashyapextern TW_INT32	tw_cl_reset_ctlr(struct tw_cl_ctlr_handle *ctlr_handle);
573144966Svkashyap
574144966Svkashyap
575144966Svkashyap#ifdef TW_OSL_DEBUG
576144966Svkashyap/* Reset CL's statistics for a controller. */
577144966Svkashyapextern TW_VOID	tw_cl_reset_stats(struct tw_cl_ctlr_handle *ctlr_handle);
578144966Svkashyap#endif /* TW_OSL_DEBUG */
579144966Svkashyap
580144966Svkashyap
581144966Svkashyap/* Stop a controller. */
582144966Svkashyapextern TW_INT32	tw_cl_shutdown_ctlr(struct tw_cl_ctlr_handle *ctlr_handle,
583144966Svkashyap	TW_UINT32 flags);
584144966Svkashyap
585144966Svkashyap
586144966Svkashyap/* Submit a SCSI I/O request. */
587144966Svkashyapextern TW_INT32	tw_cl_start_io(struct tw_cl_ctlr_handle *ctlr_handle,
588144966Svkashyap	struct tw_cl_req_packet *req_pkt, struct tw_cl_req_handle *req_handle);
589144966Svkashyap
590144966Svkashyap
591144966Svkashyap#endif /* TW_CL_SHARE_H */
592