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