#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/freebsd/driver/ini/src/agdef.h>
#include <dev/pms/freebsd/driver/common/lxcommon.h>
#ifdef AGTIAPI_ISCSI
#include "cmtypes.h"
#include "bktypes.h"
#endif
#ifdef FDS_DM
#include <dev/pms/RefTisa/discovery/api/dm.h>
#endif
#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
#include <dev/pms/RefTisa/tisa/api/titypes.h>
#include <vm/uma.h>
typedef u_int32_t atomic_t;
#define atomic_set(p,v) (*(p) = (v))
#define atomic_read(p) (*(p))
#define atomic_inc(p) atomic_add_int(p,1)
#define atomic_dec(p) atomic_subtract_int(p,1)
#define atomic_add(n,p) atomic_add_int(p,n)
#define atomic_sub(n,p) atomic_subtract_int(p,n)
#define AGSCSI_INIT_XCHG_LEN sizeof(tiScsiInitiatorRequest_t)
#define AGSMP_INIT_XCHG_LEN sizeof(tiSMPFrame_t)
#define CMND_DMA_UNMAP( pCard, cmnd )
#define DPMC_LEANFLAG_NOAGDEVYT 2
#define DPMC_LEANFLAG_NOWWNLIST 4
#define DPMC_LEANFLAG_AGDEVUSED 8
#define DPMC_LEANFLAG_PDEVSUSED 16
typedef bus_dmamap_t dma_addr_t;
#define timer_list callout
typedef struct ccb_hdr_s {
void *next;
} ccb_hdr_t;
typedef struct _CCB {
U32 targetId;
U32 lun;
U32 channel;
U16 ccbStatus;
U16 scsiStatus;
U32 dataLen;
U08 senseLen;
U08 addrMode;
U08 retryCount;
U16 numSgElements;
U32 flags;
U32_64 dmaHandle;
caddr_t pSenseData;
tiSgl_t *sgList;
bus_addr_t tisgl_busaddr;
tiDeviceHandle_t *devHandle;
struct _CCB *pccbNext;
struct _CCB *pccbChainNext;
struct scsi_cmnd *cmd;
struct _CCB *pccbIO;
U32_64 startTime;
tiIORequest_t tiIORequest;
tdIORequestBody_t tdIOReqBody;
tiSuperScsiInitiatorRequest_t tiSuperScsiRequest;
tiSMPFrame_t tiSMPFrame;
#ifdef CCBUILD_TEST_EPL
caddr_t epl_ptr;
dma_addr_t epl_dma_ptr;
#endif
#ifdef CCBUILD_TEST_DPL
caddr_t dplPtr;
dma_addr_t dplDma;
#endif
#if defined (PERF_COUNT)
u64 startCmnd;
#endif
#ifdef ENABLE_NONSTANDARD_SECTORS
caddr_t metaPtr;
dma_addr_t dmaHandleMeta;
#endif
#ifdef ENABLE_SATA_DIF
caddr_t holePtr;
dma_addr_t dmaHandleHole;
int scaling_done;
#endif
#ifdef SUPER_FAST_IO_TEST
agsaIORequest_t IoContext;
agsaSASRequestBody_t sasRequestBody;
u32 reqType;
u32 queueId;
agsaSgl_t *sgl;
#endif
bus_dmamap_t CCB_dmamap;
union ccb *ccb;
struct agtiapi_softc *pmcsc;
} ccb_t, *pccb_t;
#define AGTIAPI_CCB_SIZE sizeof(struct _CCB)
typedef enum {
DEK_TABLE_0 = 0,
DEK_TABLE_1 = 1,
DEK_TABLE_INVALID = DEK_MAX_TABLES,
} dek_table_e;
typedef struct ag_encrypt_map_s {
unsigned long long lbaMin;
unsigned long long lbaMax;
dek_table_e dekTable;
bit32 dekIndex;
bit32 kekIndex;
bit32 kekTagCheck;
bit32 kekTag[2];
struct list_head *list;
} ag_encrypt_map_t;
typedef struct ag_kek_table_s {
#define KEK_TABLE_MAX_ENTRY 8
bit32 wrapperIndex;
tiEncryptKekBlob_t kekBlob;
} ag_kek_table_t;
typedef struct ag_dek_kek_map_s {
bit32 kekIndex;
} ag_dek_kek_map_t;
typedef struct _ag_device {
LINK_NODE devLink;
U32 targetId;
U32 flags;
U16 devType;
U16 resetCount;
U32 portalId;
void *pCard;
U32 sector_size;
U32 CCBCount;
#ifdef HOTPLUG_SUPPORT
struct scsi_device *sdev;
#endif
tiDeviceHandle_t *pDevHandle;
tiDeviceInfo_t devInfo;
ag_portal_info_t *pPortalInfo;
U08 targetName[AGTIAPI_MAX_NAME];
U16 targetLen;
U32 qbusy;
U32 qdepth;
} ag_device_t;
typedef struct _ag_tgt_map {
U16 devListIndex;
U16 flags;
U08 targetName[AGTIAPI_MAX_NAME];
U16 targetLen;
U08 portId;
int sasLrIdx;
uint32_t devRemoved;
} ag_tgt_map_t;
typedef struct _ag_slr_map {
U08 localeName[AGTIAPI_MIN_NAME];
U08 remoteName[AGTIAPI_MAX_NAME];
int localeNameLen;
int remoteNameLen;
} ag_slr_map_t;
#ifdef LINUX_PERBI_SUPPORT
typedef struct _ag_mapping_s
{
struct _ag_mapping_s *next;
U16 targetId;
U08 cardNo;
U08 targetLen;
U08 targetName[AGTIAPI_MAX_NAME];
} ag_mapping_t;
#endif
typedef struct _ag_portal_data
{
ag_portal_info_t portalInfo;
void *pCard;
} ag_portal_data_t;
struct agtiapi_softc {
device_t my_dev;
struct cdev *my_cdev;
struct cam_sim *sim;
struct cam_path *path;
struct resource *resirq;
void *intr_cookie;
int rscID[MAX_MSIX_NUM_VECTOR];
struct resource *irq[MAX_MSIX_NUM_VECTOR];
void *intrcookie[MAX_MSIX_NUM_VECTOR];
bus_dma_tag_t buffer_dmat;
struct cam_devq *devq;
struct callout OS_timer;
struct mtx OS_timer_lock;
struct callout IO_timer;
struct mtx IO_timer_lock;
struct callout devRmTimer;
struct mtx devRmTimerLock;
uint16_t rmChkCt;
tiSgl_t *tisgl_mem;
bus_addr_t tisgl_busaddr;
bus_dma_tag_t tisgl_dmat;
bus_dmamap_t tisgl_map;
void *osti_mem;
bus_addr_t osti_busaddr;
bus_dma_tag_t osti_dmat;
bus_dmamap_t osti_mapp;
U32 typhn;
void *typh_mem;
bus_addr_t typh_busaddr;
bus_dma_tag_t typh_dmat;
bus_dmamap_t typh_mapp;
U32 typhIdx;
U32 tyPhsIx;
struct Scsi_Host *pHost;
tiRoot_t tiRoot;
U32 VidDid;
U32 SVID_SSID;
U32 flags;
U32 freezeSim;
U32 up_count;
U32 down_count;
U08 hostNo;
U08 cardNo;
U16 tgtCount;
U16 badTgtCount;
U16 activeCCB;
U32 ccbTotal;
U32 devDiscover;
U32 resetCount;
U32 timeoutTicks;
U32 portCount;
U32 SimQFrozen;
U32 devq_flag;
U32 dev_scan;
pccb_t ccbSendHead;
pccb_t ccbSendTail;
pccb_t ccbDoneHead;
pccb_t ccbDoneTail;
pccb_t smpSendHead;
pccb_t smpSendTail;
pccb_t smpDoneHead;
pccb_t smpDoneTail;
caddr_t *ccbChainList;
caddr_t *ccbFreeList;
ccb_hdr_t *ccbAllocList;
struct pci_pool *sglPool;
struct timer_list osTimerList;
#ifdef TD_TIMER
struct timer_list tdTimerList;
#endif
struct timer_list tiTimerList;
ag_portal_data_t *pPortalData;
ag_card_info_t *pCardInfo;
ag_device_t *pDevList;
#define CIPHER_MODE_INVALID 0xffffffffUL
#define DEK_INDEX_INVALID 0xffffffffUL
#define KEK_INDEX_INVALID 0xffffffffUL
int encrypt;
bit32 dek_size;
void *ioctl_data;
struct list_head *encrypt_map;
ag_kek_table_t kek_table[KEK_TABLE_MAX_ENTRY];
ag_dek_kek_map_t dek_kek_map[DEK_MAX_TABLES][DEK_MAX_TABLE_ITEMS];
int dek_index[2];
#define DEK_SIZE_PLAIN 72
#define DEK_SIZE_ENCRYPT 80
#define ENCRYPTION_MAP_MEMPOOL_SIZE 64
char map_cache_name[32];
struct kmem_cache *map_cache;
bit32 cipher_mode;
#define ENCRYPTION_IO_ERR_MEMPOOL_SIZE 256
struct mtx ioerr_queue_lock;
char ioerr_cache_name[32];
struct kmem_cache *ioerr_cache;
ag_tgt_map_t *pWWNList;
ag_slr_map_t *pSLRList;
U32 numTgtHardMapped;
struct sema *pIoctlSem;
U32_64 osLockFlag;
#ifdef AGTIAPI_LOCAL_LOCK
struct mtx sendLock;
struct mtx doneLock;
struct mtx sendSMPLock;
struct mtx doneSMPLock;
struct mtx ccbLock;
struct mtx *STLock;
unsigned long *STLockFlags;
struct mtx memLock;
struct mtx freezeLock;
#endif
#ifdef AGTIAPI_DPC
struct callout tasklet_dpc[MAX_MSIX_NUM_DPC];
#endif
struct mtx devListLock;
};
int agtiapi_getdevlist( struct agtiapi_softc *pCard,
tiIOCTLPayload_t *agIOCTLPayload );
int agtiapi_getCardInfo ( struct agtiapi_softc *pCard,
U32_64 size,
void *buffer );
#ifndef LINUX_PERBI_SUPPORT
#define INDEX(_pCard, _T) (_T)
#else
#define INDEX(_pCard, _T) (((_pCard)->pWWNList + (_T))->devListIndex)
#endif