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