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