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#ifndef __SMTYPES_H__ 25#define __SMTYPES_H__ 26 27#include <dev/pms/freebsd/driver/common/osenv.h> 28#include <dev/pms/freebsd/driver/common/ostypes.h> 29#include <dev/pms/freebsd/driver/common/osdebug.h> 30 31#include <dev/pms/RefTisa/sallsdk/api/sa.h> 32#include <dev/pms/RefTisa/sallsdk/api/saapi.h> 33#include <dev/pms/RefTisa/sallsdk/api/saosapi.h> 34 35#include <dev/pms/RefTisa/sat/api/sm.h> 36#include <dev/pms/RefTisa/sat/api/smapi.h> 37#include <dev/pms/RefTisa/sat/api/tdsmapi.h> 38 39#include <dev/pms/RefTisa/sat/src/smlist.h> 40 41/* 42 * SAT specific structure per SATA drive 43 */ 44#define SAT_NONNCQ_MAX 1 45#define SAT_NCQ_MAX 32 46#define SAT_MAX_INT_IO 16 47#define SAT_APAPI_CMDQ_MAX 2 48 49/* SMP direct payload size limit: IOMB direct payload size = 48 */ 50#define SMP_DIRECT_PAYLOAD_LIMIT 44 51 52/* timer functions ; both I and T */ 53typedef void (*smTimerCBFunc_t)(smRoot_t *smRoot, void *timerData1, void *timerData2, void *timerData3); 54 55 56/** \brief data structure for timer request 57 * Timer requests are enqueued and dequeued using smList_t 58 * and have a callback function 59 */ 60typedef struct smTimerRequest_s { 61 /* the number of ticks */ 62 bit32 timeout; 63 void *timerData1; 64 void *timerData2; 65 void *timerData3; 66 smTimerCBFunc_t timerCBFunc; 67 smList_t timerLink; 68 bit32 timerRunning; 69} smTimerRequest_t; 70 71 72 73typedef struct smSatInternalIo_s 74{ 75 smList_t satIntIoLink; 76 smIORequest_t satIntSmIORequest; /* old satIntTiIORequest */ 77 void *satIntRequestBody; /* maps to smIOrequestBody */ 78 smScsiInitiatorRequest_t satIntSmScsiXchg; /* old satIntTiScsiXchg*/ 79 smMem_t satIntDmaMem; 80 smMem_t satIntReqBodyMem; 81 bit32 satIntFlag; 82 smIORequest_t *satOrgSmIORequest; /* old satOrgTiIORequest */ 83 bit32 id; 84} smSatInternalIo_t; 85 86 87 88typedef struct smDeviceData_s { 89 smList_t FreeLink; /* free dev list */ 90 smList_t MainLink; /* main(in use) dev list */ 91 bit32 id; /* for debugging only */ 92 smRoot_t *smRoot; 93 agsaDevHandle_t *agDevHandle; 94 bit32 valid; /* valid or registered */ 95 smTimerRequest_t SATAIDDeviceTimer; /* ID Device Data timer for SATA device */ 96 bit32 SMAbortAll; /* flag for abortall case */ 97 smDeviceHandle_t *smDevHandle; 98 bit32 directlyAttached; 99 agsaDevHandle_t *agExpDevHandle; /* expander a device is attached to if expander attached */ 100 bit32 phyID; 101 agsaContext_t agDeviceResetContext; /* used in saLocalPhyControl() */ 102 bit32 SMNumOfFCA; 103 104 /* from satDeviceData_t */ 105 smList_t satIoLinkList; /* Normal I/O from TISA */ 106 smList_t satFreeIntIoLinkList; /* SAT internal I/O free list */ 107 smList_t satActiveIntIoLinkList; /* SAT internal I/O active list */ 108 smSatInternalIo_t satIntIo[SAT_MAX_INT_IO]; /* Internal I/O resource */ 109 agsaSATAIdentifyData_t satIdentifyData; /* Copy of SATA Id Dev data */ 110 bit32 satNCQ; /* Flag for NCQ support */ 111 bit32 sat48BitSupport; /* Flag for 48-bit addressing */ 112 bit32 satSMARTSelfTest; /* Flag for SMART self test */ 113 bit32 satSMARTFeatureSet; /* Flag for SMART feature set */ 114 bit32 satSMARTEnabled; /* Flag for SMART enabled */ 115 bit32 satRemovableMedia; /* Flag for Removable Media */ 116 bit32 satRemovableMediaEnabled; /* Flag for Removable Media Enabled */ 117 bit32 satDMASupport; /* Flag for DMA Support */ 118 bit32 satDMAEnabled; /* Flag for DMA Enabled */ 119 bit32 satUltraDMAMode; /* Ultra DMA mode value */ 120 bit32 satDMADIRSupport; /* Flag for DMA direction */ 121 bit32 satReadLookAheadSupport; /* Flag for Read Look Ahead */ 122 bit32 satVolatileWriteCacheSupport; /* Flag for Volatile Write Cache support*/ 123 bit32 satWWNSupport; /* Flag for DMA Enabled */ 124 bit32 satDMASetupAA; /* Flag for DMA Setup Auto-Activate */ 125 bit32 satNCQQMgntCmd; /* Flag for NCQ Queue Management Command */ 126 bit32 volatile satPendingIO; /* Number of pending I/O */ 127 bit32 volatile satPendingNCQIO; /* Number of pending NCQ I/O */ 128 bit32 volatile satPendingNONNCQIO; /* Number of pending NON NCW I/O*/ 129 bit32 satNCQMaxIO; /* Max NCQ I/O in SAT or drive */ 130 bit32 satDriveState; /* State of SAT/drive */ 131 bit32 satAbortAfterReset; /* Flag: abort after SATA reset */ 132 bit32 satAbortCalled; /* Flag: abort called indication*/ 133 bit32 satVerifyState; /* Flag: Read Vrf state for diag*/ 134 bit32 satMaxUserAddrSectors; /* max user addressable setctors*/ 135 bit32 satWriteCacheEnabled; /* Flag for write cache enabled */ 136 bit32 satLookAheadEnabled; /* Flag for look ahead enabled */ 137 bit32 satDeviceFaultState; /* State of DF */ 138 bit32 satStopState; /* State of Start and Stop */ 139 bit32 satFormatState; /* State of format */ 140 bit32 satPMField; /* PM field, first 4 bits */ 141 bit8 satSignature[8]; /* Signature */ 142 bit32 satDeviceType; /* ATA device type */ 143 bit32 satSectorDone; /* Number of Sector done by Cmnd*/ 144 bit32 freeSATAFDMATagBitmap; /* SATA NCQ tag bit map */ 145 bit32 IDDeviceValid; /* ID DeviceData valid bit */ 146 bit8 satMaxLBA[8]; /* MAXLBA is from read capacity */ 147 bit32 satBGPendingDiag; /* Pending Diagnostic in backgound */ 148 bit32 NumOfFCA; /* number of SMP HARD RESET on this device */ 149 bit32 NumOfIDRetries; /* number of SMP HARD RESET after ID retries */ 150 smIORequest_t *satTmTaskTag; /* TM Task Tag */ 151 void *satSaDeviceData; /* Pointer back to sa dev data */ 152 bit32 ID_Retries; /* identify device data retries */ 153 bit32 OSAbortAll; /* OS calls abort all */ 154 bit32 ReadCapacity; /* Read Capacity Type; 10, 16 */ 155 bit32 sasAddressLo; /**< HOST SAS address lower part */ 156 bit32 sasAddressHi; /**< HOST SAS address higher part */ 157 158} smDeviceData_t; 159 160typedef struct smAtaPassThroughHdr_s 161{ 162 bit8 opc; 163 bit8 mulCount : 3; 164 bit8 proto : 4; 165 bit8 extend : 1; 166 bit8 offline : 2; 167 bit8 ckCond : 1; 168 bit8 tType : 1; 169 bit8 tDir : 1; 170 bit8 byteBlock : 1; 171 bit8 tlength : 2; 172 173}smAtaPassThroughHdr_t; 174 175/* 176 * SCSI Sense Data 177 */ 178typedef struct 179{ 180 bit8 snsRespCode; 181 bit8 snsSegment; 182 bit8 senseKey; /* sense key */ 183 bit8 info[4]; 184 bit8 addSenseLen; /* 11 always */ 185 bit8 cmdSpecific[4]; 186 bit8 addSenseCode; /* additional sense code */ 187 bit8 senseQual; /* additional sense code qualifier */ 188 bit8 fru; 189 bit8 skeySpecific[3]; 190} smScsiRspSense_t; 191 192 193/* 194 * SATA SAT specific function pointer for SATA completion for SAT commands. 195 */ 196typedef void (*smSatCompleteCbPtr_t )( 197 agsaRoot_t *agRoot, 198 agsaIORequest_t *agIORequest, 199 bit32 agIOStatus, 200 agsaFisHeader_t *agFirstDword, 201 bit32 agIOInfoLen, 202 agsaFrameHandle_t agFrameHandle, 203 void *satIOContext 204 ); 205 206/* for SMP only */ 207typedef void (*smSMPCompleted_t)( 208 agsaRoot_t *, 209 agsaIORequest_t *, 210 bit32 , 211 bit32 , 212 agsaFrameHandle_t 213 ); 214 215 216/* 217 * SATA SAT specific function for I/O context 218 */ 219typedef struct smSatIOContext_s 220{ 221 smList_t satIoContextLink; 222 smDeviceData_t *pSatDevData; 223 agsaFisRegHostToDevice_t *pFis; 224 smIniScsiCmnd_t *pScsiCmnd; 225 smScsiRspSense_t *pSense; 226 smSenseData_t *pSmSenseData; /* old pTiSenseData */ 227 void *smRequestBody; /* smIORequestBody_t; old tiRequestBody*/ 228 void *smScsiXchg; /* for writesame10(); old tiScsiXchg */ 229 bit32 reqType; 230 bit32 interruptContext; 231 smSatCompleteCbPtr_t satCompleteCB; 232 smSatInternalIo_t *satIntIoContext; /* SATM generated IOs */ 233 smDeviceHandle_t *psmDeviceHandle; /* old ptiDeviceHandle */ 234 bit8 sataTag; 235 bit8 superIOFlag;/* Flag indicating type for smScsiXchg */ 236 bit8 reserved1; /* Padding for allignment */ 237 bit8 reserved2; /* Padding for allignment */ 238 bit32 currentLBA; /* current LBA for read and write */ 239 bit32 ATACmd; /* ATA command */ 240 bit32 OrgTL; /* original tranfer length(tl) */ 241 bit32 LoopNum; /* denominator tl */ 242 bit32 LoopNum2; /* denominator tl */ 243 bit8 LBA[8]; /* for reassign blocks; current LBA */ 244 bit32 ParmIndex; /* for reassign blocks;current idx in defective LBA LIST */ 245 bit32 ParmLen; /* for reassign blocks; defective LBA list length */ 246 bit32 NotifyOS; /* only for task management */ 247 bit32 TMF; /* task management function */ 248 struct smSatIOContext_s *satToBeAbortedIOContext; 249 struct smSatIOContext_s *satOrgIOContext; 250 bit32 UpperAddr; 251 bit32 LowerAddr; 252 bit32 SplitIdx; 253 bit32 AdjustBytes; 254 bit32 EsglLen; 255 /* For the SAT Passthrough */ 256 bit8 ck_cond; 257 bit8 extend; 258 bit8 sectorCnt07; 259 bit8 LBAHigh07; 260 bit8 LBAMid07; 261 bit8 LBALow07; 262 bit8 Sector_Cnt_Upper_Nonzero; 263 bit8 LBA_Upper_Nonzero; 264 bit32 pid; /* port id; used to protect double completion */ 265 bit32 id; /* for debugging */ 266} smSatIOContext_t; 267 268typedef struct smIORequestBody_s { 269 smList_t satIoBodyLink; 270 smDeviceHandle_t *smDevHandle; 271 smIORequest_t *smIORequest; 272 agsaIORequest_t agIORequest; 273 smIORequest_t *smIOToBeAbortedRequest; /* IO to be aborted; old tiIOToBeAbortedRequest */ 274 bit32 id; 275 bit32 InUse; 276 union { 277 struct { 278 agsaSATAInitiatorRequest_t agSATARequestBody; 279 smScsiRspSense_t sensePayload; 280 smSenseData_t smSenseData; /* old tiSenseData */ 281 smSatIOContext_t satIOContext; 282 } SATA; 283 } transport; 284 bit32 ioStarted; 285 bit32 ioCompleted; 286 bit32 reTries; 287 union { 288 struct { 289 bit32 expDataLength; 290 smSgl_t smSgl1; /* old tiSgl1 */ 291 smSgl_t smSgl2; /* old tiSgl2 */ 292 void *sglVirtualAddr; 293 } InitiatorRegIO; /* regular IO */ 294 struct { 295 void *osMemHandle; 296 smIORequest_t *CurrentTaskTag; 297 smIORequest_t *TaskTag; 298 } InitiatorTMIO; /* task management */ 299 } IOType; 300 301} smIORequestBody_t; 302 303typedef struct smSMPRequestBody_s { 304 smSMPCompleted_t SMPCompletionFunc;/* must be the second */ 305 306 smDeviceHandle_t *smDevHandle; /* not used for SM generated SMP */ 307 agsaIORequest_t agIORequest; 308 agsaSASRequestBody_t agSASRequestBody; 309 void *osMemHandle; 310 smDeviceData_t *smDeviceData; 311 smIORequest_t *CurrentTaskTag; /* SMP is used for simulate target reset */ 312// tdsaPortContext_t *tdPortContext; /* portcontext where SMP is sent from */ 313 bit8 smpPayload[SMP_DIRECT_PAYLOAD_LIMIT]; /* for smp retries; 314 only for direct SMP */ 315 bit32 retries; /* number of retries */ 316 317} smSMPRequestBody_t; 318 319 320typedef struct smRootOsData_s { 321 smRoot_t *smRoot; /**< Pointer back to smRoot */ 322 void *smAllShared; /**< Pointer to smIntContext_t */ 323 void *smIni; /**< Pointer to SAS/SATA initiator */ 324} smRootOsData_t; 325 326typedef struct smIntContext_s { 327 /**< agsaRoot_t->osData points to this */ 328 struct smRootOsData_s smRootOsData; 329 330 bit32 usecsPerTick; 331 agsaRoot_t *agRoot; 332 333 /**< software-related initialization params used in saInitialize() */ 334 smSwConfig_t SwConfig; 335 336 /**< timers used commonly in SAS/SATA */ 337 smList_t timerlist; 338 339 /**< pointer to Device memory */ 340 smDeviceData_t *DeviceMem; 341 smList_t FreeDeviceList; 342 smList_t MainDeviceList; 343 344 /**< pointer to IO memory */ 345 smIORequestBody_t *IOMem; 346 smList_t freeIOList; 347 smList_t mainIOList; 348 bit32 FCA; 349} smIntContext_t; 350 351typedef struct smIntRoot_s 352{ 353 /**<< common data structure for SAS/SATA */ 354 smIntContext_t smAllShared; 355} smIntRoot_t; 356 357 358#endif /* __SMTYPES_H__ */ 359 360