#ifndef __SMTYPES_H__
#define __SMTYPES_H__
#include <dev/pms/freebsd/driver/common/osenv.h>
#include <dev/pms/freebsd/driver/common/ostypes.h>
#include <dev/pms/freebsd/driver/common/osdebug.h>
#include <dev/pms/RefTisa/sallsdk/api/sa.h>
#include <dev/pms/RefTisa/sallsdk/api/saapi.h>
#include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
#include <dev/pms/RefTisa/sat/api/sm.h>
#include <dev/pms/RefTisa/sat/api/smapi.h>
#include <dev/pms/RefTisa/sat/api/tdsmapi.h>
#include <dev/pms/RefTisa/sat/src/smlist.h>
#define SAT_NONNCQ_MAX 1
#define SAT_NCQ_MAX 32
#define SAT_MAX_INT_IO 16
#define SAT_APAPI_CMDQ_MAX 2
#define SMP_DIRECT_PAYLOAD_LIMIT 44
typedef void (*smTimerCBFunc_t)(smRoot_t *smRoot, void *timerData1, void *timerData2, void *timerData3);
typedef struct smTimerRequest_s {
bit32 timeout;
void *timerData1;
void *timerData2;
void *timerData3;
smTimerCBFunc_t timerCBFunc;
smList_t timerLink;
bit32 timerRunning;
} smTimerRequest_t;
typedef struct smSatInternalIo_s
{
smList_t satIntIoLink;
smIORequest_t satIntSmIORequest;
void *satIntRequestBody;
smScsiInitiatorRequest_t satIntSmScsiXchg;
smMem_t satIntDmaMem;
smMem_t satIntReqBodyMem;
bit32 satIntFlag;
smIORequest_t *satOrgSmIORequest;
bit32 id;
} smSatInternalIo_t;
typedef struct smDeviceData_s {
smList_t FreeLink;
smList_t MainLink;
bit32 id;
smRoot_t *smRoot;
agsaDevHandle_t *agDevHandle;
bit32 valid;
smTimerRequest_t SATAIDDeviceTimer;
bit32 SMAbortAll;
smDeviceHandle_t *smDevHandle;
bit32 directlyAttached;
agsaDevHandle_t *agExpDevHandle;
bit32 phyID;
agsaContext_t agDeviceResetContext;
bit32 SMNumOfFCA;
smList_t satIoLinkList;
smList_t satFreeIntIoLinkList;
smList_t satActiveIntIoLinkList;
smSatInternalIo_t satIntIo[SAT_MAX_INT_IO];
agsaSATAIdentifyData_t satIdentifyData;
bit32 satNCQ;
bit32 sat48BitSupport;
bit32 satSMARTSelfTest;
bit32 satSMARTFeatureSet;
bit32 satSMARTEnabled;
bit32 satRemovableMedia;
bit32 satRemovableMediaEnabled;
bit32 satDMASupport;
bit32 satDMAEnabled;
bit32 satUltraDMAMode;
bit32 satDMADIRSupport;
bit32 satReadLookAheadSupport;
bit32 satVolatileWriteCacheSupport;
bit32 satWWNSupport;
bit32 satDMASetupAA;
bit32 satNCQQMgntCmd;
bit32 volatile satPendingIO;
bit32 volatile satPendingNCQIO;
bit32 volatile satPendingNONNCQIO;
bit32 satNCQMaxIO;
bit32 satDriveState;
bit32 satAbortAfterReset;
bit32 satAbortCalled;
bit32 satVerifyState;
bit32 satMaxUserAddrSectors;
bit32 satWriteCacheEnabled;
bit32 satLookAheadEnabled;
bit32 satDeviceFaultState;
bit32 satStopState;
bit32 satFormatState;
bit32 satPMField;
bit8 satSignature[8];
bit32 satDeviceType;
bit32 satSectorDone;
bit32 freeSATAFDMATagBitmap;
bit32 IDDeviceValid;
bit8 satMaxLBA[8];
bit32 satBGPendingDiag;
bit32 NumOfFCA;
bit32 NumOfIDRetries;
smIORequest_t *satTmTaskTag;
void *satSaDeviceData;
bit32 ID_Retries;
bit32 OSAbortAll;
bit32 ReadCapacity;
bit32 sasAddressLo;
bit32 sasAddressHi;
} smDeviceData_t;
typedef struct smAtaPassThroughHdr_s
{
bit8 opc;
bit8 mulCount : 3;
bit8 proto : 4;
bit8 extend : 1;
bit8 offline : 2;
bit8 ckCond : 1;
bit8 tType : 1;
bit8 tDir : 1;
bit8 byteBlock : 1;
bit8 tlength : 2;
}smAtaPassThroughHdr_t;
typedef struct
{
bit8 snsRespCode;
bit8 snsSegment;
bit8 senseKey;
bit8 info[4];
bit8 addSenseLen;
bit8 cmdSpecific[4];
bit8 addSenseCode;
bit8 senseQual;
bit8 fru;
bit8 skeySpecific[3];
} smScsiRspSense_t;
typedef void (*smSatCompleteCbPtr_t )(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
agsaFisHeader_t *agFirstDword,
bit32 agIOInfoLen,
agsaFrameHandle_t agFrameHandle,
void *satIOContext
);
typedef void (*smSMPCompleted_t)(
agsaRoot_t *,
agsaIORequest_t *,
bit32 ,
bit32 ,
agsaFrameHandle_t
);
typedef struct smSatIOContext_s
{
smList_t satIoContextLink;
smDeviceData_t *pSatDevData;
agsaFisRegHostToDevice_t *pFis;
smIniScsiCmnd_t *pScsiCmnd;
smScsiRspSense_t *pSense;
smSenseData_t *pSmSenseData;
void *smRequestBody;
void *smScsiXchg;
bit32 reqType;
bit32 interruptContext;
smSatCompleteCbPtr_t satCompleteCB;
smSatInternalIo_t *satIntIoContext;
smDeviceHandle_t *psmDeviceHandle;
bit8 sataTag;
bit8 superIOFlag;
bit8 reserved1;
bit8 reserved2;
bit32 currentLBA;
bit32 ATACmd;
bit32 OrgTL;
bit32 LoopNum;
bit32 LoopNum2;
bit8 LBA[8];
bit32 ParmIndex;
bit32 ParmLen;
bit32 NotifyOS;
bit32 TMF;
struct smSatIOContext_s *satToBeAbortedIOContext;
struct smSatIOContext_s *satOrgIOContext;
bit32 UpperAddr;
bit32 LowerAddr;
bit32 SplitIdx;
bit32 AdjustBytes;
bit32 EsglLen;
bit8 ck_cond;
bit8 extend;
bit8 sectorCnt07;
bit8 LBAHigh07;
bit8 LBAMid07;
bit8 LBALow07;
bit8 Sector_Cnt_Upper_Nonzero;
bit8 LBA_Upper_Nonzero;
bit32 pid;
bit32 id;
} smSatIOContext_t;
typedef struct smIORequestBody_s {
smList_t satIoBodyLink;
smDeviceHandle_t *smDevHandle;
smIORequest_t *smIORequest;
agsaIORequest_t agIORequest;
smIORequest_t *smIOToBeAbortedRequest;
bit32 id;
bit32 InUse;
union {
struct {
agsaSATAInitiatorRequest_t agSATARequestBody;
smScsiRspSense_t sensePayload;
smSenseData_t smSenseData;
smSatIOContext_t satIOContext;
} SATA;
} transport;
bit32 ioStarted;
bit32 ioCompleted;
bit32 reTries;
union {
struct {
bit32 expDataLength;
smSgl_t smSgl1;
smSgl_t smSgl2;
void *sglVirtualAddr;
} InitiatorRegIO;
struct {
void *osMemHandle;
smIORequest_t *CurrentTaskTag;
smIORequest_t *TaskTag;
} InitiatorTMIO;
} IOType;
} smIORequestBody_t;
typedef struct smSMPRequestBody_s {
smSMPCompleted_t SMPCompletionFunc;
smDeviceHandle_t *smDevHandle;
agsaIORequest_t agIORequest;
agsaSASRequestBody_t agSASRequestBody;
void *osMemHandle;
smDeviceData_t *smDeviceData;
smIORequest_t *CurrentTaskTag;
bit8 smpPayload[SMP_DIRECT_PAYLOAD_LIMIT];
bit32 retries;
} smSMPRequestBody_t;
typedef struct smRootOsData_s {
smRoot_t *smRoot;
void *smAllShared;
void *smIni;
} smRootOsData_t;
typedef struct smIntContext_s {
struct smRootOsData_s smRootOsData;
bit32 usecsPerTick;
agsaRoot_t *agRoot;
smSwConfig_t SwConfig;
smList_t timerlist;
smDeviceData_t *DeviceMem;
smList_t FreeDeviceList;
smList_t MainDeviceList;
smIORequestBody_t *IOMem;
smList_t freeIOList;
smList_t mainIOList;
bit32 FCA;
} smIntContext_t;
typedef struct smIntRoot_s
{
smIntContext_t smAllShared;
} smIntRoot_t;
#endif