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*   tiapi.h
26*
27*   Abstract:   This module contains function prototype of the Transport
28*               Independent API (TIAPI) Layer for both initiator and target.
29** Version Control Information:
30**
31**
32*******************************************************************************/
33
34
35#ifndef TIAPI_H
36#define TIAPI_H
37
38#include <dev/pms/RefTisa/tisa/api/tiglobal.h>
39#include <dev/pms/RefTisa/tisa/api/titypes.h>
40
41/*****************************************************************************
42 *  INITIATOR/TARGET SHARED APIs
43 *****************************************************************************/
44
45osGLOBAL void tiCOMGetResource (
46                        tiRoot_t                *tiRoot,
47                        tiLoLevelResource_t     *loResource,
48                        tiInitiatorResource_t   *initiatorResource,
49                        tiTargetResource_t      *targetResource,
50                        tiTdSharedMem_t         *tdSharedMem
51                        );
52
53osGLOBAL bit32 tiCOMInit(
54                        tiRoot_t                *tiRoot,
55                        tiLoLevelResource_t     *loResource,
56                        tiInitiatorResource_t   *initiatorResource,
57                        tiTargetResource_t      *targetResource,
58                        tiTdSharedMem_t         *tdSharedMem
59                        );
60
61osGLOBAL bit32 tiCOMPortInit(
62                        tiRoot_t   *tiRoot,
63                        bit32       sysIntsActive
64                        );
65
66osGLOBAL bit32 tiCOMPortStart(
67                        tiRoot_t          *tiRoot,
68                        bit32             portID,
69                        tiPortalContext_t *portalContext,
70                        bit32             option
71                        );
72
73osGLOBAL void tiCOMShutDown( tiRoot_t    *tiRoot);
74
75osGLOBAL bit32 tiCOMPortStop(
76                        tiRoot_t          *tiRoot,
77                        tiPortalContext_t *portalContext
78                        );
79
80osGLOBAL void tiCOMReset (
81                        tiRoot_t    *tiRoot,
82                        bit32       option
83                        );
84
85osGLOBAL bit32
86tdsaGetNumOfLUNIOCTL(
87               tiRoot_t            *tiRoot,
88               tiIOCTLPayload_t    *agIOCTLPayload,
89               void                *agParam1,
90               void                *agParam2,
91               void                *agParam3
92               );
93
94osGLOBAL void ostiNumOfLUNIOCTLRsp(
95                        tiRoot_t            *tiRoot,
96                        bit32               status
97                        );
98osGLOBAL bit32
99tiNumOfLunIOCTLreq(
100             tiRoot_t                       *tiRoot,
101             tiIORequest_t                  *tiIORequest,
102             tiDeviceHandle_t               *tiDeviceHandle,
103             void                           *tiRequestBody,
104             tiIOCTLPayload_t               *agIOCTLPayload,
105             void                           *agParam1,
106             void                           *agParam2
107             );
108
109
110osGLOBAL FORCEINLINE bit32 tiCOMInterruptHandler(
111                        tiRoot_t    *tiRoot,
112                        bit32       channelNum
113                        );
114
115osGLOBAL FORCEINLINE bit32 tiCOMDelayedInterruptHandler (
116                        tiRoot_t    *tiRoot,
117                        bit32       channelNum,
118                        bit32       count,
119                        bit32       context
120                        );
121
122osGLOBAL bit32  tiCOMLegacyInterruptHandler(
123                        tiRoot_t    *tiRoot,
124                        bit32       channelNum
125                        );
126
127
128osGLOBAL void tiCOMLegacyDelayedInterruptHandler(
129                        tiRoot_t    *tiRoot,
130                        bit32       channelNum,
131                        bit32       count,
132                        bit32       context
133                        );
134osGLOBAL void tiCOMTimerTick( tiRoot_t  *tiRoot );
135
136osGLOBAL void tiCOMSystemInterruptsActive (
137                        tiRoot_t    *tiRoot ,
138                        bit32       sysIntsActive
139                        );
140
141
142osGLOBAL FORCEINLINE void
143tiCOMInterruptEnable(
144                      tiRoot_t * tiRoot,
145                      bit32      channelNum);
146
147osGLOBAL void tiCOMFrameReadBlock(
148                        tiRoot_t          *tiRoot,
149                        void              *agFrame,
150                        bit32             FrameOffset,
151                        void              *FrameBuffer,
152                        bit32             FrameBufLen );
153osGLOBAL bit32 tiCOMEncryptGetInfo(
154                        tiRoot_t            *tiRoot);
155
156osGLOBAL bit32 tiCOMEncryptSetMode(
157                        tiRoot_t            *tiRoot,
158                        bit32               securityCipherMode
159                        );
160
161osGLOBAL bit32  tiCOMSetControllerConfig (
162                    tiRoot_t   *tiRoot,
163                    bit32       modePage,
164                    bit32       length,
165                    void        *buffer,
166                    void        *context
167                    );
168
169osGLOBAL bit32 tiCOMGetControllerConfig(
170                    tiRoot_t    *tiRoot,
171                    bit32       modePage,
172                    bit32       flag,
173                    void        *context
174                    );
175
176
177osGLOBAL bit32 tiCOMEncryptDekAdd(
178                        tiRoot_t            *tiRoot,
179                        bit32               kekIndex,
180                        bit32               dekTableSelect,
181                        bit32               dekAddrHi,
182                        bit32               dekAddrLo,
183                        bit32               dekIndex,
184                        bit32               dekNumberOfEntries,
185                        bit32               dekBlobFormat,
186                        bit32               dekTableKeyEntrySize
187                        );
188
189osGLOBAL bit32 tiCOMEncryptDekInvalidate(
190                        tiRoot_t            *tiRoot,
191                        bit32               dekTable,
192                        bit32               dekIndex
193                        );
194
195
196osGLOBAL bit32 tiCOMEncryptKekAdd(
197                        tiRoot_t            *tiRoot,
198                        bit32               kekIndex,
199                        bit32               wrapperKekIndex,
200                        bit32               blobFormat,
201                        tiEncryptKekBlob_t  *encryptKekBlob
202                        );
203
204osGLOBAL tiDeviceHandle_t *
205tiINIGetExpDeviceHandleBySasAddress(
206                      tiRoot_t          * tiRoot,
207                      tiPortalContext_t * tiPortalContext,
208					  bit32 sas_addr_hi,
209					  bit32 sas_addr_lo,
210					  bit32               maxDevs
211                      );
212
213
214#ifdef HIALEAH_ENCRYPTION
215osGLOBAL bit32 tiCOMEncryptHilSet(tiRoot_t  *tiRoot );
216#endif /* HIALEAH_ENCRYPTION */
217
218osGLOBAL bit32 tiCOMEncryptKekStore(
219                        tiRoot_t            *tiRoot,
220                        bit32               kekIndex
221                        );
222
223osGLOBAL bit32 tiCOMEncryptKekLoad(
224                        tiRoot_t            *tiRoot,
225                        bit32               kekIndex
226                        );
227
228osGLOBAL bit32 tiCOMEncryptSelfTest(
229                        tiRoot_t  *tiRoot,
230                        bit32     type,
231                        bit32     length,
232                        void      *TestDescriptor
233                        );
234
235osGLOBAL bit32 tiCOMSetOperator(
236                        tiRoot_t      *tiRoot,
237                        bit32          flag,
238                        void           *cert
239                        );
240
241osGLOBAL bit32 tiCOMGetOperator(
242                           tiRoot_t   *tiRoot,
243                           bit32       option,
244                           bit32       AddrHi,
245                           bit32       AddrLo
246                           );
247
248osGLOBAL bit32 tiCOMOperatorManagement(
249                        tiRoot_t            *tiRoot,
250                        bit32                flag,
251                        bit8                 role,
252                        tiID_t              *idString,
253                        tiEncryptKekBlob_t  *kekBlob
254                        );
255
256/*
257 * PMC-Sierra Management IOCTL module
258 */
259osGLOBAL bit32 tiCOMMgntIOCTL(
260                        tiRoot_t            *tiRoot,
261                        tiIOCTLPayload_t    *agIOCTLPayload,
262                        void                *agParam1,
263                        void                *agParam2,
264                        void                *agParam3
265                        );
266
267osGLOBAL void ostiCOMMgntIOCTLRsp(
268                        tiRoot_t            *tiRoot,
269                        bit32               status
270                        );
271
272osGLOBAL void ostiRegDumpIOCTLRsp(
273                        tiRoot_t            *tiRoot,
274                        bit32               status
275                        );
276
277osGLOBAL void ostiSetNVMDIOCTLRsp(
278                        tiRoot_t            *tiRoot,
279                        bit32               status
280                        );
281
282osGLOBAL void ostiGetPhyProfileIOCTLRsp(
283                        tiRoot_t            *tiRoot,
284                        bit32               status
285                        );
286
287osGLOBAL void ostiGetNVMDIOCTLRsp(
288                        tiRoot_t            *tiRoot,
289                        bit32               status
290                        );
291osGLOBAL bit32 tiCOMGetPortInfo(
292                        tiRoot_t            *tiRoot,
293                        tiPortalContext_t   *portalContext,
294                        tiPortInfo_t        *tiPortInfo
295                        );
296
297osGLOBAL void ostiSendSMPIOCTLRsp(
298                        tiRoot_t            *tiRoot,
299                        bit32               status
300                        );
301
302osGLOBAL void ostiGenEventIOCTLRsp(
303                        tiRoot_t            *tiRoot,
304                        bit32               status
305                        );
306
307osGLOBAL void
308ostiGetDeviceInfoIOCTLRsp(
309                        tiRoot_t    *tiRoot,
310                        bit32        status,
311                        void        *param
312                        );
313
314osGLOBAL void
315ostiGetIoErrorStatsIOCTLRsp(
316                        tiRoot_t    *tiRoot,
317                        bit32        status,
318                        void        *param
319                        );
320
321osGLOBAL void
322ostiGetIoEventStatsIOCTLRsp(
323                        tiRoot_t    *tiRoot,
324                        bit32        status,
325                        void        *param
326                        );
327
328osGLOBAL void
329ostiGetForensicDataIOCTLRsp(
330                        tiRoot_t    *tiRoot,
331                        bit32        status,
332                        void        *param
333                        );
334
335
336#ifdef SPC_ENABLE_PROFILE
337osGLOBAL void ostiFWProfileIOCTLRsp(
338                        tiRoot_t            *tiRoot,
339                        bit32               status,
340    bit32               len
341                        );
342#endif
343
344/*****************************************************************************
345 *  INITIATOR SPECIFIC APIs
346 *****************************************************************************/
347
348/*
349 * Session management module.
350 */
351osGLOBAL bit32 tiINIGetExpander(
352                  tiRoot_t          * tiRoot,
353                  tiPortalContext_t * tiPortalContext,
354                  tiDeviceHandle_t  * tiDev,
355                  tiDeviceHandle_t  ** tiExp
356                 );
357osGLOBAL bit32 tiINIGetDeviceHandles(
358                        tiRoot_t            *tiRoot,
359                        tiPortalContext_t   *portalContext,
360                        tiDeviceHandle_t    *agDev[],
361                        bit32               maxDevs
362                        );
363
364osGLOBAL bit32 tiINIGetDeviceHandlesForWinIOCTL(
365                        tiRoot_t            *tiRoot,
366                        tiPortalContext_t   *portalContext,
367                        tiDeviceHandle_t    *agDev[],
368                        bit32               maxDevs
369                        );
370
371osGLOBAL void tiIniGetDirectSataSasAddr(tiRoot_t * tiRoot, bit32 phyId, bit8 **sasAddressHi, bit8 **sasAddressLo);
372osGLOBAL bit32 tiINIDiscoverTargets(
373                        tiRoot_t            *tiRoot,
374                        tiPortalContext_t   *portalContext,
375                        bit32               option
376                        );
377
378osGLOBAL bit32 tiINILogin(
379                        tiRoot_t            *tiRoot,
380                        tiDeviceHandle_t    *tiDeviceHandle
381                        );
382
383osGLOBAL bit32 tiINILogout(
384                        tiRoot_t            *tiRoot,
385                        tiDeviceHandle_t    *tiDeviceHandle
386                        );
387
388osGLOBAL bit32 tiINIGetDeviceInfo(
389                        tiRoot_t            *tiRoot,
390                        tiDeviceHandle_t    *tiDeviceHandle,
391                        tiDeviceInfo_t      *tiDeviceInfo);
392
393/*
394 * Transport recovery module.
395 */
396osGLOBAL void tiINITransportRecovery(
397                        tiRoot_t            *tiRoot,
398                        tiDeviceHandle_t    *tiDeviceHandle
399                        );
400
401osGLOBAL bit32 tiINITaskManagement (
402                        tiRoot_t          *tiRoot,
403                        tiDeviceHandle_t  *tiDeviceHandle,
404                        bit32             task,
405                        tiLUN_t           *lun,
406                        tiIORequest_t     *taskTag,
407                        tiIORequest_t     *currentTaskTag
408                        );
409osGLOBAL bit32 tiINISMPStart(
410            tiRoot_t                  *tiRoot,
411            tiIORequest_t             *tiIORequest,
412            tiDeviceHandle_t          *tiDeviceHandle,
413            tiSMPFrame_t              *tiScsiRequest,
414            void                      *tiSMPBody,
415            bit32                     interruptContext
416            );
417/*
418 * I/O module.
419 */
420osGLOBAL bit32 tiINIIOStart(
421                        tiRoot_t                    *tiRoot,
422                        tiIORequest_t               *tiIORequest,
423                        tiDeviceHandle_t            *tiDeviceHandle,
424                        tiScsiInitiatorRequest_t   *tiScsiRequest,
425                        void                        *tiRequestBody,
426                        bit32                       interruptContext
427                        );
428
429osGLOBAL void tiINIDebugDumpIO(
430                        tiRoot_t                  *tiRoot,
431                        tiIORequest_t             *tiIORequest
432                        );
433
434osGLOBAL bit32 tiINIIOStartDif(
435                        tiRoot_t                    *tiRoot,
436                        tiIORequest_t               *tiIORequest,
437                        tiDeviceHandle_t            *tiDeviceHandle,
438                        tiScsiInitiatorRequest_t   *tiScsiRequest,
439                        void                        *tiRequestBody,
440                        bit32                       interruptContext,
441                        tiDif_t                     *difOption
442                        );
443osGLOBAL bit32 tiINISuperIOStart (
444        tiRoot_t                      *tiRoot,
445        tiIORequest_t                 *tiIORequest,
446        tiDeviceHandle_t              *tiDeviceHandle,
447        tiSuperScsiInitiatorRequest_t *tiScsiRequest,
448        void                          *tiRequestBody,
449        bit32                         interruptContext
450        );
451
452#ifdef FAST_IO_TEST
453osGLOBAL void *tiINIFastIOPrepare(
454             tiRoot_t                 *tiRoot,
455             void                     *ioHandle,
456             agsaFastCommand_t        *fc);
457
458osGLOBAL void*
459tiINIFastIOPrepare2(
460            tiRoot_t          *tiRoot,
461            void              *ioHandle,
462            agsaFastCommand_t *fc,
463            void                 *pMessage,
464            void  *pRequest);
465
466osGLOBAL bit32 tiINIFastIOSend(void *ioHandle);
467osGLOBAL bit32 tiINIFastIOCancel(void *ioHandle);
468#endif
469
470osGLOBAL bit32 tiCOMEncryptGetMode(tiRoot_t            *tiRoot);
471osGLOBAL bit32 tiCOMEncryptSetOn_Off(tiRoot_t          *tiRoot, bit32 On);
472
473osGLOBAL bit32 tiInitDevEncrypt(
474        tiRoot_t                      *tiRoot,
475        void                          *tideviceptr );
476
477osGLOBAL bit32 tiTGTSuperIOStart (
478                              tiRoot_t         *tiRoot,
479                              tiIORequest_t    *tiIORequest,
480                              tiSuperScsiTargetRequest_t *tiScsiRequest
481                              );
482
483osGLOBAL void tiINITimerTick(
484                        tiRoot_t            *tiRoot
485                        );
486
487
488osGLOBAL bit32 tiINIIOAbort(
489                        tiRoot_t            *tiRoot,
490                        tiIORequest_t       *taskTag
491                        );
492
493osGLOBAL bit32 tiINIIOAbortAll(
494                        tiRoot_t            *tiRoot,
495                        tiDeviceHandle_t    *tiDeviceHandle
496                        );
497/*
498 * Event Logging module
499 */
500osGLOBAL bit32 tiINIReportErrorToEventLog(
501                        tiRoot_t            *tiRoot,
502                        tiEVTData_t         *agEventData
503                        );
504
505
506/*****************************************************************************
507 *  TARGET SPECIFIC APIs
508 *****************************************************************************/
509
510osGLOBAL void tiTGTTimerTick(
511                        tiRoot_t  *tiRoot
512                        );
513
514osGLOBAL void *tiTGTSenseBufferGet(
515                        tiRoot_t        *tiRoot,
516                        tiIORequest_t   *tiIORequest,
517                        bit32           length
518                        );
519
520osGLOBAL void tiTGTSetResp(
521                        tiRoot_t        *tiRoot,
522                        tiIORequest_t   *tiIORequest,
523                        bit32           dataSentLength,
524                        bit8            ScsiStatus,
525                        bit32           senseLength
526                        );
527
528osGLOBAL bit32 tiTGTIOStart (
529                        tiRoot_t        *tiRoot,
530                        tiIORequest_t   *tiIORequest,
531                        bit32           dataOffset,
532                        bit32           dataLength,
533                        tiSgl_t         *dataSGL,
534                        void            *sglVirtualAddr
535                        );
536
537osGLOBAL bit32 tiTGTIOStartMirror (
538                        tiRoot_t        *tiRoot,
539                        tiIORequest_t   *tiIORequest,
540                        bit32           dataOffset,
541                        bit32           dataLength,
542                        tiSgl_t         *dataSGL,
543                        void            *sglVirtualAddr,
544                        tiSgl_t         *dataSGLMirror,
545                        void            *sglVirtualAddrMirror
546                        );
547
548osGLOBAL bit32 tiTGTIOStartDif (
549                        tiRoot_t        *tiRoot,
550                        tiIORequest_t   *tiIORequest,
551                        bit32           dataOffset,
552                        bit32           dataLength,
553                        tiSgl_t         *dataSGL,
554                        void            *sglVirtualAddr,
555                        tiDif_t         *difOption
556                        );
557
558
559osGLOBAL bit32 tiTGTGetDeviceHandles(
560                        tiRoot_t          *tiRoot,
561                        tiPortalContext_t *portalContext,
562                        tiDeviceHandle_t  *agDev[],
563                        bit32             maxDevs
564                        );
565
566osGLOBAL bit32 tiTGTGetDeviceInfo(
567                        tiRoot_t            *tiRoot,
568                        tiDeviceHandle_t    *tiDeviceHandle,
569                        tiDeviceInfo_t      *tiDeviceInfo);
570
571osGLOBAL bit32 tiTGTIOAbort(
572                        tiRoot_t            *tiRoot,
573                        tiIORequest_t       *taskTag
574                        );
575
576osGLOBAL bit32 tiTGTSendTmResp (
577                        tiRoot_t          *tiRoot,
578                        tiIORequest_t     *tiTMRequest,
579                        bit32             status
580                        );
581
582void tiPCI_TRIGGER( tiRoot_t        *tiRoot);
583
584void tiComCountActiveIORequests( tiRoot_t        *tiRoot);
585
586#endif  /* TIAPI_H */
587