1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
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
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.
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
21 ********************************************************************************/
22 /*******************************************************************************/
26 * This file contains initiator IO related functions in TD layer
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 #include <dev/pms/config.h>
33 #include <dev/pms/freebsd/driver/common/osenv.h>
34 #include <dev/pms/freebsd/driver/common/ostypes.h>
35 #include <dev/pms/freebsd/driver/common/osdebug.h>
37 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
38 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
39 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
41 #include <dev/pms/RefTisa/tisa/api/titypes.h>
42 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
43 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
44 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
47 #include <dev/pms/RefTisa/sat/api/sm.h>
48 #include <dev/pms/RefTisa/sat/api/smapi.h>
49 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
53 #include <dev/pms/RefTisa/discovery/api/dm.h>
54 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
55 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
58 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
59 #include <dev/pms/freebsd/driver/common/osstring.h>
60 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
62 #ifdef INITIATOR_DRIVER
63 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
69 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
74 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
75 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
77 /*****************************************************************************
78 *! \brief tiINIIOStart
80 * Purpose: This routine is called to initiate a new SCSI request.
82 * \param tiRoot: Pointer to initiator driver/port instance.
83 * \param tiIORequest: Pointer to the I/O request context for this I/O.
84 * \param tiDeviceHandle: Pointer to device handle for this I/O.
85 * \param tiScsiRequest: Pointer to the SCSI-3 I/O request and SGL list.
86 * \param tiRequestBody: Pointer to the OS Specific module allocated storage
87 * to be used by the TD layer for executing this I/O.
88 * \param interruptContext: The interrupt context within which this function
92 * tiSuccess: I/O request successfully initiated.
93 * tiBusy: No resources available, try again later.
94 * tiIONoDevice: Invalid device handle.
95 * tiError: Other errors that prevent the I/O request to be started.
98 *****************************************************************************/
102 tiIORequest_t *tiIORequest,
103 tiDeviceHandle_t *tiDeviceHandle,
104 tiScsiInitiatorRequest_t *tiScsiRequest,
106 bit32 interruptContext
109 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
110 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
111 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
112 tdsaDeviceData_t *oneDeviceData;
113 agsaRoot_t *agRoot = agNULL;
114 agsaIORequest_t *agIORequest = agNULL;
115 agsaDevHandle_t *agDevHandle = agNULL;
117 agsaSASRequestBody_t *agSASRequestBody = agNULL;
118 bit32 tiStatus = tiError;
119 bit32 saStatus = AGSA_RC_FAILURE;
121 tdIORequestBody_t *tdIORequestBody;
122 agsaSSPInitiatorRequest_t *agSSPInitiatorRequest;
124 /* only for debugging */
130 satIOContext_t *satIOContext;
134 smRoot_t *smRoot = &(tdsaAllShared->smRoot);
135 smIORequest_t *smIORequest;
136 smDeviceHandle_t *smDeviceHandle;
137 smScsiInitiatorRequest_t *smSCSIRequest;
140 TDSA_INP_ENTER(tiRoot);
141 TI_DBG6(("tiINIIOStart: start\n"));
142 TI_DBG6(("tiINIIOStart:: ******* tdsaRoot %p tdsaAllShared %p \n", tdsaRoot,tdsaAllShared));
144 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
146 TI_DBG6(("tiINIIOStart: onedevicedata %p\n", oneDeviceData));
148 if(oneDeviceData == agNULL)
150 TI_DBG1(("tiINIIOStart: tiDeviceHandle=%p DeviceData is NULL\n", tiDeviceHandle ));
151 tiStatus = tiIONoDevice;
156 if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
157 oneDeviceData->tdPortContext == agNULL )
159 TI_DBG1(("tiINIIOStart: tiDeviceHandle=%p did %d DeviceData was removed\n", tiDeviceHandle, oneDeviceData->id));
160 TI_DBG6(("tiINIIOStart: device AddrHi 0x%08x AddrLo 0x%08x\n",
161 oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
163 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
164 tdIORequestBody->IOCompletionFunc = itdssIOForDebugging1Completed;
165 TI_DBG6(("tiINIIOStart: IOCompletionFunc %p\n", tdIORequestBody->IOCompletionFunc));
166 tiStatus = tiIONoDevice;
170 if (tiIORequest->osData == agNULL)
172 TI_DBG1(("tiINIIOStart: tiIORequest->osData is NULL, wrong\n"));
176 /* starting IO with SAS device */
177 if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
179 TI_DBG6(("tiINIIOStart: calling saSSPStart\n"));
181 agRoot = oneDeviceData->agRoot;
182 agDevHandle = oneDeviceData->agDevHandle;
184 /* OS layer has tdlayer data structure pointer in
185 tdIORequestBody_t tdIOReqBody;
186 in ccb_t in agtiapi.h
188 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
191 osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
193 /* let's initialize tdIOrequestBody */
194 /* initialize callback */
195 tdIORequestBody->IOCompletionFunc = itdssIOCompleted;
197 /* initialize tiDevhandle */
198 tdIORequestBody->tiDevHandle = tiDeviceHandle;
200 /* initialize tiIORequest */
201 tdIORequestBody->tiIORequest = tiIORequest;
203 /* save context if we need to abort later */
204 tiIORequest->tdData = tdIORequestBody;
206 /* initialize expDataLength */
207 tdIORequestBody->IOType.InitiatorRegIO.expDataLength
208 = tiScsiRequest->scsiCmnd.expDataLength;
210 tdIORequestBody->IOType.InitiatorRegIO.sglVirtualAddr
211 = tiScsiRequest->sglVirtualAddr;
213 /* initializes "agsaSgl_t agSgl" of "agsaDifSSPInitiatorRequest_t" */
214 tiStatus = itdssIOPrepareSGL(
217 &tiScsiRequest->agSgl1,
218 tiScsiRequest->sglVirtualAddr
221 if (tiStatus != tiSuccess)
223 TI_DBG1(("tiINIIOStart: can't get SGL\n"));
228 /* initialize agIORequest */
229 agIORequest = &(tdIORequestBody->agIORequest);
230 agIORequest->osData = (void *) tdIORequestBody;
231 agIORequest->sdkData = agNULL; /* LL takes care of this */
236 tdIORequestBody_t tdIORequestBody -> agSASRequestBody
238 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
239 agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq);
241 agSSPInitiatorRequest->flag = 0;
244 osti_memcpy(agSSPInitiatorRequest->sspCmdIU.cdb, tiScsiRequest->scsiCmnd.cdb, 16);
247 osti_memcpy(agSSPInitiatorRequest->sspCmdIU.lun,
248 tiScsiRequest->scsiCmnd.lun.lun, 8);
251 /* setting the data length */
252 agSSPInitiatorRequest->dataLength = tiScsiRequest->scsiCmnd.expDataLength;
253 TI_DBG6(("tiINIIOStart: tiScsiRequest->scsiCmnd.expDataLength %d\n", tiScsiRequest->scsiCmnd.expDataLength));
255 agSSPInitiatorRequest->firstBurstSize = 0;
258 process taskattribute
260 if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_SIMPLE)
262 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
263 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_SIMPLE;
265 else if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_ORDERED)
267 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
268 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_ORDERED;
270 else if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_HEAD_OF_QUEUE)
272 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
273 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_HEAD_OF_QUEUE;
275 else if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_ACA)
277 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
278 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_ACA;
281 if (tiScsiRequest->dataDirection == tiDirectionIn)
283 agRequestType = AGSA_SSP_INIT_READ;
284 TI_DBG6(("tiINIIOStart: READ\n"));
286 else if (tiScsiRequest->dataDirection == tiDirectionOut)
288 agRequestType = AGSA_SSP_INIT_WRITE;
289 TI_DBG6(("tiINIIOStart: WRITE\n"));
293 agRequestType = AGSA_REQ_TYPE_UNKNOWN;
294 TI_DBG1(("tiINIIOStart: unknown data direction\n"));
297 tdIORequestBody->agRequestType = agRequestType;
299 TI_DBG6(("tiINIIOStart: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
300 TI_DBG6(("tiINIIOStart: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
303 if (tdIORequestBody->IOCompletionFunc == agNULL)
305 TI_DBG1(("tiINIIOStart: Error!!!! IOCompletionFunc is NULL\n"));
307 saStatus = saSSPStart(agRoot,
309 tdsaRotateQnumber(tiRoot, oneDeviceData),
316 tdIORequestBody->ioStarted = agTRUE;
317 tdIORequestBody->ioCompleted = agFALSE;
318 tdIORequestBody->reTries = 0;
320 if (saStatus == AGSA_RC_SUCCESS)
322 Initiator->NumIOsActive++;
323 tiStatus = tiSuccess;
327 tdIORequestBody->ioStarted = agFALSE;
328 tdIORequestBody->ioCompleted = agTRUE;
329 if (saStatus == AGSA_RC_BUSY)
331 TI_DBG4(("tiINIIOStart: saSSPStart busy\n"));
342 else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
344 TI_DBG5(("tiINIIOStart: calling satIOStart\n"));
345 TI_DBG5(("tiINIIOStart: onedevicedata did %d\n", oneDeviceData->id));
346 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
348 osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
349 /* initialize tiDevhandle */
350 tdIORequestBody->tiDevHandle = tiDeviceHandle;
351 tdIORequestBody->superIOFlag = agFALSE;
353 tiIORequest->tdData = tdIORequestBody;
354 tdIORequestBody->tiIORequest = tiIORequest;
355 smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
356 smIORequest->tdData = tdIORequestBody;
358 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
359 smDeviceHandle->tdData = oneDeviceData;
361 smSCSIRequest = (smScsiInitiatorRequest_t *)&(tdIORequestBody->SM.smSCSIRequest);
362 osti_memcpy(smSCSIRequest, tiScsiRequest, sizeof(smScsiInitiatorRequest_t));
364 tiStatus = smIOStart(smRoot,
373 smIORequest_t *smIORequest,
374 smDeviceHandle_t *smDeviceHandle,
375 smScsiInitiatorRequest_t *smSCSIRequest,
376 bit32 interruptContext
383 else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
385 TI_DBG5(("tiINIIOStart: calling satIOStart\n"));
386 TI_DBG5(("tiINIIOStart: onedevicedata did %d\n", oneDeviceData->id));
389 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
392 osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
394 /* initialize tiDevhandle */
395 tdIORequestBody->tiDevHandle = tiDeviceHandle;
397 /* initialize tiIORequest */
398 tdIORequestBody->tiIORequest = tiIORequest;
399 tdIORequestBody->IOCompletionFunc = itdssIOForDebugging2Completed;
401 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
404 * Need to initialize all the fields within satIOContext except
405 * reqType and satCompleteCB which will be set in sat.c depending on cmd.
407 tdIORequestBody->transport.SATA.tiSenseData.senseData = agNULL;
408 tdIORequestBody->transport.SATA.tiSenseData.senseLen = 0;
409 satIOContext->pSatDevData = &oneDeviceData->satDevData;
411 &tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev;
412 satIOContext->pScsiCmnd = &tiScsiRequest->scsiCmnd;
413 satIOContext->pSense = &tdIORequestBody->transport.SATA.sensePayload;
414 satIOContext->pTiSenseData = &tdIORequestBody->transport.SATA.tiSenseData;
415 satIOContext->pTiSenseData->senseData = satIOContext->pSense;
416 /* satIOContext->pSense = (scsiRspSense_t *)satIOContext->pTiSenseData->senseData; */
417 satIOContext->tiRequestBody = tiRequestBody;
418 satIOContext->interruptContext = interruptContext;
419 satIOContext->ptiDeviceHandle = tiDeviceHandle;
420 satIOContext->tiScsiXchg = tiScsiRequest;
421 satIOContext->satIntIoContext = agNULL;
422 satIOContext->satOrgIOContext = agNULL;
423 /* satIOContext->tiIORequest = tiIORequest; */
425 /* save context if we need to abort later */
426 tiIORequest->tdData = tdIORequestBody;
428 /* followings are used only for internal IO */
429 satIOContext->currentLBA = 0;
430 satIOContext->OrgTL = 0;
432 TI_DBG5(("tiINIIOStart: pSatDevData=%p\n", satIOContext->pSatDevData ));
434 tiStatus = satIOStart( tiRoot,
442 #endif /* else of FDS_SM */
446 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
447 tdIORequestBody->IOCompletionFunc = itdssIOForDebugging3Completed;
448 TI_DBG1(("tiINIIOStart: wrong unspported Device %d\n", oneDeviceData->DeviceType));
450 error. unsupported IO
454 TDSA_INP_LEAVE(tiRoot);
460 tiINIFastIOSend(void *ioh)
462 bit32 saStatus, tiStatus;
464 saStatus = saFastSSPSend(ioh);
465 if (saStatus == AGSA_RC_SUCCESS)
466 tiStatus = tiSuccess;
473 tiINIFastIOCancel(void *ioh)
475 bit32 saStatus, tiStatus;
477 saStatus = saFastSSPCancel(ioh);
478 if (saStatus == AGSA_RC_SUCCESS)
479 tiStatus = tiSuccess;
489 agsaFastCommand_t *fc)
491 tdsaDeviceData_t *oneDeviceData;
492 tiDeviceHandle_t *tiDeviceHandle = fc->devHandle;
493 bit32 taskAttribute = fc->taskAttribute;
494 void *ioh = ioHandle;
496 TDSA_INP_ENTER(tiRoot);
497 TI_DBG6(("tiINIFastIOPrepare: enter\n"));
499 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
500 if(oneDeviceData == agNULL)
502 TI_DBG1(("tiINIFastIOPrepare: tiDeviceHandle=%p DeviceData is NULL\n",
508 TI_DBG6(("tiINIFastIOPrepare: onedevicedata %p\n", oneDeviceData));
510 /* starting IO with SAS device */
511 if (oneDeviceData->DeviceType != TD_SAS_DEVICE)
513 TI_DBG1(("tiINISuperIOSend: wrong Device %d\n", oneDeviceData->DeviceType));
514 /* error: unsupported IO */
520 fc->agRoot = oneDeviceData->agRoot;
521 TD_ASSERT((NULL != fc->agRoot), "");
523 fc->devHandle = oneDeviceData->agDevHandle;
524 TD_ASSERT((NULL != fc->devHandle), "");
525 fc->safb->oneDeviceData = oneDeviceData;
528 process taskattribute
530 switch (taskAttribute)
533 fc->taskAttribute = TD_TASK_SIMPLE;
536 fc->taskAttribute = TD_TASK_ORDERED;
538 case TASK_HEAD_OF_QUEUE:
539 fc->taskAttribute = TD_TASK_HEAD_OF_QUEUE;
542 fc->taskAttribute = TD_TASK_ACA;
544 /* compile out for "iniload" */
548 TI_DBG3(("tiINIFastIOPrepare: data direction: %x\n", fc->agRequestType));
549 TI_DBG6(("tiINIFastIOPrepare: device AddrHi/Lo 0x%08x / 0x%08x\n",
550 oneDeviceData->SASAddressID.sasAddressHi,
551 oneDeviceData->SASAddressID.sasAddressLo));
553 fc->queueNum = tdsaRotateQnumber(tiRoot, oneDeviceData);
555 ioHandle = saFastSSPPrepare(ioHandle, fc, ossaFastSSPCompleted, fc->safb);
558 TI_DBG1(("tiINIFastIOPrepare: saSuperSSPSend error\n"));
564 if (ioh && !ioHandle)
566 saFastSSPCancel(ioh);
569 TI_DBG6(("tiINIFastIOPrepare: leave\n"));
571 TDSA_INP_LEAVE(tiRoot);
573 } /* tiINIFastIOPrepare */
576 /*****************************************************************************
580 * Purpose: This routine is called to initiate a new SCSI request with
584 * tiRoot: Pointer to initiator driver/port instance.
585 * tiIORequest: Pointer to the I/O request context for this I/O.
586 * tiDeviceHandle: Pointer to device handle for this I/O.
587 * tiScsiRequest: Pointer to the SCSI-3 I/O request and SGL list.
588 * tiRequestBody: Pointer to the OS Specific module allocated storage
589 * to be used by the TD layer for executing this I/O.
590 * interruptContext: The interrupt context within which this function
592 * difOption: DIF option.
596 * tiSuccess: I/O request successfully initiated.
597 * tiBusy: No resources available, try again later.
598 * tiIONoDevice: Invalid device handle.
599 * tiError: Other errors that prevent the I/O request to be started.
602 *****************************************************************************/
603 osGLOBAL bit32 tiINIIOStartDif(
605 tiIORequest_t *tiIORequest,
606 tiDeviceHandle_t *tiDeviceHandle,
607 tiScsiInitiatorRequest_t *tiScsiRequest,
609 bit32 interruptContext,
614 /* This function was never used by SAS/SATA. Use tiINISuperIOStart() instead. */
619 /*****************************************************************************
623 * Purpose: This routine is called to initiate a new SCSI request.
626 * tiRoot: Pointer to initiator driver/port instance.
627 * tiIORequest: Pointer to the I/O request context for this I/O.
628 * tiDeviceHandle: Pointer to device handle for this I/O.
629 * tiScsiRequest: Pointer to the SCSI-3 I/O request and SGL list.
630 * tiRequestBody: Pointer to the OS Specific module allocated storage
631 * to be used by the TD layer for executing this I/O.
632 * interruptContext: The interrupt context within which this function
636 * tiSuccess: I/O request successfully initiated.
637 * tiBusy: No resources available, try again later.
638 * tiIONoDevice: Invalid device handle.
639 * tiError: Other errors that prevent the I/O request to be started.
642 *****************************************************************************/
646 tiIORequest_t *tiIORequest,
647 tiDeviceHandle_t *tiDeviceHandle,
648 tiSuperScsiInitiatorRequest_t *tiScsiRequest,
650 bit32 interruptContext
653 tdsaRoot_t *tdsaRoot = agNULL;
654 tdsaContext_t *tdsaAllShared = agNULL;
655 itdsaIni_t *Initiator = agNULL;
656 tdsaDeviceData_t *oneDeviceData = agNULL;
657 tdIORequestBody_t *tdIORequestBody = agNULL;
658 agsaSSPInitiatorRequest_t *agSSPInitiatorRequest = agNULL;
659 agsaRoot_t *agRoot = agNULL;
660 agsaIORequest_t *agIORequest = agNULL;
661 agsaDevHandle_t *agDevHandle = agNULL;
662 agsaSASRequestBody_t *agSASRequestBody = agNULL;
663 bit32 tiStatus = tiError;
664 bit32 saStatus = AGSA_RC_FAILURE;
665 bit32 adjusted_length = 0;
666 bit32 agRequestType = 0;
667 agBOOLEAN needPlusDataLenAdjustment = agFALSE;
668 agBOOLEAN needMinusDataLenAdjustment = agFALSE;
672 satIOContext_t *satIOContext;
677 smIORequest_t *smIORequest;
678 smDeviceHandle_t *smDeviceHandle;
679 smSuperScsiInitiatorRequest_t *smSuperSCSIRequest;
681 #ifdef CCBUILD_INDIRECT_CDB
682 agsaSSPInitiatorRequestIndirect_t *agSSPInitiatorIndRequest = agNULL;
684 TD_ASSERT(tiRoot , "tiRoot");
685 TD_ASSERT(tiIORequest, "tiIORequest");
686 TD_ASSERT(tiDeviceHandle, "tiDeviceHandle");
687 TD_ASSERT(tiRequestBody, "tiRequestBody");
688 TD_ASSERT(tiRoot->tdData, "tiRoot->tdData");
689 TD_ASSERT(tiDeviceHandle, "tiDeviceHandle");
691 tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
692 TD_ASSERT(tdsaRoot, "tdsaRoot");
694 tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
695 TD_ASSERT(tdsaAllShared, "tdsaAllShared");
697 Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
698 TD_ASSERT(Initiator, "Initiator");
700 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
701 TD_ASSERT(oneDeviceData, "oneDeviceData");
705 smRoot = &(tdsaAllShared->smRoot);
706 TD_ASSERT(smRoot , "smRoot");
710 TI_DBG6(("tiINISuperIOStart: start\n"));
711 TI_DBG6(("tiINISuperIOStart:: ******* tdsaRoot %p tdsaAllShared %p \n", tdsaRoot,tdsaAllShared));
713 TI_DBG6(("tiINISuperIOStart: onedevicedata %p\n", oneDeviceData));
715 if (oneDeviceData == agNULL)
717 TI_DBG1(("tiINISuperIOStart: tiDeviceHandle=%p DeviceData is NULL\n", tiDeviceHandle ));
722 if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
723 oneDeviceData->tdPortContext == agNULL )
725 TI_DBG1(("tiINISuperIOStart: tiDeviceHandle=%p did %d DeviceData was removed\n", tiDeviceHandle, oneDeviceData->id));
726 TI_DBG6(("tiINISuperIOStart: device AddrHi 0x%08x AddrLo 0x%08x\n",
727 oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
729 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
730 tdIORequestBody->IOCompletionFunc = itdssIOForDebugging1Completed;
731 TI_DBG6(("tiINISuperIOStart: IOCompletionFunc %p\n", tdIORequestBody->IOCompletionFunc));
736 if (tiIORequest->osData == agNULL)
738 TI_DBG1(("tiINISuperIOStart: tiIORequest->osData is NULL, wrong\n"));
742 /* starting IO with SAS device */
743 if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
745 TI_DBG3(("tiINISuperIOStart: calling saSSPStart\n"));
747 agRoot = oneDeviceData->agRoot;
748 agDevHandle = oneDeviceData->agDevHandle;
750 /* OS layer has tdlayer data structure pointer in tdIORequestBody_t tdIOReqBody; in ccb_t in agtiapi.h */
751 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
754 /*the tdIORequestBody has been initialized in HwBuildIo routine */
755 /*osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));*/
757 /* let's initialize tdIOrequestBody */
758 /* initialize callback */
759 tdIORequestBody->IOCompletionFunc = itdssIOCompleted;
761 /* initialize tiDevhandle */
762 tdIORequestBody->tiDevHandle = tiDeviceHandle;
764 /* initialize tiIORequest */
765 tdIORequestBody->tiIORequest = tiIORequest;
767 /* save context if we need to abort later */
768 tiIORequest->tdData = tdIORequestBody;
770 /* initialize expDataLength */
771 tdIORequestBody->IOType.InitiatorRegIO.expDataLength
772 = tiScsiRequest->scsiCmnd.expDataLength;
774 tdIORequestBody->IOType.InitiatorRegIO.sglVirtualAddr
775 = tiScsiRequest->sglVirtualAddr;
777 /* initialize agIORequest */
778 agIORequest = &(tdIORequestBody->agIORequest);
779 agIORequest->osData = (void *) tdIORequestBody;
781 /* initialize tdIORequestBody_t tdIORequestBody -> agSASRequestBody */
782 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
783 agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq);
785 agSSPInitiatorRequest->flag = 0;
786 if (tiScsiRequest->flags & TI_SCSI_INITIATOR_ENCRYPT)
788 TI_DBG3(("tiINISuperIOStart: TI_SCSI_INITIATOR_ENCRYPT\n"));
790 /* Copy all of the relevant encrypt information */
791 agSSPInitiatorRequest->flag |= AGSA_SAS_ENABLE_ENCRYPTION;
792 TD_ASSERT( sizeof(tiEncrypt_t) == sizeof(agsaEncrypt_t) , "sizeof(tiEncrypt_t) == sizeof(agsaEncrypt_t)");
793 osti_memcpy(&agSSPInitiatorRequest->encrypt, &tiScsiRequest->Encrypt, sizeof(agsaEncrypt_t));
796 if ((tiScsiRequest->flags & TI_SCSI_INITIATOR_DIF) &&
797 (tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_READ_10 ||
798 tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_WRITE_10 ||
799 tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_WRITE_6 ||
800 tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_READ_6 ||
801 tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_READ_12 ||
802 tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_WRITE_12 ||
803 tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_WRITE_16 ||
804 tiScsiRequest->scsiCmnd.cdb[0] == SCSIOPC_READ_16 ))
806 TI_DBG3(("tiINISuperIOStart: TI_SCSI_INITIATOR_DIF\n"));
807 /* Copy all of the relevant DIF information */
808 agSSPInitiatorRequest->flag |= AGSA_SAS_ENABLE_DIF;
809 osti_memcpy(&agSSPInitiatorRequest->dif, &tiScsiRequest->Dif, sizeof(agsaDif_t));
811 /* Check if need to adjust dataLength. */
812 switch (tiScsiRequest->dataDirection)
814 case tiDirectionOut: /* Write/Outbound */
817 case tiDirectionIn: /* Read/Inbound */
818 if ((agSSPInitiatorRequest->dif.flags & DIF_ACTION_FLAG_MASK) == DIF_INSERT)
820 needPlusDataLenAdjustment = agTRUE;
825 /* Set SGL data len XXX This code needs to support more sector sizes */
826 /* Length adjustment for PCIe DMA only not SAS */
827 if (needPlusDataLenAdjustment == agTRUE)
829 adjusted_length = tiScsiRequest->scsiCmnd.expDataLength;
830 adjusted_length += (adjusted_length/512) * 8;
831 agSSPInitiatorRequest->dataLength = adjusted_length;
833 else if (needMinusDataLenAdjustment == agTRUE)
835 adjusted_length = tiScsiRequest->scsiCmnd.expDataLength;
836 adjusted_length -= (adjusted_length/520) * 8;
837 agSSPInitiatorRequest->dataLength = adjusted_length;
841 /* setting the data length */
842 agSSPInitiatorRequest->dataLength = tiScsiRequest->scsiCmnd.expDataLength;
845 /* initializes "agsaSgl_t agSgl" of "agsaDifSSPInitiatorRequest_t" */
846 tiStatus = itdssIOPrepareSGL(
849 &tiScsiRequest->agSgl1,
850 tiScsiRequest->sglVirtualAddr
852 TI_DBG2(("tiINISuperIOStart:TI_SCSI_INITIATOR_DIF needMinusDataLenAdjustment %d needPlusDataLenAdjustment %d difAction %X\n",
853 needMinusDataLenAdjustment,
854 needPlusDataLenAdjustment,
855 agSSPInitiatorRequest->dif.flags & DIF_ACTION_FLAG_MASK));
860 /* setting the data length */
861 agSSPInitiatorRequest->dataLength = tiScsiRequest->scsiCmnd.expDataLength;
863 /* initializes "agsaSgl_t agSgl" of "agsaSSPInitiatorRequest_t" */
864 tiStatus = itdssIOPrepareSGL(
867 &tiScsiRequest->agSgl1,
868 tiScsiRequest->sglVirtualAddr
872 if (tiStatus != tiSuccess)
874 TI_DBG1(("tiINISuperIOStart: can't get SGL\n"));
878 TI_DBG6(("tiINISuperIOStart: tiScsiRequest->scsiCmnd.expDataLength %d\n", tiScsiRequest->scsiCmnd.expDataLength));
880 /* process taskattribute */
881 if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_SIMPLE)
883 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
884 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_SIMPLE;
886 else if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_ORDERED)
888 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
889 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_ORDERED;
891 else if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_HEAD_OF_QUEUE)
893 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
894 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_HEAD_OF_QUEUE;
896 else if (tiScsiRequest->scsiCmnd.taskAttribute == TASK_ACA)
898 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute = (bit8)
899 agSSPInitiatorRequest->sspCmdIU.efb_tp_taskAttribute | TD_TASK_ACA;
903 osti_memcpy(agSSPInitiatorRequest->sspCmdIU.cdb, tiScsiRequest->scsiCmnd.cdb, 16);
905 osti_memcpy(agSSPInitiatorRequest->sspCmdIU.lun, tiScsiRequest->scsiCmnd.lun.lun, 8);
906 #ifdef CCBUILD_INDIRECT_CDB
907 /* check the Indirect CDB flag */
908 if (tiScsiRequest->flags & TI_SCSI_INITIATOR_INDIRECT_CDB)
911 if (tiScsiRequest->dataDirection == tiDirectionIn)
913 agRequestType = AGSA_SSP_INIT_READ_INDIRECT;
914 TI_DBG6(("tiINISuperIOStart: Indirect READ\n"));
916 else if (tiScsiRequest->dataDirection == tiDirectionOut)
918 agRequestType = AGSA_SSP_INIT_WRITE_INDIRECT;
919 TI_DBG6(("tiINISuperIOStart: Indirect WRITE\n"));
923 agRequestType = AGSA_REQ_TYPE_UNKNOWN;
924 TI_DBG1(("tiINISuperIOStart: unknown data direction\n"));
926 agSSPInitiatorIndRequest = &(agSASRequestBody->sspInitiatorReqIndirect);
927 /* copy the constructed SSPIU info to indirect SSPIU buffer */
928 osti_memcpy(tiScsiRequest->IndCDBBuffer, &agSSPInitiatorRequest->sspCmdIU, sizeof(agsaSSPCmdInfoUnit_t));
929 /* initialize the indirect CDB buffer address and length */
930 agSSPInitiatorIndRequest->sspInitiatorReqAddrLower32 = tiScsiRequest->IndCDBLowAddr;
931 agSSPInitiatorIndRequest->sspInitiatorReqAddrUpper32 = tiScsiRequest->IndCDBHighAddr;
932 agSSPInitiatorIndRequest->sspInitiatorReqLen = sizeof(agsaSSPCmdInfoUnit_t);
935 #endif //CCBUILD_INDIRECT_CDB
938 if (tiScsiRequest->dataDirection == tiDirectionIn)
940 agRequestType = AGSA_SSP_INIT_READ;
941 TI_DBG6(("tiINISuperIOStart: READ\n"));
943 else if (tiScsiRequest->dataDirection == tiDirectionOut)
945 agRequestType = AGSA_SSP_INIT_WRITE;
946 TI_DBG6(("tiINISuperIOStart: WRITE\n"));
950 agRequestType = AGSA_REQ_TYPE_UNKNOWN;
951 TI_DBG1(("tiINISuperIOStart: unknown data direction\n"));
955 tdIORequestBody->agRequestType = agRequestType;
957 TI_DBG6(("tiINISuperIOStart: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
958 TI_DBG6(("tiINISuperIOStart: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
962 if (tdIORequestBody->IOCompletionFunc == agNULL)
964 TI_DBG1(("tiINISuperIOStart: Error!!!! IOCompletionFunc is NULL\n"));
968 saStatus = saSSPStart(agRoot,
970 tdsaRotateQnumber(tiRoot, oneDeviceData),
977 if (saStatus == AGSA_RC_SUCCESS)
979 Initiator->NumIOsActive++;
980 tdIORequestBody->ioStarted = agTRUE;
981 tdIORequestBody->ioCompleted = agFALSE;
982 tiStatus = tiSuccess;
986 tdIORequestBody->ioStarted = agFALSE;
987 tdIORequestBody->ioCompleted = agTRUE;
988 if (saStatus == AGSA_RC_BUSY)
990 TI_DBG4(("tiINISuperIOStart: saSSPStart busy\n"));
1001 else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
1003 TI_DBG5(("tiINISuperIOStart: calling satIOStart\n"));
1004 TI_DBG5(("tiINISuperIOStart: onedevicedata did %d\n", oneDeviceData->id));
1005 TI_DBG5(("tiINISuperIOStart: SATA sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
1006 TI_DBG5(("tiINISuperIOStart: SATA sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
1008 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
1010 /* the tdIORequestBody has been initialized by Storport in SRB Extension */
1011 /*osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));*/
1012 /* initialize tiDevhandle */
1013 tdIORequestBody->tiDevHandle = tiDeviceHandle;
1014 tdIORequestBody->superIOFlag = agTRUE;
1016 tiIORequest->tdData = tdIORequestBody;
1017 tdIORequestBody->tiIORequest = tiIORequest;
1018 smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
1019 smIORequest->tdData = tdIORequestBody;
1020 smIORequest->smData = &tdIORequestBody->smIORequestBody;
1022 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
1023 smDeviceHandle->tdData = oneDeviceData;
1025 smSuperSCSIRequest = (smSuperScsiInitiatorRequest_t *)&(tdIORequestBody->SM.smSuperSCSIRequest);
1026 osti_memcpy(smSuperSCSIRequest, tiScsiRequest, sizeof(smSuperScsiInitiatorRequest_t));
1028 tiStatus = smSuperIOStart(smRoot,
1032 oneDeviceData->SASAddressID.sasAddressHi,
1033 oneDeviceData->SASAddressID.sasAddressLo,
1038 else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
1041 TI_DBG5(("tiINISuperIOStart: calling satIOStart\n"));
1042 TI_DBG5(("tiINISuperIOStart: onedevicedata did %d\n", oneDeviceData->id));
1045 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
1048 osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
1050 /* initialize tiDevhandle */
1051 tdIORequestBody->tiDevHandle = tiDeviceHandle;
1053 /* initialize tiIORequest */
1054 tdIORequestBody->tiIORequest = tiIORequest;
1055 tdIORequestBody->IOCompletionFunc = itdssIOForDebugging2Completed;
1057 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
1060 * Need to initialize all the fields within satIOContext except
1061 * reqType and satCompleteCB which will be set in sat.c depending on cmd.
1063 tdIORequestBody->transport.SATA.tiSenseData.senseData = agNULL;
1064 tdIORequestBody->transport.SATA.tiSenseData.senseLen = 0;
1065 satIOContext->pSatDevData = &oneDeviceData->satDevData;
1066 satIOContext->pFis =
1067 &tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev;
1068 satIOContext->pScsiCmnd = &tiScsiRequest->scsiCmnd;
1069 satIOContext->pSense = &tdIORequestBody->transport.SATA.sensePayload;
1070 satIOContext->pTiSenseData = &tdIORequestBody->transport.SATA.tiSenseData;
1071 satIOContext->pTiSenseData->senseData = satIOContext->pSense;
1072 /* satIOContext->pSense = (scsiRspSense_t *)satIOContext->pTiSenseData->senseData; */
1073 satIOContext->tiRequestBody = tiRequestBody;
1074 satIOContext->interruptContext = interruptContext;
1075 satIOContext->ptiDeviceHandle = tiDeviceHandle;
1077 This code uses a kludge for the tiScsiXchg. Many subroutines in the SATA code
1078 require a tiScsiInitiatorRequest. Since it would be a lot of work to replicate
1079 those functions for a tiSuperScsiInitiatorRequest, we will use a short cut.
1080 The standard pointer will be passed, but the superIOFlag marks the real type of the structure.
1082 satIOContext->tiScsiXchg = tiScsiRequest;
1083 satIOContext->superIOFlag = agTRUE;
1085 satIOContext->satIntIoContext = agNULL;
1086 satIOContext->satOrgIOContext = agNULL;
1087 /* satIOContext->tiIORequest = tiIORequest; */
1089 /* save context if we need to abort later */
1090 tiIORequest->tdData = tdIORequestBody;
1092 /* followings are used only for internal IO */
1093 satIOContext->currentLBA = 0;
1094 satIOContext->OrgTL = 0;
1096 TI_DBG5(("tiINISuperIOStart: pSatDevData=%p\n", satIOContext->pSatDevData ));
1098 tiStatus = satIOStart( tiRoot,
1101 satIOContext->tiScsiXchg,
1107 #endif /* else of FDS_SM */
1112 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
1113 tdIORequestBody->IOCompletionFunc = itdssIOForDebugging3Completed;
1114 TI_DBG1(("tiINISuperIOStart: wrong unspported Device %d\n", oneDeviceData->DeviceType));
1116 error. unsupported IO
1125 tiIORequest_t *tiIORequest,
1126 tiDeviceHandle_t *tiDeviceHandle,
1127 tiSMPFrame_t *tiSMPFrame,
1129 bit32 interruptContext
1132 tdsaDeviceData_t *oneDeviceData;
1133 agsaIORequest_t *agIORequest = agNULL;
1134 tdIORequestBody_t *tdSMPRequestBody = agNULL;
1135 agsaRoot_t *agRoot = agNULL;
1136 agsaDevHandle_t *agDevHandle = agNULL;
1137 agsaSASRequestBody_t *agRequestBody = agNULL;
1138 agsaSMPFrame_t *agSMPFrame = agNULL;
1139 bit32 agRequestType;
1140 bit32 tiStatus = tiError;
1141 bit32 saStatus = AGSA_RC_FAILURE;
1143 TDSA_INP_ENTER(tiRoot);
1144 TI_DBG6(("tiINISMPStart: start\n"));
1145 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
1146 TI_DBG6(("tiINISMPStart: onedevicedata %p\n", oneDeviceData));
1147 TI_DBG6(("tiINISMPStart: tiDeviceHandle %p\n", tiDeviceHandle));
1148 if (oneDeviceData == agNULL)
1150 TI_DBG1(("tiINISMPStart: tiDeviceHandle=%p Expander DeviceData is NULL\n", tiDeviceHandle ));
1153 if (tiIORequest->osData == agNULL)
1155 TI_DBG1(("tiINISMPStart: tiIORequest->osData is NULL, wrong\n"));
1158 agRoot = oneDeviceData->agRoot;
1159 agDevHandle = oneDeviceData->agDevHandle;
1160 tdSMPRequestBody = (tdIORequestBody_t *)tiSMPBody;
1161 tdSMPRequestBody->tiIORequest = tiIORequest;
1162 tiIORequest->tdData = tdSMPRequestBody;
1163 agIORequest = &(tdSMPRequestBody->agIORequest);
1164 agIORequest->osData = (void *) tdSMPRequestBody;
1165 agRequestBody = &(tdSMPRequestBody->transport.SAS.agSASRequestBody);
1166 agSMPFrame = &(agRequestBody->smpFrame);
1167 if (!DEVICE_IS_SMP_TARGET(oneDeviceData))
1169 TI_DBG1(("tiINISMPStart: Target Device is not SMP device\n"));
1172 if (tiSMPFrame->flag == 0) // define DIRECT SMP at td layer?
1174 TI_DBG6(("tiINISMPStart: Direct SMP\n"));
1175 agSMPFrame->outFrameBuf = tiSMPFrame->outFrameBuf;
1176 agSMPFrame->outFrameLen = tiSMPFrame->outFrameLen;
1177 tdhexdump("tiINISMPStart agSMPFrame", (bit8 *)agSMPFrame->outFrameBuf, agSMPFrame->outFrameLen);
1178 agSMPFrame->expectedRespLen = tiSMPFrame->expectedRespLen;
1179 agSMPFrame->inFrameLen = 0;
1180 agSMPFrame->flag = tiSMPFrame->flag;
1181 agRequestType = AGSA_SMP_INIT_REQ;
1183 saStatus = saSMPStart(agRoot,
1189 &ossaSMPCAMCompleted
1191 if (saStatus == AGSA_RC_SUCCESS)
1193 tiStatus = tiSuccess;
1197 if (saStatus == AGSA_RC_BUSY)
1199 TI_DBG1(("tiINISMPStart: saSSPStart busy\n"));
1204 TI_DBG1(("tiINISMPStart: saSSPStart error\n"));
1212 TI_DBG1(("tiINISMPStart: Indirect SMP! Not supported yet\n"));
1217 #ifdef TD_INT_COALESCE
1219 tiINIIOStartIntCoalesce(
1221 tiIORequest_t *tiIORequest,
1222 tiDeviceHandle_t *tiDeviceHandle,
1223 tiScsiInitiatorRequest_t *tiScsiRequest,
1224 void *tiRequestBody,
1225 bit32 interruptContext,
1226 tiIntCoalesceContext_t *tiIntCoalesceCxt
1229 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1230 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1231 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
1232 tdsaDeviceData_t *oneDeviceData;
1233 agsaRoot_t *agRoot = agNULL;
1234 agsaIORequest_t *agIORequest = agNULL;
1235 agsaDevHandle_t *agDevHandle = agNULL;
1236 bit32 agRequestType;
1237 agsaSASRequestBody_t *agSASRequestBody = agNULL;
1238 bit32 tiStatus = tiError;
1239 bit32 saStatus = AGSA_RC_FAILURE;
1241 tdIORequestBody_t *tdIORequestBody;
1242 agsaSSPInitiatorRequest_t *agSSPInitiatorRequest;
1243 tdsaIntCoalesceContext_t *tdsaIntCoalCxt;
1244 agsaIntCoalesceContext_t *agIntCoalCxt;
1246 TI_DBG1(("tiINIIOStartIntCoalesce: start\n"));
1247 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
1249 TI_DBG6(("tiINIIOStartIntCoalesce: onedevicedata %p\n", oneDeviceData));
1251 if(oneDeviceData == agNULL)
1253 TI_DBG1(("tiINIIOStartIntCoalesce: tiDeviceHandle=%p DeviceData is NULL\n", tiDeviceHandle ));
1254 return tiIONoDevice;
1257 /* starting IO with SAS device */
1258 if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
1260 TI_DBG6(("tiINIIOStartIntCoalesce: calling saSSPStart\n"));
1262 agRoot = oneDeviceData->agRoot;
1263 agDevHandle = oneDeviceData->agDevHandle;
1265 /* OS layer has tdlayer data structure pointer in
1266 tdIORequestBody_t tdIOReqBody;
1267 in ccb_t in agtiapi.h
1269 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
1271 /* let's initialize tdIOrequestBody */
1272 /* initialize callback */
1273 tdIORequestBody->IOCompletionFunc = itdssIOCompleted;
1275 /* initialize tiDevhandle */
1276 tdIORequestBody->tiDevHandle = tiDeviceHandle;
1278 /* initialize tiIORequest */
1279 tdIORequestBody->tiIORequest = tiIORequest;
1281 /* save context if we need to abort later */
1282 tiIORequest->tdData = tdIORequestBody;
1284 /* initialize expDataLength */
1285 tdIORequestBody->IOType.InitiatorRegIO.expDataLength
1286 = tiScsiRequest->scsiCmnd.expDataLength;
1288 /* initializes "agsaSgl_t agSgl" of "agsaDifSSPInitiatorRequest_t" */
1289 tiStatus = itdssIOPrepareSGL(
1292 &tiScsiRequest->agSgl1,
1293 tiScsiRequest->sglVirtualAddr
1296 if (tiStatus != tiSuccess)
1298 TI_DBG1(("tiINIIOStartIntCoalesce: can't get SGL\n"));
1303 /* initialize agIORequest */
1304 agIORequest = &(tdIORequestBody->agIORequest);
1305 agIORequest->osData = (void *) tdIORequestBody;
1306 agIORequest->sdkData = agNULL; /* LL takes care of this */
1311 tdIORequestBody_t tdIORequestBody -> agSASRequestBody
1313 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
1314 agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq);
1317 /* copy cdb bytes */
1318 osti_memcpy(agSSPInitiatorRequest->sspCmdIU.cdb, tiScsiRequest->scsiCmnd.cdb, 16);
1320 /* copy lun field */
1321 osti_memcpy(agSSPInitiatorRequest->sspCmdIU.lun,
1322 tiScsiRequest->scsiCmnd.lun.lun, 8);
1324 /* setting the data length */
1325 agSSPInitiatorRequest->dataLength = tiScsiRequest->scsiCmnd.expDataLength;
1326 TI_DBG6(("tiINIIOStartIntCoalesce: tiScsiRequest->scsiCmnd.expDataLength %d\n", tiScsiRequest->scsiCmnd.expDataLength));
1328 agSSPInitiatorRequest->firstBurstSize = 0;
1330 if (tiScsiRequest->dataDirection == tiDirectionIn)
1332 agRequestType = AGSA_SSP_INIT_READ;
1333 TI_DBG6(("tiINIIOStartIntCoalesce: READ\n"));
1335 else if (tiScsiRequest->dataDirection == tiDirectionOut)
1337 agRequestType = AGSA_SSP_INIT_WRITE;
1338 TI_DBG6(("tiINIIOStartIntCoalesce: WRITE\n"));
1342 agRequestType = AGSA_REQ_TYPE_UNKNOWN;
1343 TI_DBG1(("tiINIIOStartIntCoalesce: unknown data direction\n"));
1346 tdIORequestBody->agRequestType = agRequestType;
1348 tdsaIntCoalCxt = (tdsaIntCoalesceContext_t *)tiIntCoalesceCxt->tdData;
1349 agIntCoalCxt = &(tdsaIntCoalCxt->agIntCoalCxt);
1353 #ifdef LL_INT_COALESCE
1354 saStatus = saSSPStartIntCoalesce(agRoot,
1363 tdIORequestBody->ioStarted = agTRUE;
1364 tdIORequestBody->ioCompleted = agFALSE;
1366 if (saStatus == AGSA_RC_SUCCESS)
1368 Initiator->NumIOsActive++;
1369 tiStatus = tiSuccess;
1373 TI_DBG1(("tiINIIOStartIntCoalesce: saSSPStart failed\n"));
1374 tdIORequestBody->ioStarted = agFALSE;
1375 tdIORequestBody->ioCompleted = agTRUE;
1376 if (saStatus == AGSA_RC_BUSY)
1388 else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
1391 satIOStart() -> saSATAStartIntCoalesce()
1393 TI_DBG1(("tiINIIOStartIntCoalesce: SATA not supported yet\n"));
1398 TI_DBG1(("tiINIIOStartIntCoalesce: wrong unspported Device %d\n", oneDeviceData->DeviceType));
1400 error. unsupported IO
1409 tiINIIOStartIntCoalesceDif(
1411 tiIORequest_t *tiIORequest,
1412 tiDeviceHandle_t *tiDeviceHandle,
1413 tiScsiInitiatorRequest_t *tiScsiRequest,
1414 void *tiRequestBody,
1415 bit32 interruptContext,
1416 tiIntCoalesceContext_t *tiIntCoalesceCxt,
1420 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1421 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1422 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
1423 tdsaDeviceData_t *oneDeviceData;
1424 agsaRoot_t *agRoot = agNULL;
1425 agsaIORequest_t *agIORequest = agNULL;
1426 agsaDevHandle_t *agDevHandle = agNULL;
1427 bit32 agRequestType;
1428 agsaDifSSPRequestBody_t *agEdcSSPRequestBody = agNULL;
1429 bit32 tiStatus = tiError;
1430 bit32 saStatus = AGSA_RC_FAILURE;
1432 tdIORequestBody_t *tdIORequestBody;
1433 agsaDifSSPInitiatorRequest_t *agEdcSSPInitiatorRequest;
1435 bit32 agUpdateMask = 0;
1436 bit32 agVerifyMask = 0;
1437 tdsaIntCoalesceContext_t *tdsaIntCoalCxt;
1438 agsaIntCoalesceContext_t *agIntCoalCxt;
1440 TI_DBG1(("tiINIIOStartIntCoalesceDif: start\n"));
1441 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
1443 TI_DBG6(("tiINIIOStartIntCoalesceDif: onedevicedata %p\n", oneDeviceData));
1445 if(oneDeviceData == agNULL)
1447 TI_DBG1(("tiINIIOStartIntCoalesceDif: tiDeviceHandle=%p DeviceData is NULL\n", tiDeviceHandle ));
1448 return tiIONoDevice;
1451 /* starting IO with SAS device */
1452 if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
1454 TI_DBG6(("tiINIIOStartIntCoalesceDif: calling saSSPStart\n"));
1456 agRoot = oneDeviceData->agRoot;
1457 agDevHandle = oneDeviceData->agDevHandle;
1459 /* OS layer has tdlayer data structure pointer in
1460 tdIORequestBody_t tdIOReqBody;
1461 in ccb_t in agtiapi.h
1463 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
1465 /* let's initialize tdIOrequestBody */
1466 /* initialize callback */
1467 tdIORequestBody->IOCompletionFunc = itdssIOCompleted;
1469 /* initialize tiDevhandle */
1470 tdIORequestBody->tiDevHandle = tiDeviceHandle;
1472 /* initialize tiIORequest */
1473 tdIORequestBody->tiIORequest = tiIORequest;
1475 /* save context if we need to abort later */
1476 tiIORequest->tdData = tdIORequestBody;
1478 /* initialize expDataLength */
1479 tdIORequestBody->IOType.InitiatorRegIO.expDataLength
1480 = tiScsiRequest->scsiCmnd.expDataLength;
1482 /* initializes "agsaSgl_t agSgl" of "agsaDifSSPInitiatorRequest_t" */
1483 tiStatus = itdssIOPrepareSGL(
1486 &tiScsiRequest->agSgl1,
1487 tiScsiRequest->sglVirtualAddr
1490 if (tiStatus != tiSuccess)
1492 TI_DBG1(("tiINIIOStartIntCoalesceDif: can't get SGL\n"));
1497 /* initialize agIORequest */
1498 agIORequest = &(tdIORequestBody->agIORequest);
1499 agIORequest->osData = (void *) tdIORequestBody;
1500 agIORequest->sdkData = agNULL; /* LL takes care of this */
1505 tdIORequestBody_t tdIORequestBody -> agSASRequestBody
1507 agEdcSSPRequestBody = &(tdIORequestBody->transport.SAS.agEdcSSPRequestBody);
1508 agEdcSSPInitiatorRequest = &(agEdcSSPRequestBody->edcSSPInitiatorReq);
1511 /* copy cdb bytes */
1512 osti_memcpy(agEdcSSPInitiatorRequest->sspCmdIU.cdb, tiScsiRequest->scsiCmnd.cdb, 16);
1514 /* copy lun field */
1515 osti_memcpy(agEdcSSPInitiatorRequest->sspCmdIU.lun,
1516 tiScsiRequest->scsiCmnd.lun.lun, 8);
1519 /* setting the data length */
1520 agEdcSSPInitiatorRequest->dataLength = tiScsiRequest->scsiCmnd.expDataLength;
1521 TI_DBG6(("tiINIIOStartIntCoalesceDif: tiScsiRequest->scsiCmnd.expDataLength %d\n", tiScsiRequest->scsiCmnd.expDataLength));
1523 agEdcSSPInitiatorRequest->firstBurstSize = 0;
1526 if (tiScsiRequest->dataDirection == tiDirectionIn)
1528 agRequestType = AGSA_SSP_INIT_READ;
1529 TI_DBG1(("tiINIIOStartIntCoalesceDif: READ difAction %X\n",difOption->difAction));
1531 else if (tiScsiRequest->dataDirection == tiDirectionOut)
1533 agRequestType = AGSA_SSP_INIT_WRITE;
1534 TI_DBG1(("tiINIIOStartIntCoalesceDif: WRITE difAction %X\n",difOption->difAction));
1538 agRequestType = AGSA_REQ_TYPE_UNKNOWN;
1539 TI_DBG1(("tiINIIOStartIntCoalesceDif: unknown data direction\n"));
1542 tdIORequestBody->agRequestType = agRequestType;
1544 /* process interrupt coalesce context */
1545 tdsaIntCoalCxt = (tdsaIntCoalesceContext_t *)tiIntCoalesceCxt->tdData;
1546 agIntCoalCxt = &(tdsaIntCoalCxt->agIntCoalCxt);
1550 agEdc = &(agEdcSSPInitiatorRequest->edc);
1552 osti_memset(agEdc, 0, sizeof(agsaDif_t));
1554 /* setting edcFlag */
1555 if (difOption->enableBlockCount)
1557 /* enables block count; bit5 */
1558 agEdc->edcFlag = agEdc->edcFlag | 0x20; /* 0010 0000 */
1561 if (difOption->enableCrc)
1563 /* enables CRC verification; bit6 */
1564 agEdc->edcFlag = agEdc->edcFlag | 0x40; /* 0100 0000 */
1567 if (difOption->enableIOSeed)
1571 if (difOption->difAction == DIF_INSERT)
1573 /* bit 0 - 2; 000 */
1574 agEdc->edcFlag = agEdc->edcFlag & 0xFFFFFFF8;
1576 else if (difOption->difAction == DIF_VERIFY_FORWARD)
1578 /* bit 0 - 2; 001 */
1579 agEdc->edcFlag = agEdc->edcFlag | 0x01;
1581 else if (difOption->difAction == DIF_VERIFY_DELETE)
1583 /* bit 0 - 2; 010 */
1584 agEdc->edcFlag = agEdc->edcFlag | 0x02;
1588 /* DIF_VERIFY_REPLACE */
1589 /* bit 0 - 2; 011 */
1590 agEdc->edcFlag = agEdc->edcFlag | 0x04;
1593 /* set Update Mask; bit 16-21 */
1594 agUpdateMask = (difOption->tagUpdateMask) & 0x3F; /* 0011 1111 */
1595 agUpdateMask = agUpdateMask << 16;
1596 agEdc->edcFlag = agEdc->edcFlag | agUpdateMask;
1598 /* set Verify Mask bit 24-29 */
1599 agVerifyMask = (difOption->tagVerifyMask) & 0x3F; /* 0011 1111 */
1600 agVerifyMask = agVerifyMask << 24;
1601 agEdc->edcFlag = agEdc->edcFlag | agVerifyMask;
1603 agEdc->appTag = difOption->udtArray[0];
1604 agEdc->appTag = (agEdc->appTag << 8) | difOption->udtArray[1];
1606 agEdc->lbaReferenceTag = difOption->udtArray[2];
1607 agEdc->lbaReferenceTag = (agEdc->lbaReferenceTag << 8) | difOption->udtArray[3];
1608 agEdc->lbaReferenceTag = (agEdc->lbaReferenceTag << 8) | difOption->udtArray[4];
1609 agEdc->lbaReferenceTag = (agEdc->lbaReferenceTag << 8) | difOption->udtArray[5];
1611 /* currently TISA supports only 512 logical block size */
1612 agEdc->lbSize = 512;
1615 #ifdef LL_INT_COALESCE
1616 saStatus = saSSPStartIntCoalesceEdc(agRoot,
1621 agEdcSSPRequestBody,
1625 tdIORequestBody->ioStarted = agTRUE;
1626 tdIORequestBody->ioCompleted = agFALSE;
1628 if (saStatus == AGSA_RC_SUCCESS)
1630 Initiator->NumIOsActive++;
1631 tiStatus = tiSuccess;
1635 TI_DBG1(("tiINIIOStartIntCoalesceDif: saSSPStart failed\n"));
1636 tdIORequestBody->ioStarted = agFALSE;
1637 tdIORequestBody->ioCompleted = agTRUE;
1638 if (saStatus == AGSA_RC_BUSY)
1649 else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
1652 satIOStart() -> saSATAStartIntCoalesceEdc()
1654 TI_DBG1(("tiINIIOStartIntCoalesceDif: SATA not supported yet\n"));
1659 TI_DBG1(("tiINIIOStartIntCoalesceDif: wrong unspported Device %d\n", oneDeviceData->DeviceType));
1661 error. unsupported IO
1669 tiINIIntCoalesceInit(
1671 tiIntCoalesceContext_t *tiIntCoalesceCxt,
1676 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1677 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1678 agsaRoot_t *agRoot = agNULL;
1679 tdsaIntCoalesceContext_t *tdsaIntCoalCxtHead
1680 = (tdsaIntCoalesceContext_t *)tdsaAllShared->IntCoalesce;
1681 tdsaIntCoalesceContext_t *tdsaIntCoalCxt;
1682 agsaIntCoalesceContext_t *agIntCoalCxt;
1683 tdList_t *tdsaIntCoalCxtList = agNULL;
1685 bit32 tiStatus = tiError;
1687 TI_DBG1(("tiINIIntCoalesceInit: start\n"));
1689 tdsaSingleThreadedEnter(tiRoot, TD_INTCOAL_LOCK);
1690 if (TDLIST_NOT_EMPTY(&(tdsaIntCoalCxtHead->FreeLink)))
1692 TDLIST_DEQUEUE_FROM_HEAD(&tdsaIntCoalCxtList, &(tdsaIntCoalCxtHead->FreeLink));
1693 tdsaSingleThreadedLeave(tiRoot, TD_INTCOAL_LOCK);
1695 = TDLIST_OBJECT_BASE(tdsaIntCoalesceContext_t, FreeLink, tdsaIntCoalCxtList);
1697 TI_DBG1(("tiINIIntCoalesceInit: id %d\n", tdsaIntCoalCxt->id));
1699 agRoot = &(tdsaAllShared->agRootNonInt);
1701 agIntCoalCxt = &(tdsaIntCoalCxt->agIntCoalCxt);
1702 tdsaIntCoalCxt->tiIntCoalesceCxt = tiIntCoalesceCxt;
1703 tiIntCoalesceCxt->tdData = tdsaIntCoalCxt;
1704 agIntCoalCxt->osData = tdsaIntCoalCxt;
1706 tdsaSingleThreadedEnter(tiRoot, TD_INTCOAL_LOCK);
1707 TDLIST_ENQUEUE_AT_TAIL(&(tdsaIntCoalCxt->MainLink), &(tdsaIntCoalCxtHead->MainLink));
1708 tdsaSingleThreadedLeave(tiRoot, TD_INTCOAL_LOCK);
1711 note: currently asynchronously call is assumed. In other words,
1712 "ossaIntCoalesceInitCB()" -> "ostiInitiatorCoalesceInitCB()" are used
1714 #ifdef LL_INT_COALESCE
1715 tiStatus = saIntCoalesceInit(agRoot, agIntCoalCxt, count);
1718 TI_DBG6(("tiINIIntCoalesceInit: status %d\n", tiStatus));
1723 tdsaSingleThreadedLeave(tiRoot, TD_INTCOAL_LOCK);
1724 TI_DBG1(("tiINIIntCoalesceInit: no more interrupt coalesce context; return fail\n"));
1728 #endif /* TD_INT_COALESCE */
1730 /*****************************************************************************
1731 *! \brief itdssIOPrepareSGL
1733 * Purpose: This function is called to translate TISA SGL information to the
1736 * \param tiRoot: Pointer to initiator driver/port instance.
1737 * \param IORequestBody: TD layer request body for the I/O.
1738 * \param tiSgl1: First TISA SGL info.
1739 * \param sglVirtualAddr: The virtual address of the first element in
1740 * tiSgl1 when tiSgl1 is used with the type tiSglList.
1744 * tiSuccess: SGL initialized successfully.
1745 * tiError: Failed to initialize SGL.
1748 *****************************************************************************/
1749 osGLOBAL FORCEINLINE bit32
1752 tdIORequestBody_t *tdIORequestBody,
1754 void *sglVirtualAddr
1759 TI_DBG6(("itdssIOPrepareSGL: start\n"));
1761 agSgl = &(tdIORequestBody->transport.SAS.agSASRequestBody.sspInitiatorReq.agSgl);
1765 if (tiSgl1 == agNULL)
1767 TI_DBG1(("itdssIOPrepareSGL: Error tiSgl1 is NULL\n"));
1771 if (tdIORequestBody->IOType.InitiatorRegIO.expDataLength == 0)
1773 TI_DBG6(("itdssIOPrepareSGL: expDataLength is 0\n"));
1777 CLEAR_ESGL_EXTEND(agSgl->extReserved);
1781 agSgl->sgUpper = tiSgl1->upper;
1782 agSgl->sgLower = tiSgl1->lower;
1783 agSgl->len = tiSgl1->len;
1784 agSgl->extReserved = tiSgl1->type;
1792 tiIORequest_t *tiIORequest,
1793 tiDeviceHandle_t *tiDeviceHandle,
1794 void *tiRequestBody,
1795 tiIOCTLPayload_t *agIOCTLPayload,
1800 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1801 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1802 agsaRoot_t *agRoot = &(tdsaAllShared->agRootInt);
1803 void *respBuffer = agNULL;
1804 void *osMemHandle = agNULL;
1805 bit32 ostiMemoryStatus = 0;
1806 tdsaDeviceData_t *oneDeviceData = agNULL;
1807 agsaSSPInitiatorRequest_t *agSSPFrame = agNULL;
1808 bit32 status = IOCTL_CALL_SUCCESS;
1809 bit32 agRequestType = 0;
1810 agsaDevHandle_t *agDevHandle = agNULL;
1811 agsaIORequest_t *agIORequest = agNULL;
1812 tdIORequestBody_t *tdIORequestBody = agNULL;
1813 agsaSASRequestBody_t *agSASRequestBody = agNULL;
1817 if((tiIORequest == agNULL) || (tiRequestBody == agNULL))
1819 status = IOCTL_CALL_FAIL;
1822 tdIORequestBody = (tdIORequestBody_t *)tiRequestBody;
1824 if(tdIORequestBody == agNULL)
1826 status = IOCTL_CALL_FAIL;
1829 tdIORequestBody->tiIORequest = tiIORequest;
1831 /* save context if we need to abort later */
1832 tiIORequest->tdData = tdIORequestBody;
1834 agIORequest = &(tdIORequestBody->agIORequest);
1835 agIORequest->osData = (void *) tdIORequestBody;
1836 agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
1837 agSSPFrame = &(agSASRequestBody->sspInitiatorReq);
1839 ostiMemoryStatus = ostiAllocMemory( tiRoot,
1841 (void **)&respBuffer,
1842 &(agSSPFrame->agSgl.sgUpper),
1843 &(agSSPFrame->agSgl.sgLower),
1847 if((ostiMemoryStatus != tiSuccess) && (respBuffer == agNULL ))
1849 status = IOCTL_CALL_FAIL;
1853 osti_memset((void *)respBuffer, 0, REPORT_LUN_LEN);
1855 // use FW control place in shared structure to keep the neccesary information
1856 tdsaAllShared->tdFWControlEx.virtAddr = respBuffer;
1857 tdsaAllShared->tdFWControlEx.len = REPORT_LUN_LEN;
1858 tdsaAllShared->tdFWControlEx.param1 = agParam1;
1859 tdsaAllShared->tdFWControlEx.param2 = agParam2;
1860 tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
1861 tdsaAllShared->tdFWControlEx.inProgress = 1;
1862 agRequestType = AGSA_SSP_INIT_READ;
1864 status = IOCTL_CALL_PENDING;
1865 oneDeviceData = (tdsaDeviceData_t *)(tiDeviceHandle->tdData);
1866 agDevHandle = oneDeviceData->agDevHandle;
1868 agSSPFrame->sspCmdIU.cdb[0] = REPORT_LUN_OPCODE;
1869 agSSPFrame->sspCmdIU.cdb[1] = 0x0;
1870 agSSPFrame->sspCmdIU.cdb[2] = 0x0;
1871 agSSPFrame->sspCmdIU.cdb[3] = 0x0;
1872 agSSPFrame->sspCmdIU.cdb[4] = 0x0;
1873 agSSPFrame->sspCmdIU.cdb[5] = 0x0;
1874 agSSPFrame->sspCmdIU.cdb[6] = 0x0;
1875 agSSPFrame->sspCmdIU.cdb[7] = 0x0;
1876 agSSPFrame->sspCmdIU.cdb[8] = 0x0;
1877 agSSPFrame->sspCmdIU.cdb[9] = REPORT_LUN_LEN;
1878 agSSPFrame->sspCmdIU.cdb[10] = 0x0;
1879 agSSPFrame->sspCmdIU.cdb[11] = 0x0;
1881 agSSPFrame->dataLength = REPORT_LUN_LEN;
1882 agSSPFrame->agSgl.len = sizeof(agsaSSPCmdInfoUnit_t);
1884 status = saSSPStart(agRoot, agIORequest, 0, agDevHandle, agRequestType,agSASRequestBody,agNULL,
1885 &ossaSSPIoctlCompleted);
1886 if(status != AGSA_RC_SUCCESS)
1888 ostiFreeMemory(tiRoot,
1889 tdsaAllShared->tdFWControlEx.virtAddr,
1890 tdsaAllShared->tdFWControlEx.len);
1891 tdsaAllShared->tdFWControlEx.payload = NULL;
1892 tdsaAllShared->tdFWControlEx.inProgress = 0;
1893 status = IOCTL_CALL_FAIL;