ostiapi.h revision 285809
1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*
21* $FreeBSD$
22*
23********************************************************************************/
24/********************************************************************************
25**
26** Version Control Information:
27**
28**
29*******************************************************************************/
30/********************************************************************************
31**
32**   ostiapi.h
33**
34**   Abstract:   This module contains function prototype of the Transport
35**               Independent (TIAPI) OS Callback interface.
36**
37********************************************************************************/
38
39#ifndef OSTIAPI_H
40
41#define OSTIAPI_H
42
43/*
44 * Definition for return status is defined in tiStatus_t in TIDEFS.H
45 */
46
47/*****************************************************************************
48 *  Initiator/Target Shared Callbacks
49 *****************************************************************************/
50
51osGLOBAL bit32 ostiGetTransportParam(
52                        tiRoot_t    *tiRoot,
53                        char        *key,
54                        char        *subkey1,
55                        char        *subkey2,
56                        char        *subkey3,
57                        char        *subkey4,
58                        char        *subkey5,
59                        char        *valueName,
60                        char        *buffer,
61                        bit32       bufferLen,
62                        bit32       *lenReceived
63                        );
64
65osGLOBAL void  ostiPortEvent(
66                        tiRoot_t      *tiRoot,
67                        tiPortEvent_t eventType,
68                        bit32         status,
69                        void          *pParm
70                        );
71
72osGLOBAL bit32  ostiTimeStamp( tiRoot_t  *tiRoot);
73osGLOBAL bit64  ostiTimeStamp64( tiRoot_t  *tiRoot);
74
75osGLOBAL FORCEINLINE bit32 ostiChipConfigReadBit32(
76                        tiRoot_t      *tiRoot,
77                        bit32         chipConfigOffset
78                        );
79
80osGLOBAL FORCEINLINE void ostiChipConfigWriteBit32(
81                        tiRoot_t      *tiRoot,
82                        bit32         chipConfigOffset,
83                        bit32         chipConfigValue
84                        );
85
86osGLOBAL FORCEINLINE bit32 ostiChipReadBit32(
87                        tiRoot_t      *tiRoot,
88                        bit32         chipOffset
89                        );
90
91osGLOBAL FORCEINLINE void ostiChipWriteBit32(
92                        tiRoot_t      *tiRoot,
93                        bit32         chipOffset,
94                        bit32         chipValue
95                        );
96
97osGLOBAL FORCEINLINE bit8 ostiChipReadBit8(
98                        tiRoot_t      *tiRoot,
99                        bit32         chipOffset
100                        );
101
102osGLOBAL FORCEINLINE void ostiChipWriteBit8(
103                        tiRoot_t      *tiRoot,
104                        bit32         chipOffset,
105                        bit8          chipValue
106                        );
107
108osGLOBAL void ostiFlashReadBlock(
109                        tiRoot_t      *tiRoot,
110                        bit32         flashOffset,
111                        void          *buffer,
112                        bit32         bufferLen
113                        );
114
115osGLOBAL FORCEINLINE
116tiDeviceHandle_t*
117ostiGetDevHandleFromSasAddr(
118  tiRoot_t    *root,
119  unsigned char *sas_addr
120);
121
122osGLOBAL FORCEINLINE void ostidisableEncryption(tiRoot_t *root);
123
124osGLOBAL FORCEINLINE void ostiSingleThreadedEnter(
125                        tiRoot_t      *tiRoot,
126                        bit32         queueId
127                        );
128
129osGLOBAL FORCEINLINE void ostiSingleThreadedLeave(
130                        tiRoot_t      *tiRoot,
131                        bit32         queueId
132                        );
133
134
135osGLOBAL bit32 ostiNumOfLUNIOCTLreq(tiRoot_t           *root,
136									void               *param1,
137                                    void               *param2,
138                                    void                           **tiRequestBody,
139                                    tiIORequest_t          **tiIORequest
140                                    );
141
142#ifdef PERF_COUNT
143osGLOBAL void ostiEnter(tiRoot_t *ptiRoot, bit32 layer, int io);
144osGLOBAL void ostiLeave(tiRoot_t *ptiRoot, bit32 layer, int io);
145#define OSTI_INP_ENTER(root) ostiEnter(root, 2, 0)
146#define OSTI_INP_LEAVE(root) ostiLeave(root, 2, 0)
147#define OSTI_OUT_ENTER(root) ostiEnter(root, 2, 1)
148#define OSTI_OUT_LEAVE(root) ostiLeave(root, 2, 1)
149#else
150#define OSTI_INP_ENTER(root)
151#define OSTI_INP_LEAVE(root)
152#define OSTI_OUT_ENTER(root)
153#define OSTI_OUT_LEAVE(root)
154#endif
155
156osGLOBAL void  ostiStallThread(
157                        tiRoot_t      *tiRoot,
158                        bit32         microseconds
159                        );
160
161osGLOBAL FORCEINLINE bit8
162ostiBitScanForward(
163                  tiRoot_t   *root,
164                  bit32      *Index,
165                  bit32       Mask
166                  );
167
168#ifdef LINUX_VERSION_CODE
169
170osGLOBAL sbit32
171ostiAtomicIncrement(
172                   tiRoot_t        *root,
173                   sbit32 volatile *Addend
174                   );
175
176osGLOBAL sbit32
177ostiAtomicDecrement(
178                   tiRoot_t        *root,
179                   sbit32 volatile *Addend
180                   );
181
182
183osGLOBAL sbit32
184ostiAtomicBitClear(
185                   tiRoot_t          *root,
186                   sbit32 volatile   *Destination,
187                   sbit32             Value
188                   );
189
190osGLOBAL sbit32
191ostiAtomicBitSet(
192                   tiRoot_t          *root,
193                   sbit32 volatile   *Destination,
194                   sbit32             Value
195                   );
196
197osGLOBAL sbit32
198ostiAtomicExchange(
199                   tiRoot_t         *root,
200                   sbit32 volatile  *Target,
201                   sbit32            Value
202                   );
203
204#else
205
206osGLOBAL FORCEINLINE sbit32
207ostiInterlockedIncrement(
208                   tiRoot_t        *root,
209                   sbit32 volatile *Addend
210                   );
211
212osGLOBAL FORCEINLINE sbit32
213ostiInterlockedDecrement(
214                   tiRoot_t         *root,
215                   sbit32 volatile  *Addend
216                   );
217
218
219osGLOBAL FORCEINLINE sbit32
220ostiInterlockedAnd(
221                   tiRoot_t         *root,
222                   sbit32 volatile  *Destination,
223                   sbit32            Value
224                   );
225
226osGLOBAL FORCEINLINE sbit32
227ostiInterlockedOr(
228                   tiRoot_t         *root,
229                   sbit32 volatile  *Destination,
230                   sbit32            Value
231                   );
232
233osGLOBAL FORCEINLINE sbit32
234ostiInterlockedExchange(
235                   tiRoot_t        *root,
236                   sbit32 volatile *Target,
237                   sbit32           Value
238                   );
239#endif /*LINUX_VERSION_CODE*/
240
241osGLOBAL bit32 ostiAllocMemory(
242                        tiRoot_t    *tiRoot,
243                        void        **osMemHandle,
244                        void        ** virtPtr,
245                        bit32       * physAddrUpper,
246                        bit32       * physAddrLower,
247                        bit32       alignment,
248                        bit32       allocLength,
249                        agBOOLEAN   isCacheable
250                        );
251
252osGLOBAL bit32 ostiFreeMemory(
253                        tiRoot_t    *tiRoot,
254                        void        *osDMAHandle,
255                        bit32       allocLength
256                        );
257
258osGLOBAL FORCEINLINE void ostiCacheFlush(
259                        tiRoot_t    *tiRoot,
260                        void        *osMemHandle,
261                        void        *virtPtr,
262                        bit32       length
263                        );
264
265osGLOBAL FORCEINLINE void ostiCacheInvalidate(
266                        tiRoot_t    *tiRoot,
267                        void        *osMemHandle,
268                        void        *virtPtr,
269                        bit32       length
270                        );
271
272osGLOBAL FORCEINLINE void ostiCachePreFlush(
273                        tiRoot_t    *tiRoot,
274                        void        *osMemHandle,
275                        void        *virtPtr,
276                        bit32       length
277                        );
278
279/*
280 *  The following two functions are for SAS/SATA
281 */
282osGLOBAL void
283ostiInterruptEnable(
284                        tiRoot_t  *ptiRoot,
285                        bit32     channelNum
286                        );
287
288osGLOBAL void
289ostiInterruptDisable(
290                       tiRoot_t  *ptiRoot,
291                       bit32     channelNum
292                       );
293
294osGLOBAL FORCEINLINE bit32
295ostiChipReadBit32Ext(
296                        tiRoot_t  *tiRoot,
297                        bit32     busBaseNumber,
298                        bit32     chipOffset
299                        );
300
301osGLOBAL FORCEINLINE void
302ostiChipWriteBit32Ext(
303                        tiRoot_t  *tiRoot,
304                        bit32     busBaseNumber,
305                        bit32     chipOffset,
306                        bit32     chipValue
307                        );
308
309
310/*****************************************************************************
311 *  Initiator specific Callbacks
312 *****************************************************************************/
313
314/*
315 * Initiator specific IO Completion
316 */
317osGLOBAL void ostiInitiatorIOCompleted(
318                        tiRoot_t            *tiRoot,
319                        tiIORequest_t       *tiIORequest,
320                        tiIOStatus_t        status,
321                        bit32               statusDetail,
322                        tiSenseData_t       *senseData,
323                        bit32               context
324                        );
325
326osGLOBAL tiDeviceHandle_t*
327ostiMapToDevHandle(tiRoot_t  *root,
328                          bit8      pathId,
329                          bit8      targetId,
330                          bit8      LUN
331                          );
332osGLOBAL bit32 ostiSendResetDeviceIoctl(tiRoot_t *root,
333			  void *pccb,
334			  bit8 pathId,
335  			  bit8 targetId,
336			  bit8 lun,
337			  unsigned long resetType
338			);
339
340osGLOBAL void
341ostiGetSenseKeyCount(tiRoot_t  *root,
342                            bit32      fIsClear,
343                            void      *SenseKeyCount,
344                            bit32      length
345                            );
346
347osGLOBAL void
348ostiGetSCSIStatusCount(tiRoot_t  *root,
349                            bit32      fIsClear,
350                            void      *ScsiStatusCount,
351                            bit32      length
352                            );
353
354osGLOBAL bit32
355ostiSetDeviceQueueDepth(tiRoot_t       *tiRoot,
356                                tiIORequest_t  *tiIORequest,
357                                bit32           QueueDepth
358                                );
359
360
361#ifdef FAST_IO_TEST
362typedef void (*ostiFastSSPCb_t)(tiRoot_t     *ptiRoot,
363                                 void         *arg,
364                                 tiIOStatus_t IOStatus,
365                                 bit32         statusDetail);
366
367void osti_FastIOCb(tiRoot_t     *ptiRoot,
368                   void         *arg,
369                   tiIOStatus_t IOStatus,
370                   bit32        statusDetail);
371#endif
372
373osGLOBAL void
374ostiInitiatorSMPCompleted(tiRoot_t    *tiRoot,
375               tiIORequest_t  *tiSMPRequest,
376               tiSMPStatus_t  smpStatus,
377               bit32          tiSMPInfoLen,
378               void           *tiFrameHandle,
379               bit32          context);
380/*
381 * Initiator specific event
382 */
383osGLOBAL void ostiInitiatorEvent (
384                        tiRoot_t            *tiRoot,
385                        tiPortalContext_t   *portalContext,
386                        tiDeviceHandle_t    *tiDeviceHandle,
387                        tiIntrEventType_t   eventType,
388                        bit32               eventStatus,
389                        void                *parm
390                        );
391
392
393/*
394 * PMC-Sierra IOCTL semaphoring
395 */
396osGLOBAL void ostiIOCTLClearSignal (
397                        tiRoot_t    *tiRoot,
398                        void        **agParam1,
399                        void        **agParam2,
400                        void        **agParam3
401                        );
402
403osGLOBAL void ostiIOCTLWaitForSignal (
404                        tiRoot_t    *tigRoot,
405                        void        *agParam1,
406                        void        *agParam2,
407                        void        *agParam3
408                        );
409
410osGLOBAL void ostiIOCTLSetSignal (
411                        tiRoot_t    *tiRoot,
412                        void        *agParam1,
413                        void        *agParam2,
414                        void        *agParam3
415                        );
416
417osGLOBAL void ostiIOCTLWaitForComplete (
418                        tiRoot_t    *tigRoot,
419                        void        *agParam1,
420                        void        *agParam2,
421                        void        *agParam3
422                        );
423
424osGLOBAL void ostiIOCTLComplete (
425                        tiRoot_t    *tiRoot,
426                        void        *agParam1,
427                        void        *agParam2,
428                        void        *agParam3
429                        );
430
431/*****************************************************************************
432 *  Target specific Callbacks
433 *****************************************************************************/
434
435osGLOBAL void ostiProcessScsiReq(
436                        tiRoot_t            *tiRoot,
437                        tiTargetScsiCmnd_t  *tiTgtScsiCmnd,
438                        void                *agFrameHandle,
439                        bit32               immDataLength,
440                        tiIORequest_t       *tiIORequest,
441                        tiDeviceHandle_t    *tiDeviceHandle);
442
443osGLOBAL void ostiNextDataPhase(
444                        tiRoot_t          *tiRoot,
445                        tiIORequest_t     *tiIORequest);
446
447osGLOBAL void ostiTaskManagement (
448                        tiRoot_t          *tiRoot,
449                        bit32             task,
450                        bit8              *scsiLun,
451                        tiIORequest_t     *refTiIORequest,
452                        tiIORequest_t     *tiTMRequest,
453                        tiDeviceHandle_t  *tiDeviceHandle);
454
455osGLOBAL void ostiTargetIOCompleted(
456                        tiRoot_t          *tiRoot,
457                        tiIORequest_t     *tiIORequest,
458                        tiIOStatus_t      status
459                        );
460
461osGLOBAL bit32 ostiTargetEvent (
462                        tiRoot_t          *tiRoot,
463                        tiPortalContext_t *portalContext,
464                        tiDeviceHandle_t  *tiDeviceHandle,
465                        tiTgtEventType_t  eventType,
466                        bit32             eventStatus,
467                        void              *parm
468                        );
469
470osGLOBAL void ostiTargetIOError(
471                        tiRoot_t          *tiRoot,
472                        tiIORequest_t     *tiIORequest,
473                        tiIOStatus_t      status,
474                        bit32             statusDetail
475                        );
476
477osGLOBAL void ostiTargetTmCompleted(
478                        tiRoot_t          *tiRoot,
479                        tiIORequest_t     *tiTmRequest,
480                        tiIOStatus_t      status,
481                        bit32             statusDetail
482                        );
483
484osGLOBAL void ostiPCI_TRIGGER( tiRoot_t *tiRoot );
485
486
487#endif  /* OSTIAPI_H */
488