/******************************************************************************* *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. * *Redistribution and use in source and binary forms, with or without modification, are permitted provided *that the following conditions are met: *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the *following disclaimer. *2. Redistributions in binary form must reproduce the above copyright notice, *this list of conditions and the following disclaimer in the documentation and/or other materials provided *with the distribution. * *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * * ********************************************************************************/ /******************************************************************************** ** ** Version Control Information: ** ** *******************************************************************************/ /******************************************************************************** ** ** ostiapi.h ** ** Abstract: This module contains function prototype of the Transport ** Independent (TIAPI) OS Callback interface. ** ********************************************************************************/ #ifndef OSTIAPI_H #define OSTIAPI_H /* * Definition for return status is defined in tiStatus_t in TIDEFS.H */ /***************************************************************************** * Initiator/Target Shared Callbacks *****************************************************************************/ osGLOBAL bit32 ostiGetTransportParam( tiRoot_t *tiRoot, char *key, char *subkey1, char *subkey2, char *subkey3, char *subkey4, char *subkey5, char *valueName, char *buffer, bit32 bufferLen, bit32 *lenReceived ); osGLOBAL void ostiPortEvent( tiRoot_t *tiRoot, tiPortEvent_t eventType, bit32 status, void *pParm ); osGLOBAL bit32 ostiTimeStamp( tiRoot_t *tiRoot); osGLOBAL bit64 ostiTimeStamp64( tiRoot_t *tiRoot); osGLOBAL FORCEINLINE bit32 ostiChipConfigReadBit32( tiRoot_t *tiRoot, bit32 chipConfigOffset ); osGLOBAL FORCEINLINE void ostiChipConfigWriteBit32( tiRoot_t *tiRoot, bit32 chipConfigOffset, bit32 chipConfigValue ); osGLOBAL FORCEINLINE bit32 ostiChipReadBit32( tiRoot_t *tiRoot, bit32 chipOffset ); osGLOBAL FORCEINLINE void ostiChipWriteBit32( tiRoot_t *tiRoot, bit32 chipOffset, bit32 chipValue ); osGLOBAL FORCEINLINE bit8 ostiChipReadBit8( tiRoot_t *tiRoot, bit32 chipOffset ); osGLOBAL FORCEINLINE void ostiChipWriteBit8( tiRoot_t *tiRoot, bit32 chipOffset, bit8 chipValue ); osGLOBAL void ostiFlashReadBlock( tiRoot_t *tiRoot, bit32 flashOffset, void *buffer, bit32 bufferLen ); osGLOBAL FORCEINLINE tiDeviceHandle_t* ostiGetDevHandleFromSasAddr( tiRoot_t *root, unsigned char *sas_addr ); osGLOBAL FORCEINLINE void ostidisableEncryption(tiRoot_t *root); osGLOBAL FORCEINLINE void ostiSingleThreadedEnter( tiRoot_t *tiRoot, bit32 queueId ); osGLOBAL FORCEINLINE void ostiSingleThreadedLeave( tiRoot_t *tiRoot, bit32 queueId ); osGLOBAL bit32 ostiNumOfLUNIOCTLreq(tiRoot_t *root, void *param1, void *param2, void **tiRequestBody, tiIORequest_t **tiIORequest ); #ifdef PERF_COUNT osGLOBAL void ostiEnter(tiRoot_t *ptiRoot, bit32 layer, int io); osGLOBAL void ostiLeave(tiRoot_t *ptiRoot, bit32 layer, int io); #define OSTI_INP_ENTER(root) ostiEnter(root, 2, 0) #define OSTI_INP_LEAVE(root) ostiLeave(root, 2, 0) #define OSTI_OUT_ENTER(root) ostiEnter(root, 2, 1) #define OSTI_OUT_LEAVE(root) ostiLeave(root, 2, 1) #else #define OSTI_INP_ENTER(root) #define OSTI_INP_LEAVE(root) #define OSTI_OUT_ENTER(root) #define OSTI_OUT_LEAVE(root) #endif osGLOBAL void ostiStallThread( tiRoot_t *tiRoot, bit32 microseconds ); osGLOBAL FORCEINLINE bit8 ostiBitScanForward( tiRoot_t *root, bit32 *Index, bit32 Mask ); #ifdef LINUX_VERSION_CODE osGLOBAL sbit32 ostiAtomicIncrement( tiRoot_t *root, sbit32 volatile *Addend ); osGLOBAL sbit32 ostiAtomicDecrement( tiRoot_t *root, sbit32 volatile *Addend ); osGLOBAL sbit32 ostiAtomicBitClear( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ); osGLOBAL sbit32 ostiAtomicBitSet( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ); osGLOBAL sbit32 ostiAtomicExchange( tiRoot_t *root, sbit32 volatile *Target, sbit32 Value ); #else osGLOBAL FORCEINLINE sbit32 ostiInterlockedIncrement( tiRoot_t *root, sbit32 volatile *Addend ); osGLOBAL FORCEINLINE sbit32 ostiInterlockedDecrement( tiRoot_t *root, sbit32 volatile *Addend ); osGLOBAL FORCEINLINE sbit32 ostiInterlockedAnd( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ); osGLOBAL FORCEINLINE sbit32 ostiInterlockedOr( tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value ); osGLOBAL FORCEINLINE sbit32 ostiInterlockedExchange( tiRoot_t *root, sbit32 volatile *Target, sbit32 Value ); #endif /*LINUX_VERSION_CODE*/ osGLOBAL bit32 ostiAllocMemory( tiRoot_t *tiRoot, void **osMemHandle, void ** virtPtr, bit32 * physAddrUpper, bit32 * physAddrLower, bit32 alignment, bit32 allocLength, agBOOLEAN isCacheable ); osGLOBAL bit32 ostiFreeMemory( tiRoot_t *tiRoot, void *osDMAHandle, bit32 allocLength ); osGLOBAL FORCEINLINE void ostiCacheFlush( tiRoot_t *tiRoot, void *osMemHandle, void *virtPtr, bit32 length ); osGLOBAL FORCEINLINE void ostiCacheInvalidate( tiRoot_t *tiRoot, void *osMemHandle, void *virtPtr, bit32 length ); osGLOBAL FORCEINLINE void ostiCachePreFlush( tiRoot_t *tiRoot, void *osMemHandle, void *virtPtr, bit32 length ); /* * The following two functions are for SAS/SATA */ osGLOBAL void ostiInterruptEnable( tiRoot_t *ptiRoot, bit32 channelNum ); osGLOBAL void ostiInterruptDisable( tiRoot_t *ptiRoot, bit32 channelNum ); osGLOBAL FORCEINLINE bit32 ostiChipReadBit32Ext( tiRoot_t *tiRoot, bit32 busBaseNumber, bit32 chipOffset ); osGLOBAL FORCEINLINE void ostiChipWriteBit32Ext( tiRoot_t *tiRoot, bit32 busBaseNumber, bit32 chipOffset, bit32 chipValue ); /***************************************************************************** * Initiator specific Callbacks *****************************************************************************/ /* * Initiator specific IO Completion */ osGLOBAL void ostiInitiatorIOCompleted( tiRoot_t *tiRoot, tiIORequest_t *tiIORequest, tiIOStatus_t status, bit32 statusDetail, tiSenseData_t *senseData, bit32 context ); osGLOBAL tiDeviceHandle_t* ostiMapToDevHandle(tiRoot_t *root, bit8 pathId, bit8 targetId, bit8 LUN ); osGLOBAL bit32 ostiSendResetDeviceIoctl(tiRoot_t *root, void *pccb, bit8 pathId, bit8 targetId, bit8 lun, unsigned long resetType ); osGLOBAL void ostiGetSenseKeyCount(tiRoot_t *root, bit32 fIsClear, void *SenseKeyCount, bit32 length ); osGLOBAL void ostiGetSCSIStatusCount(tiRoot_t *root, bit32 fIsClear, void *ScsiStatusCount, bit32 length ); osGLOBAL bit32 ostiSetDeviceQueueDepth(tiRoot_t *tiRoot, tiIORequest_t *tiIORequest, bit32 QueueDepth ); #ifdef FAST_IO_TEST typedef void (*ostiFastSSPCb_t)(tiRoot_t *ptiRoot, void *arg, tiIOStatus_t IOStatus, bit32 statusDetail); void osti_FastIOCb(tiRoot_t *ptiRoot, void *arg, tiIOStatus_t IOStatus, bit32 statusDetail); #endif osGLOBAL void ostiInitiatorSMPCompleted(tiRoot_t *tiRoot, tiIORequest_t *tiSMPRequest, tiSMPStatus_t smpStatus, bit32 tiSMPInfoLen, void *tiFrameHandle, bit32 context); /* * Initiator specific event */ osGLOBAL void ostiInitiatorEvent ( tiRoot_t *tiRoot, tiPortalContext_t *portalContext, tiDeviceHandle_t *tiDeviceHandle, tiIntrEventType_t eventType, bit32 eventStatus, void *parm ); /* * PMC-Sierra IOCTL semaphoring */ osGLOBAL void ostiIOCTLClearSignal ( tiRoot_t *tiRoot, void **agParam1, void **agParam2, void **agParam3 ); osGLOBAL void ostiIOCTLWaitForSignal ( tiRoot_t *tigRoot, void *agParam1, void *agParam2, void *agParam3 ); osGLOBAL void ostiIOCTLSetSignal ( tiRoot_t *tiRoot, void *agParam1, void *agParam2, void *agParam3 ); osGLOBAL void ostiIOCTLWaitForComplete ( tiRoot_t *tigRoot, void *agParam1, void *agParam2, void *agParam3 ); osGLOBAL void ostiIOCTLComplete ( tiRoot_t *tiRoot, void *agParam1, void *agParam2, void *agParam3 ); /***************************************************************************** * Target specific Callbacks *****************************************************************************/ osGLOBAL void ostiProcessScsiReq( tiRoot_t *tiRoot, tiTargetScsiCmnd_t *tiTgtScsiCmnd, void *agFrameHandle, bit32 immDataLength, tiIORequest_t *tiIORequest, tiDeviceHandle_t *tiDeviceHandle); osGLOBAL void ostiNextDataPhase( tiRoot_t *tiRoot, tiIORequest_t *tiIORequest); osGLOBAL void ostiTaskManagement ( tiRoot_t *tiRoot, bit32 task, bit8 *scsiLun, tiIORequest_t *refTiIORequest, tiIORequest_t *tiTMRequest, tiDeviceHandle_t *tiDeviceHandle); osGLOBAL void ostiTargetIOCompleted( tiRoot_t *tiRoot, tiIORequest_t *tiIORequest, tiIOStatus_t status ); osGLOBAL bit32 ostiTargetEvent ( tiRoot_t *tiRoot, tiPortalContext_t *portalContext, tiDeviceHandle_t *tiDeviceHandle, tiTgtEventType_t eventType, bit32 eventStatus, void *parm ); osGLOBAL void ostiTargetIOError( tiRoot_t *tiRoot, tiIORequest_t *tiIORequest, tiIOStatus_t status, bit32 statusDetail ); osGLOBAL void ostiTargetTmCompleted( tiRoot_t *tiRoot, tiIORequest_t *tiTmRequest, tiIOStatus_t status, bit32 statusDetail ); osGLOBAL void ostiPCI_TRIGGER( tiRoot_t *tiRoot ); #endif /* OSTIAPI_H */