xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/sasata.c (revision 7877fdebeeb35fad1cbbafce22598b1bdf97c786)
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 ********************************************************************************/
22 /*******************************************************************************/
23 /*! \file sasata.c
24  *  \brief The file implements the functions to SATA IO
25  *
26  */
27 /******************************************************************************/
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30 #include <dev/pms/config.h>
31 
32 #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
33 #ifdef SA_ENABLE_TRACE_FUNCTIONS
34 #ifdef siTraceFileID
35 #undef siTraceFileID
36 #endif
37 #define siTraceFileID 'M'
38 #endif
39 
40 /******************************************************************************/
41 /*! \brief Start SATA command
42  *
43  *  Start SATA command
44  *
45  *  \param agRoot handles for this instance of SAS/SATA hardware
46  *  \param queueNum
47  *  \param agIORequest
48  *  \param agDevHandle
49  *  \param agRequestType
50  *  \param agSATAReq
51  *  \param agTag
52  *  \param agCB
53  *
54  *  \return If command is started successfully
55  *          - \e AGSA_RC_SUCCESS command is started successfully
56  *          - \e AGSA_RC_FAILURE command is not started successfully
57  */
58 /*******************************************************************************/
59 GLOBAL bit32 saSATAStart(
60   agsaRoot_t                  *agRoot,
61   agsaIORequest_t             *agIORequest,
62   bit32                       queueNum,
63   agsaDevHandle_t             *agDevHandle,
64   bit32                       agRequestType,
65   agsaSATAInitiatorRequest_t  *agSATAReq,
66   bit8                        agTag,
67   ossaSATACompletedCB_t       agCB
68   )
69 
70 {
71   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
72   mpiICQueue_t        *circularQ = agNULL;
73   agsaDeviceDesc_t    *pDevice   = agNULL;
74   agsaPort_t          *pPort     = agNULL;
75   agsaIORequestDesc_t *pRequest  = agNULL;
76   void                *pMessage  = agNULL;
77   agsaSgl_t           *pSgl      = agNULL;
78   bit32               *payload   = agNULL;
79   bit32               deviceIndex = 0;
80   bit32               ret = AGSA_RC_SUCCESS, retVal = 0;
81   bit32               AtapDir = 0;
82   bit32               encryptFlags = 0;
83   bit16               size = 0;
84   bit16               opCode = 0;
85   bit8                inq = 0, outq = 0;
86 
87   OSSA_INP_ENTER(agRoot);
88   smTraceFuncEnter(hpDBG_VERY_LOUD, "8a");
89 
90   SA_DBG3(("saSATAStart: in\n"));
91   /* sanity check */
92   SA_ASSERT((agNULL != agRoot), "(saSATAStart) agRoot is NULL");
93   SA_ASSERT((agNULL != agIORequest), "(saSATAStart) agIORequest is NULL");
94   SA_ASSERT((agNULL != agDevHandle), "(saSATAStart) agDevHandle is NULL");
95   SA_ASSERT((agNULL != agSATAReq), "(saSATAStart) agSATAReq is NULL");
96 
97   /* Assign inbound and outbound queue */
98   inq = (bit8)(queueNum & MPI_IB_NUM_MASK);
99   outq = (bit8)((queueNum & MPI_OB_NUM_MASK) >> MPI_OB_SHIFT);
100   SA_ASSERT((AGSA_MAX_INBOUND_Q > inq), "The IBQ Number is out of range.");
101 
102   /* Find the outgoing port for the device */
103   pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
104   SA_ASSERT((agNULL != pDevice), "(saSATAStart) pDevice is NULL");
105 
106   pPort = pDevice->pPort;
107   SA_ASSERT((agNULL != pPort), "(saSATAStart) pPort is NULL");
108 
109   /* SATA DIF is obsolete */
110   if (agSATAReq->option & AGSA_SATA_ENABLE_DIF)
111   {
112     return AGSA_RC_FAILURE;
113   }
114 
115   /* find deviceID for IOMB */
116   deviceIndex = pDevice->DeviceMapIndex;
117 
118   /*  Get request from free IORequests */
119   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
120   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
121   if ( agNULL != pRequest )
122   {
123     /* If free IOMB avaliable */
124     /* Remove the request from free list */
125     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
126 
127     /* Add the request to the pendingSTARequests list of the device */
128     pRequest->valid = agTRUE;
129     saLlistIOAdd(&(pDevice->pendingIORequests), &(pRequest->linkNode));
130     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
131 
132     if ((agSATAReq->option & AGSA_SATA_ENABLE_ENCRYPTION) ||
133           (agSATAReq->option & AGSA_SATA_ENABLE_DIF))
134     {
135         opCode = OPC_INB_SATA_DIF_ENC_OPSTART;
136         size = IOMB_SIZE128;
137     }
138     else
139     {
140         opCode = OPC_INB_SATA_HOST_OPSTART;
141         if (agRequestType == AGSA_SATA_PROTOCOL_NON_PKT ||
142             agRequestType == AGSA_SATA_PROTOCOL_H2D_PKT ||
143             agRequestType == AGSA_SATA_PROTOCOL_D2H_PKT)
144             size = IOMB_SIZE128;
145         else
146             size = IOMB_SIZE64;
147     }
148     /* If LL IO request entry avaliable */
149     /* set up pRequest */
150     pRequest->pIORequestContext = agIORequest;
151     pRequest->pDevice = pDevice;
152     pRequest->pPort = pPort;
153     pRequest->requestType = agRequestType;
154     pRequest->startTick = saRoot->timeTick;
155     pRequest->completionCB = (ossaSSPCompletedCB_t)agCB;
156     /* Set request to the sdkData of agIORequest */
157     agIORequest->sdkData = pRequest;
158 
159     /* save tag and IOrequest pointer to IOMap */
160     saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
161     saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
162 
163 #ifdef SA_LL_IBQ_PROTECT
164     ossaSingleThreadedEnter(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
165 #endif /* SA_LL_IBQ_PROTECT */
166 
167     /* get a free inbound queue entry */
168     circularQ = &saRoot->inboundQueue[inq];
169     retVal    = mpiMsgFreeGet(circularQ, size, &pMessage);
170 
171     if (AGSA_RC_FAILURE == retVal)
172     {
173 #ifdef SA_LL_IBQ_PROTECT
174       ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
175 #endif /* SA_LL_IBQ_PROTECT */
176       /* if not sending return to free list rare */
177       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
178       saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
179       pRequest->valid = agFALSE;
180       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
181       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
182 
183       SA_DBG3(("saSATAStart, error when get free IOMB\n"));
184       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "8a");
185       ret = AGSA_RC_FAILURE;
186       goto ext;
187     }
188 
189     /* return busy if inbound queue is full */
190     if (AGSA_RC_BUSY == retVal)
191     {
192 #ifdef SA_LL_IBQ_PROTECT
193       ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
194 #endif /* SA_LL_IBQ_PROTECT */
195       /* if not sending return to free list rare */
196       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
197       saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
198       pRequest->valid = agFALSE;
199       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
200       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
201 
202       SA_DBG1(("saSATAStart, no more IOMB\n"));
203       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "8a");
204       ret = AGSA_RC_BUSY;
205       goto ext;
206     }
207 
208   }
209   else   /* If no LL IO request entry available */
210   {
211     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
212     SA_DBG1(("saSATAStart, No request from free list\n"));
213     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "8a");
214     ret = AGSA_RC_BUSY;
215     goto ext;
216   }
217 
218   payload = (bit32 *)pMessage;
219   SA_DBG4(("saSATAStart: Payload offset 0x%X\n", (unsigned int)(payload - (bit32 *)pMessage)));
220 
221 
222   switch ( agRequestType )
223   {
224   case AGSA_SATA_PROTOCOL_FPDMA_READ:
225   case AGSA_SATA_PROTOCOL_FPDMA_WRITE:
226   case AGSA_SATA_PROTOCOL_FPDMA_READ_M:
227   case AGSA_SATA_PROTOCOL_FPDMA_WRITE_M:
228     pSgl = &(agSATAReq->agSgl);
229     AtapDir = agRequestType & (AGSA_DIR_MASK | AGSA_SATA_ATAP_MASK);
230     if (agRequestType & AGSA_MSG)
231     {
232       /* set M bit */
233       AtapDir |= AGSA_MSG_BIT;
234     }
235     break;
236   case AGSA_SATA_PROTOCOL_DMA_READ:
237   case AGSA_SATA_PROTOCOL_DMA_WRITE:
238   case AGSA_SATA_PROTOCOL_DMA_READ_M:
239   case AGSA_SATA_PROTOCOL_DMA_WRITE_M:
240   case AGSA_SATA_PROTOCOL_PIO_READ_M:
241   case AGSA_SATA_PROTOCOL_PIO_WRITE_M:
242   case AGSA_SATA_PROTOCOL_PIO_READ:
243   case AGSA_SATA_PROTOCOL_PIO_WRITE:
244   case AGSA_SATA_PROTOCOL_H2D_PKT:
245   case AGSA_SATA_PROTOCOL_D2H_PKT:
246     agTag = 0; /* agTag not valid for these requests */
247     pSgl = &(agSATAReq->agSgl);
248     AtapDir = agRequestType & (AGSA_DIR_MASK | AGSA_SATA_ATAP_MASK);
249     if (agRequestType & AGSA_MSG)
250     {
251       /* set M bit */
252       AtapDir |= AGSA_MSG_BIT;
253     }
254     break;
255 
256   case AGSA_SATA_PROTOCOL_NON_DATA:
257   case AGSA_SATA_PROTOCOL_NON_DATA_M:
258   case AGSA_SATA_PROTOCOL_NON_PKT:
259     agTag = 0; /* agTag not valid for these requests */
260     AtapDir = agRequestType & (AGSA_DIR_MASK | AGSA_SATA_ATAP_MASK);
261     if (agRequestType & AGSA_MSG)
262     {
263       /* set M bit */
264       AtapDir |= AGSA_MSG_BIT;
265     }
266     break;
267 
268   case AGSA_SATA_PROTOCOL_SRST_ASSERT:
269     agTag = 0; /* agTag not valid for these requests */
270     AtapDir = AGSA_SATA_ATAP_SRST_ASSERT;
271     break;
272 
273   case AGSA_SATA_PROTOCOL_SRST_DEASSERT:
274     agTag = 0; /* agTag not valid for these requests */
275     AtapDir = AGSA_SATA_ATAP_SRST_DEASSERT;
276     break;
277 
278   case AGSA_SATA_PROTOCOL_DEV_RESET:
279   case AGSA_SATA_PROTOCOL_DEV_RESET_M: /* TestBase */
280     agTag = 0; /* agTag not valid for these requests */
281     AtapDir = AGSA_SATA_ATAP_PKT_DEVRESET;
282     if (agRequestType & AGSA_MSG)
283     {
284       /* set M bit */
285       AtapDir |= AGSA_MSG_BIT; /* TestBase */
286     }
287     break;
288 
289   default:
290     SA_DBG1(("saSATAStart: (Unknown agRequestType) 0x%X \n",agRequestType));
291     SA_ASSERT((0), "saSATAStart: (Unknown agRequestType)");
292 
293     break;
294   }
295 
296   if ((AGSA_SATA_PROTOCOL_SRST_ASSERT == agRequestType) ||
297        (AGSA_SATA_PROTOCOL_SRST_DEASSERT == agRequestType) ||
298        (AGSA_SATA_PROTOCOL_DEV_RESET == agRequestType))
299   {
300 
301     SA_DBG3(("saSATAStart:AGSA_SATA_PROTOCOL_SRST_DEASSERT AGSA_SATA_PROTOCOL_SRST_ASSERT\n"));
302 
303     si_memset((void *)payload, 0, sizeof(agsaSATAStartCmd_t));
304     /* build IOMB DW 1 */
305     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t, tag), pRequest->HTag);
306     /* DWORD 2 */
307     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,deviceId ), deviceIndex);
308     /* DWORD 3 */
309     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,dataLen ), 0 );
310     /* DWORD 4 */
311     OSSA_WRITE_LE_32(agRoot,
312                     payload,
313                     OSSA_OFFSET_OF(agsaSATAStartCmd_t,optNCQTagataProt ),
314                     (((agSATAReq->option & SATA_FIS_MASK) << SHIFT24)    |
315                     (agTag << SHIFT16)                                   |
316                     AtapDir));
317 
318    si_memcpy((void *)(payload+4), (void *)&agSATAReq->fis.fisRegHostToDev, sizeof(agsaFisRegHostToDevice_t));
319   }
320   else
321   {
322     /* build IOMB DW 1 */
323     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t, tag), pRequest->HTag);
324     /* DWORD 2 */
325     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,deviceId ), deviceIndex);
326     /* DWORD 3 */
327     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,dataLen ),  agSATAReq->dataLength );
328 
329      /* Since we are writing the payload in order, check for any special modes now. */
330     if (agSATAReq->option & AGSA_SATA_ENABLE_ENCRYPTION)
331     {
332         SA_ASSERT((opCode == OPC_INB_SATA_DIF_ENC_OPSTART), "opcode");
333         SA_DBG4(("saSATAStart: 1 Payload offset 0x%X\n", (unsigned int)(payload - (bit32 *)pMessage)));
334         AtapDir |= AGSA_ENCRYPT_BIT;
335     }
336 
337     if (agSATAReq->option & AGSA_SATA_ENABLE_DIF)
338     {
339         SA_ASSERT((opCode == OPC_INB_SATA_DIF_ENC_OPSTART), "opcode");
340         AtapDir |= AGSA_DIF_BIT;
341     }
342 #ifdef CCBUILD_TEST_EPL
343     if(agSATAReq->encrypt.enableEncryptionPerLA)
344         AtapDir |= (1 << SHIFT4);        // enable EPL
345 #endif
346     /* DWORD 4 */
347     OSSA_WRITE_LE_32(agRoot,
348                     payload,
349                     OSSA_OFFSET_OF(agsaSATAStartCmd_t,optNCQTagataProt ),
350                   (((agSATAReq->option & SATA_FIS_MASK) << SHIFT24) |
351                     (agTag << SHIFT16)                              |
352                     AtapDir));
353 
354     /* DWORD 5 6 7 8 9 */
355     si_memcpy((void *)(payload+4), (void *)&agSATAReq->fis.fisRegHostToDev, sizeof(agsaFisRegHostToDevice_t));
356     /* DWORD 10 reserved */
357     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,reserved1 ),  0 );
358 
359     /* DWORD 11 reserved */
360     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,reserved2 ),  0 );
361 
362     SA_DBG4(("saSATAStart: 2 Payload offset 0x%X\n", (unsigned int)(payload - (bit32 *)pMessage)));
363   }
364   if (agSATAReq->option & AGSA_SATA_ENABLE_ENCRYPTION)
365   {
366     /* Write 10 dwords of zeroes as payload, skipping all DIF fields */
367     SA_DBG4(("saSATAStart: 2a Payload offset 0x%X\n", (unsigned int)(payload - (bit32 *)pMessage)));
368     if (opCode == OPC_INB_SATA_DIF_ENC_OPSTART)
369     {
370       /* DW 11 */
371       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,Res_EPL_DESCL ),0 );
372       /* DW 12 */
373       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,resSKIPBYTES ),0 );
374        /* DW 13 */
375       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,Res_DPL_DESCL_NDPLR ),0 );
376       /* DW 14 */
377       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,Res_EDPL_DESCH ),0 );
378       /* DW 15 */
379       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,DIF_flags ),0 );
380       /* DW 16 */
381       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,udt ),0 );
382       /* DW 17 */
383       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,udtReplacementLo ),0 );
384       /* DW 18 */
385       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,udtReplacementHi ),0 );
386       /* DW 19 */
387       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,DIF_seed ),0 );
388     }
389 
390     if (agSATAReq->option & AGSA_SATA_ENABLE_ENCRYPTION)
391     {
392         SA_ASSERT((opCode == OPC_INB_SATA_DIF_ENC_OPSTART), "opcode");
393 
394         SA_DBG4(("saSATAStart: 3 Payload offset 0x%X\n", (unsigned int)(payload - (bit32 *)pMessage)));
395         /* Configure DWORD 20 */
396         encryptFlags = 0;
397 
398         if (agSATAReq->encrypt.keyTagCheck == agTRUE)
399         {
400           encryptFlags |= AGSA_ENCRYPT_KEY_TAG_BIT;
401         }
402 
403         if( agSATAReq->encrypt.cipherMode == agsaEncryptCipherModeXTS )
404         {
405           encryptFlags |= AGSA_ENCRYPT_XTS_Mode << SHIFT4;
406         }
407 
408         encryptFlags |= agSATAReq->encrypt.dekInfo.dekTable << SHIFT2;
409 
410         encryptFlags |= (agSATAReq->encrypt.dekInfo.dekIndex & 0xFFFFFF) << SHIFT8;
411         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,encryptFlagsLo ),encryptFlags );
412 
413         /* Configure DWORD 21*/
414         /* This information is available in the sectorSizeIndex */
415         encryptFlags = agSATAReq->encrypt.sectorSizeIndex;
416         /*
417          * Set Region0 sectors count
418          */
419         if(agSATAReq->encrypt.enableEncryptionPerLA)
420         {
421             encryptFlags |= (agSATAReq->encrypt.EncryptionPerLRegion0SecCount << SHIFT16);
422         }
423 
424         encryptFlags |= (agSATAReq->encrypt.kekIndex) << SHIFT5;
425         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,encryptFlagsHi ),encryptFlags );
426 
427         /* Configure DWORD 22*/
428         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,keyTagLo ),  agSATAReq->encrypt.keyTag_W0 );
429         /* Configure DWORD 23 */
430         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,keyTagHi ),  agSATAReq->encrypt.keyTag_W1 );
431         /* Configure DWORD 24 */
432         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W0 ), agSATAReq->encrypt.tweakVal_W0  );
433         /* Configure DWORD 25 */
434         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W1 ), agSATAReq->encrypt.tweakVal_W1  );
435         /* Configure DWORD 26 */
436         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W2 ), agSATAReq->encrypt.tweakVal_W2  );
437         /* Configure DWORD 27 */
438         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W3 ), agSATAReq->encrypt.tweakVal_W3  );
439     }
440     else
441     {
442       /* Write 8 dwords of zeros as payload, skipping all encryption fields */
443       if (opCode == OPC_INB_SATA_DIF_ENC_OPSTART)
444       {
445         /* Configure DWORD 22*/
446         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,keyTagLo ), 0 );
447         /* Configure DWORD 23 */
448         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,keyTagHi ), 0 );
449         /* Configure DWORD 24 */
450         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W0 ), 0  );
451         /* Configure DWORD 25 */
452         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W1 ), 0  );
453         /* Configure DWORD 26 */
454         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W2 ), 0  );
455         /* Configure DWORD 27 */
456         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,tweakVal_W3 ), 0  );
457       }
458     }
459 
460     SA_DBG4(("saSATAStart: 4 Payload offset 0x%X\n", (unsigned int)(payload - (bit32 *)pMessage)));
461 
462     /* DWORD 11 13 14*/
463     if(agSATAReq->encrypt.enableEncryptionPerLA)
464     {
465       /* DWORD 11 */
466       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t, Res_EPL_DESCL),
467                          agSATAReq->encrypt.EncryptionPerLAAddrLo);
468       /* DWORD 13 */
469       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t, Res_DPL_DESCL_NDPLR), 0);
470       /* DWORD 14 */
471       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t, Res_EDPL_DESCH),
472                       agSATAReq->encrypt.EncryptionPerLAAddrHi);
473     }
474     else
475     {
476       /* DWORD 11 */
477       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t, Res_EPL_DESCL),0);
478       /* DW 13 */
479       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t, Res_DPL_DESCL_NDPLR), 0);
480       /* DWORD 14 */
481       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,Res_EDPL_DESCH ),0 );
482     }
483 
484     /* Configure DWORD 28 for encryption*/
485     if (pSgl)
486     {
487       /* Configure DWORD 28 */
488       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,AddrLow0 ),  pSgl->sgLower );
489       /* Configure DWORD 29 */
490       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,AddrHi0 ), pSgl->sgUpper  );
491       /* Configure DWORD 30 */
492       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,Len0 ),  pSgl->len );
493       /* Configure DWORD 31 */
494       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,E0 ), pSgl->extReserved  );
495     }
496     else
497     {
498       /* Configure DWORD 28 */
499       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,AddrLow0 ),  0 );
500       /* Configure DWORD 29 */
501       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,AddrHi0 ),  0 );
502       /* Configure DWORD 30 */
503       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,Len0 ),  0 );
504       /* Configure DWORD 31 */
505       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAEncryptStartCmd_t,E0 ),  0 );
506     }
507 
508   }
509   else
510   {
511     SA_ASSERT((opCode == OPC_INB_SATA_HOST_OPSTART), "opcode");
512     if (pSgl)
513     {
514       /* Configure DWORD 12 */
515       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,AddrLow0 ),  pSgl->sgLower );
516       /* Configure DWORD 13 */
517       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,AddrHi0 ), pSgl->sgUpper  );
518       /* Configure DWORD 14 */
519       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,Len0 ),  pSgl->len );
520       /* Configure DWORD 15 */
521       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,E0 ), pSgl->extReserved  );
522     }
523     else
524     {
525       /* Configure DWORD 12 */
526       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,AddrLow0 ),  0 );
527       /* Configure DWORD 13 */
528       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,AddrHi0 ),  0 );
529       /* Configure DWORD 14 */
530       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,Len0 ),  0 );
531       /* Configure DWORD 15 */
532       OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,E0 ),  0 );
533     }
534     /* support ATAPI packet command */
535     if ((agRequestType == AGSA_SATA_PROTOCOL_NON_PKT ||
536         agRequestType == AGSA_SATA_PROTOCOL_H2D_PKT ||
537         agRequestType == AGSA_SATA_PROTOCOL_D2H_PKT))
538      {
539          /*DWORD 16 - 19 as SCSI CDB for support ATAPI Packet command*/
540         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,ATAPICDB ),
541                         (bit32)(agSATAReq->scsiCDB[0]|(agSATAReq->scsiCDB[1]<<8)|(agSATAReq->scsiCDB[2]<<16)|(agSATAReq->scsiCDB[3]<<24)));
542         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,ATAPICDB )+ 4,
543                         (bit32)(agSATAReq->scsiCDB[4]|(agSATAReq->scsiCDB[5]<<8)|(agSATAReq->scsiCDB[6]<<16)|(agSATAReq->scsiCDB[7]<<24)));
544         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,ATAPICDB )+ 8,
545                         (bit32)(agSATAReq->scsiCDB[8]|(agSATAReq->scsiCDB[9]<<8)|(agSATAReq->scsiCDB[10]<<16)|(agSATAReq->scsiCDB[11]<<24)));
546         OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAStartCmd_t,ATAPICDB )+ 12,
547                         (bit32)(agSATAReq->scsiCDB[12]|(agSATAReq->scsiCDB[13]<<8)|(agSATAReq->scsiCDB[14]<<16)|(agSATAReq->scsiCDB[15]<<24)));
548      }
549   }
550 
551   /* send IOMB to SPC */
552   ret = mpiMsgProduce(circularQ,
553                       (void *)pMessage,
554                       MPI_CATEGORY_SAS_SATA,
555                       opCode,
556                       outq,
557                       (bit8)circularQ->priority);
558 
559 #ifdef SA_LL_IBQ_PROTECT
560   ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
561 #endif /* SA_LL_IBQ_PROTECT */
562 
563 #ifdef SALL_API_TEST
564   if (AGSA_RC_FAILURE != ret)
565   {
566     saRoot->LLCounters.IOCounter.numSataStarted++;
567   }
568 #endif
569 
570   smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "8a");
571 
572 ext:
573   OSSA_INP_LEAVE(agRoot);
574   return ret;
575 }
576 
577 /******************************************************************************/
578 /*! \brief Abort SATA command
579  *
580  *  Abort SATA command
581  *
582  *  \param agRoot      handles for this instance of SAS/SATA hardware
583  *  \param queueNum    inbound/outbound queue number
584  *  \param agIORequest the IO Request descriptor
585  *  \param agIOtoBeAborted
586  *
587  *  \return If command is aborted successfully
588  *          - \e AGSA_RC_SUCCESS command is aborted successfully
589  *          - \e AGSA_RC_FAILURE command is not aborted successfully
590  */
591 /*******************************************************************************/
592 GLOBAL bit32 saSATAAbort(
593   agsaRoot_t      *agRoot,
594   agsaIORequest_t *agIORequest,
595   bit32           queueNum,
596   agsaDevHandle_t *agDevHandle,
597   bit32           flag,
598   void            *abortParam,
599   ossaGenericAbortCB_t   agCB
600   )
601 {
602   bit32 ret = AGSA_RC_SUCCESS, retVal;
603   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
604   agsaIORequestDesc_t *pRequest;
605   agsaIORequestDesc_t *pRequestABT = agNULL;
606   agsaDeviceDesc_t    *pDevice = agNULL;
607   agsaDeviceDesc_t    *pDeviceABT = NULL;
608   agsaPort_t          *pPort = agNULL;
609   mpiICQueue_t        *circularQ;
610   void                *pMessage;
611   agsaSATAAbortCmd_t  *payload;
612   agsaIORequest_t     *agIOToBeAborted;
613   bit8                inq, outq;
614   bit32               flag_copy = flag;
615 
616 
617   smTraceFuncEnter(hpDBG_VERY_LOUD,"8b");
618 
619   /* sanity check */
620   SA_ASSERT((agNULL != agRoot), "");
621   SA_ASSERT((agNULL != agIORequest), "");
622 
623   SA_DBG3(("saSATAAbort: Aborting request %p ITtoBeAborted %p\n", agIORequest, abortParam));
624 
625   /* Assign inbound and outbound Ring Buffer */
626   inq = (bit8)(queueNum & MPI_IB_NUM_MASK);
627   outq = (bit8)((queueNum & MPI_OB_NUM_MASK) >> MPI_OB_SHIFT);
628   SA_ASSERT((AGSA_MAX_INBOUND_Q > inq), "The IBQ Number is out of range.");
629 
630   if( ABORT_SINGLE == (flag & ABORT_MASK) )
631   {
632     agIOToBeAborted = (agsaIORequest_t *)abortParam;
633     /* Get LL IORequest entry for saSATAAbort() */
634     pRequest = (agsaIORequestDesc_t *) (agIOToBeAborted->sdkData);
635     if (agNULL == pRequest)
636     {
637       /* no pRequest found - can not Abort */
638       SA_DBG1(("saSATAAbort: pRequest AGSA_RC_FAILURE\n"));
639       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "8b");
640       return AGSA_RC_FAILURE;
641     }
642     /* Find the device the request sent to */
643     pDevice = pRequest->pDevice;
644     /* Get LL IORequest entry */
645     pRequestABT = (agsaIORequestDesc_t *) (agIOToBeAborted->sdkData);
646     /* Find the device the request sent to */
647     if (agNULL == pRequestABT)
648     {
649       /* no pRequestABT - can not find pDeviceABT */
650       SA_DBG1(("saSATAAbort: pRequestABT AGSA_RC_FAILURE\n"));
651       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "8b");
652       return AGSA_RC_FAILURE;
653     }
654     pDeviceABT = pRequestABT->pDevice;
655 
656     if (agNULL == pDeviceABT)
657     {
658       /* no deviceID - can not build IOMB */
659       SA_DBG1(("saSATAAbort: pDeviceABT AGSA_RC_FAILURE\n"));
660 
661       smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "8b");
662       return AGSA_RC_FAILURE;
663     }
664 
665     if (agNULL != pDevice)
666     {
667       /* Find the port the request was sent to */
668       pPort = pDevice->pPort;
669     }
670 
671     /* Get request from free IORequests */
672     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
673     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
674   }
675   else
676   {
677     if (ABORT_ALL == (flag & ABORT_MASK))
678     {
679       /* abort all */
680       /* Find the outgoing port for the device */
681       pDevice = (agsaDeviceDesc_t *) (agDevHandle->sdkData);
682       pPort = pDevice->pPort;
683       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
684       pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests));
685     }
686     else
687     {
688       /* only support 00 and 01 for flag */
689       SA_DBG1(("saSATAAbort: flag AGSA_RC_FAILURE\n"));
690       smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "8b");
691       return AGSA_RC_FAILURE;
692     }
693   }
694 
695   /* If no LL IO request entry avalable */
696   if ( agNULL == pRequest )
697   {
698     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
699     SA_DBG1(("saSATAAbort, No request from free list\n" ));
700     smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "8b");
701     return AGSA_RC_BUSY;
702   }
703 
704   /* If free IOMB avaliable */
705   /* Remove the request from free list */
706   saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
707 
708   SA_ASSERT((!pRequest->valid), "The pRequest is in use");
709   /* Add the request to the pendingIORequests list of the device */
710   pRequest->valid = agTRUE;
711   saLlistIOAdd(&(pDevice->pendingIORequests), &(pRequest->linkNode));
712   /* set up pRequest */
713 
714   ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
715 
716   pRequest->pIORequestContext = agIORequest;
717   pRequest->requestType = AGSA_SATA_REQTYPE;
718   pRequest->pDevice = pDevice;
719   pRequest->pPort = pPort;
720   pRequest->completionCB = (void*)agCB;
721 /* pRequest->abortCompletionCB = agCB; */
722   pRequest->startTick = saRoot->timeTick;
723 
724   /* Set request to the sdkData of agIORequest */
725   agIORequest->sdkData = pRequest;
726 
727   /* save tag and IOrequest pointer to IOMap */
728   saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
729   saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
730 
731 #ifdef SA_LL_IBQ_PROTECT
732   ossaSingleThreadedEnter(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
733 #endif /* SA_LL_IBQ_PROTECT */
734 
735   /* If LL IO request entry avaliable */
736   /* Get a free inbound queue entry */
737   circularQ = &saRoot->inboundQueue[inq];
738   retVal    = mpiMsgFreeGet(circularQ, IOMB_SIZE64, &pMessage);
739 
740   /* if message size is too large return failure */
741   if (AGSA_RC_FAILURE == retVal)
742   {
743 #ifdef SA_LL_IBQ_PROTECT
744     ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
745 #endif /* SA_LL_IBQ_PROTECT */
746 
747     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
748     saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
749     pRequest->valid = agFALSE;
750     saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
751     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
752 
753     SA_DBG1(("saSATAAbort, error when get free IOMB\n"));
754     smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "8b");
755     return AGSA_RC_FAILURE;
756   }
757 
758   /* return busy if inbound queue is full */
759   if (AGSA_RC_BUSY == retVal)
760   {
761 #ifdef SA_LL_IBQ_PROTECT
762     ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
763 #endif /* SA_LL_IBQ_PROTECT */
764 
765     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
766     saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
767     pRequest->valid = agFALSE;
768     saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
769     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
770 
771     SA_DBG1(("saSATASAbort, no more IOMB\n"));
772     smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "8b");
773     return AGSA_RC_BUSY;
774   }
775 
776 
777   /* setup payload */
778   payload = (agsaSATAAbortCmd_t*)pMessage;
779   OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAAbortCmd_t, tag), pRequest->HTag);
780 
781   if( ABORT_SINGLE == (flag & ABORT_MASK) )
782   {
783     /* If no device  */
784     if ( agNULL == pDeviceABT )
785     {
786       #ifdef SA_LL_IBQ_PROTECT
787       ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
788       #endif /* SA_LL_IBQ_PROTECT */
789 
790       ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
791       saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
792       pRequest->valid = agFALSE;
793       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
794       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
795 
796       SA_DBG1(("saSATAAbort,no device\n" ));
797       smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "8b");
798       return AGSA_RC_FAILURE;
799     }
800     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAAbortCmd_t, deviceId), pDeviceABT->DeviceMapIndex);
801     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAAbortCmd_t, HTagAbort), pRequestABT->HTag);
802   }
803   else
804   {
805     /* abort all */
806     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAAbortCmd_t, deviceId), pDevice->DeviceMapIndex);
807     OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAAbortCmd_t, HTagAbort), 0);
808   }
809 
810   if(flag & ABORT_TSDK_QUARANTINE)
811   {
812     if(smIS_SPCV(agRoot))
813     {
814       flag_copy &= ABORT_SCOPE;
815       flag_copy |= ABORT_QUARANTINE_SPCV;
816     }
817   }
818   OSSA_WRITE_LE_32(agRoot, payload, OSSA_OFFSET_OF(agsaSATAAbortCmd_t, abortAll), flag_copy);
819 
820 
821 
822   SA_DBG1(("saSATAAbort, HTag 0x%x HTagABT 0x%x deviceId 0x%x\n", payload->tag, payload->HTagAbort, payload->deviceId));
823 
824   /* post the IOMB to SPC */
825   ret = mpiMsgProduce(circularQ, (void *)pMessage, MPI_CATEGORY_SAS_SATA, OPC_INB_SATA_ABORT, outq, (bit8)circularQ->priority);
826 
827 #ifdef SA_LL_IBQ_PROTECT
828   ossaSingleThreadedLeave(agRoot, LL_IOREQ_IBQ0_LOCK + inq);
829 #endif /* SA_LL_IBQ_PROTECT */
830 
831 #ifdef SALL_API_TEST
832   if (AGSA_RC_FAILURE != ret)
833   {
834     saRoot->LLCounters.IOCounter.numSataAborted++;
835   }
836 #endif
837 
838   siCountActiveIORequestsOnDevice( agRoot,   payload->deviceId );
839 
840   smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "8b");
841 
842   return ret;
843 }
844 
845 /******************************************************************************/
846 /*! \brief Routine to handle for received SATA with data payload event
847  *
848  *  The handle for received SATA with data payload event
849  *
850  *  \param agRoot       handles for this instance of SAS/SATA hardware
851  *  \param pRequest     the IO request descriptor
852  *  \param agFirstDword pointer to the first Dword
853  *  \param pResp        pointer to the rest of SATA response
854  *  \param lengthResp   total length of SATA Response frame
855  *
856  *  \return -void-
857  */
858 /*******************************************************************************/
859 GLOBAL void siEventSATAResponseWtDataRcvd(
860   agsaRoot_t              *agRoot,
861   agsaIORequestDesc_t     *pRequest,
862   bit32                   *agFirstDword,
863   bit32                   *pResp,
864   bit32                   lengthResp
865   )
866 {
867   agsaLLRoot_t        *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
868   agsaDeviceDesc_t    *pDevice;
869 #if defined(SALLSDK_DEBUG)
870   agsaFrameHandle_t   frameHandle;
871   /* get frame handle */
872   frameHandle = (agsaFrameHandle_t)(pResp);
873 #endif  /* SALLSDK_DEBUG */
874 
875   smTraceFuncEnter(hpDBG_VERY_LOUD,"8c");
876 
877   /* If the request is still valid */
878   if ( agTRUE == pRequest->valid )
879   {
880     /* get device */
881     pDevice = pRequest->pDevice;
882     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
883 
884     /* Delete the request from the pendingIORequests */
885     saLlistIORemove(&(pDevice->pendingIORequests), &(pRequest->linkNode));
886     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
887 
888     (*(ossaSATACompletedCB_t)(pRequest->completionCB))(agRoot,
889                                                        pRequest->pIORequestContext,
890                                                        OSSA_IO_SUCCESS,
891                                                        agFirstDword,
892                                                        lengthResp,
893                                                        (void *)pResp);
894 
895     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
896     pRequest->valid = agFALSE;
897     /* return the request to free pool */
898     saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
899     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
900   }
901 
902   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "8c");
903 
904   return;
905 }
906 
907 /******************************************************************************/
908 /*! \brief copy a SATA signature to another
909  *
910  *  copy a SATA signature to another
911  *
912  *  \param pDstSignature pointer to the destination signature
913  *  \param pSrcSignature pointer to the source signature
914  *
915  *  \return If they match
916  *          - \e agTRUE match
917  *          - \e agFALSE  doesn't match
918  */
919 /*******************************************************************************/
920 GLOBAL void siSATASignatureCpy(
921   bit8  *pDstSignature,
922   bit8  *pSrcSignature
923   )
924 {
925   bit32   i;
926 
927   for ( i = 0; i < 5; i ++ )
928   {
929     pDstSignature[i] = pSrcSignature[i];
930   }
931 
932   return;
933 }
934 
935 
936 
937