FreeBSD kernel pms device code
smsatcb.c
Go to the documentation of this file.
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#include <sys/cdefs.h>
23__FBSDID("$FreeBSD$");
24#include <dev/pms/config.h>
25
29
31
35
39
43
44extern smRoot_t *gsmRoot;
45
46/******************************** completion ***********************************************************/
47
48FORCEINLINE void
50 agsaRoot_t *agRoot,
51 agsaIORequest_t *agIORequest,
52 bit32 agIOStatus,
53 void *agFirstDword,
54 bit32 agIOInfoLen,
55 void *agParam
56 )
57{
58 smRoot_t *smRoot = agNULL;
59// smIntRoot_t *smIntRoot = agNULL;
60// smIntContext_t *smAllShared = agNULL;
61 smIORequestBody_t *smIORequestBody;
62 smSatIOContext_t *satIOContext;
63 smDeviceData_t *pSatDevData;
64 smDeviceHandle_t *smDeviceHandle = agNULL;
65 smDeviceData_t *oneDeviceData = agNULL;
66
67 SM_DBG2(("smllSATACompleted: start\n"));
68
69 if (agIORequest == agNULL)
70 {
71 SM_DBG1(("smllSATACompleted: agIORequest is NULL!!!\n"));
72 return;
73 }
74
75 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
76
77 if (smIORequestBody == agNULL)
78 {
79 SM_DBG1(("smllSATACompleted: smIORequestBody is NULL!!!\n"));
80 return;
81 }
82
83 /* for debugging */
84 if (smIORequestBody->ioCompleted == agTRUE)
85 {
86 smDeviceHandle = smIORequestBody->smDevHandle;
87 if (smDeviceHandle == agNULL)
88 {
89 SM_DBG1(("smllSATACompleted: smDeviceHandle is NULL!!!\n"));
90 return;
91 }
92 oneDeviceData = (smDeviceData_t *)smDeviceHandle->smData;
93 SM_DBG1(("smllSATACompleted: Error!!!!!! double completion!!!, ID %d!!!\n", smIORequestBody->id));
94 if (oneDeviceData == agNULL)
95 {
96 SM_DBG1(("smllSATACompleted: oneDeviceData is NULL!!!\n"));
97 return;
98 }
99 SM_DBG1(("smllSATACompleted: did %d!!!\n", oneDeviceData->id));
100 return;
101 }
102
103 smIORequestBody->ioCompleted = agTRUE;
104 satIOContext = &(smIORequestBody->transport.SATA.satIOContext);
105
106 if (satIOContext == agNULL)
107 {
108 SM_DBG1(("smllSATACompleted: satIOContext is NULL!!!\n"));
109 return;
110 }
111
112 pSatDevData = satIOContext->pSatDevData;
113
114 if (pSatDevData == agNULL)
115 {
116 SM_DBG1(("smllSATACompleted: pSatDevData is NULL loc 1, wrong!!!\n"));
117 if (satIOContext->satIntIoContext == agNULL)
118 {
119 SM_DBG1(("smllSATACompleted: external command!!!\n"));
120 }
121 else
122 {
123 SM_DBG1(("smllSATACompleted: internal command!!!\n"));
124 }
125 return;
126 }
127
128 smDeviceHandle = smIORequestBody->smDevHandle;
129
130 if (smDeviceHandle == agNULL)
131 {
132 SM_DBG1(("smllSATACompleted: smDeviceHandle is NULL!!!!\n"));
133 return;
134 }
135
136 oneDeviceData = (smDeviceData_t *)smDeviceHandle->smData;
137
138 if (oneDeviceData != pSatDevData)
139 {
140 SM_DBG1(("smllSATACompleted: diff device handle!!!\n"));
141 if (satIOContext->satIntIoContext == agNULL)
142 {
143 SM_DBG1(("smllSATACompleted: external command!!!\n"));
144 }
145 else
146 {
147 SM_DBG1(("smllSATACompleted: internal command!!!\n"));
148 }
149 return;
150 }
151
152 if (oneDeviceData == agNULL)
153 {
154 SM_DBG1(("smllSATACompleted: oneDeviceData is NULL!!!!\n"));
155 if (satIOContext->satIntIoContext == agNULL)
156 {
157 SM_DBG1(("smllSATACompleted: external command!!!\n"));
158 }
159 else
160 {
161 SM_DBG1(("smllSATACompleted: internal command!!!\n"));
162 }
163 return;
164 }
165
166 smRoot = oneDeviceData->smRoot;
167
168 /* release tag value for SATA */
169 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
170 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
171 {
172 smsatTagRelease(smRoot, pSatDevData, satIOContext->sataTag);
173 SM_DBG3(("smllSATACompleted: ncq tag 0x%x\n",satIOContext->sataTag));
174 }
175
176 /* just for debugging */
177 if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
178 {
179 SM_DBG1(("smllSATACompleted: agIOStatus is OSSA_IO_DS_NON_OPERATIONAL!!!\n"));
180 }
181 if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
182 {
183 SM_DBG1(("smllSATACompleted: agIOStatus is OSSA_IO_DS_IN_RECOVERY!!!\n"));
184 }
185 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS)
186 {
187 SM_DBG1(("smllSATACompleted: agIOStatus is OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS!!!\n"));
188 }
189
190 satIOContext->satCompleteCB( agRoot,
191 agIORequest,
192 agIOStatus,
193 agFirstDword,
194 agIOInfoLen,
195 agParam,
196 satIOContext);
197
198
199
200 return;
201}
202/*****************************************************************************
203*! \brief smsatPacketCB
204*
205* This routine is a callback function called from smllSATACompleted().
206* This CB routine deals with normal Packet command I/O SATA request.
207*
208* \param agRoot: Handles for this instance of SAS/SATA hardware
209* \param agIORequest: Pointer to the LL I/O request context for this I/O.
210* \param agIOStatus: Status of completed I/O.
211* \param agFirstDword:Pointer to the four bytes of FIS.
212* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
213* length.
214* \param agParam: Additional info based on status.
215* \param ioContext: Pointer to smSatIOContext_t.
216*
217* \return: none
218*
219*****************************************************************************/
220
221osGLOBAL void
223 agsaRoot_t *agRoot,
224 agsaIORequest_t *agIORequest,
225 bit32 agIOStatus,
226 agsaFisHeader_t *agFirstDword,
227 bit32 agIOInfoLen,
228 void *agParam,
229 void *ioContext
230 )
231{
232 smRoot_t *smRoot = agNULL;
233 smIntRoot_t *smIntRoot = agNULL;
234 smIntContext_t *smAllShared = agNULL;
235 smIORequestBody_t *smIORequestBody;
236 smIORequestBody_t *smOrgIORequestBody;
237 smSatIOContext_t *satIOContext;
238 smSatIOContext_t *satOrgIOContext;
239 smSatIOContext_t *satNewIOContext;
240 smSatInternalIo_t *satIntIo;
241 smSatInternalIo_t *satNewIntIo = agNULL;
242 smDeviceData_t *oneDeviceData;
243 bit32 interruptContext;
244 smScsiRspSense_t *pSense;
245 smIniScsiCmnd_t *scsiCmnd;
246 smIORequest_t *smOrgIORequest;
247// bit32 ataStatus = 0;
248// bit32 ataError;
249
251// agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
252// bit32 dataLength;
253 bit8 bSenseKey = 0;
254 bit16 bSenseCodeInfo = 0;
255
256 SM_DBG3(("smsatPacketCB: start\n"));
257 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
258 satIOContext = (smSatIOContext_t *) ioContext;
259 if (satIOContext == agNULL)
260 {
261 SM_DBG1(("smsatPacketCB: satIOContext is NULL\n"));
262 return;
263 }
264 satIntIo = satIOContext->satIntIoContext;
265 oneDeviceData = satIOContext->pSatDevData;
266 interruptContext = satIOContext->interruptContext;
267 smRoot = oneDeviceData->smRoot;
268 smIntRoot = (smIntRoot_t *)smRoot->smData;
269 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
270
271 if (satIntIo == agNULL)
272 {
273 SM_DBG5(("smsatPacketCB: External smSatInternalIo_t satIntIoContext\n"));
274 satOrgIOContext = satIOContext;
275 smOrgIORequest = smIORequestBody->smIORequest;
276 pSense = satIOContext->pSense;
277 scsiCmnd = satIOContext->pScsiCmnd;
278 }
279 else
280 {
281 SM_DBG5(("smsatPacketCB: Internal smSatInternalIo_t satIntIoContext\n"));
282 satOrgIOContext = satIOContext->satOrgIOContext;
283 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
284 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
285 pSense = satOrgIOContext->pSense;
286 scsiCmnd = satOrgIOContext->pScsiCmnd;
287 }
288
289 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
290
291 smIORequestBody->ioCompleted = agTRUE;
292 smIORequestBody->ioStarted = agFALSE;
293
294 /* interal structure free */
295 smsatFreeIntIoResource( smRoot, oneDeviceData, satIntIo);
296 if( agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0 && agFirstDword == agNULL)
297 {
298 SM_DBG3(("smsatPacketCB: First, agIOStatus == OSSA_IO_SUCCESS, agFirstDword == agNULL, agIOInfoLen = %d\n", agIOInfoLen));
299 tdsmIOCompletedCB(smRoot,
300 smOrgIORequest,
303 agNULL,
304 interruptContext);
305 }
306 else if (agIOStatus == OSSA_IO_SUCCESS && !(agIOInfoLen == 0 && agFirstDword == agNULL))
307 {
308 SM_DBG2(("smsatPacketCB: Second, agIOStatus == OSSA_IO_SUCCESS , agFirstDword %p agIOInfoLen = %d\n", agFirstDword, agIOInfoLen));
309 /*The SCSI command status is error, need to send REQUEST SENSE for getting more sense information*/
310 satNewIntIo = smsatAllocIntIoResource( smRoot,
311 smOrgIORequest,
312 oneDeviceData,
314 satNewIntIo);
315 if (satNewIntIo == agNULL)
316 {
317 /* memory allocation failure */
318 /* just translate the ATAPI error register to sense information */
320 scsiCmnd->cdb[0],
321 agFirstDword->D2H.status,
322 agFirstDword->D2H.error,
323 &bSenseKey,
324 &bSenseCodeInfo
325 );
326 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
327 tdsmIOCompletedCB( smRoot,
328 smOrgIORequest,
331 satOrgIOContext->pSmSenseData,
332 interruptContext);
333 SM_DBG1(("smsatPacketCB: momory allocation fails\n"));
334 return;
335 } /* end memory allocation */
336
337 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
338 smOrgIORequest,
339 oneDeviceData,
340 scsiCmnd,
341 satOrgIOContext
342 );
343 /* sends request sense to ATAPI device for acquiring sense information */
345 &satNewIntIo->satIntSmIORequest,
346 satNewIOContext->psmDeviceHandle,
347 &satNewIntIo->satIntSmScsiXchg,
348 satNewIOContext
349 );
350 if (status != SM_RC_SUCCESS)
351 {
353 oneDeviceData,
354 satNewIntIo);
355 /* just translate the ATAPI error register to sense information */
357 scsiCmnd->cdb[0],
358 agFirstDword->D2H.status,
359 agFirstDword->D2H.error,
360 &bSenseKey,
361 &bSenseCodeInfo
362 );
363 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
364 tdsmIOCompletedCB(smRoot,
365 smOrgIORequest,
368 satOrgIOContext->pSmSenseData,
369 interruptContext);
370 SM_DBG1(("smsatPacketCB: failed to call satRequestSenseForATAPI()\n"));
371 }
372 }
373 else if (agIOStatus != OSSA_IO_SUCCESS )
374 {
375 SM_DBG2(("smsatPacketCB: agIOStatus != OSSA_IO_SUCCESS, status %d\n", agIOStatus));
377 agRoot,
378 agIORequest,
379 agIOStatus,
380 agFirstDword,
381 agIOInfoLen,
382 agParam,
383 satIOContext);
384 }
385 else
386 {
387 SM_DBG1(("smsatPacketCB: Unknown error \n"));
388 tdsmIOCompletedCB(smRoot,
389 smOrgIORequest,
392 agNULL,
393 interruptContext);
394 }
395}
396/*****************************************************************************
397*! \brief smsatRequestSenseForATAPICB
398*
399* This routine is a callback function called from smllSATACompleted().
400* This CB routine deals with normal non-chained data I/O SATA request.
401*
402* \param agRoot: Handles for this instance of SAS/SATA hardware
403* \param agIORequest: Pointer to the LL I/O request context for this I/O.
404* \param agIOStatus: Status of completed I/O.
405* \param agFirstDword:Pointer to the four bytes of FIS.
406* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
407* length.
408* \param agParam: Additional info based on status.
409* \param ioContext: Pointer to smSatIOContext_t.
410*
411* \return: none
412*
413*****************************************************************************/
414osGLOBAL void
416 agsaRoot_t *agRoot,
417 agsaIORequest_t *agIORequest,
418 bit32 agIOStatus,
419 agsaFisHeader_t *agFirstDword,
420 bit32 agIOInfoLen,
421 void *agParam,
422 void *ioContext
423 )
424{
425 smRoot_t *smRoot = agNULL;
426 smIntRoot_t *smIntRoot = agNULL;
427 smIntContext_t *smAllShared = agNULL;
428 smIORequestBody_t *smIORequestBody;
429 smIORequestBody_t *smOrgIORequestBody;
430 smSatIOContext_t *satIOContext;
431 smSatIOContext_t *satOrgIOContext;
432// smSatIOContext_t *satNewIOContext;
433 smSatInternalIo_t *satIntIo;
434// smSatInternalIo_t *satNewIntIo = agNULL;
435 smDeviceData_t *oneDeviceData;
436 bit32 interruptContext;
437 bit8 dataLength;
438 smIniScsiCmnd_t *scsiCmnd;
439 smIORequest_t *smOrgIORequest;
440
441 SM_DBG3(("smsatRequestSenseForATAPICB: start\n"));
442 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
443 satIOContext = (smSatIOContext_t *) ioContext;
444 if (satIOContext == agNULL)
445 {
446 SM_DBG1(("smsatRequestSenseForATAPICB: satIOContext is NULL\n"));
447 return;
448 }
449 satIntIo = satIOContext->satIntIoContext;
450 oneDeviceData = satIOContext->pSatDevData;
451 interruptContext = satIOContext->interruptContext;
452 smRoot = oneDeviceData->smRoot;
453 smIntRoot = (smIntRoot_t *)smRoot->smData;
454 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
455 if (satIntIo == agNULL)
456 {
457 SM_DBG5(("smsatRequestSenseForATAPICB: External smSatInternalIo_t satIntIoContext\n"));
458 satOrgIOContext = satIOContext;
459 smOrgIORequest = smIORequestBody->smIORequest;
460 scsiCmnd = satIOContext->pScsiCmnd;
461 }
462 else
463 {
464 SM_DBG5(("smsatRequestSenseForATAPICB: Internal smSatInternalIo_t satIntIoContext\n"));
465 satOrgIOContext = satIOContext->satOrgIOContext;
466 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
467 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
468 scsiCmnd = satOrgIOContext->pScsiCmnd;
469 }
470
471 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
472 smIORequestBody->ioCompleted = agTRUE;
473 smIORequestBody->ioStarted = agFALSE;
474 if ( (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0 && agFirstDword == agNULL))
475 {
476 /* copy the request sense buffer to original IO buffer*/
477 if (satIntIo)
478 {
480 }
481 satOrgIOContext->pSmSenseData->senseLen = SENSE_DATA_LENGTH;
482 /* interal structure free */
483 smsatFreeIntIoResource( smRoot, oneDeviceData, satIntIo);
484
485 /* notify the OS to complete this SRB */
486 tdsmIOCompletedCB( smRoot,
487 smOrgIORequest,
490 satOrgIOContext->pSmSenseData,
491 interruptContext);
492 }
493 else if (agIOStatus == OSSA_IO_UNDERFLOW )
494 {
495 /* copy the request sense buffer to original IO buffer*/
496 SM_DBG1(("smsatRequestSenseForATAPICB: OSSA_IO_UNDERFLOW agIOInfoLen = %d\n", agIOInfoLen));
497 dataLength = (bit8)(scsiCmnd->expDataLength - agIOInfoLen);
498 if (satIntIo)
499 {
500 sm_memcpy(satOrgIOContext->pSmSenseData->senseData, satIntIo->satIntDmaMem.virtPtr, dataLength);
501 }
502 satOrgIOContext->pSmSenseData->senseLen = dataLength;
503 /* interal structure free */
504 smsatFreeIntIoResource( smRoot, oneDeviceData, satIntIo);
505
506 /* notify the OS to complete this SRB */
507 tdsmIOCompletedCB( smRoot,
508 smOrgIORequest,
511 satOrgIOContext->pSmSenseData,
512 interruptContext);
513 }
514 else
515 {
516 SM_DBG1(("smsatRequestSenseForATAPICB: failed, agIOStatus error = 0x%x agIOInfoLen = %d\n", agIOStatus, agIOInfoLen));
517 /* interal structure free */
518 smsatFreeIntIoResource( smRoot, oneDeviceData, satIntIo);
519
520 /* notify the OS to complete this SRB */
521 tdsmIOCompletedCB( smRoot,
522 smOrgIORequest,
525 agNULL,
526 interruptContext);
527 }
528 SM_DBG3(("smsatRequestSenseForATAPICB: end\n"));
529}
530
531/*****************************************************************************
532*! \brief smsatSetFeaturesPIOCB
533*
534* This routine is a callback function called from smllSATACompleted().
535* This CB routine deals with normal non-chained data I/O SATA request.
536*
537* \param agRoot: Handles for this instance of SAS/SATA hardware
538* \param agIORequest: Pointer to the LL I/O request context for this I/O.
539* \param agIOStatus: Status of completed I/O.
540* \param agFirstDword:Pointer to the four bytes of FIS.
541* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
542* length.
543* \param agParam: Additional info based on status.
544* \param ioContext: Pointer to smSatIOContext_t.
545*
546* \return: none
547*
548*****************************************************************************/
549osGLOBAL void
551 agsaRoot_t *agRoot,
552 agsaIORequest_t *agIORequest,
553 bit32 agIOStatus,
554 agsaFisHeader_t *agFirstDword,
555 bit32 agIOInfoLen,
556 void *agParam,
557 void *ioContext
558 )
559{
560 smRoot_t *smRoot = agNULL;
561 smIntRoot_t *smIntRoot = agNULL;
562 smIntContext_t *smAllShared = agNULL;
563 smIORequestBody_t *smIORequestBody;
564 smIORequestBody_t *smOrgIORequestBody = agNULL;
565 smSatIOContext_t *satIOContext;
566 smSatIOContext_t *satOrgIOContext;
567 smSatIOContext_t *satNewIOContext;
568 smSatInternalIo_t *satIntIo;
569 smSatInternalIo_t *satNewIntIo = agNULL;
570 smDeviceData_t *oneDeviceData;
571 smIniScsiCmnd_t *scsiCmnd;
572 smIORequest_t *smOrgIORequest;
573 smDeviceHandle_t *smDeviceHandle;
575 smIORequest_t *smIORequest;
576
577 SM_DBG2(("smsatSetFeaturesPIOCB: start\n"));
578 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
579 satIOContext = (smSatIOContext_t *) ioContext;
580 if (satIOContext == agNULL)
581 {
582 SM_DBG1(("smsatSetFeaturesPIOCB: satIOContext is NULL\n"));
583 return;
584 }
585 satIntIo = satIOContext->satIntIoContext;
586 oneDeviceData = satIOContext->pSatDevData;
587 smDeviceHandle = satIOContext->psmDeviceHandle;
588 smRoot = oneDeviceData->smRoot;
589 smIntRoot = (smIntRoot_t *)smRoot->smData;
590 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
591 if (satIntIo == agNULL)
592 {
593 SM_DBG2(("smsatSetFeaturesPIOCB: External smSatInternalIo_t satIntIoContext\n"));
594 satOrgIOContext = satIOContext;
595 smOrgIORequest = smIORequestBody->smIORequest;
596 scsiCmnd = satIOContext->pScsiCmnd;
597 }
598 else
599 {
600 SM_DBG2(("smsatSetFeaturesPIOCB: Internal smSatInternalIo_t satIntIoContext\n"));
601 satOrgIOContext = satIOContext->satOrgIOContext;
602 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
603 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
604 scsiCmnd = satOrgIOContext->pScsiCmnd;
605 }
606 smIORequest = smOrgIORequestBody->smIORequest;
607 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
608 smIORequestBody->ioCompleted = agTRUE;
609 smIORequestBody->ioStarted = agFALSE;
610 /* interal structure free */
612 oneDeviceData,
613 satIntIo);
614 if (smIORequest->tdData == smIORequest->smData)
615 {
616 SM_DBG1(("smsatSetFeaturesPIOCB: the same tdData and smData error!\n"));
617 }
618 /* check the agIOStatus */
619 if (agIOStatus == OSSA_IO_ABORTED ||
620 agIOStatus == OSSA_IO_NO_DEVICE ||
621 agIOStatus == OSSA_IO_PORT_IN_RESET ||
622 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL ||
623 agIOStatus == OSSA_IO_DS_IN_RECOVERY ||
624 agIOStatus == OSSA_IO_DS_IN_ERROR ||
625 agIOStatus == OSSA_IO_DS_INVALID
626 )
627 {
628 SM_DBG1(("smsatSetFeaturesPIOCB: error status 0x%x\n", agIOStatus));
629 SM_DBG1(("smsatSetFeaturesPIOCB: did %d!!!\n", oneDeviceData->id));
630 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
631 return;
632 }
633 /*if the ATAPI device support DMA, then enble this feature*/
634 if (oneDeviceData->satDMASupport)
635 {
636 satNewIntIo = smsatAllocIntIoResource(smRoot,
637 smOrgIORequest,
638 oneDeviceData,
639 0,
640 satNewIntIo);
641 if (satNewIntIo == agNULL)
642 {
643 SM_DBG1(("smsatSetFeaturesPIOCB: memory allocation fails\n"));
644 /*Complete this identify packet device IO */
645 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
646 return;
647 } /* end memory allocation */
648
649 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
650 smOrgIORequest,
651 oneDeviceData,
652 scsiCmnd,
653 satOrgIOContext
654 );
655 /* sends another ATA SET FEATURES based on DMA bit */
657 &satNewIntIo->satIntSmIORequest,
658 satNewIOContext->psmDeviceHandle,
659 &satNewIntIo->satIntSmScsiXchg,
660 satNewIOContext
661 );
662 if (status != SM_RC_SUCCESS)
663 {
664 smsatFreeIntIoResource(smRoot, oneDeviceData, satNewIntIo);
665 SM_DBG2(("satSetFeaturesPIOCB: failed to call smsatSetFeatures()\n"));
666 /*Complete this identify packet device IO */
667 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
668 }
669 }
670 else
671 {
672 /*Complete this identify packet device IO */
673 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
674 }
675 SM_DBG2(("smsatSetFeaturesPIOCB: exit, agIOStatus 0x%x\n", agIOStatus));
676}
677
678/*****************************************************************************
679*! \brief smsatDeviceResetCB
680*
681* This routine is a callback function called from smllSATACompleted().
682* This CB routine deals with normal non-chained data I/O SATA request.
683*
684* \param agRoot: Handles for this instance of SAS/SATA hardware
685* \param agIORequest: Pointer to the LL I/O request context for this I/O.
686* \param agIOStatus: Status of completed I/O.
687* \param agFirstDword:Pointer to the four bytes of FIS.
688* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
689* length.
690* \param agParam: Additional info based on status.
691* \param ioContext: Pointer to smSatIOContext_t.
692*
693* \return: none
694*
695*****************************************************************************/
696osGLOBAL void
698 agsaRoot_t *agRoot,
699 agsaIORequest_t *agIORequest,
700 bit32 agIOStatus,
701 agsaFisHeader_t *agFirstDword,
702 bit32 agIOInfoLen,
703 void *agParam,
704 void *ioContext
705 )
706{
707 smRoot_t *smRoot = agNULL;
708 smIntRoot_t *smIntRoot = agNULL;
709 smIntContext_t *smAllShared = agNULL;
710 smIORequestBody_t *smIORequestBody;
711 smSatIOContext_t *satIOContext;
712 smSatIOContext_t *satOrgIOContext;
713// smSatIOContext_t *satNewIOContext;
714 smSatInternalIo_t *satIntIo;
715// smSatInternalIo_t *satNewIntIo = agNULL;
716 smDeviceData_t *oneDeviceData;
717#ifdef TD_DEBUG_ENABLE
718 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
719 bit32 ataStatus = 0;
720 bit32 ataError;
721#endif
722// bit32 status;
723 bit32 AbortTM = agFALSE;
724 smDeviceHandle_t *smDeviceHandle;
725
726 SM_DBG1(("smsatDeviceResetCB: start\n"));
727 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
728 satIOContext = (smSatIOContext_t *) ioContext;
729 satIntIo = satIOContext->satIntIoContext;
730 oneDeviceData = satIOContext->pSatDevData;
731 smRoot = oneDeviceData->smRoot;
732 smIntRoot = (smIntRoot_t *)smRoot->smData;
733 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
734 smDeviceHandle = oneDeviceData->smDevHandle;
735 if (satIntIo == agNULL)
736 {
737 SM_DBG6(("smsatDeviceResetCB: External, OS generated\n"));
738 satOrgIOContext = satIOContext;
739 }
740 else
741 {
742 SM_DBG6(("smsatDeviceResetCB: Internal, TD generated\n"));
743 satOrgIOContext = satIOContext->satOrgIOContext;
744 if (satOrgIOContext == agNULL)
745 {
746 SM_DBG6(("smsatDeviceResetCB: satOrgIOContext is NULL, wrong\n"));
747 return;
748 }
749 else
750 {
751 SM_DBG6(("smsatDeviceResetCB: satOrgIOContext is NOT NULL\n"));
752 }
753 }
754 smIORequestBody->ioCompleted = agTRUE;
755 smIORequestBody->ioStarted = agFALSE;
756 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
757 {
758 SM_DBG1(("smsatDeviceResetCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
759 /* TM completed */
760 tdsmEventCB( smRoot,
761 smDeviceHandle,
764 oneDeviceData->satTmTaskTag);
765 oneDeviceData->satTmTaskTag = agNULL;
766 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
768 oneDeviceData,
769 satIntIo);
770 return;
771 }
774 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
781 )
782 {
783 SM_DBG1(("smsatDeviceResetCB: OSSA_IO_OPEN_CNX_ERROR!!!\n"));
784 /* TM completed */
785 tdsmEventCB( smRoot,
786 smDeviceHandle,
789 oneDeviceData->satTmTaskTag);
790 oneDeviceData->satTmTaskTag = agNULL;
791 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
793 oneDeviceData,
794 satIntIo);
795 return;
796 }
797 if (agIOStatus != OSSA_IO_SUCCESS)
798 {
799#ifdef TD_DEBUG_ENABLE
800 /* only agsaFisPioSetup_t is expected */
801 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
802 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
803 ataError = satPIOSetupHeader->error; /* ATA Eror register */
804#endif
805 SM_DBG1(("smsatDeviceResetCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
806 /* TM completed */
807 tdsmEventCB( smRoot,
808 smDeviceHandle,
811 oneDeviceData->satTmTaskTag);
812 oneDeviceData->satTmTaskTag = agNULL;
813 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
815 oneDeviceData,
816 satIntIo);
817 return;
818 }
819 /*success */
820 if (satOrgIOContext->TMF == AG_ABORT_TASK)
821 {
822 AbortTM = agTRUE;
823 }
824 if (AbortTM == agTRUE)
825 {
826 SM_DBG1(("smsatDeviceResetCB: calling satAbort!!!\n"));
827 smsatAbort(smRoot, agRoot, satOrgIOContext->satToBeAbortedIOContext);
828 }
829 oneDeviceData->satTmTaskTag = agNULL;
830 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
831 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
832 SM_DBG1(("smsatDeviceResetCB: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
833 SM_DBG1(("smsatDeviceResetCB: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
835 oneDeviceData,
836 satIntIo);
837 /* TM completed */
838 tdsmEventCB( smRoot,
839 smDeviceHandle,
841 smTMOK,
842 oneDeviceData->satTmTaskTag);
843
844
845 SM_DBG3(("smsatDeviceResetCB: return\n"));
846}
847
848
849/*****************************************************************************
850*! \brief smsatExecuteDeviceDiagnosticCB
851*
852* This routine is a callback function called from smllSATACompleted().
853* This CB routine deals with normal non-chained data I/O SATA request.
854*
855* \param agRoot: Handles for this instance of SAS/SATA hardware
856* \param agIORequest: Pointer to the LL I/O request context for this I/O.
857* \param agIOStatus: Status of completed I/O.
858* \param agFirstDword:Pointer to the four bytes of FIS.
859* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
860* length.
861* \param agParam: Additional info based on status.
862* \param ioContext: Pointer to smSatIOContext_t.
863*
864* \return: none
865*
866*****************************************************************************/
867osGLOBAL void
869 agsaRoot_t *agRoot,
870 agsaIORequest_t *agIORequest,
871 bit32 agIOStatus,
872 agsaFisHeader_t *agFirstDword,
873 bit32 agIOInfoLen,
874 void *agParam,
875 void *ioContext
876 )
877{
878 smRoot_t *smRoot = agNULL;
879 smIntRoot_t *smIntRoot = agNULL;
880 smIntContext_t *smAllShared = agNULL;
881 smIORequestBody_t *smIORequestBody;
882 smSatIOContext_t *satIOContext;
883 smSatIOContext_t *satOrgIOContext;
884// smSatIOContext_t *satNewIOContext;
885 smSatInternalIo_t *satIntIo;
886// smSatInternalIo_t *satNewIntIo = agNULL;
887 smDeviceData_t *oneDeviceData;
888
889 SM_DBG6(("smsatSetFeaturesDMACB: start\n"));
890 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
891 satIOContext = (smSatIOContext_t *) ioContext;
892 satIntIo = satIOContext->satIntIoContext;
893 oneDeviceData = satIOContext->pSatDevData;
894 smRoot = oneDeviceData->smRoot;
895 smIntRoot = (smIntRoot_t *)smRoot->smData;
896 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
897 if (satIntIo == agNULL)
898 {
899 SM_DBG5(("smsatExecuteDeviceDiagnosticCB: External smSatInternalIo_t satIntIoContext\n"));
900 satOrgIOContext = satIOContext;
901 }
902 else
903 {
904 SM_DBG5(("smsatExecuteDeviceDiagnosticCB: Internal smSatInternalIo_t satIntIoContext\n"));
905 satOrgIOContext = satIOContext->satOrgIOContext;
906 if (satOrgIOContext == agNULL)
907 {
908 SM_DBG5(("smsatExecuteDeviceDiagnosticCB: satOrgIOContext is NULL\n"));
909 }
910 else
911 {
912 SM_DBG5(("smsatExecuteDeviceDiagnosticCB: satOrgIOContext is NOT NULL\n"));
913 }
914 }
915 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
916 smIORequestBody->ioCompleted = agTRUE;
917 smIORequestBody->ioStarted = agFALSE;
918 /* interal structure free */
919 smsatFreeIntIoResource(smRoot,oneDeviceData, satIntIo);
920}
921
922GLOBAL void
924 bit8 bCommand,
925 bit8 bATAStatus,
926 bit8 bATAError,
927 bit8 *pSenseKey,
928 bit16 *pSenseCodeInfo
929 )
930{
931 if (pSenseKey == agNULL || pSenseCodeInfo == agNULL)
932 {
933 SM_DBG1(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n"));
934 return;
935 }
936 if (bATAStatus & ERR_ATA_STATUS_MASK )
937 {
938 if(bATAError & NM_ATA_ERROR_MASK)
939 {
940 *pSenseKey = SCSI_SNSKEY_NOT_READY;
941 *pSenseCodeInfo = 0x3a00;
942 }
943 else if(bATAError & ABRT_ATA_ERROR_MASK)
944 {
945 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
946 *pSenseCodeInfo = 0;
947 }
948 else if(bATAError & MCR_ATA_ERROR_MASK)
949 {
950 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
951 *pSenseCodeInfo = 0x5a01;
952 }
953 else if(bATAError & IDNF_ATA_ERROR_MASK)
954 {
955 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
956 *pSenseCodeInfo = 0x1401;
957 }
958 else if(bATAError & MC_ATA_ERROR_MASK)
959 {
960 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
961 *pSenseCodeInfo = 0x2800;
962 }
963 else if(bATAError & UNC_ATA_ERROR_MASK)
964 {
965 /*READ*/
966 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
967 *pSenseCodeInfo = 0x1100;
968
969 /*add WRITE here */
970 }
971 else if(bATAError & ICRC_ATA_ERROR_MASK)
972 {
973 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
974 *pSenseCodeInfo = 0x4703;
975 }
976 }
977 else if((bATAStatus & DF_ATA_STATUS_MASK))
978 {
979 *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR;
980 *pSenseCodeInfo = 0x4400;
981 }
982 else
983 {
984 SM_DBG1(("unhandled ata error: bATAStatus = 0x%x, bATAError = 0x%x\n", bATAStatus, bATAError));
985 }
986}
987
988GLOBAL void
990 bit8 bATAStatus,
991 bit8 bATAError,
992 bit8 *pSenseKey,
993 bit16 *pSenseCodeInfo
994 )
995{
996
997 SM_DBG1(("TranslateATAErrorsToSCSIErros: bATAStatus=%d bATAError= %d \n",bATAStatus,bATAError));
998
999 if (pSenseKey == agNULL || pSenseCodeInfo == agNULL)
1000 {
1001 SM_DBG1(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n"));
1002 return;
1003 }
1004
1005 if (bATAStatus & ERR_ATA_STATUS_MASK)
1006 {
1007 if(bATAError & NM_ATA_ERROR_MASK)
1008 {
1009 *pSenseKey = SCSI_SNSKEY_NOT_READY;
1010 *pSenseCodeInfo = SCSI_SNSCODE_MEDIUM_NOT_PRESENT;
1011 }
1012 else if(bATAError & UNC_ATA_ERROR_MASK)
1013 {
1014 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
1015 *pSenseCodeInfo = SCSI_SNSCODE_UNRECOVERED_READ_ERROR;
1016 }
1017 else if(bATAError & IDNF_ATA_ERROR_MASK)
1018 {
1019 *pSenseKey = SCSI_SNSKEY_ILLEGAL_REQUEST;
1021 }
1022 else if(bATAError & ABRT_ATA_ERROR_MASK)
1023 {
1024 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
1025 *pSenseCodeInfo = SCSI_SNSCODE_NO_ADDITIONAL_INFO;
1026 }
1027 else if(bATAError & MC_ATA_ERROR_MASK)
1028 {
1029 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
1031 }
1032 else if(bATAError & MCR_ATA_ERROR_MASK)
1033 {
1034 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
1036 }
1037 else if(bATAError & ICRC_ATA_ERROR_MASK)
1038 {
1039 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
1041 }
1042 else
1043 {
1044 *pSenseKey = SCSI_SNSKEY_NO_SENSE;
1045 *pSenseCodeInfo = SCSI_SNSCODE_NO_ADDITIONAL_INFO;
1046
1047 }
1048 }
1049 else if (bATAStatus & DF_ATA_STATUS_MASK) /* INTERNAL TARGET FAILURE */
1050 {
1051 *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR;
1052 *pSenseCodeInfo = SCSI_SNSCODE_INTERNAL_TARGET_FAILURE;
1053 }
1054
1055
1056}
1057
1058
1059FORCEINLINE void
1061 agsaRoot_t *agRoot,
1062 agsaIORequest_t *agIORequest,
1063 bit32 agIOStatus,
1064 agsaFisHeader_t *agFirstDword,
1065 bit32 agIOInfoLen,
1066 void *agParam,
1067 void *ioContext
1068 )
1069{
1070 smIORequestBody_t *smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
1071 smSatIOContext_t *satIOContext = (smSatIOContext_t *) ioContext;
1072 smSatInternalIo_t *SatIntIo = satIOContext->satIntIoContext;
1073 smDeviceData_t *oneDeviceData = satIOContext->pSatDevData;
1074 smRoot_t *smRoot = oneDeviceData->smRoot;
1075 smIntRoot_t *smIntRoot = (smIntRoot_t *)smRoot->smData;
1076 smIntContext_t *smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
1077 bit32 interruptContext = satIOContext->interruptContext;
1078
1079 SM_DBG2(("smsatNonChainedDataIOCB: start\n"));
1080
1081 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1082
1083 smIORequestBody->ioCompleted = agTRUE;
1084 smIORequestBody->ioStarted = agFALSE;
1085
1086 /* interal structure free */
1087 smsatFreeIntIoResource( smRoot,
1088 oneDeviceData,
1089 SatIntIo);
1090
1091 /* Process completion */
1092 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
1093 {
1094 SM_DBG5(("smsatNonChainedDataIOCB: success\n"));
1095 SM_DBG5(("smsatNonChainedDataIOCB: success agIORequest %p\n", agIORequest));
1096 /*
1097 * Command was completed OK, this is the normal path.
1098 * Now call the OS-App Specific layer about this completion.
1099 */
1100 tdsmIOCompletedCB( smRoot,
1101 smIORequestBody->smIORequest,
1104 agNULL,
1105 interruptContext);
1106 }
1107 else
1108 {
1109 SM_DBG1(("smsatNonChainedDataIOCB: calling smsatProcessAbnormalCompletion!!!\n"));
1110 /* More checking needed */
1112 agIORequest,
1113 agIOStatus,
1114 agFirstDword,
1115 agIOInfoLen,
1116 agParam,
1117 satIOContext);
1118 }
1119
1120 return;
1121}
1122
1123FORCEINLINE void
1125 agsaRoot_t *agRoot,
1126 agsaIORequest_t *agIORequest,
1127 bit32 agIOStatus,
1128 agsaFisHeader_t *agFirstDword,
1129 bit32 agIOInfoLen,
1130 void *agParam,
1131 void *ioContext
1132 )
1133{
1134
1135 smRoot_t *smRoot = agNULL;
1136 smIntRoot_t *smIntRoot = agNULL;
1137 smIntContext_t *smAllShared = agNULL;
1138 smIORequestBody_t *smIORequestBody;
1139 smIORequestBody_t *smOrgIORequestBody;
1140 smSatIOContext_t *satIOContext;
1141 smSatIOContext_t *satOrgIOContext;
1142 smSatIOContext_t *satNewIOContext;
1143 smSatInternalIo_t *satIntIo;
1144 smSatInternalIo_t *satNewIntIo = agNULL;
1145// smDeviceData_t *satDevData;
1146 smDeviceData_t *oneDeviceData;
1147 smScsiRspSense_t *pSense;
1148 smIniScsiCmnd_t *scsiCmnd;
1149 smIORequest_t *smOrgIORequest;
1150 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1151 bit32 ataStatus = 0;
1153 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1154 bit32 dataLength;
1155
1156 SM_DBG6(("smsatChainedDataIOCB: start\n"));
1157 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
1158 satIOContext = (smSatIOContext_t *) ioContext;
1159 if (satIOContext == agNULL)
1160 {
1161 SM_DBG1(("smsatChainedDataIOCB: satIOContext is NULL\n"));
1162 return;
1163 }
1164 satIntIo = satIOContext->satIntIoContext;
1165 oneDeviceData = satIOContext->pSatDevData;
1166 hostToDevFis = satIOContext->pFis;
1167 smRoot = oneDeviceData->smRoot;
1168 smIntRoot = (smIntRoot_t *)smRoot->smData;
1169 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
1170 if (satIntIo == agNULL)
1171 {
1172 SM_DBG5(("smsatChainedDataIOCB: External smSatInternalIo_t satIntIoContext\n"));
1173 satOrgIOContext = satIOContext;
1174 smOrgIORequest = smIORequestBody->smIORequest;
1175 pSense = satIOContext->pSense;
1176 scsiCmnd = satIOContext->pScsiCmnd;
1177 }
1178 else
1179 {
1180 SM_DBG5(("smsatChainedDataIOCB: Internal smSatInternalIo_t satIntIoContext\n"));
1181 satOrgIOContext = satIOContext->satOrgIOContext;
1182 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
1183 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
1184 pSense = satOrgIOContext->pSense;
1185 scsiCmnd = satOrgIOContext->pScsiCmnd;
1186 }
1187 smIORequestBody->ioCompleted = agTRUE;
1188 smIORequestBody->ioStarted = agFALSE;
1189
1190 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1191 {
1192 SM_DBG1(("smsatChainedDataIOCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
1193 smsatSetSensePayload( pSense,
1195 0,
1197 satOrgIOContext);
1198
1199 tdsmIOCompletedCB( smRoot,
1200 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1203 satOrgIOContext->pSmSenseData,
1204 satOrgIOContext->interruptContext );
1205
1206 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1207
1208 smsatFreeIntIoResource( smRoot,
1209 oneDeviceData,
1210 satIntIo);
1211 return;
1212 }
1213
1214 /*
1215 checking IO status, FIS type and error status
1216 */
1217 if (agIOStatus != OSSA_IO_SUCCESS)
1218 {
1219 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
1220 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
1221 first, assumed to be Reg Device to Host FIS
1222 This is OK to just find fis type
1223 */
1224 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1225 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
1226 /* for debugging */
1227 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
1228 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1229 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1230 )
1231 {
1232 SM_DBG1(("smsatChainedDataIOCB: FAILED, Wrong FIS type 0x%x!!!\n", statDevToHostFisHeader->fisType));
1233 }
1234
1235 /* for debugging */
1236 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1237 (ataStatus & DF_ATA_STATUS_MASK)
1238 )
1239 {
1240 SM_DBG1(("smsatChainedDataIOCB: FAILED, error status and command 0x%x!!!\n", hostToDevFis->h.command));
1241 }
1242
1243 /* the function below handles abort case */
1245 agIORequest,
1246 agIOStatus,
1247 agFirstDword,
1248 agIOInfoLen,
1249 agParam,
1250 satIOContext);
1251
1252 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1253 smsatFreeIntIoResource( smRoot,
1254 oneDeviceData,
1255 satIntIo);
1256 return;
1257 } /* end of error */
1258
1259 switch (hostToDevFis->h.command)
1260 {
1261 case SAT_READ_DMA: /* fall through */
1262 case SAT_READ_SECTORS: /* fall through */
1263 case SAT_READ_DMA_EXT: /* fall through */
1264 case SAT_READ_SECTORS_EXT: /* fall through */
1265 case SAT_READ_FPDMA_QUEUED: /* fall through */
1266 case SAT_WRITE_DMA: /* fall through */
1267 case SAT_WRITE_SECTORS:/* fall through */
1268 case SAT_WRITE_DMA_FUA_EXT: /* fall through */
1269 case SAT_WRITE_DMA_EXT: /* fall through */
1270 case SAT_WRITE_SECTORS_EXT: /* fall through */
1272
1273 SM_DBG5(("smsatChainedDataIOCB: READ/WRITE success case\n"));
1274
1275 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1276
1277 /* done with internally genereated SAT_SMART_RETURN_STATUS */
1278 smsatFreeIntIoResource( smRoot,
1279 oneDeviceData,
1280 satIntIo);
1281 /* let's loop till TL */
1282
1283 /* lba = lba + tl
1284 loopnum--;
1285 if (loopnum == 0) done
1286 */
1287 (satOrgIOContext->LoopNum)--;
1288 if (satOrgIOContext->LoopNum == 0)
1289 {
1290 /* done with read */
1291 tdsmIOCompletedCB( smRoot,
1292 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1295 agNULL,
1296 satOrgIOContext->interruptContext );
1297 return;
1298 }
1299
1300 /* don't need to allocate payload memory here. Use the one allocated by OS layer */
1301 dataLength = 0;
1302
1303 satNewIntIo = smsatAllocIntIoResource( smRoot,
1304 smOrgIORequest,
1305 oneDeviceData,
1306 dataLength,
1307 satNewIntIo);
1308 if (satNewIntIo == agNULL)
1309 {
1310 tdsmIOCompletedCB( smRoot,
1311 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1312 smIOFailed,
1314 agNULL,
1315 satOrgIOContext->interruptContext );
1316
1317 SM_DBG1(("smsatChainedDataIOCB: momory allocation fails!!!\n"));
1318 return;
1319 } /* end of memory allocation failure */
1320
1321 /*
1322 * Need to initialize all the fields within satIOContext
1323 */
1324
1325 satNewIOContext = smsatPrepareNewIO(
1326 satNewIntIo,
1327 smOrgIORequest,
1328 oneDeviceData,
1329 scsiCmnd,
1330 satOrgIOContext
1331 );
1332
1333 /* sending another ATA command */
1334 switch (scsiCmnd->cdb[0])
1335 {
1336 case SCSIOPC_READ_6:
1337 /* no loop should occur with READ6 since it fits in one ATA command */
1338 break;
1339 case SCSIOPC_READ_10: /* fall through */
1340 case SCSIOPC_READ_12: /* fall through */
1341 case SCSIOPC_READ_16: /* fall through */
1342 status = smsatRead_1( smRoot,
1343 &satNewIntIo->satIntSmIORequest,
1344 satNewIOContext->psmDeviceHandle,
1345 &satNewIntIo->satIntSmScsiXchg,
1346 satNewIOContext);
1347 break;
1348 case SCSIOPC_WRITE_6:
1349 /* no loop should occur with WRITE6 since it fits in one ATA command */
1350 break;
1351 case SCSIOPC_WRITE_10: /* fall through */
1352 case SCSIOPC_WRITE_12: /* fall through */
1353 case SCSIOPC_WRITE_16: /* fall through */
1354 status = smsatWrite_1( smRoot,
1355 &satNewIntIo->satIntSmIORequest,
1356 satNewIOContext->psmDeviceHandle,
1357 &satNewIntIo->satIntSmScsiXchg,
1358 satNewIOContext);
1359 break;
1360 default:
1361 SM_DBG1(("smsatChainedDataIOCB: success but default case scsi cmd 0x%x ata cmd 0x%x!!!\n",scsiCmnd->cdb[0], hostToDevFis->h.command));
1362 status = tiError;
1363 break;
1364 }
1365
1366
1367
1368 if (status != SM_RC_SUCCESS)
1369 {
1370 smsatFreeIntIoResource( smRoot,
1371 oneDeviceData,
1372 satNewIntIo);
1373 tdsmIOCompletedCB( smRoot,
1374 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1375 smIOFailed,
1377 agNULL,
1378 satOrgIOContext->interruptContext );
1379 SM_DBG1(("smsatChainedDataIOCB: calling satRead10_1 fails!!!\n"));
1380 return;
1381 }
1382
1383 break;
1384
1385
1386 default:
1387 SM_DBG1(("smsatChainedDataIOCB: success but default case command 0x%x!!!\n",hostToDevFis->h.command));
1388 tdsmIOCompletedCB( smRoot,
1389 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1390 smIOFailed,
1392 agNULL,
1393 satOrgIOContext->interruptContext );
1394
1395 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1396
1397 smsatFreeIntIoResource( smRoot,
1398 oneDeviceData,
1399 satIntIo);
1400
1401 break;
1402 }
1403
1404
1405 return;
1406}
1407
1408osGLOBAL void
1410 agsaRoot_t *agRoot,
1411 agsaIORequest_t *agIORequest,
1412 bit32 agIOStatus,
1413 agsaFisHeader_t *agFirstDword,
1414 bit32 agIOInfoLen,
1415 agsaFrameHandle_t agFrameHandle,
1416 void *ioContext
1417 )
1418{
1419
1420// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1421// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1422// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1423// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1424 smRoot_t *smRoot = agNULL;
1425 smIntRoot_t *smIntRoot = agNULL;
1426 smIntContext_t *smAllShared = agNULL;
1427 smIORequestBody_t *smIORequestBody;
1428 smIORequestBody_t *smOrgIORequestBody;
1429 smSatIOContext_t *satIOContext;
1430 smSatIOContext_t *satOrgIOContext;
1431 smSatInternalIo_t *satIntIo;
1432// satDeviceData_t *satDevData;
1433 smDeviceData_t *oneDeviceData;
1434 smScsiRspSense_t *pSense;
1435 smIORequest_t *smOrgIORequest;
1436 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1437 bit32 ataStatus = 0;
1438 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1439
1440 SM_DBG2(("smsatNonChainedVerifyCB: start\n"));
1441 SM_DBG5(("smsatNonChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
1442
1443 /* internally generate smIOContext */
1444 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
1445 satIOContext = (smSatIOContext_t *) ioContext;
1446 satIntIo = satIOContext->satIntIoContext;
1447 oneDeviceData = satIOContext->pSatDevData;
1448 hostToDevFis = satIOContext->pFis;
1449 smRoot = oneDeviceData->smRoot;
1450 smIntRoot = (smIntRoot_t *)smRoot->smData;
1451 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
1452 if (satIntIo == agNULL)
1453 {
1454 SM_DBG4(("smsatNonChainedVerifyCB: External smSatInternalIo_t satIntIoContext\n"));
1455 satOrgIOContext = satIOContext;
1456 smOrgIORequest = smIORequestBody->smIORequest;
1457 pSense = satIOContext->pSense;
1458 }
1459 else
1460 {
1461 SM_DBG4(("smsatNonChainedVerifyCB: Internal smSatInternalIo_t satIntIoContext\n"));
1462 satOrgIOContext = satIOContext->satOrgIOContext;
1463 if (satOrgIOContext == agNULL)
1464 {
1465 SM_DBG4(("smsatNonChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
1466 return;
1467 }
1468 else
1469 {
1470 SM_DBG4(("smsatNonChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
1471 }
1472 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
1473 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
1474 pSense = satOrgIOContext->pSense;
1475 }
1476
1477 smIORequestBody->ioCompleted = agTRUE;
1478 smIORequestBody->ioStarted = agFALSE;
1479 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1480 {
1481 SM_DBG1(("smsatNonChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
1482 smsatSetSensePayload( pSense,
1484 0,
1486 satOrgIOContext);
1487 tdsmIOCompletedCB( smRoot,
1488 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1491 satOrgIOContext->pSmSenseData,
1492 satOrgIOContext->interruptContext );
1493 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1494
1495 smsatFreeIntIoResource( smRoot,
1496 oneDeviceData,
1497 satIntIo);
1498 return;
1499 }
1500 if (agIOStatus != OSSA_IO_SUCCESS)
1501 {
1502 /* only agsaFisRegDeviceToHost_t is expected */
1503 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1504 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
1505 }
1506
1507 if( agIOStatus != OSSA_IO_SUCCESS)
1508 {
1509 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
1510 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
1511 )
1512 {
1513 /* for debugging */
1514 if( agIOStatus != OSSA_IO_SUCCESS)
1515 {
1516 SM_DBG1(("smsatNonChainedVerifyCB: FAILED, NOT IO_SUCCESS!!!\n"));
1517 }
1518 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
1519 {
1520 SM_DBG1(("smsatNonChainedVerifyCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
1521 }
1522 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1523 (ataStatus & DF_ATA_STATUS_MASK)
1524 )
1525 {
1526 SM_DBG1(("smsatNonChainedVerifyCB: FAILED, FAILED, error status!!!\n"));
1527 }
1528
1529 /* Process abort case */
1530 if (agIOStatus == OSSA_IO_ABORTED)
1531 {
1532 smsatProcessAbort(smRoot,
1533 smOrgIORequest,
1534 satOrgIOContext
1535 );
1536
1537 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1538
1539 smsatFreeIntIoResource( smRoot,
1540 oneDeviceData,
1541 satIntIo);
1542 return;
1543 }
1544
1545 /* for debugging */
1546 switch (hostToDevFis->h.command)
1547 {
1549 SM_DBG1(("smsatNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS!!!\n"));
1550 break;
1552 SM_DBG1(("smsatNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT!!!\n"));
1553 break;
1554 default:
1555 SM_DBG1(("smsatNonChainedVerifyCB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
1556 break;
1557 }
1558
1559 smsatSetSensePayload( pSense,
1561 0,
1563 satOrgIOContext);
1564
1565 tdsmIOCompletedCB( smRoot,
1566 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1569 satOrgIOContext->pSmSenseData,
1570 satOrgIOContext->interruptContext );
1571
1572 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1573
1574 smsatFreeIntIoResource( smRoot,
1575 oneDeviceData,
1576 satIntIo);
1577 return;
1578 } /* end error checking */
1579 }
1580
1581 /* process success from this point on */
1582 switch (hostToDevFis->h.command)
1583 {
1584 case SAT_READ_VERIFY_SECTORS: /* fall through */
1586 SM_DBG5(("smsatNonChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
1587
1588 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1589
1590 smsatFreeIntIoResource( smRoot,
1591 oneDeviceData,
1592 satIntIo);
1593
1594 tdsmIOCompletedCB( smRoot,
1595 smOrgIORequest,
1598 agNULL,
1599 satOrgIOContext->interruptContext);
1600 break;
1601 default:
1602 SM_DBG1(("smsatNonChainedVerifyCB: success but error default case command 0x%x!!!\n", hostToDevFis->h.command));
1603
1604 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1605
1606 smsatFreeIntIoResource( smRoot,
1607 oneDeviceData,
1608 satIntIo);
1609
1610 smsatSetSensePayload( pSense,
1612 0,
1614 satOrgIOContext);
1615
1616 tdsmIOCompletedCB( smRoot,
1617 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1620 satOrgIOContext->pSmSenseData,
1621 satOrgIOContext->interruptContext );
1622
1623 break;
1624 }
1625
1626 return;
1627}
1628
1629osGLOBAL void
1631 agsaRoot_t *agRoot,
1632 agsaIORequest_t *agIORequest,
1633 bit32 agIOStatus,
1634 agsaFisHeader_t *agFirstDword,
1635 bit32 agIOInfoLen,
1636 agsaFrameHandle_t agFrameHandle,
1637 void *ioContext
1638 )
1639{
1640
1641 smRoot_t *smRoot = agNULL;
1642 smIntRoot_t *smIntRoot = agNULL;
1643 smIntContext_t *smAllShared = agNULL;
1644 smIORequestBody_t *smIORequestBody;
1645 smIORequestBody_t *smOrgIORequestBody;
1646 smSatIOContext_t *satIOContext;
1647 smSatIOContext_t *satOrgIOContext;
1648 smSatIOContext_t *satNewIOContext;
1649 smSatInternalIo_t *satIntIo;
1650 smSatInternalIo_t *satNewIntIo = agNULL;
1651 smDeviceData_t *oneDeviceData;
1652 smScsiRspSense_t *pSense;
1653 smIniScsiCmnd_t *scsiCmnd;
1654 smIORequest_t *smOrgIORequest;
1655 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1656 bit32 ataStatus = 0;
1657 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1659 bit32 dataLength;
1660
1661 SM_DBG2(("smsatChainedVerifyCB: start\n"));
1662 SM_DBG5(("smsatChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
1663
1664 /* internally generate smIOContext */
1665 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
1666 satIOContext = (smSatIOContext_t *) ioContext;
1667 satIntIo = satIOContext->satIntIoContext;
1668 oneDeviceData = satIOContext->pSatDevData;
1669 hostToDevFis = satIOContext->pFis;
1670 smRoot = oneDeviceData->smRoot;
1671 smIntRoot = (smIntRoot_t *)smRoot->smData;
1672 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
1673
1674 if (satIntIo == agNULL)
1675 {
1676 SM_DBG4(("smsatChainedVerifyCB: External smSatInternalIo_t satIntIoContext\n"));
1677 satOrgIOContext = satIOContext;
1678 smOrgIORequest = smIORequestBody->smIORequest;
1679 pSense = satIOContext->pSense;
1680 scsiCmnd = satIOContext->pScsiCmnd;
1681 }
1682 else
1683 {
1684 SM_DBG4(("smsatChainedVerifyCB: Internal smSatInternalIo_t satIntIoContext\n"));
1685 satOrgIOContext = satIOContext->satOrgIOContext;
1686 if (satOrgIOContext == agNULL)
1687 {
1688 SM_DBG4(("smsatChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
1689 return;
1690 }
1691 else
1692 {
1693 SM_DBG4(("smsatChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
1694 }
1695 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
1696 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
1697 pSense = satOrgIOContext->pSense;
1698 scsiCmnd = satOrgIOContext->pScsiCmnd;
1699 }
1700
1701 smIORequestBody->ioCompleted = agTRUE;
1702 smIORequestBody->ioStarted = agFALSE;
1703
1704 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1705 {
1706 SM_DBG1(("smsatChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
1707 smsatSetSensePayload( pSense,
1709 0,
1711 satOrgIOContext);
1712
1713 tdsmIOCompletedCB( smRoot,
1714 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1717 satOrgIOContext->pSmSenseData,
1718 satOrgIOContext->interruptContext );
1719
1720 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1721
1722 smsatFreeIntIoResource( smRoot,
1723 oneDeviceData,
1724 satIntIo);
1725 return;
1726 }
1727
1728 if (agIOStatus != OSSA_IO_SUCCESS)
1729 {
1730 /* only agsaFisRegDeviceToHost_t is expected */
1731 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1732 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
1733 }
1734
1735 if( agIOStatus != OSSA_IO_SUCCESS)
1736 {
1737 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
1738 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
1739 )
1740 {
1741 /* for debugging */
1742 if( agIOStatus != OSSA_IO_SUCCESS)
1743 {
1744 SM_DBG1(("smsatChainedVerifyCB: FAILED, NOT IO_SUCCESS!!!\n"));
1745 }
1746 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
1747 {
1748 SM_DBG1(("smsatChainedVerifyCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
1749 }
1750 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1751 (ataStatus & DF_ATA_STATUS_MASK)
1752 )
1753 {
1754 SM_DBG1(("smsatChainedVerifyCB: FAILED, FAILED, error status!!!\n"));
1755 }
1756
1757 /* Process abort case */
1758 if (agIOStatus == OSSA_IO_ABORTED)
1759 {
1760 smsatProcessAbort(smRoot,
1761 smOrgIORequest,
1762 satOrgIOContext
1763 );
1764
1765 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1766
1767 smsatFreeIntIoResource( smRoot,
1768 oneDeviceData,
1769 satIntIo);
1770 return;
1771 }
1772
1773 /* for debugging */
1774 switch (hostToDevFis->h.command)
1775 {
1777 SM_DBG1(("smsatChainedVerifyCB: SAT_READ_VERIFY_SECTORS!!!\n"));
1778 break;
1780 SM_DBG1(("smsatChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT!!!\n"));
1781 break;
1782 default:
1783 SM_DBG1(("smsatChainedVerifyCB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
1784 break;
1785 }
1786
1787 smsatSetSensePayload( pSense,
1789 0,
1791 satOrgIOContext);
1792
1793 tdsmIOCompletedCB( smRoot,
1794 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1797 satOrgIOContext->pSmSenseData,
1798 satOrgIOContext->interruptContext );
1799
1800 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1801
1802 smsatFreeIntIoResource( smRoot,
1803 oneDeviceData,
1804 satIntIo);
1805 return;
1806 } /* end error checking */
1807 }
1808
1809 /* process success from this point on */
1810 switch (hostToDevFis->h.command)
1811 {
1812 case SAT_READ_VERIFY_SECTORS: /* fall through */
1814 SM_DBG5(("smsatChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
1815
1816 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1817
1818 smsatFreeIntIoResource( smRoot,
1819 oneDeviceData,
1820 satIntIo);
1821
1822 /* let's loop till TL */
1823
1824 /* lba = lba + tl
1825 loopnum--;
1826 if (loopnum == 0) done
1827 */
1828 (satOrgIOContext->LoopNum)--;
1829 if (satOrgIOContext->LoopNum == 0)
1830 {
1831 /*
1832 done with write and verify
1833 */
1834 tdsmIOCompletedCB( smRoot,
1835 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1838 agNULL,
1839 satOrgIOContext->interruptContext );
1840 return;
1841 }
1842
1843 if (satOrgIOContext->superIOFlag)
1844 {
1845 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
1846 }
1847 else
1848 {
1849 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
1850 }
1851
1852 satNewIntIo = smsatAllocIntIoResource( smRoot,
1853 smOrgIORequest,
1854 oneDeviceData,
1855 dataLength,
1856 satNewIntIo);
1857 if (satNewIntIo == agNULL)
1858 {
1859 tdsmIOCompletedCB( smRoot,
1860 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1861 smIOFailed,
1863 agNULL,
1864 satOrgIOContext->interruptContext );
1865
1866 SM_DBG1(("smsatChainedVerifyCB: momory allocation fails!!!\n"));
1867 return;
1868 } /* end of memory allocation failure */
1869
1870 /*
1871 * Need to initialize all the fields within satIOContext
1872 */
1873
1874 satNewIOContext = smsatPrepareNewIO(
1875 satNewIntIo,
1876 smOrgIORequest,
1877 oneDeviceData,
1878 scsiCmnd,
1879 satOrgIOContext
1880 );
1881 status = smsatChainedVerify(smRoot,
1882 &satNewIntIo->satIntSmIORequest,
1883 satNewIOContext->psmDeviceHandle,
1884 &satNewIntIo->satIntSmScsiXchg,
1885 satNewIOContext);
1886
1887 if (status != SM_RC_SUCCESS)
1888 {
1889 smsatFreeIntIoResource( smRoot,
1890 oneDeviceData,
1891 satNewIntIo);
1892 tdsmIOCompletedCB( smRoot,
1893 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1894 smIOFailed,
1896 agNULL,
1897 satOrgIOContext->interruptContext );
1898 SM_DBG1(("smsatChainedVerifyCB: calling satChainedVerify fails!!!\n"));
1899 return;
1900 }
1901
1902 break;
1903 default:
1904 SM_DBG1(("smsatChainedVerifyCB: success but error default case command 0x%x!!!\n", hostToDevFis->h.command));
1905
1906 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
1907
1908 smsatFreeIntIoResource( smRoot,
1909 oneDeviceData,
1910 satIntIo);
1911
1912 smsatSetSensePayload( pSense,
1914 0,
1916 satOrgIOContext);
1917
1918 tdsmIOCompletedCB( smRoot,
1919 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
1922 satOrgIOContext->pSmSenseData,
1923 satOrgIOContext->interruptContext );
1924
1925 break;
1926 }
1927 return;
1928}
1929
1930
1931osGLOBAL void
1933 agsaRoot_t *agRoot,
1934 agsaIORequest_t *agIORequest,
1935 bit32 agIOStatus,
1936 agsaFisHeader_t *agFirstDword,
1937 bit32 agIOInfoLen,
1938 agsaFrameHandle_t agFrameHandle,
1939 void *ioContext
1940 )
1941{
1942 /*
1943 In the process of TestUnitReady
1944 Process SAT_GET_MEDIA_STATUS
1945 Process SAT_CHECK_POWER_MODE
1946 */
1947// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1948// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1949// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1950// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1951 smRoot_t *smRoot = agNULL;
1952 smIntRoot_t *smIntRoot = agNULL;
1953 smIntContext_t *smAllShared = agNULL;
1954 smIORequestBody_t *smIORequestBody;
1955 smIORequestBody_t *smOrgIORequestBody;
1956 smSatIOContext_t *satIOContext;
1957 smSatIOContext_t *satOrgIOContext;
1958 smSatIOContext_t *satNewIOContext;
1959 smSatInternalIo_t *satIntIo;
1960 smSatInternalIo_t *satNewIntIo = agNULL;
1961// satDeviceData_t *satDevData;
1962 smDeviceData_t *oneDeviceData;
1963
1964 smScsiRspSense_t *pSense;
1965 smIniScsiCmnd_t *scsiCmnd;
1966 smIORequest_t *smOrgIORequest;
1967
1968 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1969 bit32 ataStatus = 0;
1970 bit32 ataError;
1971
1972 bit32 status;
1973 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1974
1975 SM_DBG2(("smsatTestUnitReadyCB: start\n"));
1976 SM_DBG6(("smsatTestUnitReadyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
1977
1978 /* internally generate smIOContext */
1979 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
1980 satIOContext = (smSatIOContext_t *) ioContext;
1981 satIntIo = satIOContext->satIntIoContext;
1982 oneDeviceData = satIOContext->pSatDevData;
1983 hostToDevFis = satIOContext->pFis;
1984 smRoot = oneDeviceData->smRoot;
1985 smIntRoot = (smIntRoot_t *)smRoot->smData;
1986 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
1987
1988 if (satIntIo == agNULL)
1989 {
1990 SM_DBG5(("smsatTestUnitReadyCB: no internal smSatInternalIo_t satIntIoContext\n"));
1991 pSense = satIOContext->pSense;
1992 scsiCmnd = satIOContext->pScsiCmnd;
1993 satOrgIOContext = satIOContext;
1994 smOrgIORequest = smIORequestBody->smIORequest;
1995 }
1996 else
1997 {
1998 SM_DBG5(("smsatTestUnitReadyCB: yes internal smSatInternalIo_t satIntIoContext\n"));
1999
2000 /* orginal smIOContext */
2001 smOrgIORequest = (smIORequest_t *)satIOContext->satIntIoContext->satOrgSmIORequest;
2002 smOrgIORequestBody = (smIORequestBody_t *)smOrgIORequest->tdData;
2003 satOrgIOContext = &(smOrgIORequestBody->transport.SATA.satIOContext);
2004
2005 pSense = satOrgIOContext->pSense;
2006 scsiCmnd = satOrgIOContext->pScsiCmnd;
2007 }
2008
2009 smIORequestBody->ioCompleted = agTRUE;
2010 smIORequestBody->ioStarted = agFALSE;
2011
2012 if (agIOStatus == OSSA_IO_ABORTED)
2013 {
2014 tdsmIOCompletedCB( smRoot,
2015 smOrgIORequest,
2016 smIOFailed,
2018 agNULL,
2019 satIOContext->interruptContext);
2020
2021 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2022
2023 smsatFreeIntIoResource( smRoot,
2024 oneDeviceData,
2025 satIntIo);
2026
2027 return;
2028 }
2029
2030 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
2031 {
2032 SM_DBG1(("smsatTestUnitReadyCB: agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
2033 smsatSetSensePayload( pSense,
2035 0,
2037 satOrgIOContext);
2038
2039 tdsmIOCompletedCB( smRoot,
2040 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2043 satOrgIOContext->pSmSenseData,
2044 satOrgIOContext->interruptContext );
2045
2046 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2047
2048 smsatFreeIntIoResource( smRoot,
2049 oneDeviceData,
2050 satIntIo);
2051
2052 return;
2053 }
2054 /*
2055 HW checks an error for us and the results is agIOStatus
2056 */
2057 if (agIOStatus != OSSA_IO_SUCCESS)
2058 {
2059 /* only agsaFisRegDeviceToHost_t is expected */
2060 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
2061 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
2062 ataError = statDevToHostFisHeader->error; /* ATA Eror register */
2063 if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
2064 {
2065 SM_DBG1(("smsatTestUnitReadyCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
2066 }
2067 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
2068 (ataStatus & DF_ATA_STATUS_MASK)
2069 )
2070 {
2071 SM_DBG1(("smsatTestUnitReadyCB: FAILED, FAILED, error status!!!\n"));
2072 }
2073
2074 /* Process abort case */
2075 if (agIOStatus == OSSA_IO_ABORTED)
2076 {
2077 smsatProcessAbort(smRoot,
2078 smOrgIORequest,
2079 satOrgIOContext
2080 );
2081
2082 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2083
2084 smsatFreeIntIoResource( smRoot,
2085 oneDeviceData,
2086 satIntIo);
2087 return;
2088 }
2089
2090 switch (hostToDevFis->h.command)
2091 {
2093 SM_DBG1(("smsatTestUnitReadyCB: SAT_GET_MEDIA_STATUS failed!!! \n"));
2094
2095 /* checking NM bit */
2096 if (ataError & SCSI_NM_MASK)
2097 {
2098 smsatSetSensePayload( pSense,
2100 0,
2102 satOrgIOContext);
2103 }
2104 else
2105 {
2106 smsatSetSensePayload( pSense,
2108 0,
2110 satOrgIOContext);
2111 }
2112
2113 tdsmIOCompletedCB( smRoot,
2114 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2117 satOrgIOContext->pSmSenseData,
2118 satOrgIOContext->interruptContext );
2119
2120 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2121
2122 smsatFreeIntIoResource( smRoot,
2123 oneDeviceData,
2124 satIntIo);
2125 break;
2127 SM_DBG1(("smsatTestUnitReadyCB: SAT_CHECK_POWER_MODE failed!!! \n"));
2128 smsatSetSensePayload( pSense,
2130 0,
2132 satOrgIOContext);
2133
2134 tdsmIOCompletedCB( smRoot,
2135 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2138 satOrgIOContext->pSmSenseData,
2139 satOrgIOContext->interruptContext );
2140
2141 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2142
2143 smsatFreeIntIoResource( smRoot,
2144 oneDeviceData,
2145 satIntIo);
2146 break;
2147 default:
2148 SM_DBG1(("smsatTestUnitReadyCB: default failed command %d!!!\n", hostToDevFis->h.command));
2149
2150 smsatSetSensePayload( pSense,
2152 0,
2154 satOrgIOContext);
2155
2156 tdsmIOCompletedCB( smRoot,
2157 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2160 satOrgIOContext->pSmSenseData,
2161 satOrgIOContext->interruptContext );
2162
2163 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2164
2165 smsatFreeIntIoResource( smRoot,
2166 oneDeviceData,
2167 satIntIo);
2168 break;
2169
2170 }
2171 return;
2172 }/* end error */
2173
2174 /* ATA command completes sucessfully */
2175 switch (hostToDevFis->h.command)
2176 {
2178
2179 SM_DBG5(("smsatTestUnitReadyCB: SAT_GET_MEDIA_STATUS success\n"));
2180
2181 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2182
2183 smsatFreeIntIoResource( smRoot,
2184 oneDeviceData,
2185 satIntIo);
2186
2187 satNewIntIo = smsatAllocIntIoResource( smRoot,
2188 smOrgIORequest,
2189 oneDeviceData,
2190 0,
2191 satNewIntIo);
2192 if (satNewIntIo == agNULL)
2193 {
2194 smsatSetSensePayload( pSense,
2196 0,
2198 satOrgIOContext);
2199
2200 tdsmIOCompletedCB( smRoot,
2201 smOrgIORequest,
2204 satOrgIOContext->pSmSenseData,
2205 satOrgIOContext->interruptContext );
2206
2207 SM_DBG1(("smsatTestUnitReadyCB: momory allocation fails!!!\n"));
2208 return;
2209 }
2210
2211 /*
2212 * Need to initialize all the fields within satIOContext
2213 */
2214
2215 satNewIOContext = smsatPrepareNewIO(
2216 satNewIntIo,
2217 smOrgIORequest,
2218 oneDeviceData,
2219 scsiCmnd,
2220 satOrgIOContext
2221 );
2222
2223 /* sends SAT_CHECK_POWER_MODE */
2224 status = smsatTestUnitReady_1( smRoot,
2225 &satNewIntIo->satIntSmIORequest,
2226 satNewIOContext->psmDeviceHandle,
2227 &satNewIntIo->satIntSmScsiXchg,
2228 satNewIOContext);
2229
2230 if (status != SM_RC_SUCCESS)
2231 {
2232 /* sending SAT_CHECK_POWER_MODE fails */
2233 smsatFreeIntIoResource( smRoot,
2234 oneDeviceData,
2235 satNewIntIo);
2236 smsatSetSensePayload( pSense,
2238 0,
2240 satOrgIOContext);
2241
2242 tdsmIOCompletedCB( smRoot,
2243 smOrgIORequest,
2246 satOrgIOContext->pSmSenseData,
2247 satOrgIOContext->interruptContext );
2248
2249 SM_DBG1(("smsatTestUnitReadyCB: calling satTestUnitReady_1 fails!!!\n"));
2250 return;
2251 }
2252
2253 break;
2255 SM_DBG5(("smsatTestUnitReadyCB: SAT_CHECK_POWER_MODE success\n"));
2256
2257
2258 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2259
2260 smsatFreeIntIoResource( smRoot,
2261 oneDeviceData,
2262 satIntIo);
2263
2264 /* returns good status */
2265 tdsmIOCompletedCB( smRoot,
2266 smOrgIORequest,
2269 agNULL,
2270 satOrgIOContext->interruptContext );
2271
2272 break;
2273 default:
2274 SM_DBG1(("smsatTestUnitReadyCB: default success command %d!!!\n", hostToDevFis->h.command));
2275 smsatSetSensePayload( pSense,
2277 0,
2279 satOrgIOContext);
2280
2281 tdsmIOCompletedCB( smRoot,
2282 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2285 satOrgIOContext->pSmSenseData,
2286 satOrgIOContext->interruptContext );
2287
2288
2289 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2290
2291 smsatFreeIntIoResource( smRoot,
2292 oneDeviceData,
2293 satIntIo);
2294 break;
2295 }
2296
2297 return;
2298}
2299
2300osGLOBAL void
2302 agsaRoot_t *agRoot,
2303 agsaIORequest_t *agIORequest,
2304 bit32 agIOStatus,
2305 agsaFisHeader_t *agFirstDword,
2306 bit32 agIOInfoLen,
2307 void *agParam,
2308 void *ioContext
2309 )
2310{
2311 /* ATA Vol 1, p299 SAT_SMART_RETURN_STATUS */
2312 /*
2313 if threshold exceeds, return SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE
2314 else call satRequestSense_1 to send CHECK_POWER_MODE
2315 */
2316
2317// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2318// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2319// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2320// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2321 smRoot_t *smRoot = agNULL;
2322 smIntRoot_t *smIntRoot = agNULL;
2323 smIntContext_t *smAllShared = agNULL;
2324 smIORequestBody_t *smIORequestBody;
2325 smIORequestBody_t *smOrgIORequestBody;
2326 smSatIOContext_t *satIOContext;
2327 smSatIOContext_t *satOrgIOContext;
2328 smSatIOContext_t *satNewIOContext;
2329 smSatInternalIo_t *satIntIo;
2330 smSatInternalIo_t *satNewIntIo = agNULL;
2331// satDeviceData_t *satDevData;
2332 smDeviceData_t *oneDeviceData;
2333 smScsiRspSense_t *pSense;
2334 smIniScsiCmnd_t *scsiCmnd;
2335 smIORequest_t *smOrgIORequest;
2336 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
2337 bit32 ataStatus = 0;
2338 bit32 status;
2339 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
2340 agsaFisRegD2HData_t statDevToHostFisData;
2341 bit32 allocationLen = 0;
2342 bit32 dataLength;
2343 bit8 *pDataBuffer = agNULL;
2344
2345 SM_DBG2(("smsatRequestSenseCB: start\n"));
2346 SM_DBG4(("smsatRequestSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
2347
2348 /* internally generate smIOContext */
2349 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
2350 satIOContext = (smSatIOContext_t *) ioContext;
2351 satIntIo = satIOContext->satIntIoContext;
2352 oneDeviceData = satIOContext->pSatDevData;
2353 hostToDevFis = satIOContext->pFis;
2354 smRoot = oneDeviceData->smRoot;
2355 smIntRoot = (smIntRoot_t *)smRoot->smData;
2356 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
2357
2358 /*ttttttthe one */
2359 if (satIntIo == agNULL)
2360 {
2361 SM_DBG4(("smsatRequestSenseCB: External smSatInternalIo_t satIntIoContext\n"));
2362 satOrgIOContext = satIOContext;
2363 smOrgIORequest = smIORequestBody->smIORequest;
2364 if (satOrgIOContext->superIOFlag)
2365 {
2366 pDataBuffer = (bit8 *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->smScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
2367 }
2368 else
2369 {
2370 pDataBuffer = (bit8 *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
2371
2372 }
2373 scsiCmnd = satOrgIOContext->pScsiCmnd;
2374 pSense = satOrgIOContext->pSense;
2375 }
2376 else
2377 {
2378 SM_DBG4(("smsatRequestSenseCB: Internal smSatInternalIo_t satIntIoContext\n"));
2379 satOrgIOContext = satIOContext->satOrgIOContext;
2380 if (satOrgIOContext == agNULL)
2381 {
2382 SM_DBG4(("smsatRequestSenseCB: satOrgIOContext is NULL, wrong\n"));
2383 return;
2384 }
2385 else
2386 {
2387 SM_DBG4(("smsatRequestSenseCB: satOrgIOContext is NOT NULL\n"));
2388 }
2389 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
2390 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
2391
2392 if (satOrgIOContext->superIOFlag)
2393 {
2394 pDataBuffer = (bit8 *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->smScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
2395 }
2396 else
2397 {
2398 pDataBuffer = (bit8 *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
2399
2400 }
2401 scsiCmnd = satOrgIOContext->pScsiCmnd;
2402 pSense = satOrgIOContext->pSense;
2403 }
2404
2405 smIORequestBody->ioCompleted = agTRUE;
2406 smIORequestBody->ioStarted = agFALSE;
2407
2408 SM_DBG4(("smsatRequestSenseCB: fis command 0x%x\n", hostToDevFis->h.command));
2409
2410 allocationLen = scsiCmnd->cdb[4];
2411 allocationLen = MIN(allocationLen, scsiCmnd->expDataLength);
2412 SM_DBG1(("smsatRequestSenseCB: allocationLen in CDB %d 0x%x!!!\n", allocationLen,allocationLen));
2413
2414 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
2415 {
2416 SM_DBG1(("smsatRequestSenseCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
2418 smRoot,
2419 smOrgIORequest,
2420 smIOFailed,
2422 agNULL,
2423 satOrgIOContext->interruptContext
2424 );
2425
2426 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2427
2428 smsatFreeIntIoResource( smRoot,
2429 oneDeviceData,
2430 satIntIo);
2431
2432 return;
2433 }
2434
2435 /*
2436 checking IO status, FIS type and error status
2437 */
2438 if (agIOStatus != OSSA_IO_SUCCESS)
2439 {
2440 /* only agsaFisRegDeviceToHost_t is expected */
2441 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
2442 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
2443
2444 /* for debugging */
2445 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
2446 {
2447 if (hostToDevFis->h.command == SAT_SMART && hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
2448 {
2449 SM_DBG1(("smsatRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_RETURN_STATU!!!\n", statDevToHostFisHeader->fisType));
2450 }
2451 else
2452 {
2453 SM_DBG1(("smsatRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_CHECK_POWER_MODE!!!\n",statDevToHostFisHeader->fisType));
2454 }
2455 }
2456
2457 /* for debugging */
2458 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
2459 (ataStatus & DF_ATA_STATUS_MASK)
2460 )
2461 {
2462 if (hostToDevFis->h.command == SAT_SMART && hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
2463 {
2464 SM_DBG1(("smsatRequestSenseCB: FAILED, error status and SAT_SMART_RETURN_STATU!!!\n"));
2465 }
2466 else
2467 {
2468 SM_DBG1(("smsatRequestSenseCB: FAILED, error status and SAT_CHECK_POWER_MODE!!!\n"));
2469 }
2470 }
2471
2472 /* Process abort case */
2473 if (agIOStatus == OSSA_IO_ABORTED)
2474 {
2475 smsatProcessAbort(smRoot,
2476 smOrgIORequest,
2477 satOrgIOContext
2478 );
2479 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2480
2481 smsatFreeIntIoResource( smRoot,
2482 oneDeviceData,
2483 satIntIo);
2484 return;
2485 }
2486 if (hostToDevFis->h.command == SAT_SMART && hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
2487 {
2488 /* report using the original tiIOrequst */
2489 /* failed during sending SMART RETURN STATUS */
2490 smsatSetSensePayload( pSense,
2492 0,
2494 satOrgIOContext);
2495 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2496 if (SENSE_DATA_LENGTH < allocationLen)
2497 {
2498 /* underrun */
2499 tdsmIOCompletedCB( smRoot,
2500 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
2502 allocationLen - SENSE_DATA_LENGTH,
2503 agNULL,
2504 satOrgIOContext->interruptContext );
2505 }
2506 else
2507 {
2508 tdsmIOCompletedCB( smRoot,
2509 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
2512 agNULL,
2513 satOrgIOContext->interruptContext );
2514 }
2515 }
2516 else
2517 {
2518 /* report using the original tiIOrequst */
2519 /* failed during sending SAT_CHECK_POWER_MODE */
2520 smsatSetSensePayload( pSense,
2522 0,
2524 satOrgIOContext);
2525 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2526
2527 if (SENSE_DATA_LENGTH < allocationLen)
2528 {
2529 /* underrun */
2530 tdsmIOCompletedCB( smRoot,
2531 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
2533 allocationLen - SENSE_DATA_LENGTH,
2534 agNULL,
2535 satOrgIOContext->interruptContext );
2536 }
2537 else
2538 {
2539 tdsmIOCompletedCB( smRoot,
2540 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
2543 agNULL,
2544 satOrgIOContext->interruptContext );
2545 }
2546 }
2547
2548
2549 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2550
2551 smsatFreeIntIoResource( smRoot,
2552 oneDeviceData,
2553 satIntIo);
2554 return;
2555 }
2556
2557 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
2558
2559 switch (hostToDevFis->h.command)
2560 {
2561 case SAT_SMART:
2562 SM_DBG4(("smsatRequestSenseCB: SAT_SMART_RETURN_STATUS case\n"));
2563 if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
2564 {
2565 /* threshold exceeds */
2566 SM_DBG1(("smsatRequestSenseCB: threshold exceeds!!!\n"));
2567
2568
2569 /* report using the original tiIOrequst */
2570 /* failed during sending SMART RETURN STATUS */
2571 smsatSetSensePayload( pSense,
2573 0,
2575 satOrgIOContext);
2576 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2577
2578 if (SENSE_DATA_LENGTH < allocationLen)
2579 {
2580 /* underrun */
2581 tdsmIOCompletedCB( smRoot,
2582 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2584 allocationLen - SENSE_DATA_LENGTH,
2585 agNULL,
2586 satOrgIOContext->interruptContext );
2587 }
2588 else
2589 {
2590 tdsmIOCompletedCB( smRoot,
2591 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2594 agNULL,
2595 satOrgIOContext->interruptContext );
2596 }
2597
2598
2599 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2600
2601 smsatFreeIntIoResource( smRoot,
2602 oneDeviceData,
2603 satIntIo);
2604 return;
2605 }
2606
2607
2608 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2609
2610 /* done with internally genereated SAT_SMART_RETURN_STATUS */
2611 smsatFreeIntIoResource( smRoot,
2612 oneDeviceData,
2613 satIntIo);
2614
2615 /* at this point, successful SMART_RETURN_STATUS
2616 xmit SAT_CHECK_POWER_MODE
2617 */
2618 if (satOrgIOContext->superIOFlag)
2619 {
2620 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
2621 }
2622 else
2623 {
2624 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
2625 }
2626
2627 satNewIntIo = smsatAllocIntIoResource( smRoot,
2628 smOrgIORequest,
2629 oneDeviceData,
2630 dataLength,
2631 satNewIntIo);
2632 if (satNewIntIo == agNULL)
2633 {
2634 /* failed as a part of sending SMART RETURN STATUS */
2635 smsatSetSensePayload( pSense,
2637 0,
2639 satOrgIOContext);
2640 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2641
2642 if (SENSE_DATA_LENGTH < allocationLen)
2643 {
2644 /* underrun */
2645 tdsmIOCompletedCB( smRoot,
2646 smOrgIORequest,
2648 allocationLen - SENSE_DATA_LENGTH,
2649 agNULL,
2650 satOrgIOContext->interruptContext );
2651 }
2652 else
2653 {
2654 tdsmIOCompletedCB( smRoot,
2655 smOrgIORequest,
2658 agNULL,
2659 satOrgIOContext->interruptContext );
2660 }
2661
2662 SM_DBG1(("smsatRequestSenseCB: momory allocation fails!!!\n"));
2663 return;
2664 } /* end of memory allocation failure */
2665
2666
2667 /*
2668 * Need to initialize all the fields within satIOContext
2669 */
2670
2671 satNewIOContext = smsatPrepareNewIO(
2672 satNewIntIo,
2673 smOrgIORequest,
2674 oneDeviceData,
2675 scsiCmnd,
2676 satOrgIOContext
2677 );
2678
2679 /* sending SAT_CHECK_POWER_MODE */
2680 status = smsatRequestSense_1( smRoot,
2681 &satNewIntIo->satIntSmIORequest,
2682 satNewIOContext->psmDeviceHandle,
2683 &satNewIntIo->satIntSmScsiXchg,
2684 satNewIOContext);
2685
2686 if (status != SM_RC_SUCCESS)
2687 {
2688 /* sending SAT_CHECK_POWER_MODE fails */
2689 smsatFreeIntIoResource( smRoot,
2690 oneDeviceData,
2691 satNewIntIo);
2692
2693 /* failed during sending SAT_CHECK_POWER_MODE */
2694 smsatSetSensePayload( pSense,
2696 0,
2698 satOrgIOContext);
2699 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2700
2701 if (SENSE_DATA_LENGTH < allocationLen)
2702 {
2703 /* underrun */
2704 tdsmIOCompletedCB( smRoot,
2705 smOrgIORequest,
2707 allocationLen - SENSE_DATA_LENGTH,
2708 agNULL,
2709 satOrgIOContext->interruptContext );
2710 }
2711 else
2712 {
2713 tdsmIOCompletedCB( smRoot,
2714 smOrgIORequest,
2717 agNULL,
2718 satOrgIOContext->interruptContext );
2719 }
2720
2721 SM_DBG1(("smsatRequestSenseCB: calling satRequestSense_1 fails!!!\n"));
2722 return;
2723 }
2724
2725 break;
2727 SM_DBG4(("smsatRequestSenseCB: SAT_CHECK_POWER_MODE case\n"));
2728
2729 /* check ATA STANDBY state */
2730 if (statDevToHostFisData.sectorCount == 0x00)
2731 {
2732 /* in STANDBY */
2733 SM_DBG1(("smsatRequestSenseCB: in standby!!!\n"));
2734
2735
2736 /* report using the original tiIOrequst */
2737 /* failed during sending SAT_CHECK_POWER_MODE */
2738 smsatSetSensePayload( pSense,
2740 0,
2742 satOrgIOContext);
2743 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2744
2745 if (SENSE_DATA_LENGTH < allocationLen)
2746 {
2747 /* underrun */
2748 tdsmIOCompletedCB( smRoot,
2749 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2751 allocationLen - SENSE_DATA_LENGTH,
2752 agNULL,
2753 satOrgIOContext->interruptContext );
2754 }
2755 else
2756 {
2757 tdsmIOCompletedCB( smRoot,
2758 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2761 agNULL,
2762 satOrgIOContext->interruptContext );
2763 }
2764
2765 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2766
2767 smsatFreeIntIoResource( smRoot,
2768 oneDeviceData,
2769 satIntIo);
2770 return;
2771 }
2772
2773 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2774
2775 /* done with internnaly generated SAT_CHECK_POWER_MODE */
2776 smsatFreeIntIoResource( smRoot,
2777 oneDeviceData,
2778 satIntIo);
2779
2780 if (oneDeviceData->satFormatState == agTRUE)
2781 {
2782 SM_DBG1(("smsatRequestSenseCB: in format!!!\n"));
2783
2784
2785 /* report using the original tiIOrequst */
2786 smsatSetSensePayload( pSense,
2788 0,
2790 satOrgIOContext);
2791 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2792
2793 if (SENSE_DATA_LENGTH < allocationLen)
2794 {
2795 /* underrun */
2796 tdsmIOCompletedCB( smRoot,
2797 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2799 allocationLen - SENSE_DATA_LENGTH,
2800 agNULL,
2801 satOrgIOContext->interruptContext );
2802 }
2803 else
2804 {
2805 tdsmIOCompletedCB( smRoot,
2806 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2809 agNULL,
2810 satOrgIOContext->interruptContext );
2811 }
2812
2813 return;
2814 }
2815
2816 /* normal: returns good status for requestsense */
2817 /* report using the original tiIOrequst */
2818 smsatSetSensePayload( pSense,
2820 0,
2822 satOrgIOContext);
2823 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2824 SM_DBG4(("smsatRequestSenseCB: returning good status for requestsense\n"));
2825 if (SENSE_DATA_LENGTH < allocationLen)
2826 {
2827 /* underrun */
2828 SM_DBG6(("smsatRequestSenseCB reporting underrun lenNeeded=0x%x lenReceived=0x%x smIORequest=%p\n",
2829 SENSE_DATA_LENGTH, allocationLen, smOrgIORequest));
2830 tdsmIOCompletedCB( smRoot,
2831 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2833 allocationLen - SENSE_DATA_LENGTH,
2834 agNULL,
2835 satOrgIOContext->interruptContext );
2836
2837 }
2838 else
2839 {
2840 tdsmIOCompletedCB( smRoot,
2841 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2844 agNULL,
2845 satOrgIOContext->interruptContext );
2846 }
2847
2848 break;
2849 default:
2850 SM_DBG1(("smsatRequestSenseCB: success but error default case command 0x%x!!!\n", hostToDevFis->h.command));
2851 /* pSense here is a part of satOrgIOContext */
2852 pSense = satOrgIOContext->pSmSenseData->senseData;
2853 satOrgIOContext->pSmSenseData->senseLen = SENSE_DATA_LENGTH;
2854 /* unspecified case, return no sense and no addition info */
2855 smsatSetSensePayload( pSense,
2857 0,
2859 satOrgIOContext);
2860 sm_memcpy(pDataBuffer, pSense, MIN(SENSE_DATA_LENGTH, allocationLen));
2861
2862 tdsmIOCompletedCB( smRoot,
2863 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
2866 satOrgIOContext->pSmSenseData,
2867 satOrgIOContext->interruptContext );
2868
2869 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2870
2871 smsatFreeIntIoResource( smRoot,
2872 oneDeviceData,
2873 satIntIo);
2874 break;
2875 } /* switch */
2876
2877 return;
2878
2879}
2880
2881osGLOBAL void
2883 agsaRoot_t *agRoot,
2884 agsaIORequest_t *agIORequest,
2885 bit32 agIOStatus,
2886 agsaFisHeader_t *agFirstDword,
2887 bit32 agIOInfoLen,
2888 agsaFrameHandle_t agFrameHandle,
2889 void *ioContext
2890 )
2891{
2892 /*
2893 In the process of SendDiagnotic
2894 Process READ VERIFY SECTOR(S) EXT two time
2895 Process SMART ECECUTE OFF-LINE IMMEDIATE
2896 */
2897// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2898// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2899// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2900// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2901 smRoot_t *smRoot = agNULL;
2902 smIntRoot_t *smIntRoot = agNULL;
2903 smIntContext_t *smAllShared = agNULL;
2904 smIORequestBody_t *smIORequestBody;
2905 smIORequestBody_t *smOrgIORequestBody;
2906 smSatIOContext_t *satIOContext;
2907 smSatIOContext_t *satOrgIOContext;
2908 smSatIOContext_t *satNewIOContext;
2909 smSatInternalIo_t *satIntIo;
2910 smSatInternalIo_t *satNewIntIo = agNULL;
2911// satDeviceData_t *satDevData;
2912 smDeviceData_t *oneDeviceData;
2913 smScsiRspSense_t *pSense;
2914 smIniScsiCmnd_t *scsiCmnd;
2915 smIORequest_t *smOrgIORequest;
2916 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
2917 bit32 ataStatus = 0;
2918
2919 bit32 status;
2920 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
2921
2922 SM_DBG2(("smsatSendDiagnosticCB: start\n"));
2923 SM_DBG5(("smsatSendDiagnosticCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
2924
2925 /* internally generate smIOContext */
2926 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
2927 satIOContext = (smSatIOContext_t *) ioContext;
2928 satIntIo = satIOContext->satIntIoContext;
2929 oneDeviceData = satIOContext->pSatDevData;
2930 hostToDevFis = satIOContext->pFis;
2931 smRoot = oneDeviceData->smRoot;
2932 smIntRoot = (smIntRoot_t *)smRoot->smData;
2933 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
2934
2935 if (satIntIo == agNULL)
2936 {
2937 SM_DBG4(("smsatSendDiagnosticCB: External smSatInternalIo_t satIntIoContext\n"));
2938 satOrgIOContext = satIOContext;
2939 smOrgIORequest = smIORequestBody->smIORequest;
2940 pSense = satOrgIOContext->pSense;
2941 scsiCmnd = satOrgIOContext->pScsiCmnd;
2942 }
2943 else
2944 {
2945 SM_DBG4(("smsatSendDiagnosticCB: Internal smSatInternalIo_t satIntIoContext\n"));
2946 satOrgIOContext = satIOContext->satOrgIOContext;
2947 if (satOrgIOContext == agNULL)
2948 {
2949 SM_DBG4(("smsatSendDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
2950 return;
2951 }
2952 else
2953 {
2954 SM_DBG4(("smsatSendDiagnosticCB: satOrgIOContext is NOT NULL\n"));
2955 }
2956 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
2957 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
2958 pSense = satOrgIOContext->pSense;
2959 scsiCmnd = satOrgIOContext->pScsiCmnd;
2960 }
2961
2962 smIORequestBody->ioCompleted = agTRUE;
2963 smIORequestBody->ioStarted = agFALSE;
2964
2965 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
2966 {
2967 SM_DBG1(("smsatSendDiagnosticCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
2968 oneDeviceData->satVerifyState = 0;
2969 oneDeviceData->satBGPendingDiag = agFALSE;
2970
2971 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
2972 {
2973 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
2975 smRoot,
2976 smOrgIORequest,
2977 smIOFailed,
2979 agNULL,
2980 satOrgIOContext->interruptContext
2981 );
2982 }
2983 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
2984
2985 smsatFreeIntIoResource( smRoot,
2986 oneDeviceData,
2987 satIntIo);
2988 return;
2989
2990 }
2991
2992 if (agIOStatus != OSSA_IO_SUCCESS)
2993 {
2994 /* only agsaFisRegDeviceToHost_t is expected */
2995 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
2996 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
2997 }
2998
2999 SM_DBG5(("smsatSendDiagnosticCB: fis command 0x%x\n", hostToDevFis->h.command));
3000
3001 if( agIOStatus != OSSA_IO_SUCCESS)
3002 {
3003 /*
3004 checking IO status, FIS type and error status
3005 */
3006 oneDeviceData->satVerifyState = 0;
3007 oneDeviceData->satBGPendingDiag = agFALSE;
3008
3009 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
3010 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
3011 )
3012 {
3013
3014 /* for debugging */
3015 if( agIOStatus != OSSA_IO_SUCCESS)
3016 {
3017 if ( hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT )
3018 {
3019 SM_DBG1(("smsatSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_READ_VERIFY_SECTORS(_EXT)!!!\n"));
3020 }
3021 else
3022 {
3023 SM_DBG1(("smsatSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE!!!\n"));
3024 }
3025 }
3026
3027 /* for debugging */
3028 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
3029 {
3030 if ( hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT )
3031 {
3032 SM_DBG1(("smsatSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_READ_VERIFY_SECTORS(_EXT)!!!\n", statDevToHostFisHeader->fisType));
3033 }
3034 else
3035 {
3036 SM_DBG1(("smsatSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE!!!\n",statDevToHostFisHeader->fisType));
3037 }
3038 }
3039
3040 /* for debugging */
3041 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
3042 (ataStatus & DF_ATA_STATUS_MASK)
3043 )
3044 {
3045 if ( hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT )
3046 {
3047 SM_DBG1(("smsatSendDiagnosticCB: FAILED, error status and SAT_READ_VERIFY_SECTORS(_EXT)!!!\n"));
3048 }
3049 else
3050 {
3051 SM_DBG1(("smsatSendDiagnosticCB: FAILED, error status and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE!!!\n"));
3052 }
3053 }
3054
3055 /* Process abort case */
3056 if (agIOStatus == OSSA_IO_ABORTED)
3057 {
3058 smsatProcessAbort(smRoot,
3059 smOrgIORequest,
3060 satOrgIOContext
3061 );
3062
3063 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3064
3065 smsatFreeIntIoResource( smRoot,
3066 oneDeviceData,
3067 satIntIo);
3068 return;
3069 }
3070
3071 if ( (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS) ||
3072 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
3073 {
3074 /* report using the original tiIOrequst */
3075 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
3076 smsatSetSensePayload( pSense,
3078 0,
3080 satOrgIOContext);
3081
3082 tdsmIOCompletedCB( smRoot,
3083 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3086 satOrgIOContext->pSmSenseData,
3087 satOrgIOContext->interruptContext );
3088
3089 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3090
3091 smsatFreeIntIoResource( smRoot,
3092 oneDeviceData,
3093 satIntIo);
3094 return;
3095 }
3096 else
3097 {
3098 /* report using the original tiIOrequst */
3099 /* failed during sending SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
3100 smsatSetSensePayload( pSense,
3102 0,
3104 satOrgIOContext);
3105
3106 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
3107 {
3108 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
3109 tdsmIOCompletedCB( smRoot,
3110 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3113 satOrgIOContext->pSmSenseData,
3114 satOrgIOContext->interruptContext );
3115
3116 }
3117 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3118
3119 smsatFreeIntIoResource( smRoot,
3120 oneDeviceData,
3121 satIntIo);
3122 return;
3123 }
3124 }
3125 }
3126
3127 /* processing success case */
3128 switch (hostToDevFis->h.command)
3129 {
3130 case SAT_READ_VERIFY_SECTORS: /* fall through */
3132 SM_DBG5(("smsatSendDiagnosticCB: SAT_READ_VERIFY_SECTORS(_EXT) case\n"));
3134 oneDeviceData->satVerifyState++;
3136 SM_DBG5(("smsatSendDiagnosticCB: satVerifyState %d\n",oneDeviceData->satVerifyState));
3137
3138 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3139
3140 /* done with internally genereated AT_READ_VERIFY_SECTORS(_EXT) */
3141 smsatFreeIntIoResource( smRoot,
3142 oneDeviceData,
3143 satIntIo);
3144
3145 if (oneDeviceData->satVerifyState == 3)
3146 {
3147 /* reset satVerifyState */
3148 oneDeviceData->satVerifyState = 0;
3149 /* return GOOD status */
3150 SM_DBG5(("smsatSendDiagnosticCB: return GOOD status\n"));
3151 tdsmIOCompletedCB( smRoot,
3152 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
3155 agNULL,
3156 satOrgIOContext->interruptContext );
3157 return;
3158 }
3159 else
3160 {
3161 /* prepare SAT_READ_VERIFY_SECTORS(_EXT) */
3162 satNewIntIo = smsatAllocIntIoResource( smRoot,
3163 smOrgIORequest,
3164 oneDeviceData,
3165 0,
3166 satNewIntIo);
3167 if (satNewIntIo == agNULL)
3168 {
3169 /* reset satVerifyState */
3170 oneDeviceData->satVerifyState = 0;
3171
3172 /* failed as a part of sending SAT_READ_VERIFY_SECTORS(_EXT) */
3173 smsatSetSensePayload( pSense,
3175 0,
3177 satOrgIOContext);
3178
3179 tdsmIOCompletedCB( smRoot,
3180 smOrgIORequest,
3183 satOrgIOContext->pSmSenseData,
3184 satOrgIOContext->interruptContext );
3185
3186 SM_DBG1(("smsatSendDiagnosticCB: momory allocation fails!!!\n"));
3187 return;
3188 } /* end of memory allocation failure */
3189
3190 /*
3191 * Need to initialize all the fields within satIOContext
3192 */
3193
3194 satNewIOContext = smsatPrepareNewIO(
3195 satNewIntIo,
3196 smOrgIORequest,
3197 oneDeviceData,
3198 scsiCmnd,
3199 satOrgIOContext
3200 );
3201
3202 if (oneDeviceData->satVerifyState == 1)
3203 {
3204 /* sending SAT_CHECK_POWER_MODE */
3205 status = smsatSendDiagnostic_1( smRoot,
3206 &satNewIntIo->satIntSmIORequest,
3207 satNewIOContext->psmDeviceHandle,
3208 &satNewIntIo->satIntSmScsiXchg,
3209 satNewIOContext);
3210 }
3211 else
3212 {
3213 /* oneDeviceData->satVerifyState == 2 */
3214 status = smsatSendDiagnostic_2( smRoot,
3215 &satNewIntIo->satIntSmIORequest,
3216 satNewIOContext->psmDeviceHandle,
3217 &satNewIntIo->satIntSmScsiXchg,
3218 satNewIOContext);
3219 }
3220
3221 if (status != SM_RC_SUCCESS)
3222 {
3223 /* sending SAT_READ_VERIFY_SECTORS(_EXT) fails */
3224 smsatFreeIntIoResource( smRoot,
3225 oneDeviceData,
3226 satNewIntIo);
3227
3228 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
3229 smsatSetSensePayload( pSense,
3231 0,
3233 satOrgIOContext);
3234
3235 tdsmIOCompletedCB( smRoot,
3236 smOrgIORequest,
3239 satOrgIOContext->pSmSenseData,
3240 satOrgIOContext->interruptContext );
3241
3242 /* reset satVerifyState */
3243 oneDeviceData->satVerifyState = 0;
3244 SM_DBG1(("smsatSendDiagnosticCB: calling satSendDiagnostic_1 or _2 fails!!!\n"));
3245 return;
3246 }
3247 } /* oneDeviceData->satVerifyState == 1 or 2 */
3248
3249 break;
3250 case SAT_SMART:
3251 if (hostToDevFis->h.features == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE)
3252 {
3253 SM_DBG5(("smsatSendDiagnosticCB: SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE case\n"));
3254
3255 oneDeviceData->satBGPendingDiag = agFALSE;
3256
3257 if (hostToDevFis->d.lbaLow == 0x01 || hostToDevFis->d.lbaLow == 0x02)
3258 {
3259 /* for background send diagnostic, no completion here. It is done already. */
3260 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3261
3262 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
3263 smsatFreeIntIoResource( smRoot,
3264 oneDeviceData,
3265 satIntIo);
3266 SM_DBG5(("smsatSendDiagnosticCB: returning but no IOCompleted\n"));
3267 }
3268 else
3269 {
3270 SM_DBG5(("smsatSendDiagnosticCB: returning good status for senddiagnostic\n"));
3271 tdsmIOCompletedCB( smRoot,
3272 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
3275 agNULL,
3276 satOrgIOContext->interruptContext );
3277
3278
3279 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3280
3281 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
3282 smsatFreeIntIoResource( smRoot,
3283 oneDeviceData,
3284 satIntIo);
3285 }
3286 }
3287 break;
3288 default:
3289 SM_DBG1(("smsatSendDiagnosticCB: success but error default case command 0x%x!!!\n", hostToDevFis->h.command));
3290 /* unspecified case, return no sense and no addition info */
3291 smsatSetSensePayload( pSense,
3293 0,
3295 satOrgIOContext);
3296
3297 tdsmIOCompletedCB( smRoot,
3298 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
3301 satOrgIOContext->pSmSenseData,
3302 satOrgIOContext->interruptContext );
3303
3304 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3305
3306 smsatFreeIntIoResource( smRoot,
3307 oneDeviceData,
3308 satIntIo);
3309 break;
3310 }
3311 return;
3312
3313}
3314
3315osGLOBAL void
3317 agsaRoot_t *agRoot,
3318 agsaIORequest_t *agIORequest,
3319 bit32 agIOStatus,
3320 agsaFisHeader_t *agFirstDword,
3321 bit32 agIOInfoLen,
3322 agsaFrameHandle_t agFrameHandle,
3323 void *ioContext
3324 )
3325{
3326 /*
3327 In the process of StartStopUnit
3328 Process FLUSH CACHE (EXT)
3329 Process STANDBY
3330 Process READ VERIFY SECTOR(S) EXT
3331 Process MEDIA EJECT
3332 */
3333// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3334// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3335// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3336// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3337 smRoot_t *smRoot = agNULL;
3338 smIntRoot_t *smIntRoot = agNULL;
3339 smIntContext_t *smAllShared = agNULL;
3340 smIORequestBody_t *smIORequestBody;
3341 smIORequestBody_t *smOrgIORequestBody;
3342 smSatIOContext_t *satIOContext;
3343 smSatIOContext_t *satOrgIOContext;
3344 smSatIOContext_t *satNewIOContext;
3345 smSatInternalIo_t *satIntIo;
3346 smSatInternalIo_t *satNewIntIo = agNULL;
3347// satDeviceData_t *satDevData;
3348 smDeviceData_t *oneDeviceData;
3349 smScsiRspSense_t *pSense;
3350 smIniScsiCmnd_t *scsiCmnd;
3351 smIORequest_t *smOrgIORequest;
3352 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
3353 bit32 ataStatus = 0;
3354 bit32 status;
3355 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
3356
3357 SM_DBG2(("smsatStartStopUnitCB: start\n"));
3358 SM_DBG5(("smsatStartStopUnitCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
3359
3360 /* internally generate smIOContext */
3361 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
3362 satIOContext = (smSatIOContext_t *) ioContext;
3363 satIntIo = satIOContext->satIntIoContext;
3364 oneDeviceData = satIOContext->pSatDevData;
3365 hostToDevFis = satIOContext->pFis;
3366 smRoot = oneDeviceData->smRoot;
3367 smIntRoot = (smIntRoot_t *)smRoot->smData;
3368 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
3369 if (satIntIo == agNULL)
3370 {
3371 SM_DBG4(("smsatStartStopUnitCB: External smSatInternalIo_t satIntIoContext\n"));
3372 satOrgIOContext = satIOContext;
3373 smOrgIORequest = smIORequestBody->smIORequest;
3374 pSense = satIOContext->pSense;
3375 scsiCmnd = satIOContext->pScsiCmnd;
3376 }
3377 else
3378 {
3379 SM_DBG4(("smsatStartStopUnitCB: Internal smSatInternalIo_t satIntIoContext\n"));
3380 satOrgIOContext = satIOContext->satOrgIOContext;
3381 if (satOrgIOContext == agNULL)
3382 {
3383 SM_DBG4(("smsatStartStopUnitCB: satOrgIOContext is NULL, wrong\n"));
3384 return;
3385 }
3386 else
3387 {
3388 SM_DBG4(("smsatStartStopUnitCB: satOrgIOContext is NOT NULL\n"));
3389 }
3390 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
3391 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
3392
3393 pSense = satOrgIOContext->pSense;
3394 scsiCmnd = satOrgIOContext->pScsiCmnd;
3395 }
3396
3397 smIORequestBody->ioCompleted = agTRUE;
3398 smIORequestBody->ioStarted = agFALSE;
3399
3400 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
3401 {
3402 SM_DBG1(("smsatStartStopUnitCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
3403
3404 /* IMMED == 0 */
3405 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3406 {
3407 SM_DBG1(("smsatStartStopUnitCB: immed bit 0!!!\n"));
3408 smsatSetSensePayload( pSense,
3410 0,
3412 satOrgIOContext);
3413
3414 tdsmIOCompletedCB( smRoot,
3415 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3418 satOrgIOContext->pSmSenseData,
3419 satOrgIOContext->interruptContext );
3420
3421
3422 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3423 smsatFreeIntIoResource( smRoot,
3424 oneDeviceData,
3425 satIntIo);
3426 }
3427 /* IMMED == 1 */
3428 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
3429 {
3430 SM_DBG1(("smsatStartStopUnitCB: immed bit 1!!!\n"));
3433 0,
3435 satOrgIOContext);
3436
3437 tdsmIOCompletedCB( smRoot,
3438 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3441 satOrgIOContext->pSmSenseData,
3442 satOrgIOContext->interruptContext );
3443
3444
3445 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3446 smsatFreeIntIoResource( smRoot,
3447 oneDeviceData,
3448 satIntIo);
3449 }
3450
3451
3452
3453 return;
3454 }
3455
3456 if (agIOStatus != OSSA_IO_SUCCESS)
3457 {
3458 /* only agsaFisRegDeviceToHost_t is expected */
3459 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
3460 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
3461 }
3462 /*
3463 checking IO status, FIS type and error status
3464 */
3465 if( agIOStatus != OSSA_IO_SUCCESS)
3466 {
3467 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
3468 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
3469 )
3470 {
3471 /* for debugging */
3472 if( agIOStatus != OSSA_IO_SUCCESS)
3473 {
3474 SM_DBG1(("smsatStartStopUnitCB: FAILED, NOT IO_SUCCESS!!!\n"));
3475 }
3476 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
3477 {
3478 SM_DBG1(("smsatStartStopUnitCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
3479 }
3480 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
3481 (ataStatus & DF_ATA_STATUS_MASK)
3482 )
3483 {
3484 SM_DBG1(("smsatStartStopUnitCB: FAILED, FAILED, error status!!!\n"));
3485 }
3486
3487
3488 /* Process abort case */
3489 if (agIOStatus == OSSA_IO_ABORTED)
3490 {
3491 smsatProcessAbort(smRoot,
3492 smOrgIORequest,
3493 satOrgIOContext
3494 );
3495
3496
3497 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3498
3499 smsatFreeIntIoResource( smRoot,
3500 oneDeviceData,
3501 satIntIo);
3502 return;
3503 }
3504
3505 switch (hostToDevFis->h.command)
3506 {
3507 case SAT_FLUSH_CACHE: /* fall through */
3509 SM_DBG1(("smsatStartStopUnitCB: SAT_FLUSH_CACHE(_EXT)!!!\n"));
3510 /* check immed bit in scsi command */
3511 /* IMMED == 0 */
3512 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3513 {
3514 smsatSetSensePayload( pSense,
3516 0,
3518 satOrgIOContext);
3519
3520 tdsmIOCompletedCB( smRoot,
3521 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3524 satOrgIOContext->pSmSenseData,
3525 satOrgIOContext->interruptContext );
3526
3527
3528 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3529
3530 smsatFreeIntIoResource( smRoot,
3531 oneDeviceData,
3532 satIntIo);
3533 }
3534 /* IMMED == 1 */
3535 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
3536 {
3539 0,
3541 satOrgIOContext);
3542
3543 tdsmIOCompletedCB( smRoot,
3544 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3547 satOrgIOContext->pSmSenseData,
3548 satOrgIOContext->interruptContext );
3549
3550
3551 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3552
3553 smsatFreeIntIoResource( smRoot,
3554 oneDeviceData,
3555 satIntIo);
3556 }
3557 break;
3558 case SAT_STANDBY:
3559 SM_DBG5(("smsatStartStopUnitCB: SAT_STANDBY\n"));
3560 /* check immed bit in scsi command */
3561 /* IMMED == 0 */
3562 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3563 {
3564 smsatSetSensePayload( pSense,
3566 0,
3568 satOrgIOContext);
3569
3570 tdsmIOCompletedCB( smRoot,
3571 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3574 satOrgIOContext->pSmSenseData,
3575 satOrgIOContext->interruptContext );
3576
3577
3578 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3579
3580 smsatFreeIntIoResource( smRoot,
3581 oneDeviceData,
3582 satIntIo);
3583 }
3584 /* IMMED == 1 */
3585 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
3586 {
3589 0,
3591 satOrgIOContext);
3592
3593 tdsmIOCompletedCB( smRoot,
3594 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3597 satOrgIOContext->pSmSenseData,
3598 satOrgIOContext->interruptContext );
3599
3600
3601 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3602
3603 smsatFreeIntIoResource( smRoot,
3604 oneDeviceData,
3605 satIntIo);
3606 }
3607 break;
3608 case SAT_READ_VERIFY_SECTORS: /* fall through */
3610 SM_DBG5(("smsatStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT)\n"));
3611 /* IMMED == 0 */
3612 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3613 {
3614 smsatSetSensePayload( pSense,
3616 0,
3618 satOrgIOContext);
3619
3620 tdsmIOCompletedCB( smRoot,
3621 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3624 satOrgIOContext->pSmSenseData,
3625 satOrgIOContext->interruptContext );
3626
3627
3628 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3629
3630 smsatFreeIntIoResource( smRoot,
3631 oneDeviceData,
3632 satIntIo);
3633 }
3634 /* IMMED == 1 */
3635 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
3636 {
3639 0,
3641 satOrgIOContext);
3642
3643 tdsmIOCompletedCB( smRoot,
3644 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3647 satOrgIOContext->pSmSenseData,
3648 satOrgIOContext->interruptContext );
3649
3650
3651 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3652
3653 smsatFreeIntIoResource( smRoot,
3654 oneDeviceData,
3655 satIntIo);
3656 }
3657 break;
3658 case SAT_MEDIA_EJECT:
3659 SM_DBG5(("smsatStartStopUnitCB: SAT_MEDIA_EJECT\n"));
3660 /* IMMED == 0 */
3661 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3662 {
3663 smsatSetSensePayload( pSense,
3665 0,
3667 satOrgIOContext);
3668
3669 tdsmIOCompletedCB( smRoot,
3670 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3673 satOrgIOContext->pSmSenseData,
3674 satOrgIOContext->interruptContext );
3675
3676
3677 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3678
3679 smsatFreeIntIoResource( smRoot,
3680 oneDeviceData,
3681 satIntIo);
3682 }
3683 /* IMMED == 1 */
3684 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
3685 {
3688 0,
3690 satOrgIOContext);
3691
3692 tdsmIOCompletedCB( smRoot,
3693 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
3696 satOrgIOContext->pSmSenseData,
3697 satOrgIOContext->interruptContext );
3698
3699 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3700
3701 smsatFreeIntIoResource( smRoot,
3702 oneDeviceData,
3703 satIntIo);
3704 }
3705 break;
3706 default:
3707 /* unspecified case, return no sense and no addition info */
3708 SM_DBG5(("smsatStartStopUnitCB: default command %d\n", hostToDevFis->h.command));
3709 smsatSetSensePayload( pSense,
3711 0,
3713 satOrgIOContext);
3714
3715 tdsmIOCompletedCB( smRoot,
3716 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
3719 satOrgIOContext->pSmSenseData,
3720 satOrgIOContext->interruptContext );
3721
3722
3723 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3724
3725 smsatFreeIntIoResource( smRoot,
3726 oneDeviceData,
3727 satIntIo);
3728 break;
3729 } /* switch */
3730
3731 return;
3732 } /* error check */
3733 }
3734
3735 /* ATA command completes sucessfully */
3736 switch (hostToDevFis->h.command)
3737 {
3738 case SAT_FLUSH_CACHE: /* fall through */
3740 SM_DBG5(("smsatStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
3741
3742
3743 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3744
3745 /* done with SAT_FLUSH_CACHE(_EXT) */
3746 smsatFreeIntIoResource( smRoot,
3747 oneDeviceData,
3748 satIntIo);
3749
3750 /* at this point, successful SAT_READ_VERIFY_SECTORS(_EXT)
3751 send SAT_SATNDBY
3752 */
3753 satNewIntIo = smsatAllocIntIoResource( smRoot,
3754 smOrgIORequest,
3755 oneDeviceData,
3756 0,
3757 satNewIntIo);
3758 if (satNewIntIo == agNULL)
3759 {
3760 /* IMMED == 0 */
3761 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3762 {
3763 smsatSetSensePayload( pSense,
3765 0,
3767 satOrgIOContext);
3768 }
3769 else /* IMMED == 1 */
3770 {
3773 0,
3775 satOrgIOContext);
3776 }
3777 tdsmIOCompletedCB( smRoot,
3778 smOrgIORequest,
3781 satOrgIOContext->pSmSenseData,
3782 satOrgIOContext->interruptContext );
3783
3784 SM_DBG1(("smsatStartStopUnitCB: momory allocation fails!!!\n"));
3785 return;
3786 } /* end of memory allocation failure */
3787
3788 /*
3789 * Need to initialize all the fields within satIOContext
3790 */
3791
3792 satNewIOContext = smsatPrepareNewIO(
3793 satNewIntIo,
3794 smOrgIORequest,
3795 oneDeviceData,
3796 scsiCmnd,
3797 satOrgIOContext
3798 );
3799
3800 /* sending SAT_STANDBY */
3801 status = smsatStartStopUnit_1( smRoot,
3802 &satNewIntIo->satIntSmIORequest,
3803 satNewIOContext->psmDeviceHandle,
3804 &satNewIntIo->satIntSmScsiXchg,
3805 satNewIOContext);
3806
3807 if (status != SM_RC_SUCCESS)
3808 {
3809 /* sending SAT_CHECK_POWER_MODE fails */
3810 smsatFreeIntIoResource( smRoot,
3811 oneDeviceData,
3812 satNewIntIo);
3813
3814 /* IMMED == 0 */
3815 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3816 {
3817 smsatSetSensePayload( pSense,
3819 0,
3821 satOrgIOContext);
3822 }
3823 else /* IMMED == 1 */
3824 {
3827 0,
3829 satOrgIOContext);
3830 }
3831 tdsmIOCompletedCB( smRoot,
3832 smOrgIORequest,
3835 satOrgIOContext->pSmSenseData,
3836 satOrgIOContext->interruptContext );
3837
3838 SM_DBG1(("smsatStartStopUnitCB: calling satStartStopUnit_1 fails!!!\n"));
3839 return;
3840 }
3841 break;
3842 case SAT_STANDBY:
3843 SM_DBG5(("smsatStartStopUnitCB: SAT_STANDBY success case\n"));
3844
3845 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3846
3847 /* done with SAT_STANDBY */
3848 smsatFreeIntIoResource( smRoot,
3849 oneDeviceData,
3850 satIntIo);
3851 /*
3852 if immed == 0, return good status
3853 */
3854 /* IMMED == 0 */
3855 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3856 {
3857 tdsmIOCompletedCB( smRoot,
3858 smOrgIORequest,
3861 agNULL,
3862 satOrgIOContext->interruptContext );
3863 }
3864 oneDeviceData->satStopState = agTRUE;
3865 break;
3866 case SAT_READ_VERIFY_SECTORS: /* fall through */
3868 SM_DBG5(("smsatStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
3869
3870 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3871
3872 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
3873 smsatFreeIntIoResource( smRoot,
3874 oneDeviceData,
3875 satIntIo);
3876 /*
3877 if immed == 0, return good status
3878 */
3879 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3880 {
3881 tdsmIOCompletedCB( smRoot,
3882 smOrgIORequest,
3885 agNULL,
3886 satOrgIOContext->interruptContext );
3887 }
3888 /*
3889 if immed == 0, return good status
3890 */
3891 /*
3892 don't forget to check and set driver state; Active power state
3893 */
3894 oneDeviceData->satStopState = agFALSE;
3895 break;
3896 case SAT_MEDIA_EJECT:
3897 SM_DBG5(("smsatStartStopUnitCB: SAT_MEDIA_EJECT success case\n"));
3898
3899 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3900
3901 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
3902 smsatFreeIntIoResource( smRoot,
3903 oneDeviceData,
3904 satIntIo);
3905 /*
3906 if immed == 0, return good status
3907 */
3908 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
3909 {
3910 tdsmIOCompletedCB( smRoot,
3911 smOrgIORequest,
3914 agNULL,
3915 satOrgIOContext->interruptContext );
3916 }
3917 break;
3918 default:
3919 SM_DBG1(("smsatStartStopUnitCB:success but error default case command 0x%x!!!\n", hostToDevFis->h.command));
3920
3921 /* unspecified case, return no sense and no addition info */
3922 smsatSetSensePayload( pSense,
3924 0,
3926 satOrgIOContext);
3927
3928 tdsmIOCompletedCB( smRoot,
3929 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
3932 satOrgIOContext->pSmSenseData,
3933 satOrgIOContext->interruptContext );
3934
3935 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
3936
3937 smsatFreeIntIoResource( smRoot,
3938 oneDeviceData,
3939 satIntIo);
3940 break;
3941 }
3942 return;
3943
3944}
3945
3946osGLOBAL void
3948 agsaRoot_t *agRoot,
3949 agsaIORequest_t *agIORequest,
3950 bit32 agIOStatus,
3951 agsaFisHeader_t *agFirstDword,
3952 bit32 agIOInfoLen,
3953 agsaFrameHandle_t agFrameHandle,
3954 void *ioContext
3955 )
3956{
3957 smRoot_t *smRoot = agNULL;
3958 smIntRoot_t *smIntRoot = agNULL;
3959 smIntContext_t *smAllShared = agNULL;
3960 smIORequestBody_t *smIORequestBody;
3961 smIORequestBody_t *smOrgIORequestBody;
3962 smIORequestBody_t *smNewIORequestBody;
3963 smSatIOContext_t *satIOContext;
3964 smSatIOContext_t *satOrgIOContext;
3965 smSatIOContext_t *satNewIOContext;
3966 smSatInternalIo_t *satIntIo;
3967 smSatInternalIo_t *satNewIntIo = agNULL;
3968 smDeviceData_t *oneDeviceData;
3969 smScsiRspSense_t *pSense;
3970 smIniScsiCmnd_t *scsiCmnd;
3971 smIORequest_t *smOrgIORequest;
3972 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
3973 bit32 ataStatus = 0;
3974 bit32 status;
3975 bit32 sectorcount = 0;
3976 bit32 lba = 0, tl = 0;
3977 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
3978 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
3979
3980 SM_DBG2(("smsatWriteSame10CB: start\n"));
3981 SM_DBG5(("smsatWriteSame10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
3982
3983 /* internally generate smIOContext */
3984 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
3985 satIOContext = (smSatIOContext_t *) ioContext;
3986 satIntIo = satIOContext->satIntIoContext;
3987 oneDeviceData = satIOContext->pSatDevData;
3988 hostToDevFis = satIOContext->pFis;
3989 smRoot = oneDeviceData->smRoot;
3990 smIntRoot = (smIntRoot_t *)smRoot->smData;
3991 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
3992
3993 if (satIntIo == agNULL)
3994 {
3995 SM_DBG4(("smsatWriteSame10CB: External smSatInternalIo_t satIntIoContext\n"));
3996 satOrgIOContext = satIOContext;
3997 smOrgIORequest = smIORequestBody->smIORequest;
3998 pSense = satIOContext->pSense;
3999 scsiCmnd = satIOContext->pScsiCmnd;
4000 }
4001 else
4002 {
4003 SM_DBG4(("smsatWriteSame10CB: Internal smSatInternalIo_t satIntIoContext\n"));
4004 satOrgIOContext = satIOContext->satOrgIOContext;
4005 if (satOrgIOContext == agNULL)
4006 {
4007 SM_DBG4(("smsatWriteSame10CB: satOrgIOContext is NULL, wrong\n"));
4008 return;
4009 }
4010 else
4011 {
4012 SM_DBG4(("smsatWriteSame10CB: satOrgIOContext is NOT NULL\n"));
4013 }
4014 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
4015 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
4016
4017 pSense = satOrgIOContext->pSense;
4018 scsiCmnd = satOrgIOContext->pScsiCmnd;
4019 }
4020
4021
4022 smIORequestBody->ioCompleted = agTRUE;
4023 smIORequestBody->ioStarted = agFALSE;
4024
4025 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4026 {
4027 SM_DBG1(("smsatWriteSame10CB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
4028 smsatSetSensePayload( pSense,
4030 0,
4032 satOrgIOContext);
4033
4034 tdsmIOCompletedCB( smRoot,
4035 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4038 satOrgIOContext->pSmSenseData,
4039 satOrgIOContext->interruptContext );
4040
4041 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4042
4043 smsatFreeIntIoResource( smRoot,
4044 oneDeviceData,
4045 satIntIo);
4046 return;
4047 }
4048
4049 if (agIOStatus != OSSA_IO_SUCCESS)
4050 {
4051 /* FP, DMA and PIO write */
4052 /* First, assumed to be Reg Device to Host FIS */
4053 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
4054 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
4055 }
4056
4057 if (agIOStatus != OSSA_IO_SUCCESS)
4058 {
4059 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
4060 {
4061 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
4062
4063 /* Get ATA Status register */
4064 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */
4065 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */
4066 }
4067 }
4068
4069 if( agIOStatus != OSSA_IO_SUCCESS)
4070 {
4071 /*
4072 checking IO status, FIS type and error status
4073 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
4074 */
4075 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
4076 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
4077 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
4078 )
4079 {
4080 /* for debugging */
4081 if( agIOStatus != OSSA_IO_SUCCESS)
4082 {
4083 SM_DBG1(("smsatWriteSame10CB: FAILED, NOT IO_SUCCESS!!!\n"));
4084 }
4085 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
4086 {
4087 SM_DBG1(("smsatWriteSame10CB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
4088 }
4089 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
4090 {
4091 SM_DBG1(("smsatWriteSame10CB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
4092 }
4093 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
4094 (ataStatus & DF_ATA_STATUS_MASK)
4095 )
4096 {
4097 SM_DBG1(("smsatWriteSame10CB: FAILED, FAILED, error status!!!\n"));
4098 }
4099
4100 /* Process abort case */
4101 if (agIOStatus == OSSA_IO_ABORTED)
4102 {
4103 smsatProcessAbort(smRoot,
4104 smOrgIORequest,
4105 satOrgIOContext
4106 );
4107
4108
4109 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4110
4111 smsatFreeIntIoResource( smRoot,
4112 oneDeviceData,
4113 satIntIo);
4114 return;
4115 }
4116
4117 /* for debugging */
4118 switch (hostToDevFis->h.command)
4119 {
4120 case SAT_WRITE_DMA_EXT:
4121 SM_DBG1(("smsatWriteSame10CB: SAT_WRITE_DMA_EXT!!!\n"));
4122 break;
4124 SM_DBG1(("smsatWriteSame10CB: SAT_WRITE_SECTORS_EXT!!!\n"));
4125 break;
4127 SM_DBG1(("smsatWriteSame10CB: SAT_WRITE_FPDMA_QUEUED!!!\n"));
4128 break;
4129 default:
4130 SM_DBG1(("smsatWriteSame10CB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
4131 break;
4132 }
4133
4134 smsatSetSensePayload( pSense,
4136 0,
4138 satOrgIOContext);
4139
4140 tdsmIOCompletedCB( smRoot,
4141 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4144 satOrgIOContext->pSmSenseData,
4145 satOrgIOContext->interruptContext );
4146
4147
4148 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4149
4150 smsatFreeIntIoResource( smRoot,
4151 oneDeviceData,
4152 satIntIo);
4153 return;
4154 } /* end error */
4155 }
4156
4157 /* process success from this point on */
4158 /*
4159 note: inefficient implementation until a single block can be manipulated
4160 */
4161
4162 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
4163 {
4164 SM_DBG5(("smsatWriteSame10CB: SAT_WRITE_DMA_EXT success\n"));
4165 }
4166 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
4167 {
4168 SM_DBG5(("smsatWriteSame10CB: SAT_WRITE_SECTORS_EXT success\n"));
4169 }
4170 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
4171 {
4172 SM_DBG5(("smsatWriteSame10CB: SAT_WRITE_FPDMA_QUEUED success\n"));
4173 }
4174 else
4175 {
4176 SM_DBG1(("smsatWriteSame10CB: error case command 0x%x success!!!\n", hostToDevFis->h.command));
4177 smsatSetSensePayload( pSense,
4179 0,
4181 satOrgIOContext);
4182
4183 tdsmIOCompletedCB( smRoot,
4184 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4187 satOrgIOContext->pSmSenseData,
4188 satOrgIOContext->interruptContext );
4189
4190
4191 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4192
4193 smsatFreeIntIoResource( smRoot,
4194 oneDeviceData,
4195 satIntIo);
4196 return;
4197 }
4198
4199
4200 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4201
4202 /* free */
4203 smsatFreeIntIoResource( smRoot,
4204 oneDeviceData,
4205 satIntIo);
4206
4207 /*
4208 increment LBA by one, keeping the same sector count(1)
4209 sends another ATA command with the changed parameters
4210 */
4211
4213 oneDeviceData->satSectorDone++;
4215
4216 SM_DBG1(("smsatWriteSame10CB: sectordone %d!!!\n", oneDeviceData->satSectorDone));
4217
4218 lba = (scsiCmnd->cdb[2] << (8*3)) + (scsiCmnd->cdb[3] << (8*2))
4219 + (scsiCmnd->cdb[4] << 8) + scsiCmnd->cdb[5];
4220 tl = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
4221
4222 SM_DBG5(("smsatWriteSame10CB: lba 0x%x tl 0x%x\n", lba, tl));
4223
4224 if (tl == 0)
4225 {
4226 /* (oneDeviceData->satMaxUserAddrSectors - 1) - lba*/
4227 sectorcount = (0x0FFFFFFF - 1) - lba;
4228 }
4229 else
4230 {
4231 sectorcount = tl;
4232 }
4233
4234 if (sectorcount <= 0)
4235 {
4236 smsatSetSensePayload( pSense,
4238 0,
4240 satOrgIOContext);
4241
4242 tdsmIOCompletedCB( smRoot,
4243 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4246 satOrgIOContext->pSmSenseData,
4247 satOrgIOContext->interruptContext );
4248 SM_DBG1(("smsatWriteSame10CB: incorrect sectorcount 0x%x!!!\n", sectorcount));
4249 return;
4250 }
4251
4252 if (sectorcount == oneDeviceData->satSectorDone)
4253 {
4254 /*
4255 done with writesame
4256 */
4257 SM_DBG1(("smsatWriteSame10CB: return writesame done!!!\n"));
4258 oneDeviceData->satSectorDone = 0;
4259
4260 tdsmIOCompletedCB( smRoot,
4261 smOrgIORequest,
4264 agNULL,
4265 satOrgIOContext->interruptContext );
4266 }
4267 else
4268 {
4269 /* sends another ATA command */
4270 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
4271 {
4272 SM_DBG1(("smsatWriteSame10CB: sends another SAT_WRITE_DMA_EXT!!!\n"));
4273 }
4274 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
4275 {
4276 SM_DBG1(("smsatWriteSame10CB: sends another SAT_WRITE_SECTORS_EXT!!!\n"));
4277 }
4278 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
4279 {
4280 SM_DBG1(("smsatWriteSame10CB: sends another SAT_WRITE_FPDMA_QUEUED!!!\n"));
4281 }
4282
4283 satNewIntIo = smsatAllocIntIoResource( smRoot,
4284 smOrgIORequest,
4285 oneDeviceData,
4286 0,
4287 satNewIntIo);
4288 if (satNewIntIo == agNULL)
4289 {
4290 smsatSetSensePayload( pSense,
4292 0,
4294 satOrgIOContext);
4295
4296 tdsmIOCompletedCB( smRoot,
4297 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4300 satOrgIOContext->pSmSenseData,
4301 satOrgIOContext->interruptContext );
4302 SM_DBG1(("smsatWriteSame10CB: momory allocation fails!!!\n"));
4303 return;
4304 } /* end memory allocation */
4305
4306 /* the one to be used */
4307 smNewIORequestBody = satNewIntIo->satIntRequestBody;
4308 satNewIOContext = &smNewIORequestBody->transport.SATA.satIOContext;
4309
4310 satNewIOContext->pSatDevData = oneDeviceData;
4311 satNewIOContext->pFis = &smNewIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev;
4312 satNewIOContext->pScsiCmnd = &satNewIntIo->satIntSmScsiXchg.scsiCmnd;
4313 /* saves scsi command for LBA and number of blocks */
4314 sm_memcpy(satNewIOContext->pScsiCmnd, scsiCmnd, sizeof(smIniScsiCmnd_t));
4315 satNewIOContext->pSense = &smNewIORequestBody->transport.SATA.sensePayload;
4316 satNewIOContext->pSmSenseData = &smNewIORequestBody->transport.SATA.smSenseData;
4317 satNewIOContext->pSmSenseData->senseData = satNewIOContext->pSense;
4318 satNewIOContext->smRequestBody = satNewIntIo->satIntRequestBody;
4319 satNewIOContext->interruptContext = satNewIOContext->interruptContext;
4320 satNewIOContext->satIntIoContext = satNewIntIo;
4321 satNewIOContext->psmDeviceHandle = satIOContext->psmDeviceHandle;
4322 /* saves smScsiXchg; only for writesame10() */
4323 satNewIOContext->smScsiXchg = satOrgIOContext->smScsiXchg;
4324
4325 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
4326 {
4327 status = smsatWriteSame10_1( smRoot,
4328 &satNewIntIo->satIntSmIORequest,
4329 satNewIOContext->psmDeviceHandle,
4330 &satNewIntIo->satIntSmScsiXchg,
4331 satNewIOContext,
4332 lba + oneDeviceData->satSectorDone
4333 );
4334 }
4335 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
4336 {
4337 status = smsatWriteSame10_2( smRoot,
4338 &satNewIntIo->satIntSmIORequest,
4339 satNewIOContext->psmDeviceHandle,
4340 &satNewIntIo->satIntSmScsiXchg,
4341 satNewIOContext,
4342 lba + oneDeviceData->satSectorDone
4343 );
4344 }
4345 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
4346 {
4347 status = smsatWriteSame10_3( smRoot,
4348 &satNewIntIo->satIntSmIORequest,
4349 satNewIOContext->psmDeviceHandle,
4350 &satNewIntIo->satIntSmScsiXchg,
4351 satNewIOContext,
4352 lba + oneDeviceData->satSectorDone
4353 );
4354 }
4355 else
4356 {
4357 status = tiError;
4358 SM_DBG1(("smsatWriteSame10CB: sucess but error in command 0x%x!!!\n", hostToDevFis->h.command));
4359 }
4360
4361 if (status != SM_RC_SUCCESS)
4362 {
4363 /* sending ATA command fails */
4364 smsatFreeIntIoResource( smRoot,
4365 oneDeviceData,
4366 satNewIntIo);
4367 smsatSetSensePayload( pSense,
4369 0,
4371 satOrgIOContext);
4372
4373 tdsmIOCompletedCB( smRoot,
4374 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4377 satOrgIOContext->pSmSenseData,
4378 satOrgIOContext->interruptContext );
4379 SM_DBG1(("smsatWriteSame10CB:calling satWriteSame10_1 fails!!!\n"));
4380 return;
4381 } /* end send fails */
4382
4383 } /* end sends another ATA command */
4384
4385 return;
4386
4387}
4388
4389osGLOBAL void
4391 agsaRoot_t *agRoot,
4392 agsaIORequest_t *agIORequest,
4393 bit32 agIOStatus,
4394 agsaFisHeader_t *agFirstDword,
4395 bit32 agIOInfoLen,
4396 void *agParam,
4397 void *ioContext
4398 )
4399{
4400 smRoot_t *smRoot = agNULL;
4401 smIntRoot_t *smIntRoot = agNULL;
4402 smIntContext_t *smAllShared = agNULL;
4403 smIORequestBody_t *smIORequestBody;
4404 smIORequestBody_t *smOrgIORequestBody;
4405 smSatIOContext_t *satIOContext;
4406 smSatIOContext_t *satOrgIOContext;
4407 smSatInternalIo_t *satIntIo;
4408// satDeviceData_t *satDevData;
4409 smDeviceData_t *oneDeviceData;
4410
4411 smScsiRspSense_t *pSense;
4412 smIORequest_t *smOrgIORequest;
4413
4414 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
4415 bit32 ataStatus = 0;
4416 smScsiInitiatorRequest_t *smScsiRequest; /* tiScsiXchg */
4417 smScsiInitiatorRequest_t *smOrgScsiRequest; /* tiScsiXchg */
4418 satReadLogExtSelfTest_t *virtAddr1;
4419 satSmartReadLogSelfTest_t *virtAddr2;
4420 bit8 *pLogPage;
4422 bit8 SelfTestExecutionStatus = 0;
4423 bit32 i = 0;
4424
4425 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
4426 agsaFisRegD2HData_t statDevToHostFisData;
4427 smIniScsiCmnd_t *scsiCmnd;
4428 bit32 allocationLen = 0;
4429
4430 SM_DBG2(("smsatLogSenseCB: start\n"));
4431 SM_DBG5(("smsatLogSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4432
4433 /* internally generate smIOContext */
4434 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
4435 satIOContext = (smSatIOContext_t *) ioContext;
4436 if (satIOContext == agNULL)
4437 {
4438 SM_DBG1(("smsatLogSenseCB: satIOContext is NULL\n"));
4439 return;
4440 }
4441 satIntIo = satIOContext->satIntIoContext;
4442 oneDeviceData = satIOContext->pSatDevData;
4443 hostToDevFis = satIOContext->pFis;
4444 smRoot = oneDeviceData->smRoot;
4445 smIntRoot = (smIntRoot_t *)smRoot->smData;
4446 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
4447
4448 if (satIntIo == agNULL)
4449 {
4450 SM_DBG4(("smsatLogSenseCB: External smSatInternalIo_t satIntIoContext\n"));
4451 satOrgIOContext = satIOContext;
4452 smOrgIORequest = smIORequestBody->smIORequest;
4453 pSense = satOrgIOContext->pSense;
4454 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
4455 /* SCSI command response payload to OS layer */
4456 pLogPage = (bit8 *) smOrgScsiRequest->sglVirtualAddr;
4457 /* ATA command response payload */
4458 smScsiRequest = satOrgIOContext->smScsiXchg;
4459 scsiCmnd = satOrgIOContext->pScsiCmnd;
4460 }
4461 else
4462 {
4463 SM_DBG4(("smsatLogSenseCB: Internal smSatInternalIo_t satIntIoContext\n"));
4464 satOrgIOContext = satIOContext->satOrgIOContext;
4465 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
4466 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
4467
4468 pSense = satOrgIOContext->pSense;
4469 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
4470 /* SCSI command response payload to OS layer */
4471 pLogPage = (bit8 *) smOrgScsiRequest->sglVirtualAddr;
4472 /* ATA command response payload */
4473 smScsiRequest = (smScsiInitiatorRequest_t *)&(satIntIo->satIntSmScsiXchg);
4474 scsiCmnd = satOrgIOContext->pScsiCmnd;
4475 }
4476
4477 smIORequestBody->ioCompleted = agTRUE;
4478 smIORequestBody->ioStarted = agFALSE;
4479
4480 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4481 {
4482 SM_DBG1(("smsatLogSenseCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
4484 smRoot,
4485 smOrgIORequest,
4486 smIOFailed,
4488 agNULL,
4489 satOrgIOContext->interruptContext
4490 );
4491 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4492
4493 smsatFreeIntIoResource( smRoot,
4494 oneDeviceData,
4495 satIntIo);
4496 return;
4497 }
4498
4499 if (agIOStatus != OSSA_IO_SUCCESS)
4500 {
4501 /* non-data and pio read -> device to host and pio setup fis are expected */
4502 /*
4503 first, assumed to be Reg Device to Host FIS
4504 This is OK to just find fis type
4505 */
4506 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
4507 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
4508 }
4509
4510 if( agIOStatus != OSSA_IO_SUCCESS)
4511 {
4512 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
4513 (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) ||
4514 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
4515 )
4516 {
4517 /* for debugging */
4518 if( agIOStatus != OSSA_IO_SUCCESS)
4519 {
4520 SM_DBG1(("smsatLogSenseCB: FAILED, NOT IO_SUCCESS!!!\n"));
4521 }
4522 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
4523 {
4524 SM_DBG1(("smsatLogSenseCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
4525 }
4526 else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)
4527 {
4528 SM_DBG1(("smsatLogSenseCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
4529 }
4530 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
4531 (ataStatus & DF_ATA_STATUS_MASK)
4532 )
4533 {
4534 SM_DBG1(("smsatLogSenseCB: FAILED, FAILED, error status!!!\n"));
4535 }
4536
4537 /* Process abort case */
4538 if (agIOStatus == OSSA_IO_ABORTED)
4539 {
4540 smsatProcessAbort(smRoot,
4541 smOrgIORequest,
4542 satOrgIOContext
4543 );
4544
4545 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4546
4547 smsatFreeIntIoResource( smRoot,
4548 oneDeviceData,
4549 satIntIo);
4550 return;
4551 }
4552
4553 /* for debugging */
4554 if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
4555 {
4556 SM_DBG1(("smsatLogSenseCB: SAT_READ_LOG_EXT failed!!!\n"));
4557 }
4558 else if (hostToDevFis->h.command == SAT_SMART)
4559 {
4560 if (hostToDevFis->h.features == SAT_SMART_READ_LOG)
4561 {
4562 SM_DBG1(("smsatLogSenseCB: SAT_SMART_READ_LOG failed!!!\n"));
4563 }
4564 else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
4565 {
4566 SM_DBG1(("smsatLogSenseCB: SAT_SMART_RETURN_STATUS failed!!!\n"));
4567 }
4568 else
4569 {
4570 SM_DBG1(("smsatLogSenseCB: error unknown command 0x%x feature 0x%x!!!\n", hostToDevFis->h.command, hostToDevFis->h.features));
4571 }
4572 }
4573 else
4574 {
4575 SM_DBG1(("smsatLogSenseCB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
4576 }
4577
4578 smsatSetSensePayload( pSense,
4580 0,
4582 satOrgIOContext);
4583
4584 tdsmIOCompletedCB( smRoot,
4585 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4588 satOrgIOContext->pSmSenseData,
4589 satOrgIOContext->interruptContext );
4590
4591 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4592
4593 smsatFreeIntIoResource( smRoot,
4594 oneDeviceData,
4595 satIntIo);
4596 return;
4597
4598 } /* error checking */
4599 }
4600
4601 /* prcessing the success case */
4602 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
4603
4604 allocationLen = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
4605 allocationLen = MIN(allocationLen, scsiCmnd->expDataLength);
4606 SM_DBG5(("smsatLogSenseCB: allocationLen in CDB %d 0x%x\n", allocationLen,allocationLen));
4607
4608
4609 if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
4610 {
4611 SM_DBG5(("smsatLogSenseCB: SAT_READ_LOG_EXT success\n"));
4612
4613 /* process log data and sends it to upper */
4614
4615 /* ATA: Extended Self-Test Log */
4616 virtAddr1 = (satReadLogExtSelfTest_t *)(smScsiRequest->sglVirtualAddr);
4617 /*
4618 ATA/ATAPI VOLII, p197, 287
4619 self-test execution status (4 bits); ((virtAddr1->byte[5] & 0xF0) >> 4)
4620 */
4621 SelfTestExecutionStatus = (bit8)(((virtAddr1->byte[5] & 0xF0) >> 4));
4622
4623 /* fills in the log page from ATA log page */
4624 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
4625 LogPage[0] = 0x10; /* page code */
4626 LogPage[1] = 0;
4627 LogPage[2] = 0x01; /* 0x190, page length */
4628 LogPage[3] = 0x90;
4629
4630 /* SPC-4, Table 217 */
4631 LogPage[4] = 0; /* Parameter Code */
4632 LogPage[5] = 0x01; /* Parameter Code, unspecfied but ... */
4633 LogPage[6] = 3; /* unspecified but ... */
4634 LogPage[7] = 0x10; /* Parameter Length */
4635 LogPage[8] = (bit8)(0 | ((virtAddr1->byte[5] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
4636 LogPage[9] = 0; /* self test number */
4637 LogPage[10] = virtAddr1->byte[7]; /* time stamp, MSB */
4638 LogPage[11] = virtAddr1->byte[6]; /* time stamp, LSB */
4639
4640 LogPage[12] = 0; /* address of first failure MSB*/
4641 LogPage[13] = 0; /* address of first failure */
4642 LogPage[14] = virtAddr1->byte[14]; /* address of first failure */
4643 LogPage[15] = virtAddr1->byte[13]; /* address of first failure */
4644 LogPage[16] = virtAddr1->byte[12]; /* address of first failure */
4645 LogPage[17] = virtAddr1->byte[11]; /* address of first failure */
4646 LogPage[18] = virtAddr1->byte[10]; /* address of first failure */
4647 LogPage[19] = virtAddr1->byte[9]; /* address of first failure LSB */
4648
4649 /* SAT rev8 Table75, p 76 */
4650 switch (SelfTestExecutionStatus)
4651 {
4652 case 0:
4653 LogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
4654 LogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
4655 LogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
4656 break;
4657 case 1:
4658 LogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
4659 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4660 LogPage[22] = 0x81;
4661 break;
4662 case 2:
4663 LogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
4664 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4665 LogPage[22] = 0x82;
4666 break;
4667 case 3:
4668 LogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
4669 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4670 LogPage[22] = 0x83;
4671 break;
4672 case 4:
4673 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4674 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4675 LogPage[22] = 0x84;
4676 break;
4677 case 5:
4678 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4679 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4680 LogPage[22] = 0x85;
4681 break;
4682 case 6:
4683 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4684 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4685 LogPage[22] = 0x86;
4686 break;
4687 case 7:
4688 LogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
4689 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4690 LogPage[22] = 0x87;
4691 break;
4692 case 8:
4693 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4694 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4695 LogPage[22] = 0x88;
4696 break;
4697 case 9: /* fall through */
4698 case 10:/* fall through */
4699 case 11:/* fall through */
4700 case 12:/* fall through */
4701 case 13:/* fall through */
4702 case 14:
4703 LogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
4704 LogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
4705 LogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
4706 break;
4707 case 15:
4708 LogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
4709 LogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
4710 LogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
4711 break;
4712 default:
4713 SM_DBG1(("smsatLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x!!!\n", SelfTestExecutionStatus));
4714
4715 smsatSetSensePayload( pSense,
4717 0,
4719 satOrgIOContext);
4720
4721 tdsmIOCompletedCB( smRoot,
4722 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4725 satOrgIOContext->pSmSenseData,
4726 satOrgIOContext->interruptContext );
4727
4728 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4729
4730 smsatFreeIntIoResource( smRoot,
4731 oneDeviceData,
4732 satIntIo);
4733
4734 return;
4735 }
4736
4737 LogPage[23] = 0; /* vendor specific */
4738
4739 /* the rest of Self-test results log */
4740 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
4741 for (i=24;i<=403;i++)
4742 {
4743 LogPage[i] = 0; /* vendor specific */
4744 }
4745
4746 sm_memcpy(pLogPage, LogPage, MIN(allocationLen, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
4747 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < allocationLen)
4748 {
4749 SM_DBG6(("smsatLogSenseCB: 1st underrun allocationLen %d len %d \n", allocationLen, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
4750
4751 /* underrun */
4752 tdsmIOCompletedCB( smRoot,
4753 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
4755 allocationLen - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
4756 agNULL,
4757 satOrgIOContext->interruptContext );
4758
4759 }
4760 else
4761 {
4762 tdsmIOCompletedCB( smRoot,
4763 smOrgIORequest,
4766 agNULL,
4767 satOrgIOContext->interruptContext);
4768 }
4769
4770 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4771
4772 smsatFreeIntIoResource( smRoot,
4773 oneDeviceData,
4774 satIntIo);
4775
4776 return;
4777 }
4778 else if (hostToDevFis->h.command == SAT_SMART)
4779 {
4780 if (hostToDevFis->h.features == SAT_SMART_READ_LOG)
4781 {
4782 SM_DBG5(("smsatLogSenseCB: SAT_SMART_READ_LOG success\n"));
4783 /* process log data and sends it to upper */
4784
4785 /* ATA: Extended Self-Test Log */
4786 virtAddr2 = (satSmartReadLogSelfTest_t *)(smScsiRequest->sglVirtualAddr);
4787 /*
4788 SPC-4, p197, 287
4789 self-test execution status (4 bits); ((virtAddr2->byte[3] & 0xF0) >> 4)
4790 */
4791 SelfTestExecutionStatus = (bit8)(((virtAddr2->byte[3] & 0xF0) >> 4));
4792
4793 /* fills in the log page from ATA log page */
4794 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
4795 LogPage[0] = 0x10; /* page code */
4796 LogPage[1] = 0;
4797 LogPage[2] = 0x01; /* 0x190, page length */
4798 LogPage[3] = 0x90; /* 0x190, page length */
4799
4800 /* SPC-4, Table 217 */
4801 LogPage[4] = 0; /* Parameter Code */
4802 LogPage[5] = 0x01; /* Parameter Code unspecfied but ... */
4803 LogPage[6] = 3; /* unspecified but ... */
4804 LogPage[7] = 0x10; /* Parameter Length */
4805 LogPage[8] = (bit8)(0 | ((virtAddr2->byte[3] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
4806 LogPage[9] = 0; /* self test number */
4807 LogPage[10] = virtAddr2->byte[5]; /* time stamp, MSB */
4808 LogPage[11] = virtAddr2->byte[4]; /* time stamp, LSB */
4809
4810 LogPage[12] = 0; /* address of first failure MSB*/
4811 LogPage[13] = 0; /* address of first failure */
4812 LogPage[14] = 0; /* address of first failure */
4813 LogPage[15] = 0; /* address of first failure */
4814 LogPage[16] = virtAddr2->byte[10]; /* address of first failure */
4815 LogPage[17] = virtAddr2->byte[9]; /* address of first failure */
4816 LogPage[18] = virtAddr2->byte[8]; /* address of first failure */
4817 LogPage[19] = virtAddr2->byte[7]; /* address of first failure LSB */
4818
4819 /* SAT rev8 Table75, p 76 */
4820 switch (SelfTestExecutionStatus)
4821 {
4822 case 0:
4823 LogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
4824 LogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
4825 LogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
4826 break;
4827 case 1:
4828 LogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
4829 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4830 LogPage[22] = 0x81;
4831 break;
4832 case 2:
4833 LogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
4834 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4835 LogPage[22] = 0x82;
4836 break;
4837 case 3:
4838 LogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
4839 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4840 LogPage[22] = 0x83;
4841 break;
4842 case 4:
4843 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4844 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4845 LogPage[22] = 0x84;
4846 break;
4847 case 5:
4848 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4849 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4850 LogPage[22] = 0x85;
4851 break;
4852 case 6:
4853 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4854 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4855 LogPage[22] = 0x86;
4856 break;
4857 case 7:
4858 LogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
4859 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4860 LogPage[22] = 0x87;
4861 break;
4862 case 8:
4863 LogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
4864 LogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
4865 LogPage[22] = 0x88;
4866 break;
4867 case 9: /* fall through */
4868 case 10:/* fall through */
4869 case 11:/* fall through */
4870 case 12:/* fall through */
4871 case 13:/* fall through */
4872 case 14:
4873 /* unspecified */
4874 LogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
4875 LogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
4876 LogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
4877 break;
4878 case 15:
4879 LogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
4880 LogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
4881 LogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
4882 break;
4883 default:
4884 SM_DBG1(("smsatLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x!!!\n", SelfTestExecutionStatus));
4885
4886 smsatSetSensePayload( pSense,
4888 0,
4890 satOrgIOContext);
4891
4892 tdsmIOCompletedCB( smRoot,
4893 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
4896 satOrgIOContext->pSmSenseData,
4897 satOrgIOContext->interruptContext );
4898
4899 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4900
4901 smsatFreeIntIoResource( smRoot,
4902 oneDeviceData,
4903 satIntIo);
4904
4905 return;
4906 }
4907
4908 LogPage[23] = 0; /* vendor specific */
4909
4910 /* the rest of Self-test results log */
4911 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
4912 for (i=24;i<=403;i++)
4913 {
4914 LogPage[i] = 0; /* vendor specific */
4915 }
4916
4917 sm_memcpy(pLogPage, LogPage, MIN(allocationLen, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
4918 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < allocationLen)
4919 {
4920 SM_DBG6(("smsatLogSenseCB: 2nd underrun allocationLen %d len %d \n", allocationLen, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
4921
4922 /* underrun */
4923 tdsmIOCompletedCB( smRoot,
4924 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
4926 allocationLen - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
4927 agNULL,
4928 satOrgIOContext->interruptContext );
4929
4930 }
4931 else
4932 {
4933 tdsmIOCompletedCB( smRoot,
4934 smOrgIORequest,
4937 agNULL,
4938 satOrgIOContext->interruptContext);
4939 }
4940 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
4941
4942 smsatFreeIntIoResource( smRoot,
4943 oneDeviceData,
4944 satIntIo);
4945
4946 return;
4947 }
4948 else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
4949 {
4950 SM_DBG5(("smsatLogSenseCB: SAT_SMART_RETURN_STATUS success\n"));
4951
4952 /* fills in the log page from ATA output */
4953 /* SPC-4, 7.2.5, Table 209, 211, p 255 */
4954 LogPage[0] = 0x2F; /* page code unspecified */
4955 LogPage[1] = 0; /* reserved */
4956 LogPage[2] = 0; /* page length */
4957 LogPage[3] = 0x07; /* page length */
4958
4959 /*
4960 SPC-4, 7.2.5, Table 211, p 255
4961 no vendor specific field
4962 */
4963 LogPage[4] = 0; /* Parameter Code */
4964 LogPage[5] = 0; /* Parameter Code unspecfied but to do: */
4965 LogPage[6] = 0; /* unspecified */
4966 LogPage[7] = 0x03; /* Parameter length, unspecified */
4967
4968 /* SAT rev8, 10.2.3.1 Table 72, p 73 */
4969 if (statDevToHostFisData.lbaMid == 0x4F || statDevToHostFisData.lbaHigh == 0xC2)
4970 {
4971 LogPage[8] = 0; /* Sense code */
4972 LogPage[9] = 0; /* Sense code qualifier */
4973 }
4974 else if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
4975 {
4976 LogPage[8] = 0x5D; /* Sense code */
4977 LogPage[9] = 0x10; /* Sense code qualifier */
4978 }
4979
4980 /* Assumption: No support for SCT */
4981 LogPage[10] = 0xFF; /* Most Recent Temperature Reading */
4982
4983 sm_memcpy(pLogPage, LogPage, MIN(allocationLen, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH));
4984 if (INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH < allocationLen)
4985 {
4986 SM_DBG6(("smsatLogSenseCB: 3rd underrun allocationLen %d len %d \n", allocationLen, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH));
4987
4988 /* underrun */
4989 tdsmIOCompletedCB( smRoot,
4990 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
4993 agNULL,
4994 satOrgIOContext->interruptContext );
4995
4996 }
4997 else
4998 {
4999 tdsmIOCompletedCB( smRoot,
5000 smOrgIORequest,
5003 agNULL,
5004 satOrgIOContext->interruptContext);
5005 }
5006
5007 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5008
5009 smsatFreeIntIoResource( smRoot,
5010 oneDeviceData,
5011 satIntIo);
5012
5013
5014 return;
5015 }
5016 else
5017 {
5018 SM_DBG1(("smsatLogSenseCB: error unknown command success 0x%x feature 0x%x!!!\n", hostToDevFis->h.command, hostToDevFis->h.features));
5019 smsatSetSensePayload( pSense,
5021 0,
5023 satOrgIOContext);
5024
5025 tdsmIOCompletedCB( smRoot,
5026 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5029 satOrgIOContext->pSmSenseData,
5030 satOrgIOContext->interruptContext );
5031 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5032
5033 smsatFreeIntIoResource( smRoot,
5034 oneDeviceData,
5035 satIntIo);
5036
5037 return;
5038 }
5039 }
5040 else
5041 {
5042 SM_DBG1(("smsatLogSenseCB: error unknown command success 0x%x!!!\n", hostToDevFis->h.command));
5043 smsatSetSensePayload( pSense,
5045 0,
5047 satOrgIOContext);
5048
5049 tdsmIOCompletedCB( smRoot,
5050 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5053 satOrgIOContext->pSmSenseData,
5054 satOrgIOContext->interruptContext );
5055
5056 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5057
5058 smsatFreeIntIoResource( smRoot,
5059 oneDeviceData,
5060 satIntIo);
5061
5062 return;
5063 }
5064
5065 return;
5066}
5067
5068osGLOBAL void
5070 agsaRoot_t *agRoot,
5071 agsaIORequest_t *agIORequest,
5072 bit32 agIOStatus,
5073 agsaFisHeader_t *agFirstDword,
5074 bit32 agIOInfoLen,
5075 agsaFrameHandle_t agFrameHandle,
5076 void *ioContext
5077 )
5078{
5079// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5080// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5081// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5082// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5083 smRoot_t *smRoot = agNULL;
5084 smIntRoot_t *smIntRoot = agNULL;
5085 smIntContext_t *smAllShared = agNULL;
5086 smIORequestBody_t *smIORequestBody;
5087 smIORequestBody_t *smOrgIORequestBody;
5088 smSatIOContext_t *satIOContext;
5089 smSatIOContext_t *satOrgIOContext;
5090 smSatIOContext_t *satNewIOContext;
5091 smSatInternalIo_t *satIntIo;
5092 smSatInternalIo_t *satNewIntIo = agNULL;
5093// satDeviceData_t *satDevData;
5094 smDeviceData_t *oneDeviceData;
5095 smIniScsiCmnd_t *scsiCmnd;
5096 smIORequest_t *smOrgIORequest;
5097 bit32 status;
5098
5099 SM_DBG2(("smsatSMARTEnableCB: start\n"));
5100 SM_DBG4(("smsatSMARTEnableCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5101
5102 /* internally generate tiIOContext */
5103 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
5104 satIOContext = (smSatIOContext_t *) ioContext;
5105 satIntIo = satIOContext->satIntIoContext;
5106 oneDeviceData = satIOContext->pSatDevData;
5107 smRoot = oneDeviceData->smRoot;
5108 smIntRoot = (smIntRoot_t *)smRoot->smData;
5109 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
5110 /*ttttttthe one */
5111 if (satIntIo == agNULL)
5112 {
5113 SM_DBG4(("smsatSMARTEnableCB: External smSatInternalIo_t satIntIoContext\n"));
5114 satOrgIOContext = satIOContext;
5115 smOrgIORequest = smIORequestBody->smIORequest;
5116 scsiCmnd = satOrgIOContext->pScsiCmnd;
5117 }
5118 else
5119 {
5120 SM_DBG4(("smsatSMARTEnableCB: Internal smSatInternalIo_t satIntIoContext\n"));
5121 satOrgIOContext = satIOContext->satOrgIOContext;
5122 if (satOrgIOContext == agNULL)
5123 {
5124 SM_DBG4(("smsatSMARTEnableCB: satOrgIOContext is NULL, wrong\n"));
5125 return;
5126 }
5127 else
5128 {
5129 SM_DBG4(("smsatSMARTEnableCB: satOrgIOContext is NOT NULL\n"));
5130 }
5131 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
5132 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
5133 scsiCmnd = satOrgIOContext->pScsiCmnd;
5134 }
5135 smIORequestBody->ioCompleted = agTRUE;
5136 smIORequestBody->ioStarted = agFALSE;
5137
5138 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5139 {
5140 SM_DBG1(("smsatSMARTEnableCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
5142 smRoot,
5143 smOrgIORequest,
5144 smIOFailed,
5146 agNULL,
5147 satOrgIOContext->interruptContext
5148 );
5149 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5150 smsatFreeIntIoResource( smRoot,
5151 oneDeviceData,
5152 satIntIo);
5153 return;
5154 }
5155 /*
5156 checking IO status, FIS type and error status
5157 */
5158 if (agIOStatus != OSSA_IO_SUCCESS)
5159 {
5160 SM_DBG1(("smsatSMARTEnableCB: not success status, status %d!!!\n", agIOStatus));
5162 smRoot,
5163 smOrgIORequest,
5164 smIOFailed,
5166 agNULL,
5167 satOrgIOContext->interruptContext
5168 );
5169 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5170 smsatFreeIntIoResource( smRoot,
5171 oneDeviceData,
5172 satIntIo);
5173 return;
5174 }
5175 /* process success case */
5176 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5177 smsatFreeIntIoResource( smRoot,
5178 oneDeviceData,
5179 satIntIo);
5180 satNewIntIo = smsatAllocIntIoResource( smRoot,
5181 smOrgIORequest,
5182 oneDeviceData,
5183 512,
5184 satNewIntIo);
5185 if (satNewIntIo == agNULL)
5186 {
5188 smRoot,
5189 smOrgIORequest,
5190 smIOFailed,
5192 agNULL,
5193 satOrgIOContext->interruptContext
5194 );
5195 return;
5196 }
5197 satNewIOContext = smsatPrepareNewIO(
5198 satNewIntIo,
5199 smOrgIORequest,
5200 oneDeviceData,
5201 scsiCmnd,
5202 satOrgIOContext
5203 );
5204 status = smsatLogSense_1(smRoot,
5205 &satNewIntIo->satIntSmIORequest,
5206 satNewIOContext->psmDeviceHandle,
5207 &satNewIntIo->satIntSmScsiXchg,
5208 satNewIOContext);
5209 if (status != SM_RC_SUCCESS)
5210 {
5211 /* sending SAT_CHECK_POWER_MODE fails */
5212 smsatFreeIntIoResource( smRoot,
5213 oneDeviceData,
5214 satNewIntIo);
5216 smRoot,
5217 smOrgIORequest,
5218 smIOFailed,
5220 agNULL,
5221 satOrgIOContext->interruptContext
5222 );
5223 return;
5224 }
5225 return;
5226}
5227
5228osGLOBAL void
5230 agsaRoot_t *agRoot,
5231 agsaIORequest_t *agIORequest,
5232 bit32 agIOStatus,
5233 agsaFisHeader_t *agFirstDword,
5234 bit32 agIOInfoLen,
5235 agsaFrameHandle_t agFrameHandle,
5236 void *ioContext
5237 )
5238{
5239 smRoot_t *smRoot = agNULL;
5240 smIntRoot_t *smIntRoot = agNULL;
5241 smIntContext_t *smAllShared = agNULL;
5242 smIORequestBody_t *smIORequestBody;
5243 smIORequestBody_t *smOrgIORequestBody;
5244 smSatIOContext_t *satIOContext;
5245 smSatIOContext_t *satOrgIOContext;
5246 smSatIOContext_t *satNewIOContext;
5247 smSatInternalIo_t *satIntIo;
5248 smSatInternalIo_t *satNewIntIo = agNULL;
5249// satDeviceData_t *satDevData;
5250 smDeviceData_t *oneDeviceData;
5251
5252 smScsiRspSense_t *pSense;
5253 smIniScsiCmnd_t *scsiCmnd;
5254 smIORequest_t *smOrgIORequest;
5255
5256 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5257 bit32 ataStatus = 0;
5258 bit32 status;
5259 smScsiInitiatorRequest_t *smScsiRequest; /* smScsiXchg */
5260 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5261
5262 SM_DBG2(("smsatModeSelect6n10CB: start\n"));
5263 SM_DBG5(("smsatModeSelect6n10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5264
5265 /* internally generate smIOContext */
5266 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
5267 satIOContext = (smSatIOContext_t *) ioContext;
5268 satIntIo = satIOContext->satIntIoContext;
5269 oneDeviceData = satIOContext->pSatDevData;
5270 hostToDevFis = satIOContext->pFis;
5271 smRoot = oneDeviceData->smRoot;
5272 smIntRoot = (smIntRoot_t *)smRoot->smData;
5273 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
5274
5275 if (satIntIo == agNULL)
5276 {
5277 SM_DBG4(("smsatModeSelect6n10CB: External smSatInternalIo_t satIntIoContext\n"));
5278 satOrgIOContext = satIOContext;
5279 smOrgIORequest = smIORequestBody->smIORequest;
5280 smScsiRequest = satOrgIOContext->smScsiXchg;
5281 pSense = satOrgIOContext->pSense;
5282 scsiCmnd = satOrgIOContext->pScsiCmnd;
5283 }
5284 else
5285 {
5286 SM_DBG4(("smsatModeSelect6n10CB: Internal smSatInternalIo_t satIntIoContext\n"));
5287 satOrgIOContext = satIOContext->satOrgIOContext;
5288 if (satOrgIOContext == agNULL)
5289 {
5290 SM_DBG4(("smsatModeSelect6n10CB: satOrgIOContext is NULL, wrong\n"));
5291 return;
5292 }
5293 else
5294 {
5295 SM_DBG4(("smsatModeSelect6n10CB: satOrgIOContext is NOT NULL\n"));
5296 }
5297 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
5298 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
5299
5300 smScsiRequest = satOrgIOContext->smScsiXchg;
5301 pSense = satOrgIOContext->pSense;
5302 scsiCmnd = satOrgIOContext->pScsiCmnd;
5303 }
5304
5305 smIORequestBody->ioCompleted = agTRUE;
5306 smIORequestBody->ioStarted = agFALSE;
5307
5308 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5309 {
5310 SM_DBG1(("smsatModeSelect6n10CB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
5312 smRoot,
5313 smOrgIORequest,
5314 smIOFailed,
5316 agNULL,
5317 satOrgIOContext->interruptContext
5318 );
5319 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5320
5321 smsatFreeIntIoResource( smRoot,
5322 oneDeviceData,
5323 satIntIo);
5324 return;
5325 }
5326
5327 if (agIOStatus != OSSA_IO_SUCCESS)
5328 {
5329 /* only agsaFisRegDeviceToHost_t is expected */
5330 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5331 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5332 }
5333
5334 if (agIOStatus != OSSA_IO_SUCCESS)
5335 {
5336 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5337 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5338 )
5339 {
5340 /* for debugging */
5341 if( agIOStatus != OSSA_IO_SUCCESS)
5342 {
5343 SM_DBG1(("smsatModeSelect6n10CB: FAILED, NOT IO_SUCCESS!!!\n"));
5344 }
5345 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5346 {
5347 SM_DBG1(("smsatModeSelect6n10CB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
5348 }
5349 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5350 (ataStatus & DF_ATA_STATUS_MASK)
5351 )
5352 {
5353 SM_DBG1(("smsatModeSelect6n10CB: FAILED, FAILED, error status!!!\n"));
5354 }
5355
5356 /* Process abort case */
5357 if (agIOStatus == OSSA_IO_ABORTED)
5358 {
5359 smsatProcessAbort(smRoot,
5360 smOrgIORequest,
5361 satOrgIOContext
5362 );
5363
5364 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5365
5366 smsatFreeIntIoResource( smRoot,
5367 oneDeviceData,
5368 satIntIo);
5369 return;
5370 }
5371
5372 /* for debugging */
5373 if (hostToDevFis->h.command == SAT_SET_FEATURES)
5374 {
5375 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
5376 {
5377 SM_DBG1(("smsatModeSelect6n10CB: 1 SAT_SET_FEATURES failed, feature 0x%x!!!\n", hostToDevFis->h.features));
5378 }
5379 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
5380 {
5381 SM_DBG1(("smsatModeSelect6n10CB: 2 SAT_SET_FEATURES failed, feature 0x%x!!!\n", hostToDevFis->h.features));
5382 }
5383 else
5384 {
5385 SM_DBG1(("smsatModeSelect6n10CB: error unknown command 0x%x feature 0x%x!!!\n", hostToDevFis->h.command, hostToDevFis->h.features));
5386 }
5387 }
5388 else if (hostToDevFis->h.command == SAT_SMART)
5389 {
5390 if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS))
5391 {
5392 SM_DBG1(("smsatModeSelect6n10CB: SAT_SMART_ENABLE/DISABLE_OPERATIONS failed, feature 0x%x!!!\n", hostToDevFis->h.features));
5393 }
5394 else
5395 {
5396 SM_DBG1(("smsatModeSelect6n10CB: error unknown command 0x%x feature 0x%x!!!\n", hostToDevFis->h.command, hostToDevFis->h.features));
5397 }
5398 }
5399 else
5400 {
5401 SM_DBG1(("smsatModeSelect6n10CB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
5402 }
5403
5404
5405 smsatSetSensePayload( pSense,
5407 0,
5409 satOrgIOContext);
5410
5411 tdsmIOCompletedCB( smRoot,
5412 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5415 satOrgIOContext->pSmSenseData,
5416 satOrgIOContext->interruptContext );
5417
5418
5419 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5420
5421 smsatFreeIntIoResource( smRoot,
5422 oneDeviceData,
5423 satIntIo);
5424 return;
5425 } /* error checking */
5426 }
5427
5428
5429 /* prcessing the success case */
5430
5431
5432 if (hostToDevFis->h.command == SAT_SET_FEATURES)
5433 {
5434 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
5435 {
5436 SM_DBG5(("smsatModeSelect6n10CB: 1 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
5437 if (hostToDevFis->h.features == 0x02)
5438 {
5439 /* enable write cache */
5440 oneDeviceData->satWriteCacheEnabled = agTRUE;
5441 }
5442 else
5443 {
5444 /* disable write cache */
5445 oneDeviceData->satWriteCacheEnabled = agFALSE;
5446 }
5447
5448 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5449
5450 smsatFreeIntIoResource( smRoot,
5451 oneDeviceData,
5452 satIntIo);
5453
5454 satNewIntIo = smsatAllocIntIoResource( smRoot,
5455 smOrgIORequest,
5456 oneDeviceData,
5457 0,
5458 satNewIntIo);
5459 if (satNewIntIo == agNULL)
5460 {
5461 smsatSetSensePayload( pSense,
5463 0,
5465 satOrgIOContext);
5466
5467 tdsmIOCompletedCB( smRoot,
5468 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5471 satOrgIOContext->pSmSenseData,
5472 satOrgIOContext->interruptContext );
5473 SM_DBG1(("smsatModeSelect6n10CB: momory allocation fails!!!\n"));
5474 return;
5475 } /* end memory allocation */
5476
5477 satNewIOContext = smsatPrepareNewIO(
5478 satNewIntIo,
5479 smOrgIORequest,
5480 oneDeviceData,
5481 scsiCmnd,
5482 satOrgIOContext
5483 );
5484 /* sends either ATA SET FEATURES based on DRA bit */
5485 status = smsatModeSelect6n10_1( smRoot,
5486 &satNewIntIo->satIntSmIORequest,
5487 satNewIOContext->psmDeviceHandle,
5488 smScsiRequest, /* orginal from OS layer */
5489 satNewIOContext
5490 );
5491
5492 if (status != SM_RC_SUCCESS)
5493 {
5494 /* sending ATA command fails */
5495 smsatFreeIntIoResource( smRoot,
5496 oneDeviceData,
5497 satNewIntIo);
5498 smsatSetSensePayload( pSense,
5500 0,
5502 satOrgIOContext);
5503
5504 tdsmIOCompletedCB( smRoot,
5505 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5508 satOrgIOContext->pSmSenseData,
5509 satOrgIOContext->interruptContext );
5510 SM_DBG1(("smsatModeSelect6n10CB: calling satModeSelect6_1 fails!!!\n"));
5511 return;
5512 } /* end send fails */
5513 return;
5514 }
5515 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
5516 {
5517 SM_DBG5(("smsatModeSelect6n10CB: 2 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
5518
5519 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5520
5521 smsatFreeIntIoResource( smRoot,
5522 oneDeviceData,
5523 satIntIo);
5524
5525 /* return stat_good */
5526 tdsmIOCompletedCB( smRoot,
5527 smOrgIORequest,
5530 agNULL,
5531 satOrgIOContext->interruptContext );
5532 return;
5533 }
5534 else
5535 {
5536 SM_DBG1(("smsatModeSelect6n10CB: error unknown command success 0x%x feature 0x%x!!!\n", hostToDevFis->h.command, hostToDevFis->h.features));
5537
5538 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5539
5540 smsatFreeIntIoResource( smRoot,
5541 oneDeviceData,
5542 satIntIo);
5543 smsatSetSensePayload( pSense,
5545 0,
5547 satOrgIOContext);
5548
5549 tdsmIOCompletedCB( smRoot,
5550 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5553 satOrgIOContext->pSmSenseData,
5554 satOrgIOContext->interruptContext );
5555 return;
5556 }
5557 }
5558 else if (hostToDevFis->h.command == SAT_SMART )
5559 {
5560 if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS))
5561 {
5562 SM_DBG5(("smsatModeSelect6n10CB: SAT_SMART_ENABLE/DISABLE_OPERATIONS success, feature 0x%x\n", hostToDevFis->h.features));
5563
5564 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5565
5566 smsatFreeIntIoResource( smRoot,
5567 oneDeviceData,
5568 satIntIo);
5569 /* return stat_good */
5570 tdsmIOCompletedCB( smRoot,
5571 smOrgIORequest,
5574 agNULL,
5575 satOrgIOContext->interruptContext );
5576 return;
5577 }
5578 else
5579 {
5580 SM_DBG1(("smsatModeSelect6n10CB: error unknown command failed 0x%x feature 0x%x!!!\n", hostToDevFis->h.command, hostToDevFis->h.features));
5581
5582 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5583
5584 smsatFreeIntIoResource( smRoot,
5585 oneDeviceData,
5586 satIntIo);
5587 smsatSetSensePayload( pSense,
5589 0,
5591 satOrgIOContext);
5592
5593 tdsmIOCompletedCB( smRoot,
5594 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5597 satOrgIOContext->pSmSenseData,
5598 satOrgIOContext->interruptContext );
5599 return;
5600 }
5601 }
5602
5603 else
5604 {
5605 SM_DBG1(("smsatModeSelect6n10CB: error default case command success 0x%x!!!\n", hostToDevFis->h.command));
5606
5607 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5608
5609 smsatFreeIntIoResource( smRoot,
5610 oneDeviceData,
5611 satIntIo);
5612
5613 smsatSetSensePayload( pSense,
5615 0,
5617 satOrgIOContext);
5618
5619 tdsmIOCompletedCB( smRoot,
5620 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5623 satOrgIOContext->pSmSenseData,
5624 satOrgIOContext->interruptContext );
5625 return;
5626 }
5627
5628 return;
5629
5630}
5631
5632osGLOBAL void
5634 agsaRoot_t *agRoot,
5635 agsaIORequest_t *agIORequest,
5636 bit32 agIOStatus,
5637 agsaFisHeader_t *agFirstDword,
5638 bit32 agIOInfoLen,
5639 agsaFrameHandle_t agFrameHandle,
5640 void *ioContext
5641 )
5642{
5643 /*
5644 In the process of SynchronizeCache10 and SynchronizeCache16
5645 Process SAT_FLUSH_CACHE_EXT
5646 Process SAT_FLUSH_CACHE
5647 */
5648
5649
5650 smRoot_t *smRoot = agNULL;
5651 smIntRoot_t *smIntRoot = agNULL;
5652 smIntContext_t *smAllShared = agNULL;
5653 smIORequestBody_t *smIORequestBody;
5654 smIORequestBody_t *smOrgIORequestBody;
5655 smSatIOContext_t *satIOContext;
5656 smSatIOContext_t *satOrgIOContext;
5657 smSatInternalIo_t *satIntIo;
5658 smDeviceData_t *oneDeviceData;
5659
5660 smScsiRspSense_t *pSense;
5661 smIniScsiCmnd_t *scsiCmnd;
5662 smIORequest_t *smOrgIORequest;
5663
5664 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5665 bit32 ataStatus = 0;
5666 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5667
5668 SM_DBG2(("smsatSynchronizeCache10n16CB: start\n"));
5669 SM_DBG5(("smsatSynchronizeCache10n16CB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5670
5671 /* internally generate smIOContext */
5672 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
5673 satIOContext = (smSatIOContext_t *) ioContext;
5674 satIntIo = satIOContext->satIntIoContext;
5675 oneDeviceData = satIOContext->pSatDevData;
5676 hostToDevFis = satIOContext->pFis;
5677 smRoot = oneDeviceData->smRoot;
5678 smIntRoot = (smIntRoot_t *)smRoot->smData;
5679 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
5680
5681 /* SPC: Self-Test Result Log page */
5682 if (satIntIo == agNULL)
5683 {
5684 SM_DBG4(("smsatSynchronizeCache10n16CB: External smSatInternalIo_t satIntIoContext\n"));
5685 satOrgIOContext = satIOContext;
5686 smOrgIORequest = smIORequestBody->smIORequest;
5687 pSense = satIOContext->pSense;
5688 scsiCmnd = satIOContext->pScsiCmnd;
5689 }
5690 else
5691 {
5692 SM_DBG4(("smsatSynchronizeCache10n16CB: Internal smSatInternalIo_t satIntIoContext\n"));
5693 satOrgIOContext = satIOContext->satOrgIOContext;
5694 if (satOrgIOContext == agNULL)
5695 {
5696 SM_DBG4(("smsatSynchronizeCache10n16CB: satOrgIOContext is NULL, wrong\n"));
5697 return;
5698 }
5699 else
5700 {
5701 SM_DBG4(("smsatSynchronizeCache10n16CB: satOrgIOContext is NOT NULL\n"));
5702 }
5703 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
5704 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
5705
5706 pSense = satOrgIOContext->pSense;
5707 scsiCmnd = satOrgIOContext->pScsiCmnd;
5708 }
5709
5710 smIORequestBody->ioCompleted = agTRUE;
5711 smIORequestBody->ioStarted = agFALSE;
5712
5713 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5714 {
5715 SM_DBG1(("smsatSynchronizeCache10n16CB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
5716
5718 smRoot,
5719 smOrgIORequest,
5720 smIOFailed,
5722 agNULL,
5723 satOrgIOContext->interruptContext
5724 );
5725 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5726
5727 smsatFreeIntIoResource( smRoot,
5728 oneDeviceData,
5729 satIntIo);
5730 return;
5731 }
5732
5733 if( agIOStatus != OSSA_IO_SUCCESS)
5734 {
5735 /* only agsaFisRegDeviceToHost_t is expected */
5736 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5737 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5738 }
5739
5740 if( agIOStatus != OSSA_IO_SUCCESS)
5741 {
5742 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5743 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5744 )
5745 {
5746 /* for debugging */
5747 if( agIOStatus != OSSA_IO_SUCCESS)
5748 {
5749 SM_DBG1(("smsatSynchronizeCache10n16CB: FAILED, NOT IO_SUCCESS!!!\n"));
5750 }
5751 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5752 {
5753 SM_DBG1(("smsatSynchronizeCache10n16CB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
5754 }
5755 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5756 (ataStatus & DF_ATA_STATUS_MASK)
5757 )
5758 {
5759 SM_DBG1(("smsatSynchronizeCache10n16CB: FAILED, FAILED, error status!!!\n"));
5760 }
5761
5762
5763 /* Process abort case */
5764 if (agIOStatus == OSSA_IO_ABORTED)
5765 {
5766 smsatProcessAbort(smRoot,
5767 smOrgIORequest,
5768 satOrgIOContext
5769 );
5770
5771 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5772
5773 smsatFreeIntIoResource( smRoot,
5774 oneDeviceData,
5775 satIntIo);
5776 return;
5777 }
5778
5779 switch (hostToDevFis->h.command)
5780 {
5781 case SAT_FLUSH_CACHE:
5782 SM_DBG1(("smsatSynchronizeCache10n16CB: SAT_FLUSH_CACHE failed!!!\n"));
5783 /* checking IMMED bit */
5784 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
5785 {
5788 0,
5790 satOrgIOContext);
5791 }
5792 else
5793 {
5796 0,
5798 satOrgIOContext);
5799 }
5800
5801
5802 tdsmIOCompletedCB( smRoot,
5803 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5806 satOrgIOContext->pSmSenseData,
5807 satOrgIOContext->interruptContext );
5808
5809 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5810
5811 smsatFreeIntIoResource( smRoot,
5812 oneDeviceData,
5813 satIntIo);
5814 return;
5815 break;
5817 SM_DBG1(("smsatSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT failed!!!\n"));
5818 /* checking IMMED bit */
5819 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
5820 {
5823 0,
5825 satOrgIOContext);
5826 }
5827 else
5828 {
5831 0,
5833 satOrgIOContext);
5834 }
5835
5836
5837 tdsmIOCompletedCB( smRoot,
5838 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5841 satOrgIOContext->pSmSenseData,
5842 satOrgIOContext->interruptContext );
5843
5844 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5845
5846 smsatFreeIntIoResource( smRoot,
5847 oneDeviceData,
5848 satIntIo);
5849 return;
5850 break;
5851 default:
5852 SM_DBG1(("smsatSynchronizeCache10n16CB: error unknown command 0x%x!!!\n", hostToDevFis->h.command));
5853 smsatSetSensePayload( pSense,
5855 0,
5857 satOrgIOContext);
5858
5859
5860 tdsmIOCompletedCB( smRoot,
5861 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5864 satOrgIOContext->pSmSenseData,
5865 satOrgIOContext->interruptContext );
5866
5867 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5868
5869 smsatFreeIntIoResource( smRoot,
5870 oneDeviceData,
5871 satIntIo);
5872 return;
5873 break;
5874 }
5875
5876 return;
5877 } /* end of error checking */
5878 }
5879
5880 /* prcessing the success case */
5881 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
5882
5883 smsatFreeIntIoResource( smRoot,
5884 oneDeviceData,
5885 satIntIo);
5886
5887
5888 switch (hostToDevFis->h.command)
5889 {
5890 case SAT_FLUSH_CACHE:
5891 SM_DBG5(("smsatSynchronizeCache10n16CB: SAT_FLUSH_CACHE success\n"));
5892
5893 /* checking IMMED bit */
5894 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
5895 {
5896 tdsmIOCompletedCB( smRoot,
5897 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5900 agNULL,
5901 satOrgIOContext->interruptContext );
5902 return;
5903 }
5904
5905
5906 break;
5908 SM_DBG5(("smsatSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT success\n"));
5909
5910 /* checking IMMED bit */
5911 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
5912 {
5913 tdsmIOCompletedCB( smRoot,
5914 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5917 agNULL,
5918 satOrgIOContext->interruptContext );
5919 return;
5920 }
5921
5922 break;
5923 default:
5924 SM_DBG5(("smsatSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
5925 smsatSetSensePayload( pSense,
5927 0,
5929 satOrgIOContext);
5930
5931
5932 tdsmIOCompletedCB( smRoot,
5933 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
5936 satOrgIOContext->pSmSenseData,
5937 satOrgIOContext->interruptContext );
5938
5939 return;
5940 break;
5941 }
5942
5943 return;
5944}
5945
5946//qqqqqqqq
5947osGLOBAL void
5949 agsaRoot_t *agRoot,
5950 agsaIORequest_t *agIORequest,
5951 bit32 agIOStatus,
5952 agsaFisHeader_t *agFirstDword,
5953 bit32 agIOInfoLen,
5954 void *agParam,
5955 void *ioContext
5956 )
5957{
5958 /*
5959 In the process of WriteAndVerify10
5960 Process SAT_WRITE_DMA_FUA_EXT
5961 Process SAT_WRITE_DMA_EXT
5962 Process SAT_WRITE_SECTORS_EXT
5963 Process SAT_WRITE_FPDMA_QUEUED
5964 Process SAT_READ_VERIFY_SECTORS
5965 Process SAT_READ_VERIFY_SECTORS_EXT
5966 chained command
5967 */
5968
5969
5970 smRoot_t *smRoot = agNULL;
5971 smIntRoot_t *smIntRoot = agNULL;
5972 smIntContext_t *smAllShared = agNULL;
5973 smIORequestBody_t *smIORequestBody;
5974 smIORequestBody_t *smOrgIORequestBody;
5975 smSatIOContext_t *satIOContext;
5976 smSatIOContext_t *satOrgIOContext;
5977 smSatIOContext_t *satNewIOContext;
5978 smSatInternalIo_t *satIntIo;
5979 smSatInternalIo_t *satNewIntIo = agNULL;
5980// satDeviceData_t *satDevData;
5981 smDeviceData_t *oneDeviceData;
5982
5983 smScsiRspSense_t *pSense;
5984 smIniScsiCmnd_t *scsiCmnd;
5985 smIORequest_t *smOrgIORequest;
5986
5987 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5988 bit32 ataStatus = 0;
5989 bit32 status;
5990 smScsiInitiatorRequest_t *smScsiRequest; /* smScsiXchg */
5991 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5992 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
5993
5994 /* internally generate smIOContext */
5995 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
5996 satIOContext = (smSatIOContext_t *) ioContext;
5997 satIntIo = satIOContext->satIntIoContext;
5998 oneDeviceData = satIOContext->pSatDevData;
5999 hostToDevFis = satIOContext->pFis;
6000 smRoot = oneDeviceData->smRoot;
6001 smIntRoot = (smIntRoot_t *)smRoot->smData;
6002 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
6003
6004 /* SPC: Self-Test Result Log page */
6005 smScsiRequest = satIOContext->smScsiXchg;
6006
6007 SM_DBG2(("smsatNonChainedWriteNVerifyCB: start\n"));
6008 SM_DBG5(("smsatNonChainedWriteNVerifyCB: start agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6009
6010
6011 if (satIntIo == agNULL)
6012 {
6013 SM_DBG4(("smsatNonChainedWriteNVerifyCB: External smSatInternalIo_t satIntIoContext\n"));
6014 satOrgIOContext = satIOContext;
6015 smOrgIORequest = smIORequestBody->smIORequest;
6016 pSense = satOrgIOContext->pSense;
6017 scsiCmnd = satOrgIOContext->pScsiCmnd;
6018 }
6019 else
6020 {
6021 SM_DBG4(("smsatNonChainedWriteNVerifyCB: Internal smSatInternalIo_t satIntIoContext\n"));
6022 satOrgIOContext = satIOContext->satOrgIOContext;
6023 if (satOrgIOContext == agNULL)
6024 {
6025 SM_DBG4(("smsatNonChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
6026 return;
6027 }
6028 else
6029 {
6030 SM_DBG4(("smsatNonChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
6031 }
6032 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
6033 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
6034
6035 pSense = satOrgIOContext->pSense;
6036 scsiCmnd = satOrgIOContext->pScsiCmnd;
6037 }
6038
6039 smIORequestBody->ioCompleted = agTRUE;
6040 smIORequestBody->ioStarted = agFALSE;
6041
6042
6043 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6044 {
6045 SM_DBG1(("smsatNonChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
6046 tdsmIOCompletedCB( smRoot,
6047 smOrgIORequest,
6048 smIOFailed,
6050 agNULL,
6051 satOrgIOContext->interruptContext
6052 );
6053 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6054
6055 smsatFreeIntIoResource( smRoot,
6056 oneDeviceData,
6057 satIntIo);
6058 return;
6059 }
6060
6061
6062 if (agIOStatus != OSSA_IO_SUCCESS)
6063 {
6064 /*
6065 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
6066 */
6067 /* First, assumed to be Reg Device to Host FIS */
6068 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6069 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
6070 }
6071
6072 if (agIOStatus != OSSA_IO_SUCCESS)
6073 {
6074 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
6075 {
6076 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
6077
6078 /* Get ATA Status register */
6079 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */
6080 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */
6081 }
6082 }
6083
6084
6085 if( agIOStatus != OSSA_IO_SUCCESS)
6086 {
6087 /*
6088 checking IO status, FIS type and error status
6089 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
6090 Both have fisType in the same location
6091 */
6092 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
6093 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
6094 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6095 )
6096 {
6097 /* for debugging */
6098 if( agIOStatus != OSSA_IO_SUCCESS)
6099 {
6100 SM_DBG1(("smsatNonChainedWriteNVerifyCB: FAILED, NOT IO_SUCCESS!!!\n"));
6101 }
6102 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6103 {
6104 SM_DBG1(("smsatNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
6105 }
6106 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
6107 {
6108 SM_DBG1(("smsatNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
6109 }
6110 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6111 (ataStatus & DF_ATA_STATUS_MASK)
6112 )
6113 {
6114 SM_DBG1(("smsatNonChainedWriteNVerifyCB: FAILED, FAILED, error status!!!\n"));
6115 }
6116
6117
6118 /* Process abort case */
6119 if (agIOStatus == OSSA_IO_ABORTED)
6120 {
6121 smsatProcessAbort(smRoot,
6122 smOrgIORequest,
6123 satOrgIOContext
6124 );
6125
6126 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6127
6128 smsatFreeIntIoResource( smRoot,
6129 oneDeviceData,
6130 satIntIo);
6131 return;
6132 }
6133
6134 /* for debugging */
6135 switch (hostToDevFis->h.command)
6136 {
6138 SM_DBG1(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT!!!\n"));
6139 break;
6140 case SAT_WRITE_DMA_EXT:
6141 SM_DBG1(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT!!!\n"));
6142 break;
6144 SM_DBG1(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT!!!\n"));
6145 break;
6147 SM_DBG1(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED!!!\n"));
6148 break;
6150 SM_DBG1(("smsatNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS!!!\n"));
6151 break;
6153 SM_DBG1(("smsatNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT!!!\n"));
6154 break;
6155 default:
6156 SM_DBG1(("smsatNonChainedWriteNVerifyCB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
6157 break;
6158 }
6159
6160 smsatSetSensePayload( pSense,
6162 0,
6164 satOrgIOContext);
6165
6166 tdsmIOCompletedCB( smRoot,
6167 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6170 satOrgIOContext->pSmSenseData,
6171 satOrgIOContext->interruptContext );
6172
6173 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6174
6175 smsatFreeIntIoResource( smRoot,
6176 oneDeviceData,
6177 satIntIo);
6178 return;
6179 } /* end error checking */
6180 }
6181
6182 /* process success from this point on */
6183
6184 switch (hostToDevFis->h.command)
6185 {
6187 SM_DBG5(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT success\n"));
6188 break;
6189 case SAT_WRITE_DMA_EXT:
6190 SM_DBG5(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT success\n"));
6191 break;
6193 SM_DBG5(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT succes\n"));
6194
6195 break;
6197 SM_DBG5(("smsatNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED succes\n"));
6198 break;
6200 SM_DBG5(("smsatNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS succes\n"));
6201 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6202
6203 /* free */
6204 smsatFreeIntIoResource( smRoot,
6205 oneDeviceData,
6206 satIntIo);
6207
6208 /* return stat_good */
6209 tdsmIOCompletedCB( smRoot,
6210 smOrgIORequest,
6213 agNULL,
6214 satOrgIOContext->interruptContext );
6215 return;
6216 break;
6218 SM_DBG5(("smsatNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT succes\n"));
6219 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6220
6221 /* free */
6222 smsatFreeIntIoResource( smRoot,
6223 oneDeviceData,
6224 satIntIo);
6225
6226 /* return stat_good */
6227 tdsmIOCompletedCB( smRoot,
6228 smOrgIORequest,
6231 agNULL,
6232 satOrgIOContext->interruptContext );
6233 return;
6234 break;
6235 default:
6236 SM_DBG1(("smsatNonChainedWriteNVerifyCB: error default case command 0x%x success!!!\n", hostToDevFis->h.command));
6237
6238 smsatSetSensePayload( pSense,
6240 0,
6242 satOrgIOContext);
6243
6244 tdsmIOCompletedCB( smRoot,
6245 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6248 satOrgIOContext->pSmSenseData,
6249 satOrgIOContext->interruptContext );
6250
6251 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6252
6253 smsatFreeIntIoResource( smRoot,
6254 oneDeviceData,
6255 satIntIo);
6256 return;
6257 break;
6258 }
6259
6260 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6261
6262 /* free */
6263 smsatFreeIntIoResource( smRoot,
6264 oneDeviceData,
6265 satIntIo);
6266
6267 satNewIntIo = smsatAllocIntIoResource( smRoot,
6268 smOrgIORequest,
6269 oneDeviceData,
6270 0,
6271 satNewIntIo);
6272 if (satNewIntIo == agNULL)
6273 {
6274 smsatSetSensePayload( pSense,
6276 0,
6278 satOrgIOContext);
6279
6280 tdsmIOCompletedCB( smRoot,
6281 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6284 satOrgIOContext->pSmSenseData,
6285 satOrgIOContext->interruptContext );
6286 SM_DBG1(("smsatNonChainedWriteNVerifyCB: momory allocation fails!!!\n"));
6287 return;
6288 } /* end memory allocation */
6289
6290 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
6291 smOrgIORequest,
6292 oneDeviceData,
6293 scsiCmnd,
6294 satOrgIOContext
6295 );
6296
6297 /* sends ATA verify command(READ_VERIFY_SECTORS or READ_VERIFY_SECTORS_EXT) */
6299 &satNewIntIo->satIntSmIORequest,
6300 satNewIOContext->psmDeviceHandle,
6301 smScsiRequest, /* orginal from OS layer */
6302 satNewIOContext
6303 );
6304
6305
6306 if (status != SM_RC_SUCCESS)
6307 {
6308 /* sending ATA command fails */
6309 smsatFreeIntIoResource( smRoot,
6310 oneDeviceData,
6311 satNewIntIo);
6312 smsatSetSensePayload( pSense,
6314 0,
6316 satOrgIOContext);
6317
6318 tdsmIOCompletedCB( smRoot,
6319 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6322 satOrgIOContext->pSmSenseData,
6323 satOrgIOContext->interruptContext );
6324 SM_DBG1(("smsatNonChainedWriteNVerifyCB: calling satWriteAndVerify10_1 fails!!!\n"));
6325 return;
6326 } /* end send fails */
6327
6328 return;
6329
6330}
6331
6332osGLOBAL void
6334 agsaRoot_t *agRoot,
6335 agsaIORequest_t *agIORequest,
6336 bit32 agIOStatus,
6337 agsaFisHeader_t *agFirstDword,
6338 bit32 agIOInfoLen,
6339 void *agParam,
6340 void *ioContext
6341 )
6342{
6343 /*
6344 send write in loop
6345 then, send verify in loop
6346 */
6347
6348 smRoot_t *smRoot = agNULL;
6349 smIntRoot_t *smIntRoot = agNULL;
6350 smIntContext_t *smAllShared = agNULL;
6351// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6352// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6353// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6354// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6355 smIORequestBody_t *smIORequestBody;
6356 smIORequestBody_t *smOrgIORequestBody;
6357 smSatIOContext_t *satIOContext;
6358 smSatIOContext_t *satOrgIOContext;
6359 smSatIOContext_t *satNewIOContext;
6360 smSatInternalIo_t *satIntIo;
6361 smSatInternalIo_t *satNewIntIo = agNULL;
6362// satDeviceData_t *satDevData;
6363 smDeviceData_t *oneDeviceData;
6364
6365 smScsiRspSense_t *pSense;
6366 smIniScsiCmnd_t *scsiCmnd;
6367 smIORequest_t *smOrgIORequest;
6368 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
6369 bit32 ataStatus = 0;
6370 bit32 dataLength;
6372 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
6373
6374 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
6375 satIOContext = (smSatIOContext_t *) ioContext;
6376 satIntIo = satIOContext->satIntIoContext;
6377 oneDeviceData = satIOContext->pSatDevData;
6378 hostToDevFis = satIOContext->pFis;
6379 smRoot = oneDeviceData->smRoot;
6380 smIntRoot = (smIntRoot_t *)smRoot->smData;
6381 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
6382 SM_DBG2(("smsatChainedWriteNVerifyCB: start\n"));
6383 SM_DBG6(("smsatChainedWriteNVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
6384 agIORequest, agIOStatus, agIOInfoLen));
6385
6386 if (satIntIo == agNULL)
6387 {
6388 SM_DBG5(("smsatChainedWriteNVerifyCB: External smSatInternalIo_t satIntIoContext\n"));
6389 satOrgIOContext = satIOContext;
6390 smOrgIORequest = smIORequestBody->smIORequest;
6391 pSense = satIOContext->pSense;
6392 scsiCmnd = satIOContext->pScsiCmnd;
6393 }
6394 else
6395 {
6396 SM_DBG5(("smsatChainedWriteNVerifyCB: Internal smSatInternalIo_t satIntIoContext\n"));
6397 satOrgIOContext = satIOContext->satOrgIOContext;
6398 if (satOrgIOContext == agNULL)
6399 {
6400 SM_DBG5(("smsatChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
6401 return;
6402 }
6403 else
6404 {
6405 SM_DBG5(("smsatChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
6406 }
6407 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
6408 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
6409
6410 pSense = satOrgIOContext->pSense;
6411 scsiCmnd = satOrgIOContext->pScsiCmnd;
6412 }
6413
6414 smIORequestBody->ioCompleted = agTRUE;
6415 smIORequestBody->ioStarted = agFALSE;
6416
6417 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6418 {
6419 SM_DBG1(("smsatChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
6420 smsatSetSensePayload( pSense,
6422 0,
6424 satOrgIOContext);
6425
6426 tdsmIOCompletedCB( smRoot,
6427 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6430 satOrgIOContext->pSmSenseData,
6431 satOrgIOContext->interruptContext );
6432
6433 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6434
6435 smsatFreeIntIoResource( smRoot,
6436 oneDeviceData,
6437 satIntIo);
6438 return;
6439 }
6440
6441 /*
6442 checking IO status, FIS type and error status
6443 */
6444 if (agIOStatus != OSSA_IO_SUCCESS)
6445 {
6446 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
6447 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
6448 first, assumed to be Reg Device to Host FIS
6449 This is OK to just find fis type
6450 */
6451 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6452 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
6453 /* for debugging */
6454 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
6455 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
6456 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
6457 )
6458 {
6459 SM_DBG1(("smsatChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x!!!\n", statDevToHostFisHeader->fisType));
6460 }
6461
6462 /* for debugging */
6463 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6464 (ataStatus & DF_ATA_STATUS_MASK)
6465 )
6466 {
6467 SM_DBG1(("smsatChainedWriteNVerifyCB: FAILED, error status and command 0x%x!!!\n", hostToDevFis->h.command));
6468 }
6469
6470 /* the function below handles abort case */
6472 agIORequest,
6473 agIOStatus,
6474 agFirstDword,
6475 agIOInfoLen,
6476 agParam,
6477 satIOContext);
6478
6479 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6480 smsatFreeIntIoResource( smRoot,
6481 oneDeviceData,
6482 satIntIo);
6483 return;
6484 } /* end of error */
6485
6486 /* process the success case */
6487 switch (hostToDevFis->h.command)
6488 {
6489 case SAT_WRITE_DMA: /* fall through */
6490 case SAT_WRITE_SECTORS:/* fall through */
6491// case SAT_WRITE_DMA_FUA_EXT: /* fall through */
6492 case SAT_WRITE_DMA_EXT: /* fall through */
6493 case SAT_WRITE_SECTORS_EXT: /* fall through */
6495
6496 SM_DBG5(("smsatChainedWriteNVerifyCB: WRITE success case\n"));
6497
6498 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6499
6500 /* done with internally genereated SAT_SMART_RETURN_STATUS */
6501 smsatFreeIntIoResource( smRoot,
6502 oneDeviceData,
6503 satIntIo);
6504 /* let's loop till TL */
6505
6506 /* lba = lba + tl
6507 loopnum--;
6508 if (loopnum == 0) done
6509 */
6510 (satOrgIOContext->LoopNum)--;
6511
6512 if (satOrgIOContext->superIOFlag)
6513 {
6514 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
6515 }
6516 else
6517 {
6518 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
6519 }
6520
6521 satNewIntIo = smsatAllocIntIoResource( smRoot,
6522 smOrgIORequest,
6523 oneDeviceData,
6524 dataLength,
6525 satNewIntIo);
6526 if (satNewIntIo == agNULL)
6527 {
6528 tdsmIOCompletedCB( smRoot,
6529 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6530 smIOFailed,
6532 agNULL,
6533 satOrgIOContext->interruptContext );
6534
6535 SM_DBG1(("smsatChainedWriteNVerifyCB: momory allocation fails!!!\n"));
6536 return;
6537 } /* end of memory allocation failure */
6538
6539 /*
6540 * Need to initialize all the fields within satIOContext
6541 */
6542
6543 satNewIOContext = smsatPrepareNewIO(
6544 satNewIntIo,
6545 smOrgIORequest,
6546 oneDeviceData,
6547 scsiCmnd,
6548 satOrgIOContext
6549 );
6550
6551 if (satOrgIOContext->LoopNum == 0)
6552 {
6553 /*
6554 done with write
6555 start with verify
6556 */
6557 satOrgIOContext->LoopNum = satOrgIOContext->LoopNum2;
6559 &satNewIntIo->satIntSmIORequest,
6560 satNewIOContext->psmDeviceHandle,
6561 &satNewIntIo->satIntSmScsiXchg,
6562 satNewIOContext);
6563 }
6564 else
6565 {
6567 &satNewIntIo->satIntSmIORequest,
6568 satNewIOContext->psmDeviceHandle,
6569 &satNewIntIo->satIntSmScsiXchg,
6570 satNewIOContext);
6571 }
6572
6573 if (status != SM_RC_SUCCESS)
6574 {
6575 smsatFreeIntIoResource( smRoot,
6576 oneDeviceData,
6577 satNewIntIo);
6578 tdsmIOCompletedCB( smRoot,
6579 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6580 smIOFailed,
6582 agNULL,
6583 satOrgIOContext->interruptContext );
6584 SM_DBG1(("smsatChainedWriteNVerifyCB: calling satChainedWriteNVerify_Write fails!!!\n"));
6585 return;
6586 }
6587
6588 break;
6589
6590 case SAT_READ_VERIFY_SECTORS: /* fall through */
6592 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6593
6594 /* done with internally genereated SAT_SMART_RETURN_STATUS */
6595 smsatFreeIntIoResource( smRoot,
6596 oneDeviceData,
6597 satIntIo);
6598 /* let's loop till TL */
6599
6600 /* lba = lba + tl
6601 loopnum--;
6602 if (loopnum == 0) done
6603 */
6604 (satOrgIOContext->LoopNum)--;
6605 if (satOrgIOContext->LoopNum == 0)
6606 {
6607 /*
6608 done with write and verify
6609 */
6610 tdsmIOCompletedCB( smRoot,
6611 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6614 agNULL,
6615 satOrgIOContext->interruptContext );
6616 return;
6617 }
6618
6619 if (satOrgIOContext->superIOFlag)
6620 {
6621 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
6622 }
6623 else
6624 {
6625 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->smScsiXchg)->scsiCmnd.expDataLength;
6626 }
6627
6628 satNewIntIo = smsatAllocIntIoResource( smRoot,
6629 smOrgIORequest,
6630 oneDeviceData,
6631 dataLength,
6632 satNewIntIo);
6633 if (satNewIntIo == agNULL)
6634 {
6635 tdsmIOCompletedCB( smRoot,
6636 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6637 smIOFailed,
6639 agNULL,
6640 satOrgIOContext->interruptContext );
6641
6642 SM_DBG1(("smsatChainedWriteNVerifyCB: momory allocation fails!!!\n"));
6643 return;
6644 } /* end of memory allocation failure */
6645
6646 /*
6647 * Need to initialize all the fields within satIOContext
6648 */
6649
6650 satNewIOContext = smsatPrepareNewIO(
6651 satNewIntIo,
6652 smOrgIORequest,
6653 oneDeviceData,
6654 scsiCmnd,
6655 satOrgIOContext
6656 );
6658 &satNewIntIo->satIntSmIORequest,
6659 satNewIOContext->psmDeviceHandle,
6660 &satNewIntIo->satIntSmScsiXchg,
6661 satNewIOContext);
6662
6663 if (status != SM_RC_SUCCESS)
6664 {
6665 smsatFreeIntIoResource( smRoot,
6666 oneDeviceData,
6667 satNewIntIo);
6668 tdsmIOCompletedCB( smRoot,
6669 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6670 smIOFailed,
6672 agNULL,
6673 satOrgIOContext->interruptContext );
6674 SM_DBG1(("smsatChainedWriteNVerifyCB: calling satChainedWriteNVerify_Verify fails!!!\n"));
6675 return;
6676 }
6677
6678 break;
6679
6680 default:
6681 SM_DBG1(("smsatChainedWriteNVerifyCB: success but default case command 0x%x!!!\n",hostToDevFis->h.command));
6682 tdsmIOCompletedCB( smRoot,
6683 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6684 smIOFailed,
6686 agNULL,
6687 satOrgIOContext->interruptContext );
6688
6689 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6690
6691 smsatFreeIntIoResource( smRoot,
6692 oneDeviceData,
6693 satIntIo);
6694
6695 break;
6696 }
6697
6698
6699 return;
6700}
6701
6702osGLOBAL void
6704 agsaRoot_t *agRoot,
6705 agsaIORequest_t *agIORequest,
6706 bit32 agIOStatus,
6707 agsaFisHeader_t *agFirstDword,
6708 bit32 agIOInfoLen,
6709 agsaFrameHandle_t agFrameHandle,
6710 void *ioContext
6711 )
6712{
6713// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6714// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6715// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6716// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6717 smRoot_t *smRoot = agNULL;
6718 smIntRoot_t *smIntRoot = agNULL;
6719 smIntContext_t *smAllShared = agNULL;
6720 smIORequestBody_t *smIORequestBody;
6721 smIORequestBody_t *smOrgIORequestBody;
6722 smSatIOContext_t *satIOContext;
6723 smSatIOContext_t *satOrgIOContext;
6724 smSatInternalIo_t *satIntIo;
6725// satDeviceData_t *satDevData;
6726 smDeviceData_t *oneDeviceData;
6727
6728 smScsiRspSense_t *pSense;
6729 smIORequest_t *smOrgIORequest;
6730
6731 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
6732 smScsiInitiatorRequest_t *smOrgScsiRequest; /* tiScsiXchg */
6733 bit8 *pMediaSerialNumber;
6734 bit8 MediaSerialNumber[ZERO_MEDIA_SERIAL_NUMBER_LENGTH] = {0};
6735 smIniScsiCmnd_t *scsiCmnd;
6736 bit32 allocationLen = 0;
6737
6738 SM_DBG2(("smsatReadMediaSerialNumberCB: start\n"));
6739 SM_DBG4(("smsatReadMediaSerialNumberCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6740
6741 /* internally generate tiIOContext */
6742 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
6743 satIOContext = (smSatIOContext_t *) ioContext;
6744 satIntIo = satIOContext->satIntIoContext;
6745 oneDeviceData = satIOContext->pSatDevData;
6746 hostToDevFis = satIOContext->pFis;
6747 smRoot = oneDeviceData->smRoot;
6748 smIntRoot = (smIntRoot_t *)smRoot->smData;
6749 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
6750
6751 if (satIntIo == agNULL)
6752 {
6753 SM_DBG4(("smsatReadMediaSerialNumberCB: External smSatInternalIo_t satIntIoContext\n"));
6754 satOrgIOContext = satIOContext;
6755 smOrgIORequest = smIORequestBody->smIORequest;
6756 pSense = satOrgIOContext->pSense;
6757 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
6758 /* SCSI command response payload to OS layer */
6759 pMediaSerialNumber = (bit8 *) smOrgScsiRequest->sglVirtualAddr;
6760 /* ATA command response payload */
6761 scsiCmnd = satOrgIOContext->pScsiCmnd;
6762 }
6763 else
6764 {
6765 SM_DBG4(("smsatReadMediaSerialNumberCB: Internal smSatInternalIo_t satIntIoContext\n"));
6766 satOrgIOContext = satIOContext->satOrgIOContext;
6767 if (satOrgIOContext == agNULL)
6768 {
6769 SM_DBG4(("smsatReadMediaSerialNumberCB: satOrgIOContext is NULL, wrong\n"));
6770 return;
6771 }
6772 else
6773 {
6774 SM_DBG4(("smsatReadMediaSerialNumberCB: satOrgIOContext is NOT NULL\n"));
6775 }
6776 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
6777 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
6778
6779 pSense = satOrgIOContext->pSense;
6780 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
6781 /* SCSI command response payload to OS layer */
6782 pMediaSerialNumber = (bit8 *) smOrgScsiRequest->sglVirtualAddr;
6783 scsiCmnd = satOrgIOContext->pScsiCmnd;
6784 }
6785
6786 smIORequestBody->ioCompleted = agTRUE;
6787 smIORequestBody->ioStarted = agFALSE;
6788
6789 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6790 {
6791 SM_DBG1(("smsatReadMediaSerialNumberCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
6793 smRoot,
6794 smOrgIORequest,
6795 smIOFailed,
6797 agNULL,
6798 satOrgIOContext->interruptContext
6799 );
6800 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6801
6802 smsatFreeIntIoResource( smRoot,
6803 oneDeviceData,
6804 satIntIo);
6805 return;
6806 }
6807
6808 if( agIOStatus != OSSA_IO_SUCCESS)
6809 {
6810 /* Process abort case */
6811 if (agIOStatus == OSSA_IO_ABORTED)
6812 {
6813 smsatProcessAbort(smRoot,
6814 smOrgIORequest,
6815 satOrgIOContext
6816 );
6817
6818 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6819
6820 smsatFreeIntIoResource( smRoot,
6821 oneDeviceData,
6822 satIntIo);
6823 return;
6824 }
6825 smsatSetSensePayload( pSense,
6827 0,
6829 satOrgIOContext);
6830
6831 tdsmIOCompletedCB( smRoot,
6832 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6835 satOrgIOContext->pSmSenseData,
6836 satOrgIOContext->interruptContext );
6837
6838 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6839
6840 smsatFreeIntIoResource( smRoot,
6841 oneDeviceData,
6842 satIntIo);
6843 return;
6844 }
6845
6846 /* process success case */
6847 allocationLen = (scsiCmnd->cdb[6] << (8*3)) + (scsiCmnd->cdb[7] << (8*2))
6848 + (scsiCmnd->cdb[8] << 8) + scsiCmnd->cdb[9];
6849 allocationLen = MIN(allocationLen, scsiCmnd->expDataLength);
6850 SM_DBG5(("smsatReadMediaSerialNumberCB: allocationLen in CDB %d 0x%x\n", allocationLen,allocationLen));
6851
6852 if (hostToDevFis->h.command == SAT_READ_SECTORS ||
6853 hostToDevFis->h.command == SAT_READ_SECTORS_EXT
6854 )
6855 {
6856 MediaSerialNumber[0] = 0;
6857 MediaSerialNumber[1] = 0;
6858 MediaSerialNumber[2] = 0;
6859 MediaSerialNumber[3] = 4;
6860 MediaSerialNumber[4] = 0;
6861 MediaSerialNumber[5] = 0;
6862 MediaSerialNumber[6] = 0;
6863 MediaSerialNumber[7] = 0;
6864
6865 sm_memcpy(pMediaSerialNumber, MediaSerialNumber, MIN(allocationLen, ZERO_MEDIA_SERIAL_NUMBER_LENGTH));
6866 if (ZERO_MEDIA_SERIAL_NUMBER_LENGTH < allocationLen)
6867 {
6868 SM_DBG1(("smsatReadMediaSerialNumberCB: 1st underrun allocationLen %d len %d !!!\n", allocationLen, ZERO_MEDIA_SERIAL_NUMBER_LENGTH));
6869
6870 /* underrun */
6871 tdsmIOCompletedCB( smRoot,
6872 smOrgIORequest, /* == satIntIo->satOrgSmIORequest */
6874 allocationLen - ZERO_MEDIA_SERIAL_NUMBER_LENGTH,
6875 agNULL,
6876 satOrgIOContext->interruptContext );
6877
6878 }
6879 else
6880 {
6881 tdsmIOCompletedCB( smRoot,
6882 smOrgIORequest,
6885 agNULL,
6886 satOrgIOContext->interruptContext);
6887 }
6888 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6889
6890 smsatFreeIntIoResource( smRoot,
6891 oneDeviceData,
6892 satIntIo);
6893 return;
6894 }
6895 else
6896 {
6897 SM_DBG1(("smsatReadMediaSerialNumberCB: error unknown command success 0x%x!!!\n", hostToDevFis->h.command));
6898 smsatSetSensePayload( pSense,
6900 0,
6902 satOrgIOContext);
6903
6904 tdsmIOCompletedCB( smRoot,
6905 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
6908 satOrgIOContext->pSmSenseData,
6909 satOrgIOContext->interruptContext );
6910
6911 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6912
6913 smsatFreeIntIoResource( smRoot,
6914 oneDeviceData,
6915 satIntIo);
6916
6917 return;
6918 }
6919 return;
6920}
6921
6922osGLOBAL void
6924 agsaRoot_t *agRoot,
6925 agsaIORequest_t *agIORequest,
6926 bit32 agIOStatus,
6927 agsaFisHeader_t *agFirstDword,
6928 bit32 agIOInfoLen,
6929 agsaFrameHandle_t agFrameHandle,
6930 void *ioContext
6931 )
6932{
6933 smRoot_t *smRoot = agNULL;
6934 smIntRoot_t *smIntRoot = agNULL;
6935 smIntContext_t *smAllShared = agNULL;
6936 smIORequestBody_t *smIORequestBody;
6937 smIORequestBody_t *smOrgIORequestBody;
6938 smSatIOContext_t *satIOContext;
6939 smSatIOContext_t *satOrgIOContext;
6940 smSatInternalIo_t *satIntIo;
6941 smDeviceData_t *oneDeviceData;
6942 smScsiRspSense_t *pSense;
6943 smIORequest_t *smOrgIORequest;
6944 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
6945
6946
6947 SM_DBG2(("smsatReadBufferCB: start\n"));
6948 SM_DBG4(("smsatReadBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6949 /* internally generate tiIOContext */
6950 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
6951 satIOContext = (smSatIOContext_t *) ioContext;
6952 satIntIo = satIOContext->satIntIoContext;
6953 oneDeviceData = satIOContext->pSatDevData;
6954 hostToDevFis = satIOContext->pFis;
6955 smRoot = oneDeviceData->smRoot;
6956 smIntRoot = (smIntRoot_t *)smRoot->smData;
6957 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
6958 if (satIntIo == agNULL)
6959 {
6960 SM_DBG4(("smsatReadBufferCB: External smSatInternalIo_t satIntIoContext\n"));
6961 satOrgIOContext = satIOContext;
6962 smOrgIORequest = smIORequestBody->smIORequest;
6963 pSense = satOrgIOContext->pSense;
6964 }
6965 else
6966 {
6967 SM_DBG4(("smsatReadBufferCB: Internal smSatInternalIo_t satIntIoContext\n"));
6968 satOrgIOContext = satIOContext->satOrgIOContext;
6969 if (satOrgIOContext == agNULL)
6970 {
6971 SM_DBG4(("smsatReadBufferCB: satOrgIOContext is NULL, wrong\n"));
6972 return;
6973 }
6974 else
6975 {
6976 SM_DBG4(("smsatReadBufferCB: satOrgIOContext is NOT NULL\n"));
6977 }
6978 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
6979 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
6980 pSense = satOrgIOContext->pSense;
6981 }
6982 smIORequestBody->ioCompleted = agTRUE;
6983 smIORequestBody->ioStarted = agFALSE;
6984 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6985 {
6986 SM_DBG1(("smsatReadBufferCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
6988 smRoot,
6989 smOrgIORequest,
6990 smIOFailed,
6992 agNULL,
6993 satOrgIOContext->interruptContext
6994 );
6995 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
6996
6997 smsatFreeIntIoResource( smRoot,
6998 oneDeviceData,
6999 satIntIo);
7000 return;
7001 }
7002
7003 if( agIOStatus != OSSA_IO_SUCCESS)
7004 {
7005 /* Process abort case */
7006 if (agIOStatus == OSSA_IO_ABORTED)
7007 {
7008 smsatProcessAbort(smRoot,
7009 smOrgIORequest,
7010 satOrgIOContext
7011 );
7012
7013 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7014
7015 smsatFreeIntIoResource( smRoot,
7016 oneDeviceData,
7017 satIntIo);
7018 return;
7019 }
7020 smsatSetSensePayload( pSense,
7022 0,
7024 satOrgIOContext);
7025
7026 tdsmIOCompletedCB( smRoot,
7027 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7030 satOrgIOContext->pSmSenseData,
7031 satOrgIOContext->interruptContext );
7032
7033 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7034
7035 smsatFreeIntIoResource( smRoot,
7036 oneDeviceData,
7037 satIntIo);
7038 return;
7039 }
7040
7041 /* process success case */
7042 if (hostToDevFis->h.command == SAT_READ_BUFFER )
7043 {
7044
7045 tdsmIOCompletedCB( smRoot,
7046 smOrgIORequest,
7049 agNULL,
7050 satOrgIOContext->interruptContext);
7051 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7052
7053 smsatFreeIntIoResource( smRoot,
7054 oneDeviceData,
7055 satIntIo);
7056 return;
7057 }
7058 else
7059 {
7060 SM_DBG1(("smsatReadBufferCB: error unknown command success 0x%x!!!\n", hostToDevFis->h.command));
7061 smsatSetSensePayload( pSense,
7063 0,
7065 satOrgIOContext);
7066
7067 tdsmIOCompletedCB( smRoot,
7068 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7071 satOrgIOContext->pSmSenseData,
7072 satOrgIOContext->interruptContext );
7073
7074 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7075
7076 smsatFreeIntIoResource( smRoot,
7077 oneDeviceData,
7078 satIntIo);
7079
7080 return;
7081 }
7082
7083 return;
7084}
7085
7086osGLOBAL void
7088 agsaRoot_t *agRoot,
7089 agsaIORequest_t *agIORequest,
7090 bit32 agIOStatus,
7091 agsaFisHeader_t *agFirstDword,
7092 bit32 agIOInfoLen,
7093 agsaFrameHandle_t agFrameHandle,
7094 void *ioContext
7095 )
7096{
7097 smRoot_t *smRoot = agNULL;
7098 smIntRoot_t *smIntRoot = agNULL;
7099 smIntContext_t *smAllShared = agNULL;
7100 smIORequestBody_t *smIORequestBody;
7101 smIORequestBody_t *smOrgIORequestBody;
7102 smSatIOContext_t *satIOContext;
7103 smSatIOContext_t *satOrgIOContext;
7104 smSatInternalIo_t *satIntIo;
7105 smDeviceData_t *oneDeviceData;
7106 smScsiRspSense_t *pSense;
7107 smIORequest_t *smOrgIORequest;
7108 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
7109
7110
7111 SM_DBG2(("smsatWriteBufferCB: start\n"));
7112 SM_DBG4(("smsatWriteBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7113 /* internally generate tiIOContext */
7114 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
7115 satIOContext = (smSatIOContext_t *) ioContext;
7116 satIntIo = satIOContext->satIntIoContext;
7117 oneDeviceData = satIOContext->pSatDevData;
7118 hostToDevFis = satIOContext->pFis;
7119 smRoot = oneDeviceData->smRoot;
7120 smIntRoot = (smIntRoot_t *)smRoot->smData;
7121 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
7122 if (satIntIo == agNULL)
7123 {
7124 SM_DBG4(("smsatWriteBufferCB: External smSatInternalIo_t satIntIoContext\n"));
7125 satOrgIOContext = satIOContext;
7126 smOrgIORequest = smIORequestBody->smIORequest;
7127 pSense = satOrgIOContext->pSense;
7128 /* SCSI command response payload to OS layer */
7129// pMediaSerialNumber = (bit8 *) s,OrgScsiRequest->sglVirtualAddr;
7130 }
7131 else
7132 {
7133 SM_DBG4(("smsatWriteBufferCB: Internal smSatInternalIo_t satIntIoContext\n"));
7134 satOrgIOContext = satIOContext->satOrgIOContext;
7135 if (satOrgIOContext == agNULL)
7136 {
7137 SM_DBG4(("smsatWriteBufferCB: satOrgIOContext is NULL, wrong\n"));
7138 return;
7139 }
7140 else
7141 {
7142 SM_DBG4(("smsatWriteBufferCB: satOrgIOContext is NOT NULL\n"));
7143 }
7144 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
7145 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
7146 pSense = satOrgIOContext->pSense;
7147 }
7148 smIORequestBody->ioCompleted = agTRUE;
7149 smIORequestBody->ioStarted = agFALSE;
7150 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7151 {
7152 SM_DBG1(("smsatWriteBufferCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
7154 smRoot,
7155 smOrgIORequest,
7156 smIOFailed,
7158 agNULL,
7159 satOrgIOContext->interruptContext
7160 );
7161 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7162
7163 smsatFreeIntIoResource( smRoot,
7164 oneDeviceData,
7165 satIntIo);
7166 return;
7167 }
7168 if( agIOStatus != OSSA_IO_SUCCESS)
7169 {
7170 /* Process abort case */
7171 if (agIOStatus == OSSA_IO_ABORTED)
7172 {
7173 smsatProcessAbort(smRoot,
7174 smOrgIORequest,
7175 satOrgIOContext
7176 );
7177 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7178
7179 smsatFreeIntIoResource( smRoot,
7180 oneDeviceData,
7181 satIntIo);
7182 return;
7183 }
7184 smsatSetSensePayload( pSense,
7186 0,
7188 satOrgIOContext);
7189 tdsmIOCompletedCB( smRoot,
7190 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7193 satOrgIOContext->pSmSenseData,
7194 satOrgIOContext->interruptContext );
7195 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7196
7197 smsatFreeIntIoResource( smRoot,
7198 oneDeviceData,
7199 satIntIo);
7200 return;
7201 }
7202 /* process success case */
7203 if (hostToDevFis->h.command == SAT_WRITE_BUFFER )
7204 {
7205 tdsmIOCompletedCB( smRoot,
7206 smOrgIORequest,
7209 agNULL,
7210 satOrgIOContext->interruptContext);
7211 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7212
7213 smsatFreeIntIoResource( smRoot,
7214 oneDeviceData,
7215 satIntIo);
7216 return;
7217 }
7218 else
7219 {
7220 SM_DBG1(("smsatWriteBufferCB: error unknown command success 0x%x!!!\n", hostToDevFis->h.command));
7221 smsatSetSensePayload( pSense,
7223 0,
7225 satOrgIOContext);
7226 tdsmIOCompletedCB( smRoot,
7227 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7230 satOrgIOContext->pSmSenseData,
7231 satOrgIOContext->interruptContext );
7232 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7233 smsatFreeIntIoResource( smRoot,
7234 oneDeviceData,
7235 satIntIo);
7236 return;
7237 }
7238 return;
7239}
7240
7241osGLOBAL void
7243 agsaRoot_t *agRoot,
7244 agsaIORequest_t *agIORequest,
7245 bit32 agIOStatus,
7246 agsaFisHeader_t *agFirstDword,
7247 bit32 agIOInfoLen,
7248 agsaFrameHandle_t agFrameHandle,
7249 void *ioContext
7250 )
7251{
7252 smRoot_t *smRoot = agNULL;
7253 smIntRoot_t *smIntRoot = agNULL;
7254 smIntContext_t *smAllShared = agNULL;
7255 smIORequestBody_t *smIORequestBody;
7256 smIORequestBody_t *smOrgIORequestBody;
7257 smSatIOContext_t *satIOContext;
7258 smSatIOContext_t *satOrgIOContext;
7259 smSatIOContext_t *satNewIOContext;
7260 smSatInternalIo_t *satIntIo;
7261 smSatInternalIo_t *satNewIntIo = agNULL;
7262 smDeviceData_t *oneDeviceData;
7263 smScsiRspSense_t *pSense;
7264 smIniScsiCmnd_t *scsiCmnd;
7265 smIORequest_t *smOrgIORequest;
7266 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
7267 bit32 ataStatus = 0;
7268 bit32 status;
7269 smScsiInitiatorRequest_t *smScsiRequest; /* smScsiXchg */
7270 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
7271
7272 SM_DBG2(("smsatReassignBlocksCB: start\n"));
7273 SM_DBG5(("smsatReassignBlocksCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7274
7275 /* internally generate tiIOContext */
7276 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
7277 satIOContext = (smSatIOContext_t *) ioContext;
7278 satIntIo = satIOContext->satIntIoContext;
7279 oneDeviceData = satIOContext->pSatDevData;
7280 hostToDevFis = satIOContext->pFis;
7281 smRoot = oneDeviceData->smRoot;
7282 smIntRoot = (smIntRoot_t *)smRoot->smData;
7283 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
7284 if (satIntIo == agNULL)
7285 {
7286 SM_DBG4(("smsatReassignBlocksCB: External smSatInternalIo_t satIntIoContext\n"));
7287 satOrgIOContext = satIOContext;
7288 smOrgIORequest = smIORequestBody->smIORequest;
7289 smScsiRequest = satOrgIOContext->smScsiXchg;
7290 pSense = satOrgIOContext->pSense;
7291 scsiCmnd = satOrgIOContext->pScsiCmnd;
7292 }
7293 else
7294 {
7295 SM_DBG4(("smsatReassignBlocksCB: Internal smSatInternalIo_t satIntIoContext\n"));
7296 satOrgIOContext = satIOContext->satOrgIOContext;
7297 if (satOrgIOContext == agNULL)
7298 {
7299 SM_DBG4(("smsatReassignBlocksCB: satOrgIOContext is NULL, Wrong\n"));
7300 return;
7301 }
7302 else
7303 {
7304 SM_DBG4(("smsatReassignBlocksCB: satOrgIOContext is NOT NULL, Wrong\n"));
7305 }
7306 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
7307 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
7308 smScsiRequest = satOrgIOContext->smScsiXchg;
7309 pSense = satOrgIOContext->pSense;
7310 scsiCmnd = satOrgIOContext->pScsiCmnd;
7311 }
7312
7313 smIORequestBody->ioCompleted = agTRUE;
7314 smIORequestBody->ioStarted = agFALSE;
7315
7316 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7317 {
7318 SM_DBG1(("smsatReassignBlocksCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
7320 smRoot,
7321 smOrgIORequest,
7322 smIOFailed,
7324 agNULL,
7325 satOrgIOContext->interruptContext
7326 );
7327 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7328
7329 smsatFreeIntIoResource( smRoot,
7330 oneDeviceData,
7331 satIntIo);
7332 return;
7333 }
7334 if (agIOStatus != OSSA_IO_SUCCESS)
7335 {
7336 /* only agsaFisRegDeviceToHost_t is expected */
7337 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7338 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
7339 }
7340 if (agIOStatus != OSSA_IO_SUCCESS)
7341 {
7342 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
7343 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
7344 )
7345 {
7346 /* for debugging */
7347 if( agIOStatus != OSSA_IO_SUCCESS)
7348 {
7349 SM_DBG1(("smsatReassignBlocksCB FAILED, NOT IO_SUCCESS!!!\n"));
7350 }
7351 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7352 {
7353 SM_DBG1(("smsatReassignBlocksCB FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
7354 }
7355 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7356 (ataStatus & DF_ATA_STATUS_MASK)
7357 )
7358 {
7359 SM_DBG1(("smsatReassignBlocksCB FAILED, FAILED, error status!!!\n"));
7360 }
7361
7362 /* Process abort case */
7363 if (agIOStatus == OSSA_IO_ABORTED)
7364 {
7365 smsatProcessAbort(smRoot,
7366 smOrgIORequest,
7367 satOrgIOContext
7368 );
7369 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7370
7371 smsatFreeIntIoResource( smRoot,
7372 oneDeviceData,
7373 satIntIo);
7374 return;
7375 }
7376 /* for debugging */
7377 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
7378 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT
7379 )
7380 {
7381 SM_DBG1(("smsatReassignBlocksCB SAT_READ_VERIFY_SECTORS(_EXT) failed!!!\n"));
7382 /* Verify failed; send Write with same LBA */
7383 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7384
7385 smsatFreeIntIoResource( smRoot,
7386 oneDeviceData,
7387 satIntIo);
7388
7389 satNewIntIo = smsatAllocIntIoResource( smRoot,
7390 smOrgIORequest,
7391 oneDeviceData,
7392 512, /* writing 1 sector */
7393 satNewIntIo);
7394 if (satNewIntIo == agNULL)
7395 {
7396 smsatSetSensePayload( pSense,
7398 0,
7400 satOrgIOContext);
7401 tdsmIOCompletedCB( smRoot,
7402 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7405 satOrgIOContext->pSmSenseData,
7406 satOrgIOContext->interruptContext );
7407 SM_DBG1(("smsatReassignBlocksCB: momory allocation fails!!!\n"));
7408 return;
7409 } /* end memory allocation */
7410 satNewIOContext = smsatPrepareNewIO(
7411 satNewIntIo,
7412 smOrgIORequest,
7413 oneDeviceData,
7414 scsiCmnd,
7415 satOrgIOContext
7416 );
7417 /* send Write with same LBA */
7419 smRoot,
7420 &satNewIntIo->satIntSmIORequest,
7421 satNewIOContext->psmDeviceHandle,
7422 &satNewIntIo->satIntSmScsiXchg,
7423 satNewIOContext,
7424 satOrgIOContext->LBA
7425 );
7426
7427 if (status != SM_RC_SUCCESS)
7428 {
7429 /* sending ATA command fails */
7430 smsatFreeIntIoResource( smRoot,
7431 oneDeviceData,
7432 satNewIntIo);
7433 smsatSetSensePayload( pSense,
7435 0,
7437 satOrgIOContext);
7438
7439 tdsmIOCompletedCB( smRoot,
7440 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7443 satOrgIOContext->pSmSenseData,
7444 satOrgIOContext->interruptContext );
7445 SM_DBG1(("smsatReassignBlocksCB calling fail 1!!!\n"));
7446 return;
7447 } /* end send fails */
7448
7449 return;
7450 }
7451 else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
7452 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
7453 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
7454 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
7455 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
7456 )
7457 {
7458 SM_DBG1(("smsatReassignBlocksCB SAT_WRITE failed!!!\n"));
7459 /* fall through */
7460 }
7461 else
7462 {
7463 SM_DBG1(("smsatReassignBlocksCB error default case unexpected command 0x%x!!!\n", hostToDevFis->h.command));
7464 }
7465
7466
7467 smsatSetSensePayload( pSense,
7469 0,
7471 satOrgIOContext);
7472
7473 tdsmIOCompletedCB( smRoot,
7474 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7477 satOrgIOContext->pSmSenseData,
7478 satOrgIOContext->interruptContext );
7479
7480
7481 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7482
7483 smsatFreeIntIoResource( smRoot,
7484 oneDeviceData,
7485 satIntIo);
7486 return;
7487 } /* error checking */
7488 }
7489
7490
7491 /* prcessing the success case */
7492 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
7493 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT ||
7494 hostToDevFis->h.command == SAT_WRITE_DMA ||
7495 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
7496 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
7497 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
7498 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
7499 )
7500 {
7501 /* next LBA; verify */
7502 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7503
7504 smsatFreeIntIoResource( smRoot,
7505 oneDeviceData,
7506 satIntIo);
7507
7508 if (satOrgIOContext->ParmIndex >= satOrgIOContext->ParmLen)
7509 {
7510 SM_DBG5(("smsatReassignBlocksCB: GOOD status\n"));
7511 /* return stat_good */
7512 tdsmIOCompletedCB( smRoot,
7513 smOrgIORequest,
7516 agNULL,
7517 satOrgIOContext->interruptContext );
7518 return;
7519 }
7520 else
7521 {
7522 SM_DBG5(("smsatReassignBlocksCB: processing next LBA\n"));
7523 satNewIntIo = smsatAllocIntIoResource( smRoot,
7524 smOrgIORequest,
7525 oneDeviceData,
7526 0,
7527 satNewIntIo);
7528 if (satNewIntIo == agNULL)
7529 {
7530 smsatSetSensePayload( pSense,
7532 0,
7534 satOrgIOContext);
7535
7536 tdsmIOCompletedCB( smRoot,
7537 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7540 satOrgIOContext->pSmSenseData,
7541 satOrgIOContext->interruptContext );
7542 SM_DBG1(("smsatReassignBlocksCB: momory allocation fails!!!\n"));
7543 return;
7544 } /* end memory allocation */
7545
7546 satNewIOContext = smsatPrepareNewIO(
7547 satNewIntIo,
7548 smOrgIORequest,
7549 oneDeviceData,
7550 scsiCmnd,
7551 satOrgIOContext
7552 );
7553
7554 /* send Verify with the next LBA */
7556 smRoot,
7557 &satNewIntIo->satIntSmIORequest,
7558 satNewIOContext->psmDeviceHandle,
7559 smScsiRequest, /* orginal from OS layer */
7560 satNewIOContext,
7561 satOrgIOContext
7562 );
7563
7564 if (status != SM_RC_SUCCESS)
7565 {
7566 /* sending ATA command fails */
7567 smsatFreeIntIoResource( smRoot,
7568 oneDeviceData,
7569 satNewIntIo);
7570 smsatSetSensePayload( pSense,
7572 0,
7574 satOrgIOContext);
7575
7576 tdsmIOCompletedCB( smRoot,
7577 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7580 satOrgIOContext->pSmSenseData,
7581 satOrgIOContext->interruptContext );
7582 SM_DBG1(("smsatReassignBlocksCB calling satModeSelect6_1 fails!!!\n"));
7583 return;
7584 } /* end send fails */
7585 } /* else */
7586 return;
7587
7588 }
7589 else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
7590 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
7591 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
7592 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
7593 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
7594 )
7595 {
7596 /* next LBA; verify */
7597 }
7598 else
7599 {
7600 SM_DBG1(("smsatReassignBlocksCB error unknown command success 0x%x !!!\n", hostToDevFis->h.command));
7601
7602 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
7603
7604 smsatFreeIntIoResource( smRoot,
7605 oneDeviceData,
7606 satIntIo);
7607 smsatSetSensePayload( pSense,
7609 0,
7611 satOrgIOContext);
7612
7613 tdsmIOCompletedCB( smRoot,
7614 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
7617 satOrgIOContext->pSmSenseData,
7618 satOrgIOContext->interruptContext );
7619 return;
7620 }
7621 return;
7622}
7623
7624
7627 smRoot_t *smRoot,
7628 smIntContext_t *smAllShared,
7629 smSatIOContext_t *satIOContext
7630 )
7631{
7632#ifdef CCFLAG_OPTIMIZE_SAT_LOCK
7633 bit32 volatile satPendingNCQIO = 0;
7634 bit32 volatile satPendingNONNCQIO = 0;
7635 bit32 volatile satPendingIO = 0;
7636#endif /* CCFLAG_OPTIMIZE_SAT_LOCK */
7637 smDeviceData_t *oneDeviceData = satIOContext->pSatDevData;
7638 smSatInternalIo_t *satIntIo = satIOContext->satIntIoContext;
7639 smSatIOContext_t *satOrgIOContext = satIOContext->satOrgIOContext;
7640#ifdef TD_DEBUG_ENABLE
7641 smIORequestBody_t *smIORequestBody = agNULL;
7642 smIORequestBody = (smIORequestBody_t *)satIOContext->smRequestBody;
7643#endif
7644
7645 SM_DBG3(("smsatDecrementPendingIO: start\n"));
7646
7647#ifdef CCFLAG_OPTIMIZE_SAT_LOCK
7648 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
7649 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
7650 {
7651 tdsmInterlockedDecrement(smRoot,&oneDeviceData->satPendingNCQIO);
7652 }
7653 else
7654 {
7655 tdsmInterlockedDecrement(smRoot,&oneDeviceData->satPendingNONNCQIO);
7656 }
7657 tdsmInterlockedDecrement(smRoot,&oneDeviceData->satPendingIO);
7658 /* temp */
7659 tdsmInterlockedExchange(smRoot, &satPendingNCQIO, oneDeviceData->satPendingNCQIO);
7660 tdsmInterlockedExchange(smRoot, &satPendingNONNCQIO, oneDeviceData->satPendingNONNCQIO);
7661 tdsmInterlockedExchange(smRoot, &satPendingIO, oneDeviceData->satPendingIO);
7662 if (satPendingNCQIO == -1)
7663 {
7664 SM_DBG1(("smsatDecrementPendingIO: satPendingNCQIO adjustment!!!\n"));
7665 oneDeviceData->satPendingNCQIO = 0;
7666 }
7667 if (satPendingNONNCQIO == -1)
7668 {
7669 SM_DBG1(("smsatDecrementPendingIO: satPendingNONNCQIO adjustment!!!\n"));
7670 oneDeviceData->satPendingNONNCQIO = 0;
7671 }
7672 if (satPendingIO == -1)
7673 {
7674 SM_DBG1(("smsatDecrementPendingIO: satPendingIO adjustment!!!\n"));
7675 oneDeviceData->satPendingIO = 0;
7676 }
7677
7678#else
7679
7680 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
7681 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
7682 {
7684 oneDeviceData->satPendingNCQIO--;
7685 oneDeviceData->satPendingIO--;
7686 SMLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
7687 /* temp */
7688 if (oneDeviceData->satPendingNCQIO == -1)
7689 {
7690 SM_DBG1(("smsatDecrementPendingIO: satPendingNCQIO adjustment!!!\n"));
7691 oneDeviceData->satPendingNCQIO = 0;
7692 }
7693 if (oneDeviceData->satPendingIO == -1)
7694 {
7695 SM_DBG1(("smsatDecrementPendingIO: satPendingIO adjustment!!!\n"));
7696 oneDeviceData->satPendingIO = 0;
7697 }
7699 }
7700 else
7701 {
7703 oneDeviceData->satPendingNONNCQIO--;
7704 oneDeviceData->satPendingIO--;
7705 SMLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
7706 /* temp */
7707 if (oneDeviceData->satPendingNONNCQIO == -1)
7708 {
7709 SM_DBG1(("smsatDecrementPendingIO: satPendingNONNCQIO adjustment!!!\n"));
7710 oneDeviceData->satPendingNONNCQIO = 0;
7711 }
7712 if (oneDeviceData->satPendingIO == -1)
7713 {
7714 SM_DBG1(("smsatDecrementPendingIO: satPendingIO adjustment!!!\n"));
7715 oneDeviceData->satPendingIO = 0;
7716 }
7718 }
7719
7720#endif /* CCFLAG_OPTIMIZE_SAT_LOCK */
7721
7722 if (satIntIo == agNULL)
7723 {
7724 SM_DBG3(("smsatDecrementPendingIO: external command!!!\n"));
7725 /*smEnqueueIO(smRoot, satIOContext);*/
7726 }
7727 else
7728 {
7729 SM_DBG3(("smsatDecrementPendingIO: internal command!!!\n"));
7730 if (satOrgIOContext == agNULL)
7731 {
7732 /* No smEnqueueIO since only alloc used */
7733 SM_DBG3(("smsatDecrementPendingIO: internal only command!!!, ID %d!!!\n", smIORequestBody->id));
7734 return;
7735 }
7736 else
7737 {
7738 /* smDequeueIO used */
7739 /*smEnqueueIO(smRoot, satOrgIOContext);*/
7740 }
7741 }
7742
7743 return;
7744}
7745
7746
7747osGLOBAL void
7749 agsaRoot_t *agRoot,
7750 agsaIORequest_t *agIORequest,
7751 bit32 agIOStatus,
7752 agsaFisHeader_t *agFirstDword,
7753 bit32 agIOInfoLen,
7754 void *agParam,
7755 smSatIOContext_t *satIOContext
7756 )
7757{
7758
7759 smRoot_t *smRoot = agNULL;
7760// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7761// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7762 bit32 interruptContext;
7763 smIORequestBody_t *smIORequestBody;
7764// satDeviceData_t *pSatDevData;
7765 smDeviceHandle_t *smDeviceHandle;
7766 smDeviceData_t *oneDeviceData = agNULL;
7767 agsaDevHandle_t *agDevHandle = agNULL;
7768
7769 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
7770 oneDeviceData = satIOContext->pSatDevData;
7771 if (oneDeviceData == agNULL)
7772 {
7773 SM_DBG1(("smsatProcessAbnormalCompletion: oneDeviceData is NULL\n"));
7774 return;
7775 }
7776 smDeviceHandle = satIOContext->psmDeviceHandle;
7777 smRoot = oneDeviceData->smRoot;
7778 interruptContext = satIOContext->interruptContext;
7779
7780 SM_DBG5(("smsatProcessAbnormalCompletion: start\n"));
7781
7782 /* Get into the detail */
7783 switch(agIOStatus)
7784 {
7785 case OSSA_IO_SUCCESS:
7786 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS agIOInfoLen 0x%x calling smsatIOCompleted!!!\n", agIOInfoLen));
7787 /*
7788 * At this point agIOInfoLen should be non-zero and there is valid FIS
7789 * to read. Pass this info to the SAT layer in order to do the ATA status
7790 * to SCSI status translation.
7791 */
7792 smsatIOCompleted( smRoot,
7793 smIORequestBody->smIORequest,
7794 agFirstDword,
7795 agIOInfoLen,
7796 agParam,
7797 satIOContext,
7798 interruptContext);
7799 break;
7800
7801
7802 case OSSA_IO_ABORTED:
7803 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED!!!\n"));
7804
7805 tdsmIOCompletedCB( smRoot,
7806 smIORequestBody->smIORequest,
7807 smIOFailed,
7809 agNULL,
7810 interruptContext);
7811
7812#ifdef REMOVED
7813 if ( oneDeviceData->satTmTaskTag != agNULL )
7814 {
7815 SM_DBG1(("smsatProcessAbnormalCompletion: TM callback!!!\n"));
7816 if (smDeviceHandle == agNULL)
7817 {
7818 SM_DBG1(("smsatProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
7819 }
7820 /* TM completed */
7821 tdsmEventCB( smRoot,
7822 smDeviceHandle,
7824 smTMOK,
7825 oneDeviceData->satTmTaskTag);
7826 /*
7827 * Reset flag
7828 */
7829 oneDeviceData->satTmTaskTag = agNULL;
7830 }
7831#endif
7832
7833 /*
7834 * Check if we are in recovery mode and need to update the recovery flag
7835 */
7836 if ((oneDeviceData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
7837 (oneDeviceData->satPendingIO == 0 ))
7838 {
7839 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
7840 SM_DBG1(("smsatProcessAbnormalCompletion: STATE NORMAL!!!\n"));
7841 }
7842
7843 SM_DBG1(("smsatProcessAbnormalCompletion: did %d satDriveState %d!!!\n", oneDeviceData->id, oneDeviceData->satDriveState));
7844 SM_DBG1(("smsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
7845 SM_DBG1(("smsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
7846
7847 break;
7848#ifdef REMOVED
7849 case OSSA_IO_OVERFLOW:
7850 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OVERFLOW!!!\n"));
7851 tdsmIOCompletedCB( smRoot,
7852 smIORequestBody->smIORequest,
7854 agIOInfoLen,
7855 agNULL,
7856 interruptContext);
7857 break;
7858#endif
7859 case OSSA_IO_UNDERFLOW:
7860 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW!!!\n"));
7861 tdsmIOCompletedCB( smRoot,
7862 smIORequestBody->smIORequest,
7864 agIOInfoLen,
7865 agNULL,
7866 interruptContext);
7867 break;
7868
7869
7870 case OSSA_IO_FAILED:
7871 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED!!!\n"));
7872 tdsmIOCompletedCB( smRoot,
7873 smIORequestBody->smIORequest,
7874 smIOFailed,
7876 agNULL,
7877 interruptContext);
7878 break;
7879
7881 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET!!!\n"));
7882 tdsmIOCompletedCB( smRoot,
7883 smIORequestBody->smIORequest,
7884 smIOFailed,
7886 agNULL,
7887 interruptContext);
7888 /*
7889 * Check if we are in recovery mode and need to update the recovery flag
7890 */
7891 if ((oneDeviceData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
7892 (oneDeviceData->satPendingIO == 0 ))
7893 {
7894 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
7895 SM_DBG1(("smsatProcessAbnormalCompletion: STATE NORMAL!!!\n"));
7896 }
7897
7898 SM_DBG1(("smsatProcessAbnormalCompletion: satDriveState %d!!!\n", oneDeviceData->satDriveState));
7899 SM_DBG1(("smsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
7900 SM_DBG1(("smsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
7901
7902 break;
7903
7904#ifdef REMOVED
7905 case OSSA_IO_NOT_VALID:
7906 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NOT_VALID!!!\n"));
7907 tdsmIOCompletedCB( smRoot,
7908 smIORequestBody->smIORequest,
7909 smIOFailed,
7911 agNULL,
7912 interruptContext);
7913 break;
7914#endif
7915
7916 case OSSA_IO_NO_DEVICE:
7917 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE!!!\n"));
7918 tdsmIOCompletedCB( smRoot,
7919 smIORequestBody->smIORequest,
7920 smIOFailed,
7922 agNULL,
7923 interruptContext);
7924 break;
7925
7926#ifdef REMOVED /* removed from spec */
7928 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ILLEGAL_PARAMETER!!!\n"));
7929 tdsmIOCompletedCB( smRoot,
7930 smIORequestBody->smIORequest,
7931 smIOFailed,
7933 agNULL,
7934 interruptContext);
7935 break;
7936
7938 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_LINK_FAILURE!!!\n"));
7939 tdsmIOCompletedCB( smRoot,
7940 smIORequestBody->smIORequest,
7941 smIOFailed,
7943 agNULL,
7944 interruptContext);
7945 break;
7946
7947 case OSSA_IO_PROG_ERROR:
7948 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR!!!\n"));
7949 tdsmIOCompletedCB( smRoot,
7950 smIORequestBody->smIORequest,
7951 smIOFailed,
7953 agNULL,
7954 interruptContext);
7955 break;
7956#endif
7957 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
7958 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
7959 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
7960 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
7961 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
7963 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
7964 case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED: /* fall through */
7965#ifdef REMOVED /* removed from spec */
7966 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
7967#endif
7968 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x!!!\n", agIOStatus));
7969 if (smDeviceHandle == agNULL)
7970 {
7971 SM_DBG1(("smsatProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
7972 tdsmIOCompletedCB( smRoot,
7973 smIORequestBody->smIORequest,
7974 smIOFailed,
7976 agNULL,
7977 interruptContext);
7978 return;
7979 }
7980 if (oneDeviceData == agNULL)
7981 {
7982 SM_DBG1(("smsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL!!!\n"));
7983 }
7984 else
7985 {
7986 SM_DBG1(("smsatProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
7987 }
7988
7989 tdsmIOCompletedCB( smRoot,
7990 smIORequestBody->smIORequest,
7991 smIOFailed,
7993 agNULL,
7994 interruptContext);
7995 break;
7997 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY!!!\n"));
7998 tdsmIOCompletedCB( smRoot,
7999 smIORequestBody->smIORequest,
8000 smIOFailed,
8002 agNULL,
8003 interruptContext);
8004 break;
8005#ifdef REMOVED
8006 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
8007#endif
8008
8009 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
8010 case OSSA_IO_XFER_ERROR_NAK_RECEIVED: /* fall throuth */
8011
8012#ifdef REMOVED
8013 case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT: /* fall throuth */
8014 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
8015#endif
8016 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
8017#ifdef REMOVED
8018 case OSSA_IO_XFER_ERROR_RX_FRAME: /* fall throuth */
8019 case OSSA_IO_XFER_ERROR_CREDIT_TIMEOUT: /* fall throuth */
8020 case OSSA_IO_XFER_ERROR_SATA: /* fall throuth */
8021#endif
8022 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
8023 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
8024 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
8025#ifdef REMOVED
8027 case OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE: /* fall throuth */
8028 case OSSA_IO_XFER_ERROR_DISRUPTED_PHY_DOWN: /* fall throuth */
8029 case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH: /* fall throuth */
8030 case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN: /* fall throuth */
8031#endif
8032 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x!!!\n", agIOStatus));
8033 tdsmIOCompletedCB( smRoot,
8034 smIORequestBody->smIORequest,
8035 smIOFailed,
8037 agNULL,
8038 interruptContext);
8039 break;
8040#ifdef REMOVED
8041 case OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT: /* fall throuth */
8044 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_* 0x%x!!!\n", agIOStatus));
8045 tdsmIOCompletedCB( smRoot,
8046 smIORequestBody->smIORequest,
8047 smIOFailed,
8049 agNULL,
8050 interruptContext);
8051 break;
8053 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_PIO_SETUP_ERROR!!!\n"));
8054 tdsmIOCompletedCB( smRoot,
8055 smIORequestBody->smIORequest,
8056 smIOFailed,
8058 agNULL,
8059 interruptContext);
8060 break;
8061#endif
8063 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR!!!\n"));
8064 if (smDeviceHandle == agNULL)
8065 {
8066 SM_DBG1(("smsatProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
8067 tdsmIOCompletedCB( smRoot,
8068 smIORequestBody->smIORequest,
8069 smIOFailed,
8071 agNULL,
8072 interruptContext);
8073 return;
8074 }
8075 if (oneDeviceData == agNULL)
8076 {
8077 SM_DBG1(("smsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL!!!\n"));
8078 }
8079 else
8080 {
8081 SM_DBG1(("smsatProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
8082 }
8083 tdsmIOCompletedCB( smRoot,
8084 smIORequestBody->smIORequest,
8085 smIOFailed,
8087 agNULL,
8088 interruptContext);
8089 break;
8091 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL!!!\n"));
8092 if (smDeviceHandle == agNULL)
8093 {
8094 SM_DBG1(("smsatProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
8095 tdsmIOCompletedCB( smRoot,
8096 smIORequestBody->smIORequest,
8097 smIOFailed,
8099 agNULL,
8100 interruptContext);
8101 return;
8102 }
8103 if (oneDeviceData == agNULL)
8104 {
8105 SM_DBG1(("smsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL!!!\n"));
8106 }
8107 else
8108 {
8109 SM_DBG1(("smsatProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
8110 agDevHandle = oneDeviceData->agDevHandle;
8111 if (oneDeviceData->valid == agTRUE)
8112 {
8113 saSetDeviceState(agRoot, agNULL, tdsmRotateQnumber(smRoot, smDeviceHandle), agDevHandle, SA_DS_OPERATIONAL);
8114 }
8115 }
8116
8117 tdsmIOCompletedCB( smRoot,
8118 smIORequestBody->smIORequest,
8119 smIOFailed,
8121 agNULL,
8122 interruptContext);
8123 break;
8124
8127 SM_DBG1(("smsatProcessAbnormalCompletion: OSSA_IO_DS_IN_RECOVERY or OSSA_IO_PORT_IN_RESET status %x\n", agIOStatus));
8128 tdsmIOCompletedCB( smRoot,
8129 smIORequestBody->smIORequest,
8130 smIOFailed,
8132 agNULL,
8133 interruptContext);
8134 break;
8135
8141 SM_DBG1(("smsatProcessAbnormalCompletion: SSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_XX status %x\n", agIOStatus));
8142 tdsmIOCompletedCB( smRoot,
8143 smIORequestBody->smIORequest,
8144 smIOFailed,
8146 agNULL,
8147 interruptContext);
8148 break;
8149
8153 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = OSSA_MPI_%x!!!\n", agIOStatus));
8154 tdsmIOCompletedCB( smRoot,
8155 smIORequestBody->smIORequest,
8156 smIOFailed,
8158 agNULL,
8159 interruptContext);
8160 break;
8161
8162 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
8163#ifdef REMOVED
8165#endif
8166 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: /* fall through */
8167 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: /* fall through */
8168 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: /* fall through */
8171
8172 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x!!!\n", agIOStatus));
8174 agIORequest,
8175 agIOStatus,
8176 agIOInfoLen,
8177 agParam,
8178 0,
8179 interruptContext);
8180 break;
8181
8182#ifdef REMOVED
8183 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
8184 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
8186 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x!!!\n", agIOStatus));
8187 smsatDifHandler(smRoot,
8188 agIORequest,
8189 agIOStatus,
8190 agIOInfoLen,
8191 agParam,
8192 0,
8193 interruptContext);
8194 break;
8195#endif
8196
8197 default:
8198 SM_DBG1(("smsatProcessAbnormalCompletion: agIOStatus = unknown 0x%x!!!\n", agIOStatus));
8199 if (oneDeviceData != agNULL)
8200 {
8201 SM_DBG1(("smsatProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
8202 }
8203 else
8204 {
8205 SM_DBG1(("smsatProcessAbnormalCompletion: oneDeviceData is NULL!!!\n"));
8206 }
8207
8208 tdsmIOCompletedCB( smRoot,
8209 smIORequestBody->smIORequest,
8210 smIOFailed,
8212 agNULL,
8213 interruptContext);
8214 break;
8215
8216 } /* switch */
8217
8218 return;
8219}
8220
8221osGLOBAL void
8223 agsaRoot_t *agRoot,
8224 agsaIORequest_t *agIORequest,
8225 bit32 agIOStatus,
8226 agsaFisHeader_t *agFirstDword,
8227 bit32 agIOInfoLen,
8228 void *agParam,
8229 smSatIOContext_t *satIOContext
8230 )
8231{
8232 smRoot_t *smRoot = agNULL;
8233// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8234// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8235// bit32 interruptContext = osData->IntContext;
8236 bit32 interruptContext;
8237 smIORequestBody_t *smIORequestBody;
8238// satDeviceData_t *pSatDevData;
8239 smDeviceHandle_t *smDeviceHandle;
8240 smDeviceData_t *oneDeviceData = agNULL;
8241 agsaDevHandle_t *agDevHandle = agNULL;
8242
8243 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
8244 oneDeviceData = satIOContext->pSatDevData;
8245 if (oneDeviceData == agNULL)
8246 {
8247 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: oneDeviceData is NULL\n"));
8248 return;
8249 }
8250 smDeviceHandle = satIOContext->psmDeviceHandle;
8251 smRoot = oneDeviceData->smRoot;
8252 interruptContext = satIOContext->interruptContext;
8253
8254 SM_DBG5(("smsatDelayedProcessAbnormalCompletion: start\n"));
8255
8256 /* Get into the detail */
8257 switch(agIOStatus)
8258 {
8259 case OSSA_IO_SUCCESS:
8260 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS calling smsatIOCompleted!!!\n"));
8261 /* do nothing */
8262 break;
8263
8264
8265 case OSSA_IO_ABORTED:
8266 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED!!!\n"));
8267
8268 tdsmIOCompletedCB( smRoot,
8269 smIORequestBody->smIORequest,
8270 smIOFailed,
8272 agNULL,
8273 interruptContext);
8274
8275 if ( oneDeviceData->satTmTaskTag != agNULL )
8276 {
8277 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: TM callback!!!\n"));
8278 if (smDeviceHandle == agNULL)
8279 {
8280 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
8281 }
8282 else
8283 {
8284 /* TM completed */
8285 tdsmEventCB( smRoot,
8286 smDeviceHandle,
8288 smTMOK,
8289 oneDeviceData->satTmTaskTag);
8290 /*
8291 * Reset flag
8292 */
8293 oneDeviceData->satTmTaskTag = agNULL;
8294 }
8295 }
8296
8297 /*
8298 * Check if we are in recovery mode and need to update the recovery flag
8299 */
8300 if ((oneDeviceData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
8301 (oneDeviceData->satPendingIO == 0 ))
8302 {
8303 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
8304 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: STATE NORMAL.!!!\n"));
8305 }
8306
8307 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: satDriveState %d!!!\n", oneDeviceData->satDriveState));
8308 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
8309 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
8310
8311 break;
8312#ifdef REMOVED
8313 case OSSA_IO_OVERFLOW:
8314 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OVERFLOW!!!\n"));
8315 tdsmIOCompletedCB( smRoot,
8316 smIORequestBody->smIORequest,
8318 agIOInfoLen,
8319 agNULL,
8320 interruptContext);
8321 break;
8322#endif
8323 case OSSA_IO_UNDERFLOW:
8324 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW!!!\n"));
8325 tdsmIOCompletedCB( smRoot,
8326 smIORequestBody->smIORequest,
8328 agIOInfoLen,
8329 agNULL,
8330 interruptContext);
8331 break;
8332
8333
8334 case OSSA_IO_FAILED:
8335 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED!!!\n"));
8336 tdsmIOCompletedCB( smRoot,
8337 smIORequestBody->smIORequest,
8338 smIOFailed,
8340 agNULL,
8341 interruptContext);
8342 break;
8343
8345 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET!!!\n"));
8346 tdsmIOCompletedCB( smRoot,
8347 smIORequestBody->smIORequest,
8348 smIOFailed,
8350 agNULL,
8351 interruptContext);
8352 /*
8353 * Check if we are in recovery mode and need to update the recovery flag
8354 */
8355 if ((oneDeviceData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
8356 (oneDeviceData->satPendingIO == 0 ))
8357 {
8358 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
8359 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: STATE NORMAL.!!!\n"));
8360 }
8361
8362 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: satDriveState %d!!!\n", oneDeviceData->satDriveState));
8363 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
8364 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
8365
8366 break;
8367
8368#ifdef REMOVED
8369 case OSSA_IO_NOT_VALID:
8370 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NOT_VALID!!!\n"));
8371 tdsmIOCompletedCB( smRoot,
8372 smIORequestBody->smIORequest,
8373 smIOFailed,
8375 agNULL,
8376 interruptContext);
8377 break;
8378#endif
8379
8380 case OSSA_IO_NO_DEVICE:
8381 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE!!!\n"));
8382 tdsmIOCompletedCB( smRoot,
8383 smIORequestBody->smIORequest,
8384 smIOFailed,
8386 agNULL,
8387 interruptContext);
8388 break;
8389
8390#ifdef REMOVED /* removed from spec */
8392 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ILLEGAL_PARAMETER!!!\n"));
8393 tdsmIOCompletedCB( smRoot,
8394 smIORequestBody->smIORequest,
8395 smIOFailed,
8397 agNULL,
8398 interruptContext);
8399 break;
8400
8402 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_LINK_FAILURE!!!\n"));
8403 tdsmIOCompletedCB( smRoot,
8404 smIORequestBody->smIORequest,
8405 smIOFailed,
8407 agNULL,
8408 interruptContext);
8409 break;
8410
8411 case OSSA_IO_PROG_ERROR:
8412 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR!!!\n"));
8413 tdsmIOCompletedCB( smRoot,
8414 smIORequestBody->smIORequest,
8415 smIOFailed,
8417 agNULL,
8418 interruptContext);
8419 break;
8420#endif
8421 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
8422 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
8423 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
8424 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
8425 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
8427 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
8428 case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED: /* fall through */
8429#ifdef REMOVED /* removed from spec */
8430 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
8431#endif
8432 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x!!!\n", agIOStatus));
8433 if (smDeviceHandle == agNULL)
8434 {
8435 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
8436 tdsmIOCompletedCB( smRoot,
8437 smIORequestBody->smIORequest,
8438 smIOFailed,
8440 agNULL,
8441 interruptContext);
8442 return;
8443 }
8444 if (oneDeviceData == agNULL)
8445 {
8446 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL!!!\n"));
8447 }
8448 else
8449 {
8450 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
8451 }
8452 tdsmIOCompletedCB( smRoot,
8453 smIORequestBody->smIORequest,
8454 smIOFailed,
8456 agNULL,
8457 interruptContext);
8458 break;
8459
8461 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY!!!\n"));
8462 tdsmIOCompletedCB( smRoot,
8463 smIORequestBody->smIORequest,
8464 smIOFailed,
8466 agNULL,
8467 interruptContext);
8468 break;
8469#ifdef REMOVED
8470 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
8471#endif
8472
8473 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
8474 case OSSA_IO_XFER_ERROR_NAK_RECEIVED: /* fall throuth */
8475
8476#ifdef REMOVED
8477 case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT: /* fall throuth */
8478 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
8479#endif
8480
8481 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
8482
8483#ifdef REMOVED
8484 case OSSA_IO_XFER_ERROR_RX_FRAME: /* fall throuth */
8485 case OSSA_IO_XFER_ERROR_CREDIT_TIMEOUT: /* fall throuth */
8486 case OSSA_IO_XFER_ERROR_SATA: /* fall throuth */
8487#endif
8488 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
8489 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
8490 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
8491#ifdef REMOVED
8492 case OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE: /* fall throuth */
8493 case OSSA_IO_XFER_ERROR_DISRUPTED_PHY_DOWN: /* fall throuth */
8494 case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH: /* fall throuth */
8495 case OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN: /* fall throuth */
8496#endif
8497 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x!!!\n", agIOStatus));
8498
8499 tdsmIOCompletedCB( smRoot,
8500 smIORequestBody->smIORequest,
8501 smIOFailed,
8503 agNULL,
8504 interruptContext);
8505 break;
8506#ifdef REMOVED
8507 case OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT: /* fall throuth */
8510 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_* 0x%x!!!\n", agIOStatus));
8511 tdsmIOCompletedCB( smRoot,
8512 smIORequestBody->smIORequest,
8513 smIOFailed,
8515 agNULL,
8516 interruptContext);
8517 break;
8519 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_PIO_SETUP_ERROR!!!\n"));
8520 if (smDeviceHandle == agNULL)
8521 {
8522 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
8523 }
8524 if (oneDeviceData == agNULL)
8525 {
8526 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL!!!\n"));
8527 }
8528 else
8529 {
8530 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
8531 }
8532 tdsmIOCompletedCB( smRoot,
8533 smIORequestBody->smIORequest,
8534 smIOFailed,
8536 agNULL,
8537 interruptContext);
8538 break;
8539#endif
8541 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR!!!\n"));
8542 if (smDeviceHandle == agNULL)
8543 {
8544 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
8545 tdsmIOCompletedCB( smRoot,
8546 smIORequestBody->smIORequest,
8547 smIOFailed,
8549 agNULL,
8550 interruptContext);
8551 return;
8552 }
8553 if (oneDeviceData == agNULL)
8554 {
8555 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL!!!\n"));
8556 }
8557 else
8558 {
8559 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
8560 }
8561 tdsmIOCompletedCB( smRoot,
8562 smIORequestBody->smIORequest,
8563 smIOFailed,
8565 agNULL,
8566 interruptContext);
8567 break;
8569 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL!!!\n"));
8570 if (smDeviceHandle == agNULL)
8571 {
8572 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, smDeviceHandle is NULL!!!\n"));
8573 tdsmIOCompletedCB( smRoot,
8574 smIORequestBody->smIORequest,
8575 smIOFailed,
8577 agNULL,
8578 interruptContext);
8579 return;
8580 }
8581 if (oneDeviceData == agNULL)
8582 {
8583 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL!!!\n"));
8584 }
8585 else
8586 {
8587 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: did %d!!!\n", oneDeviceData->id));
8588 agDevHandle = oneDeviceData->agDevHandle;
8589 if (oneDeviceData->valid == agTRUE)
8590 {
8591 saSetDeviceState(agRoot, agNULL, tdsmRotateQnumber(smRoot, smDeviceHandle), agDevHandle, SA_DS_OPERATIONAL);
8592 }
8593 }
8594 tdsmIOCompletedCB( smRoot,
8595 smIORequestBody->smIORequest,
8596 smIOFailed,
8598 agNULL,
8599 interruptContext);
8600 break;
8601
8604 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: OSSA_IO_DS_IN_RECOVERY or OSSA_IO_PORT_IN_RESET status %x\n", agIOStatus));
8605 tdsmIOCompletedCB( smRoot,
8606 smIORequestBody->smIORequest,
8607 smIOFailed,
8609 agNULL,
8610 interruptContext);
8611 break;
8612
8618 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: SSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_XX status %x\n", agIOStatus));
8619 tdsmIOCompletedCB( smRoot,
8620 smIORequestBody->smIORequest,
8621 smIOFailed,
8623 agNULL,
8624 interruptContext);
8625 break;
8626 case OSSA_IO_DS_INVALID:
8627 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: OSSA_IO_DS_INVALID status %x\n", agIOStatus));
8628 tdsmIOCompletedCB( smRoot,
8629 smIORequestBody->smIORequest,
8630 smIOFailed,
8632 agNULL,
8633 interruptContext);
8634 break;
8635
8639 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_MPI_%x!!!\n", agIOStatus));
8640 tdsmIOCompletedCB( smRoot,
8641 smIORequestBody->smIORequest,
8642 smIOFailed,
8644 agNULL,
8645 interruptContext);
8646 break;
8647
8648 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
8649#ifdef REMOVED
8651#endif
8652 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: /* fall through */
8653 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: /* fall through */
8654 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: /* fall through */
8657
8658 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x!!!\n", agIOStatus));
8660 agIORequest,
8661 agIOStatus,
8662 agIOInfoLen,
8663 agParam,
8664 0,
8665 interruptContext);
8666 break;
8667
8668#ifdef REMOVED
8669 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
8670 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
8672 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x!!!\n", agIOStatus));
8673 smsatDifHandler(smRoot,
8674 agIORequest,
8675 agIOStatus,
8676 agIOInfoLen,
8677 agParam,
8678 0,
8679 interruptContext);
8680 break;
8681#endif
8682
8683 default:
8684 SM_DBG1(("smsatDelayedProcessAbnormalCompletion: agIOStatus = unknown!!!\n"));
8685 tdsmIOCompletedCB( smRoot,
8686 smIORequestBody->smIORequest,
8687 smIOFailed,
8689 agNULL,
8690 interruptContext);
8691 break;
8692
8693 } /* switch */
8694 return;
8695}
8696
8697osGLOBAL void
8699 agsaRoot_t *agRoot,
8700 agsaIORequest_t *agIORequest,
8701 bit32 agIOStatus,
8702 agsaFisHeader_t *agFirstDword,
8703 bit32 agIOInfoLen,
8704 void *agParam,
8705 void *ioContext
8706 )
8707{
8708 /*
8709 In the process of SAT_IDENTIFY_DEVICE during discovery
8710 */
8711// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8712// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8713// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8714// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8715 smRoot_t *smRoot = agNULL;
8716 smIntRoot_t *smIntRoot = agNULL;
8717 smIntContext_t *smAllShared = agNULL;
8718 smIORequestBody_t *smIORequestBody;
8719 smIORequestBody_t *smOrgIORequestBody = agNULL;
8720 smDeviceHandle_t *smDeviceHandle;
8721 smSatIOContext_t *satIOContext;
8722 smSatIOContext_t *satOrgIOContext;
8723 smSatIOContext_t *satNewIOContext;
8724 smSatInternalIo_t *satIntIo;
8725 smSatInternalIo_t *satNewIntIo = agNULL;
8726 smDeviceData_t *oneDeviceData;
8727 smIORequest_t *smOrgIORequest = agNULL;
8728// agsaFisRegD2HData_t *deviceToHostFisData = agNULL;
8729// bit8 signature[8];
8730#ifdef TD_DEBUG_ENABLE
8731 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
8732 bit32 ataStatus = 0;
8733 bit32 ataError;
8734#endif
8735 agsaSATAIdentifyData_t *pSATAIdData;
8736 bit16 *tmpptr, tmpptr_tmp;
8737 bit32 x;
8738 void *sglVirtualAddr;
8739 bit32 status = 0;
8740// tdsaPortContext_t *onePortContext = agNULL;
8741// tiPortalContext_t *tiPortalContext = agNULL;
8742// bit32 retry_status;
8743 smIORequest_t *smIORequest;
8744 agsaDevHandle_t *agDevHandle = agNULL;
8745
8746 SM_DBG1(("smsatIDStartCB: start\n"));
8747 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
8748 satIOContext = (smSatIOContext_t *) ioContext;
8749 satIntIo = satIOContext->satIntIoContext;
8750 oneDeviceData = satIOContext->pSatDevData;
8751 smDeviceHandle = satIOContext->psmDeviceHandle;
8752 smRoot = oneDeviceData->smRoot;
8753 smIntRoot = (smIntRoot_t *)smRoot->smData;
8754 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
8755 SM_DBG1(("smsatIDStartCB: did %d\n", oneDeviceData->id));
8756// onePortContext = oneDeviceData->tdPortContext;
8757// tiPortalContext= onePortContext->tiPortalContext;
8758 oneDeviceData->IDDeviceValid = agFALSE;
8759 if (satIntIo == agNULL)
8760 {
8761 SM_DBG1(("smsatIDStartCB: External, OS generated!!!\n"));
8762 SM_DBG1(("smsatIDStartCB: Not possible case!!!\n"));
8763 satOrgIOContext = satIOContext;
8764 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
8765
8766 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
8767
8768 smsatFreeIntIoResource( smRoot,
8769 oneDeviceData,
8770 satIntIo);
8771 return;
8772 }
8773 else
8774 {
8775 SM_DBG3(("smsatIDStartCB: Internal, SM generated\n"));
8776 satOrgIOContext = satIOContext->satOrgIOContext;
8777 if (satOrgIOContext == agNULL)
8778 {
8779 SM_DBG5(("smsatIDStartCB: satOrgIOContext is NULL\n"));
8780 }
8781 else
8782 {
8783 SM_DBG5(("smsatIDStartCB: satOrgIOContext is NOT NULL\n"));
8784 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
8785 if (smOrgIORequestBody == agNULL)
8786 {
8787 SM_DBG1(("smsatIDStartCB: smOrgIORequestBody is NULL!!!\n"));
8788 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
8789
8790 smsatFreeIntIoResource(smRoot, oneDeviceData, satIntIo);
8791 return;
8792 }
8793 }
8794 sglVirtualAddr = satIntIo->satIntSmScsiXchg.sglVirtualAddr;
8795 }
8796 smOrgIORequest = smIORequestBody->smIORequest;
8797 smIORequest = smOrgIORequestBody->smIORequest;
8798 smIORequestBody->ioCompleted = agTRUE;
8799 smIORequestBody->ioStarted = agFALSE;
8800
8801
8802 if ( agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT ||
8805 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL )
8806 {
8807 SM_DBG1(("smsatIDStartCB: OPEN_RETRY_TIMEOUT or STP_RESOURCES_BUSY or OPEN_RETRY_BACKOFF_THRESHOLD_REACHED or OSSA_IO_DS_NON_OPERATIONAL!!! 0x%x\n", agIOStatus));
8808 SM_DBG1(("smsatIDStartCB: did %d!!!\n", oneDeviceData->id));
8809 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
8810
8811 smsatFreeIntIoResource( smRoot,
8812 oneDeviceData,
8813 satIntIo);
8814
8815 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody %p smIORequest %p\n", smOrgIORequestBody, smIORequest));
8816 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody->id %d\n", smOrgIORequestBody->id));
8817 if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
8818 {
8819 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIORetry, &(oneDeviceData->satIdentifyData));
8820 }
8822 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL )
8823 {
8824 /* set device to operational */
8825 agDevHandle = oneDeviceData->agDevHandle;
8826 if (oneDeviceData->valid == agTRUE)
8827 {
8828 saSetDeviceState(agRoot, agNULL, tdsmRotateQnumber(smRoot, smDeviceHandle), agDevHandle, SA_DS_OPERATIONAL);
8829 }
8830 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIORetry, &(oneDeviceData->satIdentifyData));
8831 }
8832 else
8833 {
8834 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSTPResourceBusy, &(oneDeviceData->satIdentifyData));
8835 }
8836 return;
8837 }
8838
8839 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8840 {
8841 SM_DBG1(("smsatIDStartCB: agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
8842 SM_DBG1(("smsatIDStartCB: did %d!!!\n", oneDeviceData->id));
8843 SM_DBG1(("smsatIDStartCB: before pending IO %d NCQ pending IO %d NONNCQ pending IO %d\n",
8844 oneDeviceData->satPendingIO, oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
8845
8846 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
8847
8848 SM_DBG1(("smsatIDStartCB: after pending IO %d NCQ pending IO %d NONNCQ pending IO %d\n",
8849 oneDeviceData->satPendingIO, oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
8850
8851 smsatFreeIntIoResource( smRoot,
8852 oneDeviceData,
8853 satIntIo);
8854
8855 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody %p smIORequest %p\n", smOrgIORequestBody, smIORequest));
8856 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody->id %d\n", smOrgIORequestBody->id));
8857 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
8858 return;
8859 }
8860
8861 if (agIOStatus == OSSA_IO_ABORTED ||
8862 agIOStatus == OSSA_IO_UNDERFLOW ||
8863 agIOStatus == OSSA_IO_XFER_ERROR_BREAK ||
8864 agIOStatus == OSSA_IO_XFER_ERROR_PHY_NOT_READY ||
8866 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
8871 agIOStatus == OSSA_IO_XFER_ERROR_NAK_RECEIVED ||
8872 agIOStatus == OSSA_IO_XFER_ERROR_DMA ||
8875 agIOStatus == OSSA_IO_NO_DEVICE ||
8877 agIOStatus == OSSA_IO_PORT_IN_RESET ||
8878 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL ||
8879 agIOStatus == OSSA_IO_DS_IN_RECOVERY ||
8880 agIOStatus == OSSA_IO_DS_IN_ERROR ||
8881 agIOStatus == OSSA_IO_DS_INVALID
8882 )
8883 {
8884 SM_DBG1(("smsatIDStartCB: OSSA_IO_OPEN_CNX_ERROR 0x%x!!!\n", agIOStatus));
8885 SM_DBG1(("smsatIDStartCB: did %d!!!\n", oneDeviceData->id));
8886 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
8887
8888 smsatFreeIntIoResource( smRoot,
8889 oneDeviceData,
8890 satIntIo);
8891
8892
8893 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody %p smIORequest %p\n", smOrgIORequestBody, smIORequest));
8894 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody->id %d\n", smOrgIORequestBody->id));
8895 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
8896 return;
8897 }
8898
8899 if ( agIOStatus != OSSA_IO_SUCCESS ||
8900 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
8901 )
8902 {
8903#ifdef TD_DEBUG_ENABLE
8904 /* only agsaFisPioSetup_t is expected */
8905 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
8906 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
8907 ataError = satPIOSetupHeader->error; /* ATA Eror register */
8908#endif
8909 SM_DBG1(("smsatIDStartCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
8910
8911 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
8912
8913 smsatFreeIntIoResource( smRoot,
8914 oneDeviceData,
8915 satIntIo);
8916
8917 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody %p smIORequest %p\n", smOrgIORequestBody, smIORequest));
8918 SM_DBG2(("smsatIDStartCB: smOrgIORequestBody->id %d\n", smOrgIORequestBody->id));
8919
8920 {
8921 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
8922 }
8923 return;
8924 }
8925
8926
8927 /* success */
8928 SM_DBG3(("smsatIDStartCB: Success\n"));
8929 SM_DBG3(("smsatIDStartCB: Success did %d\n", oneDeviceData->id));
8930
8931 /* Convert to host endian */
8932 tmpptr = (bit16*)sglVirtualAddr;
8933 for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++)
8934 {
8935 OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0);
8936 *tmpptr = tmpptr_tmp;
8937 tmpptr++;
8938 }
8939
8940 pSATAIdData = (agsaSATAIdentifyData_t *)sglVirtualAddr;
8941 //smhexdump("satAddSATAIDDevCB before", (bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
8942
8943 SM_DBG5(("smsatIDStartCB: OS satOrgIOContext %p \n", satOrgIOContext));
8944 SM_DBG5(("smsatIDStartCB: TD satIOContext %p \n", satIOContext));
8945 SM_DBG5(("smsatIDStartCB: OS tiScsiXchg %p \n", satOrgIOContext->smScsiXchg));
8946 SM_DBG5(("smsatIDStartCB: TD tiScsiXchg %p \n", satIOContext->smScsiXchg));
8947
8948
8949 /* copy ID Dev data to oneDeviceData */
8950 oneDeviceData->satIdentifyData = *pSATAIdData;
8951 oneDeviceData->IDDeviceValid = agTRUE;
8952
8953#ifdef SM_INTERNAL_DEBUG
8954 smhexdump("smsatIDStartCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
8955 smhexdump("smsatIDStartCB Device ID Dev data",(bit8 *)&oneDeviceData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
8956#endif
8957
8958 /* set oneDeviceData fields from IndentifyData */
8959 smsatSetDevInfo(oneDeviceData,pSATAIdData);
8960 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
8961
8962 smsatFreeIntIoResource( smRoot,
8963 oneDeviceData,
8964 satIntIo);
8965
8966 if (smIORequest->tdData == smIORequest->smData)
8967 {
8968 SM_DBG1(("smsatIDStartCB: the same tdData and smData error!\n"));
8969 }
8970
8971 /* send the Set Feature ATA command to SATA device for enbling PIO and DMA transfer mode*/
8972 satNewIntIo = smsatAllocIntIoResource( smRoot,
8973 smOrgIORequest,
8974 oneDeviceData,
8975 0,
8976 satNewIntIo);
8977
8978 if (satNewIntIo == agNULL)
8979 {
8980 SM_DBG1(("smsatIDStartCB: momory allocation fails\n"));
8981 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
8982 return;
8983 } /* end memory allocation */
8984
8985 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
8986 smOrgIORequest,
8987 oneDeviceData,
8988 agNULL,
8989 satOrgIOContext
8990 );
8991 /*enable PIO mode*/
8992 status = smsatSetFeaturesPIO(smRoot,
8993 &satNewIntIo->satIntSmIORequest,
8994 satNewIOContext->psmDeviceHandle,
8995 &satNewIntIo->satIntSmScsiXchg, /* orginal from OS layer */
8996 satNewIOContext
8997 );
8998
8999 if (status != SM_RC_SUCCESS)
9000 {
9002 oneDeviceData,
9003 satNewIntIo);
9004 /* clean up TD layer's IORequestBody */
9005 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
9006 }
9007
9008 SM_DBG2(("smsatIDStartCB: End device id %d\n", oneDeviceData->id));
9009 return;
9010}
9011
9012
9013osGLOBAL void
9015 smRoot_t *smRoot,
9016 smIORequest_t *smIORequest,
9017 agsaFisHeader_t *agFirstDword,
9018 bit32 respFisLen,
9019 agsaFrameHandle_t agFrameHandle,
9020 smSatIOContext_t *satIOContext,
9021 bit32 interruptContext
9022 )
9023{
9024// satDeviceData_t *pSatDevData;
9025 smDeviceData_t *oneDeviceData;
9026 smScsiRspSense_t *pSense;
9027#ifdef TD_DEBUG_ENABLE
9028 smIniScsiCmnd_t *pScsiCmnd;
9029#endif
9030 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
9031 bit32 ataStatus = 0;
9032 bit32 ataError;
9033 smSatInternalIo_t *satIntIo = agNULL;
9034 bit32 status;
9035// agsaRoot_t *agRoot;
9036// agsaDevHandle_t *agDevHandle;
9037 smDeviceHandle_t *smDeviceHandle;
9038 smSatIOContext_t *satIOContext2;
9039 smIORequestBody_t *smIORequestBody;
9040 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
9041 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
9042 smIORequest_t smIORequestTMP;
9043
9044 pSense = satIOContext->pSense;
9045 oneDeviceData = satIOContext->pSatDevData;
9046#ifdef TD_DEBUG_ENABLE
9047 pScsiCmnd = satIOContext->pScsiCmnd;
9048#endif
9049 hostToDevFis = satIOContext->pFis;
9050
9051
9052// agRoot = ((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->agRoot;
9053// agDevHandle = ((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->agDevHandle;
9054// tiDeviceHandle = &((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->tiDeviceHandle;
9055 smDeviceHandle = satIOContext->psmDeviceHandle;
9056 /*
9057 * Find out the type of response FIS:
9058 * Set Device Bit FIS or Reg Device To Host FIS.
9059 */
9060
9061 /* First assume it is Reg Device to Host FIS */
9062 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
9063 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
9064 ataError = statDevToHostFisHeader->error; /* ATA Eror register */
9065
9066 SM_DBG5(("smsatIOCompleted: start\n"));
9067
9068 /* for debugging */
9069 SM_DBG1(("smsatIOCompleted: H to D command 0x%x!!!\n", hostToDevFis->h.command));
9070 SM_DBG1(("smsatIOCompleted: D to H fistype 0x%x!!!\n", statDevToHostFisHeader->fisType));
9071
9072
9073 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
9074 {
9075 /* It is Set Device Bits FIS */
9076 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
9077 /* Get ATA Status register */
9078 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */
9079 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */
9080
9081 /* ATA Eror register */
9082 ataError = statSetDevBitFisHeader->error;
9083
9084 statDevToHostFisHeader = agNULL;
9085 }
9086
9087 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
9088 {
9089 SM_DBG1(("smsatIOCompleted: *** UNEXPECTED RESP FIS TYPE 0x%x *** smIORequest=%p!!!\n",
9090 statDevToHostFisHeader->fisType, smIORequest));
9091
9092 smsatSetSensePayload( pSense,
9094 0,
9096 satIOContext);
9097
9098 tdsmIOCompletedCB( smRoot,
9099 smIORequest,
9102 satIOContext->pSmSenseData,
9103 interruptContext );
9104 return;
9105
9106 }
9107
9108 if ( ataStatus & DF_ATA_STATUS_MASK )
9109 {
9110 oneDeviceData->satDeviceFaultState = agTRUE;
9111 }
9112 else
9113 {
9114 oneDeviceData->satDeviceFaultState = agFALSE;
9115 }
9116
9117 SM_DBG5(("smsatIOCompleted: smIORequest=%p CDB=0x%x ATA CMD =0x%x\n",
9118 smIORequest, pScsiCmnd->cdb[0], hostToDevFis->h.command));
9119
9120 /*
9121 * Decide which ATA command is the translation needed
9122 */
9123 switch(hostToDevFis->h.command)
9124 {
9127
9128 /************************************************************************
9129 *
9130 * !!!! See Section 13.5.2.4 of SATA 2.5 specs. !!!!
9131 * !!!! If the NCQ error ends up here, it means that the device sent !!!!
9132 * !!!! Set Device Bit FIS (which has SActive register) instead of !!!!
9133 * !!!! Register Device To Host FIS (which does not have SActive !!!!
9134 * !!!! register). The callback ossaSATAEvent() deals with the case !!!!
9135 * !!!! where Register Device To Host FIS was sent by the device. !!!!
9136 *
9137 * For NCQ we need to issue READ LOG EXT command with log page 10h
9138 * to get the error and to allow other I/Os to continue.
9139 *
9140 * Here is the basic flow or sequence of error recovery, note that due
9141 * to the SATA HW assist that we have, this sequence is slighly different
9142 * from the one described in SATA 2.5:
9143 *
9144 * 1. Set SATA device flag to indicate error condition and returning busy
9145 * for all new request.
9146 * return SM_RC_SUCCESS;
9147
9148 * 2. Because the HW/LL layer received Set Device Bit FIS, it can get the
9149 * tag or I/O context for NCQ request, SATL would translate the ATA error
9150 * to SCSI status and return the original NCQ I/O with the appopriate
9151 * SCSI status.
9152 *
9153 * 3. Prepare READ LOG EXT page 10h command. Set flag to indicate that
9154 * the failed I/O has been returned to the OS Layer. Send command.
9155 *
9156 * 4. When the device receives READ LOG EXT page 10h request all other
9157 * pending I/O are implicitly aborted. No completion (aborted) status
9158 * will be sent to the host for these aborted commands.
9159 *
9160 * 5. SATL receives the completion for READ LOG EXT command in
9161 * smsatReadLogExtCB(). Steps 6,7,8,9 below are the step 1,2,3,4 in
9162 * smsatReadLogExtCB().
9163 *
9164 * 6. Check flag that indicates whether the failed I/O has been returned
9165 * to the OS Layer. If not, search the I/O context in device data
9166 * looking for a matched tag. Then return the completion of the failed
9167 * NCQ command with the appopriate/trasnlated SCSI status.
9168 *
9169 * 7. Issue abort to LL layer to all other pending I/Os for the same SATA
9170 * drive.
9171 *
9172 * 8. Free resource allocated for the internally generated READ LOG EXT.
9173 *
9174 * 9. At the completion of abort, in the context of ossaSATACompleted(),
9175 * return the I/O with error status to the OS-App Specific layer.
9176 * When all I/O aborts are completed, clear SATA device flag to
9177 * indicate ready to process new request.
9178 *
9179 ***********************************************************************/
9180
9181 SM_DBG1(("smsatIOCompleted: NCQ ERROR smIORequest=%p ataStatus=0x%x ataError=0x%x!!!\n",
9182 smIORequest, ataStatus, ataError ));
9183
9184 /* Set flag to indicate we are in recovery */
9186
9187 /* Return the failed NCQ I/O to OS-Apps Specifiic layer */
9189 smIORequest,
9190 satIOContext,
9191 pSense,
9192 (bit8)ataStatus,
9193 (bit8)ataError,
9194 interruptContext );
9195
9196 /*
9197 * Allocate resource for READ LOG EXT page 10h
9198 */
9199 satIntIo = smsatAllocIntIoResource( smRoot,
9200 &(smIORequestTMP), /* anything but NULL */
9201 oneDeviceData,
9202 sizeof (satReadLogExtPage10h_t),
9203 satIntIo);
9204
9205 /*
9206 * If we cannot allocate resource for READ LOG EXT 10 in order to do
9207 * the normal NCQ recovery, we will do SATA device reset.
9208 */
9209 if (satIntIo == agNULL)
9210 {
9211 SM_DBG1(("smsatIOCompleted: can't send RLE due to resource lack!!!\n"));
9212
9213 /* Abort I/O after completion of device reset */
9214 oneDeviceData->satAbortAfterReset = agTRUE;
9215#ifdef NOT_YET
9216 /* needs further investigation */
9217 /* no report to OS layer */
9218 satSubTM(smRoot,
9219 smDeviceHandle,
9220 SM_INTERNAL_TM_RESET,
9221 agNULL,
9222 agNULL,
9223 agNULL,
9224 agFALSE);
9225#endif
9226
9227
9228 SM_DBG1(("smsatIOCompleted: calling saSATADeviceReset 1!!!\n"));
9229 return;
9230 }
9231
9232
9233 /*
9234 * Set flag to indicate that the failed I/O has been returned to the
9235 * OS-App specific Layer.
9236 */
9238
9239 /* compare to satPrepareNewIO() */
9240 /* Send READ LOG EXIT page 10h command */
9241
9242 /*
9243 * Need to initialize all the fields within satIOContext except
9244 * reqType and satCompleteCB which will be set depending on cmd.
9245 */
9246
9247 smIORequestBody = (smIORequestBody_t *)satIntIo->satIntRequestBody;
9248 satIOContext2 = &(smIORequestBody->transport.SATA.satIOContext);
9249
9250 satIOContext2->pSatDevData = oneDeviceData;
9251 satIOContext2->pFis = &(smIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
9252 satIOContext2->pScsiCmnd = &(satIntIo->satIntSmScsiXchg.scsiCmnd);
9253 satIOContext2->pSense = &(smIORequestBody->transport.SATA.sensePayload);
9254 satIOContext2->pSmSenseData = &(smIORequestBody->transport.SATA.smSenseData);
9255 satIOContext2->pSmSenseData->senseData = satIOContext2->pSense;
9256
9257 satIOContext2->smRequestBody = satIntIo->satIntRequestBody;
9258 satIOContext2->interruptContext = interruptContext;
9259 satIOContext2->satIntIoContext = satIntIo;
9260
9261 satIOContext2->psmDeviceHandle = smDeviceHandle;
9262 satIOContext2->satOrgIOContext = agNULL;
9263 satIOContext2->smScsiXchg = agNULL;
9264
9265 status = smsatSendReadLogExt( smRoot,
9266 &satIntIo->satIntSmIORequest,
9267 smDeviceHandle,
9268 &satIntIo->satIntSmScsiXchg,
9269 satIOContext2);
9270
9271 if (status != SM_RC_SUCCESS)
9272 {
9273 SM_DBG1(("smsatIOCompleted: can't send RLE due to LL api failure!!!\n"));
9274 smsatFreeIntIoResource( smRoot,
9275 oneDeviceData,
9276 satIntIo);
9277
9278 /* Abort I/O after completion of device reset */
9279 oneDeviceData->satAbortAfterReset = agTRUE;
9280#ifdef NOT_YET
9281 /* needs further investigation */
9282 /* no report to OS layer */
9283 satSubTM(smRoot,
9284 smDeviceHandle,
9285 SM_INTERNAL_TM_RESET,
9286 agNULL,
9287 agNULL,
9288 agNULL,
9289 agFALSE);
9290#endif
9291
9292 SM_DBG1(("smsatIOCompleted: calling saSATADeviceReset 2!!!\n"));
9293 return;
9294 }
9295
9296 break;
9297
9298 case SAT_READ_DMA_EXT:
9299 /* fall through */
9300 /* Use default status/error translation */
9301
9302 case SAT_READ_DMA:
9303 /* fall through */
9304 /* Use default status/error translation */
9305
9306 default:
9308 smIORequest,
9309 satIOContext,
9310 pSense,
9311 (bit8)ataStatus,
9312 (bit8)ataError,
9313 interruptContext );
9314 break;
9315
9316 } /* end switch */
9317 return;
9318}
9319
9320
9321osGLOBAL void
9323 smRoot_t *smRoot,
9324 agsaIORequest_t *agIORequest,
9325 bit32 agIOStatus,
9326 bit32 agIOInfoLen,
9327 void *agParam,
9328 bit32 agOtherInfo,
9329 bit32 interruptContext
9330 )
9331{
9332 smIORequestBody_t *smIORequestBody;
9333 bit32 errorDetail = smDetailOtherError;
9334
9335 SM_DBG1(("smsatEncryptionHandler: start\n"));
9336 SM_DBG1(("smsatEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
9337
9338 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
9339
9340 switch (agIOStatus)
9341 {
9343 SM_DBG1(("smsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
9344 errorDetail = smDetailDekKeyCacheMiss;
9345 break;
9347 SM_DBG1(("smsatEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
9348 errorDetail = smDetailCipherModeInvalid;
9349 break;
9351 SM_DBG1(("smsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
9352 errorDetail = smDetailDekIVMismatch;
9353 break;
9355 SM_DBG1(("smsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
9356 errorDetail = smDetailDekRamInterfaceError;
9357 break;
9359 SM_DBG1(("smsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS\n"));
9360 errorDetail = smDetailDekIndexOutofBounds;
9361 break;
9363 SM_DBG1(("smsatEncryptionHandler:OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE\n"));
9364 errorDetail = smDetailOtherError;
9365 break;
9366 default:
9367 SM_DBG1(("smsatEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
9368 errorDetail = smDetailOtherError;
9369 break;
9370 }
9371
9372 tdsmIOCompletedCB( smRoot,
9373 smIORequestBody->smIORequest,
9375 errorDetail,
9376 agNULL,
9377 interruptContext
9378 );
9379 return;
9380}
9381
9382osGLOBAL void
9384 smRoot_t *smRoot,
9385 agsaIORequest_t *agIORequest,
9386 bit32 agIOStatus,
9387 bit32 agIOInfoLen,
9388 void *agParam,
9389 bit32 agOtherInfo,
9390 bit32 interruptContext
9391 )
9392{
9393 smIORequestBody_t *smIORequestBody;
9394 bit32 errorDetail = smDetailOtherError;
9395#ifdef TD_DEBUG_ENABLE
9396 agsaDifDetails_t *DifDetail;
9397#endif
9398
9399 SM_DBG1(("smsatDifHandler: start\n"));
9400 SM_DBG1(("smsatDifHandler: agIOStatus 0x%x\n", agIOStatus));
9401 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
9402#ifdef TD_DEBUG_ENABLE
9403 DifDetail = (agsaDifDetails_t *)agParam;
9404#endif
9405
9406 switch (agIOStatus)
9407 {
9409 SM_DBG1(("smsatDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
9410 errorDetail = smDetailDifAppTagMismatch;
9411 break;
9413 SM_DBG1(("smsatDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
9414 errorDetail = smDetailDifRefTagMismatch;
9415 break;
9417 SM_DBG1(("smsatDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
9418 errorDetail = smDetailDifCrcMismatch;
9419 break;
9420 default:
9421 SM_DBG1(("smsatDifHandler: other error!!! 0x%x\n", agIOStatus));
9422 errorDetail = smDetailOtherError;
9423 break;
9424 }
9425
9426 SM_DBG1(("smsatDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
9427
9428 tdsmIOCompletedCB( smRoot,
9429 smIORequestBody->smIORequest,
9431 errorDetail,
9432 agNULL,
9433 interruptContext
9434 );
9435 return;
9436}
9437
9438osGLOBAL void
9440 smRoot_t *smRoot,
9441 smIORequest_t *smIORequest,
9442 smSatIOContext_t *satIOContext
9443 )
9444{
9445 smDeviceData_t *oneDeviceData;
9446#ifdef REMOVED
9447 smDeviceHandle_t *smDeviceHandle;
9448#endif
9449 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
9450
9451 SM_DBG5(("smsatProcessAbort: start\n"));
9452
9453 oneDeviceData = satIOContext->pSatDevData;
9454#ifdef REMOVED
9455 smDeviceHandle = satIOContext->psmDeviceHandle;
9456#endif
9457 hostToDevFis = satIOContext->pFis;
9458
9459 if ( (hostToDevFis->h.command == SAT_SMART && hostToDevFis->h.features == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE) &&
9460 (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
9461 )
9462 {
9463 /* no completion for send diagnotic in background. It is done in satSendDiagnostic() */
9464 tdsmIOCompletedCB( smRoot,
9465 smIORequest,
9466 smIOFailed,
9468 agNULL,
9469 satIOContext->interruptContext);
9470 }
9471
9472 if ( oneDeviceData->satTmTaskTag != agNULL )
9473 {
9474 SM_DBG1(("smsatProcessAbort: TM callback!!!\n"));
9475#ifdef REMOVED
9476 /* TM completed */
9477 tdsmEventCB( smRoot,
9478 smDeviceHandle,
9480 smTMOK,
9481 oneDeviceData->satTmTaskTag);
9482#endif
9483 /*
9484 * Reset flag
9485 */
9486 oneDeviceData->satTmTaskTag = agNULL;
9487 }
9488
9489 /*
9490 * Check if we are in recovery mode and need to update the recovery flag
9491 */
9492 if ((oneDeviceData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
9493 (oneDeviceData->satPendingIO == 0 ))
9494 {
9495 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
9496 SM_DBG1(("smsatProcessAbort: STATE NORMAL.!!!\n"));
9497 }
9498 SM_DBG1(("smsatProcessAbort: satDriveState %d!!!\n", oneDeviceData->satDriveState));
9499 SM_DBG1(("smsatProcessAbort: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
9500 SM_DBG1(("smsatProcessAbort: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
9501
9502 return;
9503}
9504
9505
9506osGLOBAL void
9508 agsaRoot_t *agRoot,
9509 agsaIORequest_t *agIORequest,
9510 bit32 agIOStatus,
9511 agsaFisHeader_t *agFirstDword,
9512 bit32 agIOInfoLen,
9513 void *agParam,
9514 void *ioContext
9515 )
9516{
9517 smRoot_t *smRoot = agNULL;
9518 smIntRoot_t *smIntRoot = agNULL;
9519 smIntContext_t *smAllShared = agNULL;
9520 smIORequestBody_t *smIORequestBody;
9521 bit32 interruptContext;
9522 smSatIOContext_t *satIOContext;
9523 smDeviceData_t *oneDeviceData;
9524
9525 SM_DBG2(("smsatNonDataIOCB: start\n"));
9526 SM_DBG5(("satNonDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
9527 agIORequest, agIOStatus, agIOInfoLen));
9528
9529 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
9530 satIOContext = (smSatIOContext_t *) ioContext;
9531 oneDeviceData = satIOContext->pSatDevData;
9532 smRoot = oneDeviceData->smRoot;
9533 smIntRoot = (smIntRoot_t *)smRoot->smData;
9534 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
9535 interruptContext = satIOContext->interruptContext;
9536
9537 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
9538
9539
9540 smIORequestBody->ioCompleted = agTRUE;
9541 smIORequestBody->ioStarted = agFALSE;
9542
9543 /* Process completion */
9544 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen==0))
9545 {
9546
9547 SM_DBG1(("satNonDataIOCB: *** ERROR*** agIORequest=%p agIOStatus=0x%x agIOInfoLen %d!!!\n",
9548 agIORequest, agIOStatus, agIOInfoLen));
9549
9550 tdsmIOCompletedCB( smRoot,
9551 smIORequestBody->smIORequest,
9552 smIOFailed,
9554 agNULL,
9555 interruptContext);
9556 }
9557 else
9558 {
9559 /* More checking needed, for non-data IO this should be the normal case */
9561 agIORequest,
9562 agIOStatus,
9563 agFirstDword,
9564 agIOInfoLen,
9565 agParam,
9566 satIOContext);
9567 }
9568 return;
9569}
9570
9571osGLOBAL void
9573 agsaRoot_t *agRoot,
9574 agsaIORequest_t *agIORequest,
9575 bit32 agIOStatus,
9576 agsaFisHeader_t *agFirstDword,
9577 bit32 agIOInfoLen,
9578 void *agParam,
9579 void *ioContext
9580 )
9581{
9582 /*
9583 In the process of Inquiry
9584 Process SAT_IDENTIFY_DEVICE
9585 */
9586// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
9587// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
9588// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
9589// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9590 smRoot_t *smRoot = agNULL;
9591 smIntRoot_t *smIntRoot = agNULL;
9592 smIntContext_t *smAllShared = agNULL;
9593 smIORequestBody_t *smIORequestBody;
9594 smIORequestBody_t *smOrgIORequestBody;
9595 smSatIOContext_t *satIOContext;
9596 smSatIOContext_t *satOrgIOContext;
9597 smSatInternalIo_t *satIntIo;
9598// satDeviceData_t *satDevData;
9599 smDeviceData_t *oneDeviceData;
9600 smScsiRspSense_t *pSense;
9601 smIniScsiCmnd_t *scsiCmnd;
9602 smIORequest_t *smOrgIORequest;
9603#ifdef TD_DEBUG_ENABLE
9604 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
9605 bit32 ataStatus = 0;
9606 bit32 ataError;
9607#endif
9608 smScsiInitiatorRequest_t *smScsiRequest; /* TD's smScsiXchg */
9609 smScsiInitiatorRequest_t *smOrgScsiRequest; /* OS's smScsiXchg */
9610 agsaSATAIdentifyData_t *pSATAIdData;
9611 bit8 *pInquiry;
9612 bit8 page = 0xFF;
9613 bit16 *tmpptr,tmpptr_tmp;
9614 bit32 x;
9615 bit32 lenReceived = 0;
9616 bit32 allocationLen = 0;
9617 bit32 lenNeeded = 0;
9618 bit8 dataBuffer[SATA_PAGE89_INQUIRY_SIZE] = {0};
9619
9620
9621 SM_DBG6(("smsatInquiryCB: start\n"));
9622 SM_DBG6(("smsatInquiryCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9623
9624 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
9625 satIOContext = (smSatIOContext_t *) ioContext;
9626 satIntIo = satIOContext->satIntIoContext;
9627 oneDeviceData = satIOContext->pSatDevData;
9628 smScsiRequest = satIOContext->smScsiXchg;
9629 smRoot = oneDeviceData->smRoot;
9630 smIntRoot = (smIntRoot_t *)smRoot->smData;
9631 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
9632
9633 if (satIntIo == agNULL)
9634 {
9635 SM_DBG6(("smsatInquiryCB: External, OS generated\n"));
9636 pSense = satIOContext->pSense;
9637 scsiCmnd = satIOContext->pScsiCmnd;
9638 satOrgIOContext = satIOContext;
9639 smOrgIORequest = smIORequestBody->smIORequest;
9640 }
9641 else
9642 {
9643 SM_DBG6(("smsatInquiryCB: Internal, TD generated\n"));
9644 satOrgIOContext = satIOContext->satOrgIOContext;
9645 if (satOrgIOContext == agNULL)
9646 {
9647 SM_DBG1(("smsatInquiryCB: satOrgIOContext is NULL, wrong!!!\n"));
9648 return;
9649 }
9650 else
9651 {
9652 SM_DBG6(("smsatInquiryCB: satOrgIOContext is NOT NULL\n"));
9653 }
9654 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
9655 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
9656 pSense = satOrgIOContext->pSense;
9657 scsiCmnd = satOrgIOContext->pScsiCmnd;
9658 }
9659
9660 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
9661 pInquiry = dataBuffer;
9662
9663 smIORequestBody->ioCompleted = agTRUE;
9664 smIORequestBody->ioStarted = agFALSE;
9665
9666 SM_DBG3(("smsatInquiryCB: did %d\n", oneDeviceData->id));
9667
9668 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9669 {
9670 SM_DBG1(("smsatInquiryCB: agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
9672 {
9673 SM_DBG1(("smsatInquiryCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY!!!\n"));
9674 /* should NOT be retried */
9675 tdsmIOCompletedCB( smRoot,
9676 smOrgIORequest,
9677 smIOFailed,
9679 agNULL,
9680 satOrgIOContext->interruptContext
9681 );
9682 }
9683 else
9684 {
9685 SM_DBG1(("smsatInquiryCB: NOT OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY!!!\n"));
9686 tdsmIOCompletedCB( smRoot,
9687 smOrgIORequest,
9688 smIOFailed,
9690 agNULL,
9691 satOrgIOContext->interruptContext
9692 );
9693 }
9694 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
9695
9696 smsatFreeIntIoResource( smRoot,
9697 oneDeviceData,
9698 satIntIo);
9699 return;
9700 }
9703 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
9710 )
9711 {
9712 SM_DBG1(("smsatInquiryCB: OSSA_IO_OPEN_CNX_ERROR!!!\n"));
9713
9714 tdsmIOCompletedCB( smRoot,
9715 smOrgIORequest,
9716 smIOFailed,
9718 agNULL,
9719 satOrgIOContext->interruptContext
9720 );
9721
9722 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
9723
9724 smsatFreeIntIoResource( smRoot,
9725 oneDeviceData,
9726 satIntIo);
9727 return;
9728 }
9729
9730 if ( agIOStatus != OSSA_IO_SUCCESS ||
9731 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
9732 )
9733 {
9734#ifdef TD_DEBUG_ENABLE
9735 /* only agsaFisPioSetup_t is expected */
9736 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
9737 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
9738 ataError = satPIOSetupHeader->error; /* ATA Eror register */
9739#endif
9740 SM_DBG1(("smsatInquiryCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
9741
9742 /* Process abort case */
9743 if (agIOStatus == OSSA_IO_ABORTED)
9744 {
9745 smsatProcessAbort(smRoot,
9746 smOrgIORequest,
9747 satOrgIOContext
9748 );
9749
9750 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
9751
9752 smsatFreeIntIoResource( smRoot,
9753 oneDeviceData,
9754 satIntIo);
9755 return;
9756 }
9757
9758 tdsmIOCompletedCB( smRoot,
9759 smOrgIORequest,
9760 smIOFailed,
9762 agNULL,
9763 satOrgIOContext->interruptContext
9764 );
9765
9766 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
9767
9768 smsatFreeIntIoResource( smRoot,
9769 oneDeviceData,
9770 satIntIo);
9771 return;
9772 }
9773
9774 /* success */
9775
9776
9777 /* Convert to host endian */
9778 tmpptr = (bit16*)(smScsiRequest->sglVirtualAddr);
9779 for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++)
9780 {
9781 OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0);
9782 *tmpptr = tmpptr_tmp;
9783 tmpptr++;
9784 /*Print tmpptr_tmp here for debugging purpose*/
9785 }
9786
9787 pSATAIdData = (agsaSATAIdentifyData_t *)(smScsiRequest->sglVirtualAddr);
9788
9789 SM_DBG5(("smsatInquiryCB: OS satOrgIOContext %p \n", satOrgIOContext));
9790 SM_DBG5(("smsatInquiryCB: TD satIOContext %p \n", satIOContext));
9791 SM_DBG5(("smsatInquiryCB: OS smScsiXchg %p \n", satOrgIOContext->smScsiXchg));
9792 SM_DBG5(("smsatInquiryCB: TD smScsiXchg %p \n", satIOContext->smScsiXchg));
9793
9794 /* copy ID Dev data to oneDeviceData */
9795 oneDeviceData->satIdentifyData = *pSATAIdData;
9796 oneDeviceData->IDDeviceValid = agTRUE;
9797#ifdef SM_INTERNAL_DEBUG
9798 smhexdump("smsatInquiryCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
9799 smhexdump("smsatInquiryCB Device ID Dev data",(bit8 *)&oneDeviceData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
9800#endif
9801// smhexdump("smsatInquiryCB Device ID Dev data",(bit8 *)&oneDeviceData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
9802
9803 /* set oneDeviceData fields from IndentifyData */
9804 smsatSetDevInfo(oneDeviceData,pSATAIdData);
9805
9806 allocationLen = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
9807 allocationLen = MIN(allocationLen, scsiCmnd->expDataLength);
9808
9809 /* SPC-4, spec 6.4 p 141 */
9810 /* EVPD bit == 0 */
9811 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
9812 {
9813 /* Returns the standard INQUIRY data */
9814 lenNeeded = STANDARD_INQUIRY_SIZE;
9815
9816
9817 smsatInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
9818 //smhexdump("smsatInquiryCB ***standard***", (bit8 *)pInquiry, 36);
9819
9820 }
9821 else
9822 {
9823 /* EVPD bit != 0 && PAGE CODE != 0 */
9824 /* returns the pages of vital product data information */
9825
9826 /* we must support page 00h, 83h and 89h */
9827 page = scsiCmnd->cdb[2];
9828 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
9832 {
9833 smsatSetSensePayload( pSense,
9835 0,
9837 satOrgIOContext);
9838
9839 tdsmIOCompletedCB( smRoot,
9840 smOrgIORequest,
9843 satOrgIOContext->pSmSenseData,
9844 satOrgIOContext->interruptContext );
9845
9846 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
9847
9848 smsatFreeIntIoResource( smRoot,
9849 oneDeviceData,
9850 satIntIo);
9851 SM_DBG1(("smsatInquiryCB: invalid PAGE CODE 0x%x!!!\n", page));
9852 return;
9853 }
9854
9855 /* checking length */
9856 switch (page)
9857 {
9859 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 9 */
9860 break;
9862 if (oneDeviceData->satWWNSupport)
9863 {
9864 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
9865 }
9866 else
9867 {
9868 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
9869 }
9870 break;
9872 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
9873 break;
9875 lenNeeded = SATA_PAGEB1_INQUIRY_SIZE; /* 64 */
9876 break;
9877 default:
9878 SM_DBG1(("smsatInquiryCB: wrong!!! invalid PAGE CODE 0x%x!!!\n", page));
9879 break;
9880 }
9881
9882
9883 /*
9884 * Fill in the Inquiry data depending on what Inquiry data we are returning.
9885 */
9886 switch (page)
9887 {
9889 smsatInquiryPage0(pInquiry, pSATAIdData);
9890 break;
9892 smsatInquiryPage83(pInquiry, pSATAIdData, oneDeviceData);
9893 break;
9895 smsatInquiryPage89(pInquiry, pSATAIdData, oneDeviceData, lenReceived);
9896 break;
9898 smsatInquiryPageB1(pInquiry, pSATAIdData);
9899 break;
9900 default:
9901 SM_DBG1(("smsatInquiryCB: wrong!!! invalidinvalid PAGE CODE 0x%x!!!\n", page));
9902 break;
9903 }
9904 } /* else */
9905
9906 SM_DBG6(("smsatInquiryCB: calling tdsmIOCompletedCB\n"));
9907
9908 /* if this is a standard Inquiry command, notify Stoport to set the device queue depth to max NCQ */
9909 if ( (oneDeviceData->satNCQ == agTRUE) &&
9910 ((scsiCmnd->cdb[1] & 0x01) == 0))
9911 {
9912 if (tdsmSetDeviceQueueDepth(smRoot,
9913 smOrgIORequest,
9914 oneDeviceData->satNCQMaxIO-1
9915 ) == agFALSE)
9916 {
9917 SM_DBG1(("smsatInquiryCB: failed to call tdsmSetDeviceQueueDepth()!!! Q=%d\n", oneDeviceData->satNCQMaxIO));
9918 }
9919 }
9920
9921 sm_memcpy(smOrgScsiRequest->sglVirtualAddr, dataBuffer, MIN(allocationLen, lenNeeded));
9922 if (allocationLen > lenNeeded)
9923 {
9924 SM_DBG6(("smsatInquiryCB reporting underrun lenNeeded=0x%x allocationLen=0x%x smIORequest=%p\n",
9925 lenNeeded, allocationLen, smOrgIORequest));
9926
9927 tdsmIOCompletedCB( smRoot,
9928 smOrgIORequest,
9930 allocationLen - lenNeeded,
9931 agNULL,
9932 satOrgIOContext->interruptContext );
9933 }
9934 else
9935 {
9936 tdsmIOCompletedCB( smRoot,
9937 smOrgIORequest,
9940 agNULL,
9941 satOrgIOContext->interruptContext);
9942 }
9943
9944 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
9945
9946 smsatFreeIntIoResource( smRoot,
9947 oneDeviceData,
9948 satIntIo);
9949 SM_DBG5(("smsatInquiryCB: device %p pending IO %d\n", oneDeviceData, oneDeviceData->satPendingIO));
9950 SM_DBG6(("smsatInquiryCB: end\n"));
9951 return;
9952}
9953
9954osGLOBAL void
9956 smRoot_t *smRoot,
9957 smIORequest_t *smIORequest,
9958 smDeviceHandle_t *smDeviceHandle,
9959 smScsiInitiatorRequest_t *smScsiRequest,
9960 smSatIOContext_t *satIOContext
9961 )
9962{
9963 smScsiRspSense_t *pSense;
9964 smIniScsiCmnd_t *scsiCmnd;
9965// satDeviceData_t *satDevData;
9966 smDeviceData_t *oneDeviceData;
9967 agsaSATAIdentifyData_t *pSATAIdData;
9968
9969 bit8 *pInquiry;
9970 bit8 page = 0xFF;
9971 bit32 lenReceived = 0;
9972 bit32 allocationLen = 0;
9973 bit32 lenNeeded = 0;
9974 bit8 dataBuffer[SATA_PAGE89_INQUIRY_SIZE] = {0};
9975
9976 SM_DBG6(("smsatInquiryIntCB: start\n"));
9977
9978 pSense = satIOContext->pSense;
9979 scsiCmnd = &smScsiRequest->scsiCmnd;
9980 pInquiry = dataBuffer;
9981 oneDeviceData = satIOContext->pSatDevData;
9982 pSATAIdData = &oneDeviceData->satIdentifyData;
9983
9984 allocationLen = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
9985 allocationLen = MIN(allocationLen, scsiCmnd->expDataLength);
9986
9987 /* SPC-4, spec 6.4 p 141 */
9988 /* EVPD bit == 0 */
9989 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
9990 {
9991 /* Returns the standard INQUIRY data */
9992 lenNeeded = STANDARD_INQUIRY_SIZE;
9993
9994 smsatInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
9995 //smhexdump("satInquiryIntCB ***standard***", (bit8 *)pInquiry, 36);
9996
9997 }
9998 else
9999 {
10000 /* EVPD bit != 0 && PAGE CODE != 0 */
10001 /* returns the pages of vital product data information */
10002
10003 /* we must support page 00h, 83h and 89h */
10004 page = scsiCmnd->cdb[2];
10005 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
10010 {
10011 smsatSetSensePayload( pSense,
10013 0,
10015 satIOContext);
10016
10017 tdsmIOCompletedCB( smRoot,
10018 smIORequest,
10021 satIOContext->pSmSenseData,
10022 satIOContext->interruptContext );
10023
10024 SM_DBG1(("smsatInquiryIntCB: invalid PAGE CODE 0x%x!!!\n", page));
10025 return;
10026 }
10027
10028 /* checking length */
10029 switch (page)
10030 {
10032 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
10033 break;
10035 if (oneDeviceData->satWWNSupport)
10036 {
10037 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
10038 }
10039 else
10040 {
10041 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
10042 }
10043 break;
10045 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
10046 break;
10048 lenNeeded = SATA_PAGE80_INQUIRY_SIZE; /* 24 */
10049 break;
10051 lenNeeded = SATA_PAGEB1_INQUIRY_SIZE; /* 64 */
10052 break;
10053 default:
10054 SM_DBG1(("smsatInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x!!!\n", page));
10055 break;
10056 }
10057
10058
10059 /*
10060 * Fill in the Inquiry data depending on what Inquiry data we are returning.
10061 */
10062 switch (page)
10063 {
10065 smsatInquiryPage0(pInquiry, pSATAIdData);
10066 break;
10068 smsatInquiryPage83(pInquiry, pSATAIdData, oneDeviceData);
10069 break;
10071 smsatInquiryPage89(pInquiry, pSATAIdData, oneDeviceData, lenReceived);
10072 break;
10074 smsatInquiryPage80(pInquiry, pSATAIdData);
10075 break;
10077 smsatInquiryPageB1(pInquiry, pSATAIdData);
10078 break;
10079 default:
10080 SM_DBG1(("smsatInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x!!!\n", page));
10081 break;
10082 }
10083 } /* else */
10084
10085 SM_DBG6(("smsatInquiryIntCB: calling tdsmIOCompletedCB\n"));
10086
10087 /* if this is a standard Inquiry command, notify Stoport to set the device queue depth to max NCQ */
10088 if ( (oneDeviceData->satNCQ == agTRUE) &&
10089 ((scsiCmnd->cdb[1] & 0x01) == 0))
10090 {
10091 if (tdsmSetDeviceQueueDepth(smRoot,
10092 smIORequest,
10093 oneDeviceData->satNCQMaxIO-1
10094 ) == agFALSE)
10095 {
10096 SM_DBG1(("smsatInquiryIntCB: failed to call tdsmSetDeviceQueueDepth()!!! Q=%d\n", oneDeviceData->satNCQMaxIO));
10097 }
10098 }
10099
10100 sm_memcpy(smScsiRequest->sglVirtualAddr, dataBuffer, MIN(allocationLen, lenNeeded));
10101 if (allocationLen > lenNeeded)
10102 {
10103 SM_DBG6(("smsatInquiryIntCB reporting underrun lenNeeded=0x%x allocationLen=0x%x smIORequest=%p\n",
10104 lenNeeded, allocationLen, smIORequest));
10105
10106 tdsmIOCompletedCB( smRoot,
10107 smIORequest,
10109 allocationLen - lenNeeded,
10110 agNULL,
10111 satIOContext->interruptContext );
10112 }
10113 else
10114 {
10115 tdsmIOCompletedCB( smRoot,
10116 smIORequest,
10119 agNULL,
10120 satIOContext->interruptContext);
10121 }
10122
10123 SM_DBG5(("smsatInquiryIntCB: device %p pending IO %d\n", oneDeviceData, oneDeviceData->satPendingIO));
10124 SM_DBG6(("smsatInquiryIntCB: end\n"));
10125 return;
10126
10127}
10128
10129osGLOBAL void
10131 agsaRoot_t *agRoot,
10132 agsaIORequest_t *agIORequest,
10133 bit32 agIOStatus,
10134 agsaFisHeader_t *agFirstDword,
10135 bit32 agIOInfoLen,
10136 void *agParam,
10137 void *ioContext
10138 )
10139{
10140 smRoot_t *smRoot = agNULL;
10141 smIntRoot_t *smIntRoot = agNULL;
10142 smIntContext_t *smAllShared = agNULL;
10143 smIORequestBody_t *smIORequestBody;
10144 smIORequestBody_t *smOrgIORequestBody;
10145 smSatIOContext_t *satIOContext;
10146 smSatIOContext_t *satOrgIOContext;
10147 smSatInternalIo_t *satIntIo;
10148 smDeviceData_t *oneDeviceData;
10149
10150 smScsiRspSense_t *pSense;
10151 smIORequest_t *smOrgIORequest;
10152
10153 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
10154 bit32 ataStatus = 0;
10155 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
10156
10157 SM_DBG5(("smsatVerify10CB: start\n"));
10158 SM_DBG5(("smsatVerify10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10159
10160 /* internally generate smIOContext */
10161 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
10162 satIOContext = (smSatIOContext_t *) ioContext;
10163 satIntIo = satIOContext->satIntIoContext;
10164 oneDeviceData = satIOContext->pSatDevData;
10165 hostToDevFis = satIOContext->pFis;
10166 smRoot = oneDeviceData->smRoot;
10167 smIntRoot = (smIntRoot_t *)smRoot->smData;
10168 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
10169
10170 if (satIntIo == agNULL)
10171 {
10172 SM_DBG4(("smsatVerify10CB: External smSatInternalIo_t satIntIoContext\n"));
10173 satOrgIOContext = satIOContext;
10174 smOrgIORequest = smIORequestBody->smIORequest;
10175 pSense = satIOContext->pSense;
10176 }
10177 else
10178 {
10179 SM_DBG4(("smsatVerify10CB: Internal smSatInternalIo_t satIntIoContext\n"));
10180 satOrgIOContext = satIOContext->satOrgIOContext;
10181 if (satOrgIOContext == agNULL)
10182 {
10183 SM_DBG4(("smsatVerify10CB: satOrgIOContext is NULL, wrong\n"));
10184 return;
10185 }
10186 else
10187 {
10188 SM_DBG4(("smsatVerify10CB: satOrgIOContext is NOT NULL\n"));
10189 }
10190 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
10191 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
10192 pSense = satOrgIOContext->pSense;
10193 }
10194
10195 smIORequestBody->ioCompleted = agTRUE;
10196 smIORequestBody->ioStarted = agFALSE;
10197
10198 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10199 {
10200 SM_DBG1(("smsatVerify10CB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
10201 smsatSetSensePayload( pSense,
10203 0,
10205 satOrgIOContext);
10206
10207 tdsmIOCompletedCB( smRoot,
10208 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
10211 satOrgIOContext->pSmSenseData,
10212 satOrgIOContext->interruptContext );
10213
10214 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
10215
10216 smsatFreeIntIoResource( smRoot,
10217 oneDeviceData,
10218 satIntIo);
10219 return;
10220 }
10221
10222 if (agIOStatus != OSSA_IO_SUCCESS)
10223 {
10224 /* only agsaFisRegDeviceToHost_t is expected */
10225 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
10226 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
10227 }
10228
10229 if( agIOStatus != OSSA_IO_SUCCESS)
10230 {
10231 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
10232 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
10233 )
10234 {
10235 /* for debugging */
10236 if( agIOStatus != OSSA_IO_SUCCESS)
10237 {
10238 SM_DBG1(("smsatVerify10CB: FAILED, NOT IO_SUCCESS!!!\n"));
10239 }
10240 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
10241 {
10242 SM_DBG1(("smsatVerify10CB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
10243 }
10244 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
10245 (ataStatus & DF_ATA_STATUS_MASK)
10246 )
10247 {
10248 SM_DBG1(("smsatVerify10CB: FAILED, FAILED, error status!!!\n"));
10249 }
10250
10251 /* Process abort case */
10252 if (agIOStatus == OSSA_IO_ABORTED)
10253 {
10254 smsatProcessAbort(smRoot,
10255 smOrgIORequest,
10256 satOrgIOContext
10257 );
10258
10259 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
10260
10261 smsatFreeIntIoResource( smRoot,
10262 oneDeviceData,
10263 satIntIo);
10264 return;
10265 }
10266
10267 /* for debugging */
10268 switch (hostToDevFis->h.command)
10269 {
10271 SM_DBG1(("smsatVerify10CB: SAT_READ_VERIFY_SECTORS_EXT!!!\n"));
10272 break;
10273 default:
10274 SM_DBG1(("smsatVerify10CB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
10275 break;
10276 }
10277
10278 smsatSetSensePayload( pSense,
10280 0,
10282 satOrgIOContext);
10283
10284 tdsmIOCompletedCB( smRoot,
10285 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
10288 satOrgIOContext->pSmSenseData,
10289 satOrgIOContext->interruptContext );
10290
10291 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
10292
10293 smsatFreeIntIoResource( smRoot,
10294 oneDeviceData,
10295 satIntIo);
10296 return;
10297 } /* end error checking */
10298 }
10299
10300 /* process success from this point on */
10301 switch (hostToDevFis->h.command)
10302 {
10304 SM_DBG5(("smsatVerify10CB: SAT_WRITE_DMA_EXT success \n"));
10305
10306 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
10307
10308 smsatFreeIntIoResource( smRoot,
10309 oneDeviceData,
10310 satIntIo);
10311
10312 tdsmIOCompletedCB( smRoot,
10313 smOrgIORequest,
10316 agNULL,
10317 satOrgIOContext->interruptContext);
10318 break;
10319 default:
10320 SM_DBG1(("smsatVerify10CB: success but error default case command 0x%x!!!\n", hostToDevFis->h.command));
10321
10322 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
10323
10324 smsatFreeIntIoResource( smRoot,
10325 oneDeviceData,
10326 satIntIo);
10327
10328 smsatSetSensePayload( pSense,
10330 0,
10332 satOrgIOContext);
10333
10334 tdsmIOCompletedCB( smRoot,
10335 smOrgIORequest, /* == &satIntIo->satOrgSmIORequest */
10338 satOrgIOContext->pSmSenseData,
10339 satOrgIOContext->interruptContext );
10340
10341 break;
10342 }
10343
10344 return;
10345}
10346
10347osGLOBAL void
10349 agsaRoot_t *agRoot,
10350 agsaIORequest_t *agIORequest,
10351 bit32 agIOStatus,
10352 agsaFisHeader_t *agFirstDword,
10353 bit32 agIOInfoLen,
10354 void *agParam,
10355 void *ioContext
10356 )
10357{
10358 smRoot_t *smRoot = agNULL;
10359 smIntRoot_t *smIntRoot = agNULL;
10360 smIntContext_t *smAllShared = agNULL;
10361 smIORequestBody_t *smIORequestBody;
10362 smSatIOContext_t *satReadLogExtIOContext;
10363 smSatIOContext_t *satIOContext;
10364 smSatInternalIo_t *satIntIo;
10365 smDeviceData_t *oneDeviceData;
10366 agsaIORequest_t *agAbortIORequest;
10367 smIORequestBody_t *smAbortIORequestBody;
10368 bit32 PhysUpper32;
10369 bit32 PhysLower32;
10370 bit32 memAllocStatus;
10371 void *osMemHandle;
10372 smDeviceHandle_t *smDeviceHandle;
10373
10374 SM_DBG5(("smsatReadLogExtCB: start\n"));
10375 SM_DBG1(("smsatReadLogExtCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
10376 agIORequest, agIOStatus, agIOInfoLen));
10377 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
10378 satReadLogExtIOContext = (smSatIOContext_t *) ioContext;
10379 satIntIo = satReadLogExtIOContext->satIntIoContext;
10380 oneDeviceData = satReadLogExtIOContext->pSatDevData;
10381 smDeviceHandle = satReadLogExtIOContext->psmDeviceHandle;
10382 smRoot = oneDeviceData->smRoot;
10383 smIntRoot = (smIntRoot_t *)smRoot->smData;
10384 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
10385 SM_DBG1(("smsatReadLogExtCB: did %d!!!\n", oneDeviceData->id));
10386 SM_DBG1(("smsatReadLogExtCB: smIORequestBody ID %d!!!\n", smIORequestBody->id));
10387 SM_DBG1(("smsatReadLogExtCB: smIORequestBody ioCompleted %d ioStarted %d\n", smIORequestBody->ioCompleted, smIORequestBody->ioStarted));
10388 smsatDecrementPendingIO(smRoot, smAllShared, satReadLogExtIOContext);
10389
10390 smIORequestBody->ioCompleted = agTRUE;
10391 smIORequestBody->ioStarted = agFALSE;
10392
10393 /*
10394 * If READ LOG EXT failed, we issue device reset.
10395 */
10396 if ( agIOStatus != OSSA_IO_SUCCESS ||
10397 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
10398 )
10399 {
10400 SM_DBG1(("smsatReadLogExtCB: FAILED.!!!\n"));
10401
10402 smsatFreeIntIoResource( smRoot,
10403 oneDeviceData,
10404 satIntIo);
10405 /* Abort I/O after completion of device reset */
10406 oneDeviceData->satAbortAfterReset = agTRUE;
10407#ifdef NOT_YET
10408 /* needs to investigate this case */
10409 /* no report to OS layer */
10410 satSubTM(smRoot,
10411 satReadLogExtIOContext->ptiDeviceHandle,
10413 agNULL,
10414 agNULL,
10415 agNULL,
10416 agFALSE);
10417#endif
10418 return;
10419 }
10420
10421
10422 /***************************************************************************
10423 * The following steps take place when READ LOG EXT successfully completed.
10424 ***************************************************************************/
10425
10426 /************************************************************************
10427 *
10428 * 1. Issue abort to LL layer to all other pending I/Os for the same SATA
10429 * drive.
10430 *
10431 * 2. Free resource allocated for the internally generated READ LOG EXT.
10432 *
10433 * 3. At the completion of abort, in the context of ossaSATACompleted(),
10434 * return the I/O with error status to the OS-App Specific layer.
10435 * When all I/O aborts are completed, clear SATA device flag to
10436 * indicate ready to process new request.
10437 *
10438 ***********************************************************************/
10439
10440 /*
10441 * Issue abort to LL layer to all other pending I/Os for the same SATA drive
10442 */
10443 /*
10444 replace the single IO abort with device abort
10445 */
10446
10447 SM_DBG1(("smsatReadLogExtCB: issuing saSATAAbort. Device Abort!!!\n"));
10448 oneDeviceData->SMAbortAll = agTRUE;
10449 /*
10450 smAbortIORequestBody = smDequeueIO(smRoot);
10451
10452 if (smAbortIORequestBody == agNULL)
10453 {
10454 SM_DBG1(("smsatReadLogExtCB: empty freeIOList!!!\n"));
10455 return;
10456 }
10457 */
10458 /* allocating agIORequest for abort itself */
10459 memAllocStatus = tdsmAllocMemory(
10460 smRoot,
10461 &osMemHandle,
10462 (void **)&smAbortIORequestBody,
10463 &PhysUpper32,
10464 &PhysLower32,
10465 8,
10466 sizeof(smIORequestBody_t),
10467 agTRUE
10468 );
10469
10470 if (memAllocStatus != tiSuccess)
10471 {
10472 /* let os process IO */
10473 SM_DBG1(("smsatReadLogExtCB: ostiAllocMemory failed...\n"));
10474 return;
10475 }
10476
10477 if (smAbortIORequestBody == agNULL)
10478 {
10479 /* let os process IO */
10480 SM_DBG1(("smsatReadLogExtCB: ostiAllocMemory returned NULL smAbortIORequestBody\n"));
10481 return;
10482 }
10483 smIOReInit(smRoot, smAbortIORequestBody);
10484 /* setup task management structure */
10485 smAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
10486 smAbortIORequestBody->smDevHandle = smDeviceHandle;
10487 /* setup task management structure */
10488// smAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
10489 satIOContext = &(smAbortIORequestBody->transport.SATA.satIOContext);
10490 satIOContext->smRequestBody = smAbortIORequestBody;
10491
10492 /* initialize agIORequest */
10493 agAbortIORequest = &(smAbortIORequestBody->agIORequest);
10494 agAbortIORequest->osData = (void *) smAbortIORequestBody;
10495 agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
10496
10497 /*
10498 * Issue abort (device abort all)
10499 */
10500 saSATAAbort( agRoot, agAbortIORequest, tdsmRotateQnumber(smRoot, smDeviceHandle), oneDeviceData->agDevHandle, 1, agNULL, smaSATAAbortCB);
10501
10502 /*
10503 * Free resource allocated for the internally generated READ LOG EXT.
10504 */
10505 smsatFreeIntIoResource( smRoot,
10506 oneDeviceData,
10507 satIntIo);
10508
10509 /*
10510 * Sequence of recovery continue at some other context:
10511 * At the completion of abort, in the context of ossaSATACompleted(),
10512 * return the I/O with error status to the OS-App Specific layer.
10513 * When all I/O aborts are completed, clear SATA device flag to
10514 * indicate ready to process new request.
10515 */
10516
10517 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
10518
10519 SM_DBG1(("smsatReadLogExtCB: end return!!!\n"));
10520 return;
10521}
10522
10523osGLOBAL void
10525 agsaRoot_t *agRoot,
10526 agsaIORequest_t *agIORequest,
10527 agsaPortContext_t *agPortContext,
10528 agsaDevHandle_t *agDevHandle,
10529 bit32 event,
10530 bit32 agIOInfoLen,
10531 void *agParam
10532 )
10533{
10534 smRoot_t *smRoot = gsmRoot;
10535 smIntRoot_t *smIntRoot = (smIntRoot_t *)smRoot->smData;
10536 smIntContext_t *smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
10537 smDeviceHandle_t *smDeviceHandle = agNULL;
10538 smDeviceData_t *oneDeviceData = agNULL;
10539 smList_t *DeviceListList;
10540 bit32 found = agFALSE;
10541 smIORequestBody_t *smIORequestBody = agNULL;
10542 smSatInternalIo_t *satIntIo = agNULL;
10543 smSatIOContext_t *satIOContext2;
10544 smIORequest_t smIORequestTMP;
10545 bit32 status;
10546#ifdef REMOVED
10547 agsaDifDetails_t agDifDetails;
10548 bit8 framePayload[256];
10549 bit16 frameOffset = 0;
10550 bit16 frameLen = 0;
10551#endif
10552
10553 SM_DBG1(("ossaSATAEvent: start\n"));
10555 {
10556 /* agIORequest is invalid, search for smDeviceHandle from smAllShared using agDevHandle */
10557 /* find a device's existence */
10558 DeviceListList = smAllShared->MainDeviceList.flink;
10559 while (DeviceListList != &(smAllShared->MainDeviceList))
10560 {
10561 oneDeviceData = SMLIST_OBJECT_BASE(smDeviceData_t, MainLink, DeviceListList);
10562 if (oneDeviceData == agNULL)
10563 {
10564 SM_DBG1(("ossaSATAEvent: oneDeviceData is NULL!!!\n"));
10565 return;
10566 }
10567 if (oneDeviceData->agDevHandle == agDevHandle)
10568 {
10569 SM_DBG2(("ossaSATAEvent: did %d\n", oneDeviceData->id));
10570 found = agTRUE;
10571 break;
10572 }
10573 DeviceListList = DeviceListList->flink;
10574 }
10575 if (found == agFALSE)
10576 {
10577 SM_DBG2(("ossaSATAEvent: not found!!!\n"));
10578 return;
10579 }
10580 if (oneDeviceData->valid == agFALSE)
10581 {
10582 SM_DBG2(("ossaSATAEvent: oneDeviceData is not valid did %d!!!\n", oneDeviceData->id));
10583 return;
10584 }
10585 /**************************************************************************
10586 *
10587 * !!!! See Section 13.5.2.4 of SATA 2.5 specs. !!!!
10588 * !!!! If the NCQ error ends up here, it means that the device sent !!!!
10589 * !!!! Register Device To Host FIS (which does not have SActive !!!!
10590 * !!!! register) instead of Set Device Bit FIS (which has SActive !!!!
10591 * !!!! register). The routine osSatIOCompleted() deals with the case !!!!
10592 * !!!! where Set Device Bit FIS was sent by the device. !!!!
10593 *
10594 * For NCQ we need to issue READ LOG EXT command with log page 10h
10595 * to get the error and to allow other I/Os to continue.
10596 *
10597 * Here is the basic flow or sequence of error recovery, this sequence is
10598 * similar to the one described in SATA 2.5:
10599 *
10600 * 1. Set SATA device flag to indicate error condition and returning busy
10601 * for all new request.
10602 *
10603 * 2. Prepare READ LOG EXT page 10h command. Set flag to indicate that
10604 * the failed I/O has NOT been returned to the OS Layer. Send command.
10605 *
10606 * 3. When the device receives READ LOG EXT page 10h request all other
10607 * pending I/O are implicitly aborted. No completion (aborted) status
10608 * will be sent to the host for these aborted commands.
10609 *
10610 * 4. SATL receives the completion for READ LOG EXT command in
10611 * smsatReadLogExtCB(). Steps 5,6,7,8 below are the step 1,2,3,4 in
10612 * smsatReadLogExtCB().
10613 *
10614 * 5. Check flag that indicates whether the failed I/O has been returned
10615 * to the OS Layer. If not, search the I/O context in device data
10616 * looking for a matched tag. Then return the completion of the failed
10617 * NCQ command with the appopriate/trasnlated SCSI status.
10618 *
10619 * 6. Issue abort to LL layer to all other pending I/Os for the same SATA
10620 * drive.
10621 *
10622 * 7. Free resource allocated for the internally generated READ LOG EXT.
10623 *
10624 * 8. At the completion of abort, in the context of ossaSATACompleted(),
10625 * return the I/O with error status to the OS-App Specific layer.
10626 * When all I/O aborts are completed, clear SATA device flag to
10627 * indicate ready to process new request.
10628 *
10629 *************************************************************************/
10630
10631 smDeviceHandle = oneDeviceData->smDevHandle;
10632 SM_DBG1(("ossaSATAEvent: did %d!!!\n", oneDeviceData->id));
10633
10634 if (oneDeviceData->satDriveState == SAT_DEV_STATE_NORMAL)
10635 {
10636 SM_DBG1(("ossaSATAEvent: NCQ ERROR did %d!!!\n", oneDeviceData->id ));
10637
10638 /* Set flag to indicate we are in recovery */
10640
10641 /*
10642 * Allocate resource for READ LOG EXIT page 10h
10643 */
10644 satIntIo = smsatAllocIntIoResource( smRoot,
10645 &(smIORequestTMP), /* anything but NULL */
10646 oneDeviceData,
10647 sizeof (satReadLogExtPage10h_t),
10648 satIntIo);
10649
10650 /*
10651 * If we cannot allocate resource to do the normal NCQ recovery, we
10652 * will do SATA device reset.
10653 */
10654 if (satIntIo == agNULL)
10655 {
10656 /* Abort I/O after completion of device reset */
10657 oneDeviceData->satAbortAfterReset = agTRUE;
10658 SM_DBG1(("ossaSATAEvent: can't send RLE due to resource lack!!!\n"));
10659
10660#ifdef NOT_YET
10661 /* needs to investigate this case */
10662 /* no report to OS layer */
10663 smsatSubTM(smRoot,
10664 smDeviceHandle,
10666 agNULL,
10667 agNULL,
10668 agNULL,
10669 agFALSE);
10670#endif
10671
10672 return;
10673 }
10674
10675
10676 /*
10677 * Clear flag to indicate that the failed I/O has NOT been returned to the
10678 * OS-App specific Layer.
10679 */
10680 satIntIo->satIntFlag = 0;
10681
10682 /* compare to satPrepareNewIO() */
10683 /* Send READ LOG EXIT page 10h command */
10684
10685 /*
10686 * Need to initialize all the fields within satIOContext except
10687 * reqType and satCompleteCB which will be set depending on cmd.
10688 */
10689
10690 smIORequestBody = (smIORequestBody_t *)satIntIo->satIntRequestBody;
10691 satIOContext2 = &(smIORequestBody->transport.SATA.satIOContext);
10692
10693 satIOContext2->pSatDevData = oneDeviceData;
10694 satIOContext2->pFis = &(smIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
10695 satIOContext2->pScsiCmnd = &(satIntIo->satIntSmScsiXchg.scsiCmnd);
10696 satIOContext2->pSense = &(smIORequestBody->transport.SATA.sensePayload);
10697 satIOContext2->pSmSenseData = &(smIORequestBody->transport.SATA.smSenseData);
10698 satIOContext2->pSmSenseData->senseData = satIOContext2->pSense;
10699
10700 satIOContext2->smRequestBody = satIntIo->satIntRequestBody;
10701 //not used
10702// satIOContext2->interruptContext = interruptContext;
10703 satIOContext2->satIntIoContext = satIntIo;
10704
10705 satIOContext2->psmDeviceHandle = smDeviceHandle;
10706 satIOContext2->satOrgIOContext = agNULL;
10707 satIOContext2->smScsiXchg = agNULL;
10708
10709 SM_DBG1(("ossaSATAEvent: smIORequestBody ID %d!!!\n", smIORequestBody->id));
10710 SM_DBG1(("ossaSATAEvent: smIORequestBody ioCompleted %d ioStarted %d\n", smIORequestBody->ioCompleted, smIORequestBody->ioStarted));
10711 status = smsatSendReadLogExt( smRoot,
10712 &satIntIo->satIntSmIORequest,
10713 smDeviceHandle,
10714 &satIntIo->satIntSmScsiXchg,
10715 satIOContext2);
10716
10717 if (status != SM_RC_SUCCESS)
10718 {
10719 SM_DBG1(("ossaSATAEvent: can't send RLE due to LL api failure!!!\n"));
10720 smsatFreeIntIoResource( smRoot,
10721 oneDeviceData,
10722 satIntIo);
10723 /* Abort I/O after completion of device reset */
10724 oneDeviceData->satAbortAfterReset = agTRUE;
10725#ifdef NOT_YET
10726 /* needs to investigate this case */
10727 /* no report to OS layer */
10728 smsatSubTM(smRoot,
10729 smDeviceHandle,
10731 agNULL,
10732 agNULL,
10733 agNULL,
10734 agFALSE);
10735#endif
10736
10737 return;
10738 }
10739 }
10740 else
10741 {
10742 SM_DBG1(("ossaSATAEvent: NCQ ERROR but recovery in progress!!!\n"));
10743 }
10744 }
10745 else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
10746 {
10747 SM_DBG1(("ossaSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
10748 }
10749 else if (event == OSSA_IO_XFER_PIO_SETUP_ERROR)
10750 {
10751 SM_DBG1(("ossaSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR\n"));
10752 }
10754 {
10755 SM_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
10756 }
10758 {
10759 SM_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
10760 }
10762 {
10763 SM_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
10764 }
10766 {
10767 SM_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
10768 }
10770 {
10771 SM_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
10772 }
10774 {
10775 SM_DBG1(("ossaSATAEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
10776 }
10777#ifdef REMOVED
10780 {
10781 SM_DBG1(("ossaSATAEvent: DIF related, event 0x%x\n", event));
10782 /* process DIF detail information */
10783 SM_DBG2(("ossaSATAEvent: agIOInfoLen %d\n", agIOInfoLen));
10784 if (agParam == agNULL)
10785 {
10786 SM_DBG2(("ossaSATAEvent: agParam is NULL!!!\n"));
10787 return;
10788 }
10789 if (agIOInfoLen < sizeof(agsaDifDetails_t))
10790 {
10791 SM_DBG2(("ossaSATAEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, (int)sizeof(agsaDifDetails_t)));
10792 return;
10793 }
10794 /* reads agsaDifDetails_t */
10795 saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
10796 frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
10797 frameLen = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16;
10798
10799 SM_DBG2(("ossaSATAEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
10800 SM_DBG2(("ossaSATAEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
10802 SM_DBG2(("ossaSATAEvent: DIF error mask 0x%x Device ID 0x%x\n",
10803 (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
10804 if (frameLen != 0 && frameLen <= 256)
10805 {
10806 saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
10807 smhexdump("ossaSATAEvent frame", framePayload, frameLen);
10808 }
10809 }
10810#endif
10812 {
10813 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
10814 if (smIORequestBody == agNULL)
10815 {
10816 SM_DBG1(("ossaSATAEvent: smIORequestBody is NULL!!!\n"));
10817 return;
10818 }
10819 smDeviceHandle = smIORequestBody->smDevHandle;
10820 if (smDeviceHandle == agNULL)
10821 {
10822 SM_DBG1(("ossaSATAEvent: smDeviceHandle is NULL!!!\n"));
10823 return;
10824 }
10825 oneDeviceData = (smDeviceData_t *)smDeviceHandle->smData;
10826 if (oneDeviceData == agNULL)
10827 {
10828 SM_DBG1(("ossaSATAEvent: oneDeviceData is NULL!!!\n"));
10829 return;
10830 }
10831 SM_DBG1(("ossaSATAEvent: ERROR event %d did=%d\n", event, oneDeviceData->id));
10832
10833
10834 if (smAllShared->FCA)
10835 {
10836 if (oneDeviceData->SMNumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
10837 {
10838 SM_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
10839 oneDeviceData->SMNumOfFCA++;
10840 smPhyControlSend(smRoot,
10841 oneDeviceData,
10843 agNULL,
10844 tdsmRotateQnumber(smRoot, smDeviceHandle)
10845 );
10846 }
10847 else
10848 {
10849 /* given up after one time of SMP HARD RESET; */
10850 SM_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; but giving up sending HARD_RESET!!!\n"));
10851 }
10852 }
10853 }
10854 else if (event == OSSA_IO_XFER_ERROR_NAK_RECEIVED)
10855 {
10856 SM_DBG1(("ossaSATAEvent: OSSA_IO_XFER_ERROR_NAK_RECEIVED\n"));
10857 }
10859 {
10860 SM_DBG1(("ossaSATAEvent: OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT\n"));
10861 }
10862 else
10863 {
10864 SM_DBG1(("ossaSATAEvent: other event 0x%x\n", event));
10865 }
10866
10867 return;
10868}
10869
10870osGLOBAL void
10872 agsaRoot_t *agRoot,
10873 agsaIORequest_t *agIORequest,
10874 bit32 agIOStatus,
10875 bit32 agIOInfoLen,
10876 agsaFrameHandle_t agFrameHandle
10877 )
10878{
10879 smSMPRequestBody_t *smSMPRequestBody = (smSMPRequestBody_t *) agIORequest->osData;
10880
10881 SM_DBG2(("smSMPCompletedCB: start\n"));
10882
10883 if (smSMPRequestBody == agNULL)
10884 {
10885 SM_DBG1(("smSMPCompletedCB: smSMPRequestBody is NULL!!!\n"));
10886 return;
10887 }
10888
10889 if (smSMPRequestBody->SMPCompletionFunc == agNULL)
10890 {
10891 SM_DBG1(("smSMPCompletedCB: smSMPRequestBody->SMPCompletionFunc is NULL!!!\n"));
10892 return;
10893 }
10894
10895 /* calling smSMPCompleted */
10896 smSMPRequestBody->SMPCompletionFunc(
10897 agRoot,
10898 agIORequest,
10899 agIOStatus,
10900 agIOInfoLen,
10901 agFrameHandle
10902 );
10903 return;
10904}
10905
10906osGLOBAL void
10908 agsaRoot_t *agRoot,
10909 agsaIORequest_t *agIORequest,
10910 bit32 agIOStatus,
10911 bit32 agIOInfoLen,
10912 agsaFrameHandle_t agFrameHandle
10913 )
10914{
10915 smRoot_t *smRoot = gsmRoot;
10916 smSMPRequestBody_t *smSMPRequestBody = (smSMPRequestBody_t *) agIORequest->osData;
10917 smDeviceData_t *oneDeviceData;
10918 smDeviceHandle_t *smDeviceHandle;
10919 smIORequest_t *CurrentTaskTag;
10920 bit8 smpHeader[4];
10921 smSMPFrameHeader_t *smSMPFrameHeader;
10922 agsaDevHandle_t *agDevHandle = agNULL;
10923
10924 SM_DBG2(("smSMPCompleted: start\n"));
10925
10926 if (smSMPRequestBody == agNULL)
10927 {
10928 SM_DBG1(("smSMPCompleted: smSMPRequestBody is NULL, wrong!!!\n"));
10929 return;
10930 }
10931
10932 CurrentTaskTag = smSMPRequestBody->CurrentTaskTag;
10933 oneDeviceData = smSMPRequestBody->smDeviceData;
10934 smDeviceHandle = smSMPRequestBody->smDevHandle;
10935 if (smDeviceHandle == agNULL)
10936 {
10937 SM_DBG2(("smSMPCompleted: smDeviceHandle is NULL, wrong!!!\n"));
10938 return;
10939 }
10940
10941 if (oneDeviceData == agNULL)
10942 {
10943 SM_DBG2(("smSMPCompleted: oneDeviceData is NULL, wrong!!!\n"));
10944 return;
10945 }
10946 agDevHandle = oneDeviceData->agExpDevHandle;
10947 if (agIOStatus == OSSA_IO_SUCCESS)
10948 {
10949 saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
10950 smSMPFrameHeader = (smSMPFrameHeader_t *)smpHeader;
10951 if (smSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
10952 {
10953 SM_DBG3(("smSMPCompleted: phy control\n"));
10954 if (agIOInfoLen != 4 &&
10955 smSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) /*zero length is expected */
10956 {
10957 SM_DBG1(("smSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x!!!\n", agIOInfoLen, 4));
10959 smRoot,
10960 smSMPRequestBody->osMemHandle,
10961 sizeof(smSMPRequestBody_t)
10962 );
10963 if (CurrentTaskTag != agNULL)
10964 {
10965 tdsmEventCB(smRoot,
10966 smDeviceHandle,
10968 smTMFailed,
10969 CurrentTaskTag);
10970 }
10971
10972 return;
10973 }
10974 smPhyControlRespRcvd(smRoot,
10975 agRoot,
10976 agIORequest,
10977 oneDeviceData,
10978 smSMPFrameHeader,
10979 agFrameHandle,
10980 CurrentTaskTag
10981 );
10982 }
10983 else
10984 {
10985 /* unknown SMP function */
10986 SM_DBG2(("smSMPCompleted: unknown smSMPFrameHeader %d!!!\n", smSMPFrameHeader->smpFunction));
10988 smRoot,
10989 smSMPRequestBody->osMemHandle,
10990 sizeof(smSMPRequestBody_t)
10991 );
10992 if (CurrentTaskTag != agNULL)
10993 {
10994 tdsmEventCB(smRoot,
10995 smDeviceHandle,
10997 smTMFailed,
10998 CurrentTaskTag);
10999 }
11000 return;
11001 }
11002 }
11003 else
11004 {
11005 SM_DBG2(("smSMPCompleted: failed agIOStatus %d!!!\n", agIOStatus));
11006 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
11012 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL
11013 )
11014 {
11015 SM_DBG1(("smSMPCompleted: setting back to operational\n"));
11016 if (agDevHandle != agNULL)
11017 {
11018 saSetDeviceState(agRoot, agNULL, tdsmRotateQnumber(smRoot, smDeviceHandle), agDevHandle, SA_DS_OPERATIONAL);
11019 }
11020 else
11021 {
11022 SM_DBG1(("smSMPCompleted: agDevHandle is NULL\n"));
11023 }
11024 }
11026 smRoot,
11027 smSMPRequestBody->osMemHandle,
11028 sizeof(smSMPRequestBody_t)
11029 );
11030 if (CurrentTaskTag != agNULL)
11031 {
11032 tdsmEventCB(smRoot,
11033 smDeviceHandle,
11035 smTMFailed,
11036 CurrentTaskTag);
11037 }
11038 return;
11039 }
11040
11042 smRoot,
11043 smSMPRequestBody->osMemHandle,
11044 sizeof(smSMPRequestBody_t)
11045 );
11046 return;
11047}
11048
11049osGLOBAL void
11051 smRoot_t *smRoot,
11052 agsaRoot_t *agRoot,
11053 agsaIORequest_t *agIORequest,
11054 smDeviceData_t *oneDeviceData, /* sata disk */
11055 smSMPFrameHeader_t *frameHeader,
11056 agsaFrameHandle_t frameHandle,
11057 smIORequest_t *CurrentTaskTag
11058 )
11059{
11060 smDeviceData_t *TargetDeviceData = agNULL;
11061 agsaDevHandle_t *agDevHandle = agNULL;
11062 smSMPRequestBody_t *smSMPRequestBody;
11063 smDeviceHandle_t *smDeviceHandle;
11064
11065 SM_DBG2(("smPhyControlRespRcvd: start\n"));
11066
11067 if (CurrentTaskTag == agNULL )
11068 {
11069 SM_DBG1(("smPhyControlRespRcvd: CurrentTaskTag is NULL; allowed\n"));
11070 return;
11071 }
11072
11073 smSMPRequestBody = (smSMPRequestBody_t *)CurrentTaskTag->smData;
11074 if (smSMPRequestBody == agNULL)
11075 {
11076 SM_DBG1(("smPhyControlRespRcvd: smSMPRequestBody is NULL!!!\n"));
11077 return;
11078 }
11079
11080 smDeviceHandle = smSMPRequestBody->smDevHandle;
11081 if (smDeviceHandle == agNULL)
11082 {
11083 SM_DBG2(("smPhyControlRespRcvd: smDeviceHandle is NULL!!!\n"));
11084 return;
11085 }
11086
11087 TargetDeviceData = smSMPRequestBody->smDeviceData;
11088 if (oneDeviceData != TargetDeviceData)
11089 {
11090 SM_DBG1(("smPhyControlRespRcvd: oneDeviceData != TargetDeviceData!!!\n"));
11091 return;
11092 }
11093
11094 agDevHandle = TargetDeviceData->agDevHandle;
11095
11096
11097 if (frameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
11098 {
11099 SM_DBG2(("smPhyControlRespRcvd: SMP success\n"));
11100 SM_DBG1(("smPhyControlRespRcvd: callback to TD layer with success\n"));
11101 TargetDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
11102 saSetDeviceState(agRoot, agNULL, tdsmRotateQnumber(smRoot, smDeviceHandle), agDevHandle, SA_DS_OPERATIONAL);
11103
11104 tdsmEventCB(smRoot,
11105 smDeviceHandle,
11107 smTMOK,
11108 CurrentTaskTag);
11109 }
11110 else
11111 {
11112 SM_DBG1(("smPhyControlRespRcvd: SMP failure; result %d!!!\n", frameHeader->smpFunctionResult));
11113 tdsmEventCB(smRoot,
11114 smDeviceHandle,
11116 smTMFailed,
11117 CurrentTaskTag);
11118 }
11119 return;
11120}
11121
11122osGLOBAL void
11124 agsaRoot_t *agRoot,
11125 agsaIORequest_t *agIORequest,
11126 bit32 agIOStatus,
11127 agsaFisHeader_t *agFirstDword,
11128 bit32 agIOInfoLen,
11129 agsaFrameHandle_t agFrameHandle,
11130 void *ioContext
11131 )
11132{
11133 /* callback for satDeResetDevice */
11134// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11135// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11136// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11137// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11138 smRoot_t *smRoot = agNULL;
11139 smIntRoot_t *smIntRoot = agNULL;
11140 smIntContext_t *smAllShared = agNULL;
11141 smIORequestBody_t *smIORequestBody;
11142 smSatIOContext_t *satIOContext;
11143 smSatIOContext_t *satOrgIOContext;
11144 smSatInternalIo_t *satIntIo;
11145// satDeviceData_t *satDevData;
11146 smDeviceData_t *oneDeviceData;
11147#ifdef TD_DEBUG_ENABLE
11148 bit32 ataStatus = 0;
11149 bit32 ataError;
11150 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
11151#endif
11152 bit32 AbortTM = agFALSE;
11153 smDeviceHandle_t *smDeviceHandle;
11154
11155 SM_DBG1(("smsatCheckPowerModeCB: start\n"));
11156 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
11157 satIOContext = (smSatIOContext_t *) ioContext;
11158 satIntIo = satIOContext->satIntIoContext;
11159 oneDeviceData = satIOContext->pSatDevData;
11160 smRoot = oneDeviceData->smRoot;
11161 smIntRoot = (smIntRoot_t *)smRoot->smData;
11162 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
11163 smDeviceHandle = oneDeviceData->smDevHandle;
11164 if (satIntIo == agNULL)
11165 {
11166 SM_DBG6(("smsatCheckPowerModeCB: External, OS generated\n"));
11167 satOrgIOContext = satIOContext;
11168 }
11169 else
11170 {
11171 SM_DBG6(("smsatCheckPowerModeCB: Internal, TD generated\n"));
11172 satOrgIOContext = satIOContext->satOrgIOContext;
11173 if (satOrgIOContext == agNULL)
11174 {
11175 SM_DBG6(("smsatCheckPowerModeCB: satOrgIOContext is NULL, wrong\n"));
11176 return;
11177 }
11178 else
11179 {
11180 SM_DBG6(("smsatCheckPowerModeCB: satOrgIOContext is NOT NULL\n"));
11181 }
11182 }
11183 smIORequestBody->ioCompleted = agTRUE;
11184 smIORequestBody->ioStarted = agFALSE;
11185 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
11186 {
11187 SM_DBG1(("smsatCheckPowerModeCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
11188 /* TM completed */
11189 tdsmEventCB( smRoot,
11190 smDeviceHandle,
11192 smTMFailed,
11193 oneDeviceData->satTmTaskTag);
11194
11195 oneDeviceData->satTmTaskTag = agNULL;
11196 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11197
11198 smsatFreeIntIoResource( smRoot,
11199 oneDeviceData,
11200 satIntIo);
11201 return;
11202 }
11203
11206 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
11213 )
11214 {
11215 SM_DBG1(("smsatCheckPowerModeCB: OSSA_IO_OPEN_CNX_ERROR!!!\n"));
11216 /* TM completed */
11217 tdsmEventCB( smRoot,
11218 smDeviceHandle,
11220 smTMFailed,
11221 oneDeviceData->satTmTaskTag);
11222 oneDeviceData->satTmTaskTag = agNULL;
11223
11224 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11225 smsatFreeIntIoResource( smRoot,
11226 oneDeviceData,
11227 satIntIo);
11228 return;
11229 }
11230 if (agIOStatus != OSSA_IO_SUCCESS)
11231 {
11232 /* only agsaFisPioSetup_t is expected */
11233#ifdef TD_DEBUG_ENABLE
11234 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
11235 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
11236 ataError = satPIOSetupHeader->error; /* ATA Eror register */
11237#endif
11238 SM_DBG1(("smsatCheckPowerModeCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
11239 /* TM completed */
11240 tdsmEventCB( smRoot,
11241 smDeviceHandle,
11243 smTMFailed,
11244 oneDeviceData->satTmTaskTag);
11245 oneDeviceData->satTmTaskTag = agNULL;
11246 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11247 smsatFreeIntIoResource( smRoot,
11248 oneDeviceData,
11249 satIntIo);
11250 return;
11251 }
11252 /* success */
11253 SM_DBG1(("smsatCheckPowerModeCB: success!!!\n"));
11254 SM_DBG1(("smsatCheckPowerModeCB: TMF %d!!!\n", satOrgIOContext->TMF));
11255
11256 if (satOrgIOContext->TMF == AG_ABORT_TASK)
11257 {
11258 AbortTM = agTRUE;
11259 }
11260 if (AbortTM == agTRUE)
11261 {
11262 SM_DBG1(("smsatCheckPowerModeCB: calling local satAbort!!!\n"));
11263 smsatAbort(smRoot, agRoot, satOrgIOContext->satToBeAbortedIOContext);
11264 }
11265 oneDeviceData->satTmTaskTag = agNULL;
11266 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
11267
11268 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11269
11270 SM_DBG1(("smsatCheckPowerModeCB: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
11271 SM_DBG1(("smsatCheckPowerModeCB: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
11272 smsatFreeIntIoResource( smRoot,
11273 oneDeviceData,
11274 satIntIo);
11275
11276 /* TM completed */
11277 tdsmEventCB( smRoot,
11278 smDeviceHandle,
11280 smTMOK,
11281 oneDeviceData->satTmTaskTag);
11282 SM_DBG5(("smsatCheckPowerModeCB: device %p pending IO %d\n", oneDeviceData, oneDeviceData->satPendingIO));
11283 SM_DBG2(("smsatCheckPowerModeCB: end\n"));
11284 return;
11285}
11286
11287osGLOBAL void
11289 agsaRoot_t *agRoot,
11290 agsaIORequest_t *agIORequest,
11291 bit32 agIOStatus,
11292 agsaFisHeader_t *agFirstDword,
11293 bit32 agIOInfoLen,
11294 agsaFrameHandle_t agFrameHandle,
11295 void *ioContext
11296 )
11297
11298{
11299
11300 smRoot_t *smRoot = agNULL;
11301 smIntRoot_t *smIntRoot = agNULL;
11302 smIntContext_t *smAllShared = agNULL;
11303 smIORequestBody_t *smIORequestBody;
11304 smSatIOContext_t *satIOContext;
11305 smSatIOContext_t *satOrgIOContext;
11306 smSatInternalIo_t *satIntIo;
11307 smIORequest_t *smOrgIORequest;
11308 smIORequestBody_t *smOrgIORequestBody;
11309// satDeviceData_t *satDevData;
11310 smDeviceData_t *oneDeviceData;
11311#ifdef TD_DEBUG_ENABLE
11312 bit32 ataStatus = 0;
11313 bit32 ataError;
11314 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
11315#endif
11316
11317 smScsiRspSense_t *pSense;
11318 bit8 bSenseKey = 0;
11319 bit16 bSenseCodeInfo = 0;
11320
11321 SM_DBG1(("smsatCheckPowerModePassCB: start\n"));
11322 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
11323 satIOContext = (smSatIOContext_t *) ioContext;
11324 satIntIo = satIOContext->satIntIoContext;
11325 oneDeviceData = satIOContext->pSatDevData;
11326 smRoot = oneDeviceData->smRoot;
11327 smIntRoot = (smIntRoot_t *)smRoot->smData;
11328 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
11329
11330 if (satIntIo == agNULL)
11331 {
11332 SM_DBG6(("smsatCheckPowerModePassCB: External, OS generated\n"));
11333 satOrgIOContext = satIOContext;
11334 smOrgIORequest = smIORequestBody->smIORequest;
11335 pSense = satOrgIOContext->pSense;
11336 }
11337 else
11338 {
11339 SM_DBG6(("smsatCheckPowerModePassCB: Internal, TD generated\n"));
11340 satOrgIOContext = satIOContext->satOrgIOContext;
11341 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
11342 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
11343 pSense = satOrgIOContext->pSense;
11344 if (satOrgIOContext == agNULL)
11345 {
11346 SM_DBG6(("smsatCheckPowerModePassCB: satOrgIOContext is NULL, wrong\n"));
11347 return;
11348 }
11349 else
11350 {
11351 SM_DBG6(("smsatCheckPowerModePassCB: satOrgIOContext is NOT NULL\n"));
11352 }
11353 }
11354 smIORequestBody->ioCompleted = agTRUE;
11355 smIORequestBody->ioStarted = agFALSE;
11356 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
11357 {
11358 SM_DBG1(("smsatCheckPowerModePassCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
11359
11361 smRoot,
11362 smOrgIORequest,
11363 smIOFailed,
11365 agNULL,
11366 satOrgIOContext->interruptContext
11367 );
11368 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11369
11370 smsatFreeIntIoResource( smRoot,
11371 oneDeviceData,
11372 satIntIo);
11373 return;
11374
11375 }
11376
11377 if (agIOStatus != OSSA_IO_SUCCESS)
11378 {
11379 /* only agsaFisPioSetup_t is expected */
11380#ifdef TD_DEBUG_ENABLE
11381 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
11382 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
11383 ataError = satPIOSetupHeader->error; /* ATA Eror register */
11384#endif
11385 SM_DBG1(("smsatCheckPowerModePassCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
11386
11387
11388 if (agIOStatus == OSSA_IO_ABORTED)
11389 {
11390 smsatProcessAbort(smRoot,
11391 smOrgIORequest,
11392 satOrgIOContext
11393 );
11394
11395 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11396
11397 smsatFreeIntIoResource( smRoot,
11398 oneDeviceData,
11399 satIntIo);
11400 return;
11401 }
11403 agFirstDword->D2H.status,
11404 agFirstDword->D2H.error,
11405 &bSenseKey,
11406 &bSenseCodeInfo
11407 );
11408 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
11409 tdsmIOCompletedCB(smRoot,
11410 smOrgIORequest,
11413 satOrgIOContext->pSmSenseData,
11414 satOrgIOContext->interruptContext );
11415
11416
11417 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11418
11419 smsatFreeIntIoResource( smRoot,
11420 oneDeviceData,
11421 satIntIo);
11422 return;
11423
11424 }
11425 /* success */
11426 SM_DBG1(("smsatCheckPowerModePassCB: success!!!\n"));
11427
11428 tdsmIOCompletedCB( smRoot,
11429 smOrgIORequest,
11432 agNULL,
11433 satOrgIOContext->interruptContext);
11434
11435
11436 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11437
11438 smsatFreeIntIoResource( smRoot,
11439 oneDeviceData,
11440 satIntIo);
11441
11442
11443 return;
11444}
11445
11446osGLOBAL void
11448 agsaRoot_t *agRoot,
11449 agsaIORequest_t *agIORequest,
11450 bit32 agIOStatus,
11451 agsaFisHeader_t *agFirstDword,
11452 bit32 agIOInfoLen,
11453 agsaFrameHandle_t agFrameHandle,
11454 void *ioContext
11455 )
11456{
11457 smRoot_t *smRoot = agNULL;
11458 smIntRoot_t *smIntRoot = agNULL;
11459 smIntContext_t *smAllShared = agNULL;
11460 smIORequestBody_t *smIORequestBody;
11461 smSatIOContext_t *satIOContext;
11462 smSatIOContext_t *satOrgIOContext;
11463 smSatInternalIo_t *satIntIo;
11464 smIORequest_t *smOrgIORequest;
11465 smIORequestBody_t *smOrgIORequestBody;
11466// satDeviceData_t *satDevData;
11467 smDeviceData_t *oneDeviceData;
11468#ifdef TD_DEBUG_ENABLE
11469 bit32 ataStatus = 0;
11470 bit32 ataError;
11471 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
11472#endif
11473
11474 smScsiRspSense_t *pSense;
11475 bit8 bSenseKey = 0;
11476 bit16 bSenseCodeInfo = 0;
11477
11478 SM_DBG3(("smsatIDDataPassCB: start\n"));
11479 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
11480 satIOContext = (smSatIOContext_t *) ioContext;
11481 satIntIo = satIOContext->satIntIoContext;
11482 oneDeviceData = satIOContext->pSatDevData;
11483 smRoot = oneDeviceData->smRoot;
11484 smIntRoot = (smIntRoot_t *)smRoot->smData;
11485 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
11486
11487 if (satIntIo == agNULL)
11488 {
11489 SM_DBG6(("smsatIDDataPassCB: External, OS generated\n"));
11490 satOrgIOContext = satIOContext;
11491 smOrgIORequest = smIORequestBody->smIORequest;
11492 pSense = satOrgIOContext->pSense;
11493 }
11494 else
11495 {
11496 SM_DBG6(("smsatIDDataPassCB: Internal, TD generated\n"));
11497 satOrgIOContext = satIOContext->satOrgIOContext;
11498 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
11499 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
11500 pSense = satOrgIOContext->pSense;
11501 if (satOrgIOContext == agNULL)
11502 {
11503 SM_DBG6(("smsatIDDataPassCB: satOrgIOContext is NULL, wrong\n"));
11504 return;
11505 }
11506 else
11507 {
11508 SM_DBG6(("smsatIDDataPassCB: satOrgIOContext is NOT NULL\n"));
11509 }
11510 }
11511 smIORequestBody->ioCompleted = agTRUE;
11512 smIORequestBody->ioStarted = agFALSE;
11513 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
11514 {
11515 SM_DBG1(("smsatIDDataPassCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
11516
11518 smRoot,
11519 smOrgIORequest,
11520 smIOFailed,
11522 agNULL,
11523 satOrgIOContext->interruptContext
11524 );
11525 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11526
11527 smsatFreeIntIoResource( smRoot,
11528 oneDeviceData,
11529 satIntIo);
11530 return;
11531
11532 }
11533
11534 if (agIOStatus != OSSA_IO_SUCCESS)
11535 {
11536 /* only agsaFisPioSetup_t is expected */
11537#ifdef TD_DEBUG_ENABLE
11538 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
11539 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
11540 ataError = satPIOSetupHeader->error; /* ATA Eror register */
11541#endif
11542 SM_DBG1(("smsatIDDataPassCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
11543
11544
11545 if (agIOStatus == OSSA_IO_ABORTED)
11546 {
11547 smsatProcessAbort(smRoot,
11548 smOrgIORequest,
11549 satOrgIOContext
11550 );
11551
11552 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11553
11554 smsatFreeIntIoResource( smRoot,
11555 oneDeviceData,
11556 satIntIo);
11557 return;
11558 }
11560 agFirstDword->D2H.status,
11561 agFirstDword->D2H.error,
11562 &bSenseKey,
11563 &bSenseCodeInfo
11564 );
11565 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
11566 tdsmIOCompletedCB(smRoot,
11567 smOrgIORequest,
11570 satOrgIOContext->pSmSenseData,
11571 satOrgIOContext->interruptContext );
11572
11573
11574 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11575
11576 smsatFreeIntIoResource( smRoot,
11577 oneDeviceData,
11578 satIntIo);
11579 return;
11580
11581 }
11582 /* success */
11583 SM_DBG3(("smsatIDDataPassCB: success!!!\n"));
11584
11585 SM_DBG3(("smsatIDDataPassCB: extend 0x%x ck_cond 0x%x sectorCnt07 0x%x\n", satOrgIOContext->extend,
11586 satIOContext->ck_cond, satOrgIOContext->sectorCnt07));
11587 SM_DBG3(("smsatIDDataPassCB: LBAHigh07 0x%x LBAMid07 0x%x LBALow07 0x%x\n", satOrgIOContext->LBAHigh07,
11588 satOrgIOContext->LBAMid07, satOrgIOContext->LBALow07));
11589
11590 if (satIOContext->ck_cond)
11591 {
11592 smsatSetSensePayload( pSense,
11594 satOrgIOContext->sectorCnt07,
11596 satIOContext);
11597
11598 tdsmIOCompletedCB( smRoot,
11599 smOrgIORequest,
11602 satIOContext->pSmSenseData,
11603 satOrgIOContext->interruptContext );
11604 }
11605 else
11606 {
11607 tdsmIOCompletedCB( smRoot,
11608 smOrgIORequest,
11611 agNULL,
11612 satOrgIOContext->interruptContext);
11613 }
11614
11615 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11616
11617 smsatFreeIntIoResource( smRoot,
11618 oneDeviceData,
11619 satIntIo);
11620
11621
11622 return;
11623}
11624
11625osGLOBAL void
11627 agsaRoot_t *agRoot,
11628 agsaIORequest_t *agIORequest,
11629 bit32 agIOStatus,
11630 agsaFisHeader_t *agFirstDword,
11631 bit32 agIOInfoLen,
11632 agsaFrameHandle_t agFrameHandle,
11633 void *ioContext
11634 )
11635{
11636 /* callback for satResetDevice */
11637// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11638// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11639// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11640// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11641 smRoot_t *smRoot = agNULL;
11642 smIntRoot_t *smIntRoot = agNULL;
11643 smIntContext_t *smAllShared = agNULL;
11644 smIORequestBody_t *smIORequestBody;
11645 smIORequestBody_t *smOrgIORequestBody;
11646 smSatIOContext_t *satIOContext;
11647 smSatIOContext_t *satOrgIOContext;
11648 smSatIOContext_t *satNewIOContext;
11649 smSatInternalIo_t *satIntIo;
11650 smSatInternalIo_t *satNewIntIo = agNULL;
11651// satDeviceData_t *satDevData;
11652 smDeviceData_t *oneDeviceData;
11653 smIORequest_t *smOrgIORequest;
11654#ifdef TD_DEBUG_ENABLE
11655 bit32 ataStatus = 0;
11656 bit32 ataError;
11657 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
11658#endif
11659 bit32 status;
11660 smDeviceHandle_t *smDeviceHandle;
11661
11662 SM_DBG1(("smsatResetDeviceCB: start\n"));
11663 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
11664 satIOContext = (smSatIOContext_t *) ioContext;
11665 satIntIo = satIOContext->satIntIoContext;
11666 oneDeviceData = satIOContext->pSatDevData;
11667 smRoot = oneDeviceData->smRoot;
11668 smIntRoot = (smIntRoot_t *)smRoot->smData;
11669 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
11670 smDeviceHandle = oneDeviceData->smDevHandle;
11671
11672 if (satIntIo == agNULL)
11673 {
11674 SM_DBG6(("smsatResetDeviceCB: External, OS generated\n"));
11675 satOrgIOContext = satIOContext;
11676 smOrgIORequest = smIORequestBody->smIORequest;
11677 }
11678 else
11679 {
11680 SM_DBG6(("smsatResetDeviceCB: Internal, TD generated\n"));
11681 satOrgIOContext = satIOContext->satOrgIOContext;
11682 if (satOrgIOContext == agNULL)
11683 {
11684 SM_DBG6(("smsatResetDeviceCB: satOrgIOContext is NULL, wrong\n"));
11685 return;
11686 }
11687 else
11688 {
11689 SM_DBG6(("smsatResetDeviceCB: satOrgIOContext is NOT NULL\n"));
11690 }
11691 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
11692 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
11693 }
11694 smIORequestBody->ioCompleted = agTRUE;
11695 smIORequestBody->ioStarted = agFALSE;
11696 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
11697 {
11698 SM_DBG1(("smsatResetDeviceCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
11699 /* TM completed */
11700 tdsmEventCB( smRoot,
11701 smDeviceHandle,
11703 smTMFailed,
11704 oneDeviceData->satTmTaskTag);
11705 oneDeviceData->satTmTaskTag = agNULL;
11706 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11707 smsatFreeIntIoResource( smRoot,
11708 oneDeviceData,
11709 satIntIo);
11710 return;
11711 }
11714 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
11721 )
11722 {
11723 SM_DBG1(("smsatResetDeviceCB: OSSA_IO_OPEN_CNX_ERROR!!!\n"));
11724 /* TM completed */
11725 tdsmEventCB( smRoot,
11726 smDeviceHandle,
11728 smTMFailed,
11729 oneDeviceData->satTmTaskTag);
11730
11731 oneDeviceData->satTmTaskTag = agNULL;
11732 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11733 smsatFreeIntIoResource( smRoot,
11734 oneDeviceData,
11735 satIntIo);
11736 return;
11737 }
11738 if (agIOStatus != OSSA_IO_SUCCESS)
11739 {
11740 /* only agsaFisPioSetup_t is expected */
11741#ifdef TD_DEBUG_ENABLE
11742 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
11743 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
11744 ataError = satPIOSetupHeader->error; /* ATA Eror register */
11745#endif
11746 SM_DBG1(("smsatResetDeviceCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
11747 /* TM completed */
11748 tdsmEventCB( smRoot,
11749 smDeviceHandle,
11751 smTMFailed,
11752 oneDeviceData->satTmTaskTag);
11753
11754 oneDeviceData->satTmTaskTag = agNULL;
11755 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11756 smsatFreeIntIoResource( smRoot,
11757 oneDeviceData,
11758 satIntIo);
11759 return;
11760 }
11761
11762 /* success */
11763 satNewIntIo = smsatAllocIntIoResource( smRoot,
11764 smOrgIORequest,
11765 oneDeviceData,
11766 0,
11767 satNewIntIo);
11768 if (satNewIntIo == agNULL)
11769 {
11770 oneDeviceData->satTmTaskTag = agNULL;
11771
11772 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11773 /* memory allocation failure */
11774 smsatFreeIntIoResource( smRoot,
11775 oneDeviceData,
11776 satIntIo);
11777 /* TM completed */
11778 tdsmEventCB( smRoot,
11779 smDeviceHandle,
11781 smTMFailed,
11782 oneDeviceData->satTmTaskTag);
11783 SM_DBG1(("smsatResetDeviceCB: momory allocation fails!!!\n"));
11784 return;
11785 } /* end of memory allocation failure */
11786 /*
11787 * Need to initialize all the fields within satIOContext
11788 */
11789 satNewIOContext = smsatPrepareNewIO(
11790 satNewIntIo,
11791 smOrgIORequest,
11792 oneDeviceData,
11793 agNULL,
11794 satOrgIOContext
11795 );
11796 /* send AGSA_SATA_PROTOCOL_SRST_DEASSERT */
11797 status = smsatDeResetDevice(smRoot,
11798 smOrgIORequest,
11799 satOrgIOContext->psmDeviceHandle,
11800 agNULL,
11801 satNewIOContext
11802 );
11803 if (status != SM_RC_SUCCESS)
11804 {
11805 /* TM completed */
11806 tdsmEventCB( smRoot,
11807 smDeviceHandle,
11809 smTMFailed,
11810 oneDeviceData->satTmTaskTag);
11811 /* sending AGSA_SATA_PROTOCOL_SRST_DEASSERT fails */
11812 oneDeviceData->satTmTaskTag = agNULL;
11813
11814 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11815 smsatFreeIntIoResource( smRoot,
11816 oneDeviceData,
11817 satIntIo);
11818
11819 smsatFreeIntIoResource( smRoot,
11820 oneDeviceData,
11821 satNewIntIo);
11822 return;
11823 }
11824// oneDeviceData->satTmTaskTag = agNULL;
11825
11826 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11827
11828 smsatFreeIntIoResource( smRoot,
11829 oneDeviceData,
11830 satIntIo);
11831 SM_DBG5(("smsatResetDeviceCB: device %p pending IO %d\n", oneDeviceData, oneDeviceData->satPendingIO));
11832 SM_DBG6(("smsatResetDeviceCB: end\n"));
11833 return;
11834}
11835
11836osGLOBAL void
11838 agsaRoot_t *agRoot,
11839 agsaIORequest_t *agIORequest,
11840 bit32 agIOStatus,
11841 agsaFisHeader_t *agFirstDword,
11842 bit32 agIOInfoLen,
11843 agsaFrameHandle_t agFrameHandle,
11844 void *ioContext
11845 )
11846{
11847 /* callback for satDeResetDevice */
11848// tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11849// tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11850// tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11851// tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11852 smRoot_t *smRoot = agNULL;
11853 smIntRoot_t *smIntRoot = agNULL;
11854 smIntContext_t *smAllShared = agNULL;
11855 smIORequestBody_t *smIORequestBody;
11856 smSatIOContext_t *satIOContext;
11857 smSatIOContext_t *satOrgIOContext;
11858 smSatInternalIo_t *satIntIo;
11859// satDeviceData_t *satDevData;
11860 smDeviceData_t *oneDeviceData;
11861#ifdef TD_DEBUG_ENABLE
11862 bit32 ataStatus = 0;
11863 bit32 ataError;
11864 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
11865#endif
11866 bit32 AbortTM = agFALSE;
11867 smDeviceHandle_t *smDeviceHandle;
11868
11869 SM_DBG1(("smsatDeResetDeviceCB: start!!!\n"));
11870 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
11871 satIOContext = (smSatIOContext_t *) ioContext;
11872 satIntIo = satIOContext->satIntIoContext;
11873 oneDeviceData = satIOContext->pSatDevData;
11874 smRoot = oneDeviceData->smRoot;
11875 smIntRoot = (smIntRoot_t *)smRoot->smData;
11876 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
11877 smDeviceHandle = oneDeviceData->smDevHandle;
11878 if (satIntIo == agNULL)
11879 {
11880 SM_DBG6(("smsatDeResetDeviceCB: External, OS generated\n"));
11881 satOrgIOContext = satIOContext;
11882 }
11883 else
11884 {
11885 SM_DBG6(("smsatDeResetDeviceCB: Internal, TD generated\n"));
11886 satOrgIOContext = satIOContext->satOrgIOContext;
11887 if (satOrgIOContext == agNULL)
11888 {
11889 SM_DBG6(("smsatDeResetDeviceCB: satOrgIOContext is NULL, wrong\n"));
11890 return;
11891 }
11892 else
11893 {
11894 SM_DBG6(("smsatDeResetDeviceCB: satOrgIOContext is NOT NULL\n"));
11895 }
11896 }
11897 smIORequestBody->ioCompleted = agTRUE;
11898 smIORequestBody->ioStarted = agFALSE;
11899 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
11900 {
11901 SM_DBG1(("smsatDeResetDeviceCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
11902 /* TM completed */
11903 tdsmEventCB( smRoot,
11904 smDeviceHandle,
11906 smTMFailed,
11907 oneDeviceData->satTmTaskTag);
11908 oneDeviceData->satTmTaskTag = agNULL;
11909 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11910 smsatFreeIntIoResource( smRoot,
11911 oneDeviceData,
11912 satIntIo);
11913 return;
11914 }
11915
11918 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
11925 )
11926 {
11927 SM_DBG1(("smsatDeResetDeviceCB: OSSA_IO_OPEN_CNX_ERROR!!!\n"));
11928
11929 /* TM completed */
11930 tdsmEventCB( smRoot,
11931 smDeviceHandle,
11933 smTMFailed,
11934 oneDeviceData->satTmTaskTag);
11935 oneDeviceData->satTmTaskTag = agNULL;
11936 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11937 smsatFreeIntIoResource( smRoot,
11938 oneDeviceData,
11939 satIntIo);
11940 return;
11941 }
11942 if (agIOStatus != OSSA_IO_SUCCESS)
11943 {
11944 /* only agsaFisPioSetup_t is expected */
11945#ifdef TD_DEBUG_ENABLE
11946 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
11947 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
11948 ataError = satPIOSetupHeader->error; /* ATA Eror register */
11949#endif
11950 SM_DBG1(("smsatDeResetDeviceCB: ataStatus 0x%x ataError 0x%x!!!\n", ataStatus, ataError));
11951 /* TM completed */
11952 tdsmEventCB( smRoot,
11953 smDeviceHandle,
11955 smTMFailed,
11956 oneDeviceData->satTmTaskTag);
11957 oneDeviceData->satTmTaskTag = agNULL;
11958 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11959 smsatFreeIntIoResource( smRoot,
11960 oneDeviceData,
11961 satIntIo);
11962 return;
11963 }
11964
11965 /* success */
11966 SM_DBG1(("smsatDeResetDeviceCB: success !!!\n"));
11967 SM_DBG1(("smsatDeResetDeviceCB: TMF %d!!!\n", satOrgIOContext->TMF));
11968
11969 if (satOrgIOContext->TMF == AG_ABORT_TASK)
11970 {
11971 AbortTM = agTRUE;
11972 }
11973 if (AbortTM == agTRUE)
11974 {
11975 SM_DBG1(("smsatDeResetDeviceCB: calling satAbort!!!\n"));
11976 smsatAbort(smRoot, agRoot, satOrgIOContext->satToBeAbortedIOContext);
11977 }
11978 oneDeviceData->satTmTaskTag = agNULL;
11979 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
11980 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
11981
11982 SM_DBG1(("smsatDeResetDeviceCB: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
11983 SM_DBG1(("smsatDeResetDeviceCB: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
11984 smsatFreeIntIoResource( smRoot, oneDeviceData, satIntIo );
11985
11986 /* TM completed */
11987 tdsmEventCB( smRoot,
11988 smDeviceHandle,
11990 smTMOK,
11991 oneDeviceData->satTmTaskTag);
11992 SM_DBG5(("smsatDeResetDeviceCB: device %p pending IO %d\n", oneDeviceData, oneDeviceData->satPendingIO));
11993 SM_DBG6(("smsatDeResetDeviceCB: end\n"));
11994 return;
11995}
11996
11997osGLOBAL void
11999 agsaRoot_t *agRoot,
12000 agsaIORequest_t *agIORequest,
12001 bit32 flag,
12003 )
12004{
12005 smRoot_t *smRoot = gsmRoot;
12006 smIORequestBody_t *smIORequestBody = agNULL;
12007 smSatIOContext_t *satIOContext;
12008 smDeviceHandle_t *smDeviceHandle;
12009 smDeviceData_t *oneDeviceData = agNULL;
12010
12011 SM_DBG1(("smaSATAAbortCB: start\n"));
12012
12013 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
12014 if (smIORequestBody == agNULL)
12015 {
12016 SM_DBG1(("smaSATAAbortCB: smIORequestBody is NULL!!! \n"));
12017 return;
12018 }
12019
12020 satIOContext = &(smIORequestBody->transport.SATA.satIOContext);
12021 if (satIOContext == agNULL)
12022 {
12023 SM_DBG1(("smaSATAAbortCB: satIOContext is NULL!!! \n"));
12024 if (smIORequestBody->IOType.InitiatorTMIO.osMemHandle != agNULL)
12025 {
12026 tdsmFreeMemory(smRoot,
12027 smIORequestBody->IOType.InitiatorTMIO.osMemHandle,
12028 sizeof(smIORequestBody_t)
12029 );
12030 }
12031 return;
12032 }
12033
12034 smDeviceHandle = smIORequestBody->smDevHandle;
12035 if (smDeviceHandle == agNULL)
12036 {
12037 SM_DBG1(("smaSATAAbortCB: smDeviceHandle is NULL!!!\n"));
12038 if (smIORequestBody->IOType.InitiatorTMIO.osMemHandle != agNULL)
12039 {
12040 tdsmFreeMemory(smRoot,
12041 smIORequestBody->IOType.InitiatorTMIO.osMemHandle,
12042 sizeof(smIORequestBody_t)
12043 );
12044 }
12045 return;
12046 }
12047
12048 oneDeviceData = (smDeviceData_t *)smDeviceHandle->smData;
12049 if (oneDeviceData == agNULL)
12050 {
12051 SM_DBG1(("smaSATAAbortCB: oneDeviceData is NULL!!!\n"));
12052 if (smIORequestBody->IOType.InitiatorTMIO.osMemHandle != agNULL)
12053 {
12054 tdsmFreeMemory(smRoot,
12055 smIORequestBody->IOType.InitiatorTMIO.osMemHandle,
12056 sizeof(smIORequestBody_t)
12057 );
12058 }
12059
12060 return;
12061 }
12062
12063 if (flag == 2)
12064 {
12065 /* abort per port */
12066 SM_DBG1(("smaSATAAbortCB: abort per port, not yet!!!\n"));
12067 }
12068 else if (flag == 1)
12069 {
12070 SM_DBG1(("smaSATAAbortCB: abort all!!!\n"));
12071 if (oneDeviceData->OSAbortAll == agTRUE)
12072 {
12073 oneDeviceData->OSAbortAll = agFALSE;
12074#if 0
12076 agNULL,
12079 tiAbortOK,
12080 agNULL);
12081#endif
12082#if 1
12083 tdsmEventCB( smRoot,
12084 smDeviceHandle,
12086 smTMOK,
12087 agNULL);
12088#endif
12089
12090 }
12091 if (smIORequestBody->IOType.InitiatorTMIO.osMemHandle != agNULL)
12092 {
12093 tdsmFreeMemory(smRoot,
12094 smIORequestBody->IOType.InitiatorTMIO.osMemHandle,
12095 sizeof(smIORequestBody_t)
12096 );
12097 }
12098 }
12099 else if (flag == 0)
12100 {
12101 SM_DBG1(("smaSATAAbortCB: abort one\n"));
12102 if (status == OSSA_IO_SUCCESS)
12103 {
12104 SM_DBG1(("smaSATAAbortCB: OSSA_IO_SUCCESS\n"));
12105 }
12106 else if (status == OSSA_IO_NOT_VALID)
12107 {
12108 SM_DBG1(("smaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
12109 }
12110 else if (status == OSSA_IO_NO_DEVICE)
12111 {
12112 SM_DBG1(("smaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
12113 }
12115 {
12116 SM_DBG1(("smaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
12117 }
12118#ifdef REMOVED
12119 else if (status == OSSA_IO_ABORT_DELAYED)
12120 {
12121 SM_DBG1(("smaSATAAbortCB: OSSA_IO_ABORT_DELAYED\n"));
12122 }
12123#endif
12124 else
12125 {
12126 SM_DBG1(("smaSATAAbortCB: unspecified status 0x%x\n", status ));
12127 }
12128 if (smIORequestBody->IOType.InitiatorTMIO.osMemHandle != agNULL)
12129 {
12130 tdsmFreeMemory(smRoot,
12131 smIORequestBody->IOType.InitiatorTMIO.osMemHandle,
12132 sizeof(smIORequestBody_t)
12133 );
12134 }
12135 }
12136 else
12137 {
12138 SM_DBG1(("smaSATAAbortCB: wrong flag %d\n", flag));
12139 }
12140
12141 return;
12142}
12143
12144osGLOBAL void
12146 agsaRoot_t *agRoot,
12147 agsaContext_t *agContext,
12148 bit32 phyId,
12149 bit32 phyOperation,
12150 bit32 status,
12151 void *parm
12152 )
12153{
12154 smRoot_t *smRoot = gsmRoot;
12155 smIORequestBody_t *smIORequestBody = agNULL;
12156 smDeviceHandle_t *smDeviceHandle;
12157 smDeviceData_t *oneDeviceData = agNULL;
12158 smIORequest_t *currentTaskTag;
12159 agsaDevHandle_t *agDevHandle = agNULL;
12160
12161 SM_DBG1(("smLocalPhyControlCB: start phyId 0x%x phyOperation 0x%x status 0x%x\n",phyId,phyOperation,status));
12162
12163 if (agContext == agNULL)
12164 {
12165 SM_DBG1(("smLocalPhyControlCB: agContext is NULL!!!\n"));
12166 return;
12167 }
12168 currentTaskTag = (smIORequest_t *)agContext->osData;
12169 if (currentTaskTag == agNULL)
12170 {
12171 SM_DBG1(("smLocalPhyControlCB: currentTaskTag is NULL!!!\n"));
12172 return;
12173 }
12174 smIORequestBody = (smIORequestBody_t *)currentTaskTag->smData;
12175 if (smIORequestBody == agNULL)
12176 {
12177 SM_DBG1(("smLocalPhyControlCB: smIORequestBody is NULL!!!\n"));
12178 return;
12179 }
12180 smDeviceHandle = smIORequestBody->smDevHandle;
12181 if (smDeviceHandle == agNULL)
12182 {
12183 SM_DBG1(("smLocalPhyControlCB: smDeviceHandle is NULL!!!\n"));
12184 return;
12185 }
12186 oneDeviceData = (smDeviceData_t *)smDeviceHandle->smData;
12187 if (oneDeviceData == agNULL)
12188 {
12189 SM_DBG1(("smLocalPhyControlCB: oneDeviceData is NULL!!!\n"));
12190 return;
12191 }
12192 switch (phyOperation)
12193 {
12194 case AGSA_PHY_LINK_RESET: /* fall through */
12196 if (status == OSSA_SUCCESS)
12197 {
12198 SM_DBG2(("smLocalPhyControlCB: callback to TD layer with success\n"));
12199 agDevHandle = oneDeviceData->agDevHandle;
12200 SM_DBG2(("smLocalPhyControlCB: satPendingIO %d satNCQMaxIO %d\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
12201 SM_DBG1(("smLocalPhyControlCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
12202 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
12203#ifdef REMOVED
12204 saSetDeviceState(agRoot,
12205 agNULL,
12206 tdsmRotateQnumber(smRoot, smDeviceHandle),
12207 agDevHandle,
12209 );
12210 /* TM completed */
12211 tdsmEventCB( smRoot,
12212 smDeviceHandle,
12214 smTMOK,
12215 currentTaskTag);
12216#endif
12217 }
12218 else
12219 {
12220 SM_DBG1(("smLocalPhyControlCB: callback to TD layer with failure!!!\n"));
12221 /* TM completed */
12222 tdsmEventCB( smRoot,
12223 smDeviceHandle,
12225 smTMFailed,
12226 currentTaskTag);
12227 }
12228 break;
12229 default:
12230 SM_DBG1(("ossaLocalPhyControlCB: error default case. phyOperation is %d!!!\n", phyOperation));
12231 /* TM completed */
12232 tdsmEventCB( smRoot,
12233 smDeviceHandle,
12235 smTMFailed,
12236 currentTaskTag);
12237 break;
12238 }
12239 return;
12240}
12241
12242osGLOBAL void
12244 agsaRoot_t *agRoot,
12245 agsaIORequest_t *agIORequest,
12246 bit32 agIOStatus,
12247 agsaFisHeader_t *agFirstDword,
12248 bit32 agIOInfoLen,
12249 void *agParam,
12250 void *ioContext
12251 )
12252{
12253 smRoot_t *smRoot = agNULL;
12254 smIntRoot_t *smIntRoot = agNULL;
12255 smIntContext_t *smAllShared = agNULL;
12256 smIORequestBody_t *smIORequestBody;
12257 smIORequestBody_t *smOrgIORequestBody = agNULL;
12258 smSatIOContext_t *satIOContext;
12259 smSatIOContext_t *satOrgIOContext;
12260 smSatInternalIo_t *satIntIo;
12261 smDeviceData_t *oneDeviceData;
12262 smIORequest_t *smOrgIORequest;
12263 smDeviceHandle_t *smDeviceHandle;
12264 smIORequest_t *smIORequest;
12265 bit32 ataStatus = 0;
12266 bit32 ataError = 0;
12267 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
12268
12269 SM_DBG2(("smsatSetFeaturesAACB: start\n"));
12270 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
12271 satIOContext = (smSatIOContext_t *) ioContext;
12272 if (satIOContext == agNULL)
12273 {
12274 SM_DBG1(("smsatSetFeaturesAACB: satIOContext is NULL\n"));
12275 return;
12276 }
12277 satIntIo = satIOContext->satIntIoContext;
12278 oneDeviceData = satIOContext->pSatDevData;
12279 smDeviceHandle = satIOContext->psmDeviceHandle;
12280 smRoot = oneDeviceData->smRoot;
12281 smIntRoot = (smIntRoot_t *)smRoot->smData;
12282 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
12283 if (satIntIo == agNULL)
12284 {
12285 SM_DBG5(("smsatSetFeaturesAACB: External smSatInternalIo_t satIntIoContext\n"));
12286 satOrgIOContext = satIOContext;
12287 smOrgIORequest = smIORequestBody->smIORequest;
12288 smIORequest = smOrgIORequest;
12289 }
12290 else
12291 {
12292 SM_DBG5(("smsatSetFeaturesAACB: Internal smSatInternalIo_t satIntIoContext\n"));
12293 satOrgIOContext = satIOContext->satOrgIOContext;
12294 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
12295 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
12296 }
12297 smIORequest = smOrgIORequestBody->smIORequest;
12298 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
12299 smIORequestBody->ioCompleted = agTRUE;
12300 smIORequestBody->ioStarted = agFALSE;
12301 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
12302 {
12303 SM_DBG1(("smsatSetFeaturesAACB: fail, case 1 agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
12304 }
12305 if (agIOStatus != OSSA_IO_SUCCESS)
12306 {
12307 SM_DBG1(("smsatSetFeaturesAACB: fail, case 2 status %d!!!\n", agIOStatus));
12308 }
12309 if (agIOInfoLen != 0 && agIOStatus == OSSA_IO_SUCCESS)
12310 {
12311 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
12312 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
12313 ataError = statDevToHostFisHeader->error; /* ATA Eror register */
12314 if ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
12315 {
12316 SM_DBG1(("smsatSetFeaturesAACB: fail, case 3 ataStatus %d ataError %d!!!\n", ataStatus, ataError));
12317 }
12318 if (ataError != 0)
12319 {
12320 SM_DBG1(("smsatSetFeaturesAACB: fail, case 4 ataStatus %d ataError %d!!!\n", ataStatus, ataError));
12321 }
12322 }
12323 /* interal structure free */
12324 smsatFreeIntIoResource(smRoot,oneDeviceData, satIntIo);
12325 if (smIORequest->tdData == smIORequest->smData)
12326 {
12327 SM_DBG1(("smsatSetFeaturesAACB: the same tdData and smData error!\n"));
12328 }
12329 /*Complete this identify device IO */
12330 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12331 SM_DBG2(("smsatSetFeaturesAACB: end\n"));
12332}
12333
12334/*****************************************************************************
12335*! \brief smsatSetFeaturesDMACB
12336*
12337* This routine is a callback function called from smllSATACompleted().
12338* This CB routine deals with normal non-chained data I/O SATA request.
12339*
12340* \param agRoot: Handles for this instance of SAS/SATA hardware
12341* \param agIORequest: Pointer to the LL I/O request context for this I/O.
12342* \param agIOStatus: Status of completed I/O.
12343* \param agFirstDword:Pointer to the four bytes of FIS.
12344* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
12345* length.
12346* \param agParam: Additional info based on status.
12347* \param ioContext: Pointer to smSatIOContext_t.
12348*
12349* \return: none
12350*
12351*****************************************************************************/
12352osGLOBAL void
12354 agsaRoot_t *agRoot,
12355 agsaIORequest_t *agIORequest,
12356 bit32 agIOStatus,
12357 agsaFisHeader_t *agFirstDword,
12358 bit32 agIOInfoLen,
12359 void *agParam,
12360 void *ioContext
12361 )
12362{
12363 smRoot_t *smRoot = agNULL;
12364 smIntRoot_t *smIntRoot = agNULL;
12365 smIntContext_t *smAllShared = agNULL;
12366 smIORequestBody_t *smIORequestBody;
12367 smIORequestBody_t *smOrgIORequestBody = agNULL;
12368 smSatIOContext_t *satIOContext;
12369 smSatIOContext_t *satOrgIOContext;
12370 smSatIOContext_t *satNewIOContext;
12371 smSatInternalIo_t *satIntIo;
12372 smSatInternalIo_t *satNewIntIo = agNULL;
12373 smDeviceData_t *oneDeviceData;
12374 smIniScsiCmnd_t *scsiCmnd;
12375 smIORequest_t *smOrgIORequest;
12376 smDeviceHandle_t *smDeviceHandle;
12378 smIORequest_t *smIORequest;
12379
12380 SM_DBG2(("smsatSetFeaturesDMACB: start\n"));
12381 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
12382 satIOContext = (smSatIOContext_t *) ioContext;
12383 if (satIOContext == agNULL)
12384 {
12385 SM_DBG1(("smsatSetFeaturesDMACB: satIOContext is NULL\n"));
12386 return;
12387 }
12388 satIntIo = satIOContext->satIntIoContext;
12389 oneDeviceData = satIOContext->pSatDevData;
12390 smDeviceHandle = satIOContext->psmDeviceHandle;
12391 smRoot = oneDeviceData->smRoot;
12392 smIntRoot = (smIntRoot_t *)smRoot->smData;
12393 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
12394 if (satIntIo == agNULL)
12395 {
12396 SM_DBG2(("smsatSetFeaturesDMACB: External smSatInternalIo_t satIntIoContext\n"));
12397 satOrgIOContext = satIOContext;
12398 smOrgIORequest = smIORequestBody->smIORequest;
12399 scsiCmnd = satIOContext->pScsiCmnd;
12400 }
12401 else
12402 {
12403 SM_DBG2(("smsatSetFeaturesDMACB: Internal smSatInternalIo_t satIntIoContext\n"));
12404 satOrgIOContext = satIOContext->satOrgIOContext;
12405 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
12406 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
12407 scsiCmnd = satOrgIOContext->pScsiCmnd;
12408 }
12409 smIORequest = smOrgIORequestBody->smIORequest;
12410 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
12411 smIORequestBody->ioCompleted = agTRUE;
12412 smIORequestBody->ioStarted = agFALSE;
12413
12414 oneDeviceData->satDMAEnabled = agTRUE;
12415 /* interal structure free */
12417 oneDeviceData,
12418 satIntIo);
12419
12420 if (smIORequest->tdData == smIORequest->smData)
12421 {
12422 SM_DBG1(("smsatSetFeaturesDMACB: the same tdData and smData error!\n"));
12423 }
12424 SM_DBG2(("smsatSetFeaturesDMACB: agIOStatus 0x%x\n", agIOStatus));
12425 /* check the agIOStatus */
12426 if (agIOStatus == OSSA_IO_ABORTED ||
12427 agIOStatus == OSSA_IO_NO_DEVICE ||
12428 agIOStatus == OSSA_IO_PORT_IN_RESET ||
12429 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL ||
12430 agIOStatus == OSSA_IO_DS_IN_RECOVERY ||
12431 agIOStatus == OSSA_IO_DS_IN_ERROR ||
12432 agIOStatus == OSSA_IO_DS_INVALID
12433 )
12434 {
12435 SM_DBG1(("smsatSetFeaturesDMACB: error status 0x%x\n", agIOStatus));
12436 SM_DBG1(("smsatSetFeaturesDMACB: did %d!!!\n", oneDeviceData->id));
12437 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12438 return;
12439 }
12440 if (oneDeviceData->satDeviceType == SATA_ATAPI_DEVICE)
12441 {
12442 /*if ATAPI device, only need to enable PIO and DMA transfer mode, then complete this identify device command */
12443 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12444 return;
12445 }
12446
12447 /* enble read look-ahead feature*/
12448 if (oneDeviceData->satReadLookAheadSupport == agTRUE)
12449 {
12450 satNewIntIo = smsatAllocIntIoResource(smRoot,
12451 smOrgIORequest,
12452 oneDeviceData,
12453 0,
12454 satNewIntIo);
12455 if (satNewIntIo == agNULL)
12456 {
12457 SM_DBG1(("smsatSetFeaturesDMACB: memory allocation fails\n"));
12458 /*Complete this identify packet device IO */
12459 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12460 return;
12461 } /* end memory allocation */
12462
12463 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
12464 smOrgIORequest,
12465 oneDeviceData,
12466 scsiCmnd,
12467 satOrgIOContext
12468 );
12469 /* sends SET FEATURES command to enable Read Look-Ahead */
12471 &satNewIntIo->satIntSmIORequest,
12472 satNewIOContext->psmDeviceHandle,
12473 &satNewIntIo->satIntSmScsiXchg,
12474 satNewIOContext
12475 );
12476 if (status != SM_RC_SUCCESS)
12477 {
12478 smsatFreeIntIoResource(smRoot, oneDeviceData, satNewIntIo);
12479 SM_DBG1(("smsatSetFeaturesDMACB: failed to call smsatSetFeatures()\n"));
12480 /*Complete this identify device IO */
12481 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12482 }
12483 SM_DBG2(("smsatSetFeaturesDMACB: end\n"));
12484 return;
12485 }
12486 /* enble Volatile Write Cache feature*/
12487 if (oneDeviceData->satVolatileWriteCacheSupport == agTRUE)
12488 {
12489 satNewIntIo = smsatAllocIntIoResource(smRoot,
12490 smOrgIORequest,
12491 oneDeviceData,
12492 0,
12493 satNewIntIo);
12494 if (satNewIntIo == agNULL)
12495 {
12496 SM_DBG1(("smsatSetFeaturesDMACB: memory allocation fails\n"));
12497 /*Complete this identify packet device IO */
12498 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12499 return;
12500 } /* end memory allocation */
12501 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
12502 smOrgIORequest,
12503 oneDeviceData,
12504 scsiCmnd,
12505 satOrgIOContext
12506 );
12507 /* sends SET FEATURES command to enable Volatile Write Cache */
12509 &satNewIntIo->satIntSmIORequest,
12510 satNewIOContext->psmDeviceHandle,
12511 &satNewIntIo->satIntSmScsiXchg,
12512 satNewIOContext
12513 );
12514 if (status != SM_RC_SUCCESS)
12515 {
12516 smsatFreeIntIoResource(smRoot, oneDeviceData, satNewIntIo);
12517 SM_DBG1(("smsatSetFeaturesDMACB: failed to call smsatSetFeatures()\n"));
12518 /*Complete this identify device IO */
12519 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12520 }
12521 SM_DBG2(("smsatSetFeaturesDMACB: end\n"));
12522 return;
12523 }
12524 /* turn on DMA Setup FIS auto-activate by sending set feature FIS */
12525 if (oneDeviceData->satNCQ == agTRUE && oneDeviceData->satDMASetupAA == agTRUE)
12526 {
12527 satNewIntIo = smsatAllocIntIoResource( smRoot,
12528 smOrgIORequest,
12529 oneDeviceData,
12530 0,
12531 satNewIntIo);
12532
12533 if (satNewIntIo == agNULL)
12534 {
12535 SM_DBG1(("smsatSetFeaturesDMACB: momory allocation fails; can't send set feature\n"));
12536 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12537 return;
12538 } /* end memory allocation */
12539 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
12540 smOrgIORequest,
12541 oneDeviceData,
12542 agNULL,
12543 satOrgIOContext
12544 );
12545 /* send the Set Feature ATA command to SATA device for enable DMA Setup FIS auto-activate */
12546 status = smsatSetFeaturesAA(smRoot,
12547 &satNewIntIo->satIntSmIORequest,
12548 satNewIOContext->psmDeviceHandle,
12549 &satNewIntIo->satIntSmScsiXchg, /* orginal from OS layer */
12550 satNewIOContext);
12551 if (status != SM_RC_SUCCESS)
12552 {
12553 SM_DBG1(("smsatSetFeaturesDMACB: failed to send set feature!!!\n"));
12554 smsatFreeIntIoResource( smRoot,
12555 oneDeviceData,
12556 satNewIntIo);
12557 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
12558 }
12559 }
12560 else
12561 {
12562 /*Complete this identify device IO */
12563 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12564 }
12565 SM_DBG2(("smsatSetFeaturesDMACB: end\n"));
12566}
12567
12568/*****************************************************************************
12569*! \brief smsatSetFeaturesReadLookAheadCB
12570*
12571* This routine is a callback function called from smllSATACompleted().
12572* This CB routine deals with normal non-chained data I/O SATA request.
12573*
12574* \param agRoot: Handles for this instance of SAS/SATA hardware
12575* \param agIORequest: Pointer to the LL I/O request context for this I/O.
12576* \param agIOStatus: Status of completed I/O.
12577* \param agFirstDword:Pointer to the four bytes of FIS.
12578* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
12579* length.
12580* \param agParam: Additional info based on status.
12581* \param ioContext: Pointer to smSatIOContext_t.
12582*
12583* \return: none
12584*
12585*****************************************************************************/
12586osGLOBAL void
12588 agsaRoot_t *agRoot,
12589 agsaIORequest_t *agIORequest,
12590 bit32 agIOStatus,
12591 agsaFisHeader_t *agFirstDword,
12592 bit32 agIOInfoLen,
12593 void *agParam,
12594 void *ioContext
12595 )
12596{
12597 smRoot_t *smRoot = agNULL;
12598 smIntRoot_t *smIntRoot = agNULL;
12599 smIntContext_t *smAllShared = agNULL;
12600 smIORequestBody_t *smIORequestBody;
12601 smIORequestBody_t *smOrgIORequestBody = agNULL;
12602 smSatIOContext_t *satIOContext;
12603 smSatIOContext_t *satOrgIOContext;
12604 smSatIOContext_t *satNewIOContext;
12605 smSatInternalIo_t *satIntIo;
12606 smSatInternalIo_t *satNewIntIo = agNULL;
12607 smDeviceData_t *oneDeviceData;
12608 smIniScsiCmnd_t *scsiCmnd;
12609 smIORequest_t *smOrgIORequest;
12610 smDeviceHandle_t *smDeviceHandle;
12612 smIORequest_t *smIORequest;
12613
12614 SM_DBG2(("smsatSetFeaturesReadLookAheadCB: start\n"));
12615 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
12616 satIOContext = (smSatIOContext_t *) ioContext;
12617 if (satIOContext == agNULL)
12618 {
12619 SM_DBG1(("smsatSetFeaturesReadLookAheadCB: satIOContext is NULL\n"));
12620 return;
12621 }
12622 satIntIo = satIOContext->satIntIoContext;
12623 oneDeviceData = satIOContext->pSatDevData;
12624 smDeviceHandle = satIOContext->psmDeviceHandle;
12625 smRoot = oneDeviceData->smRoot;
12626 smIntRoot = (smIntRoot_t *)smRoot->smData;
12627 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
12628
12629 if (satIntIo == agNULL)
12630 {
12631 SM_DBG2(("smsatSetFeaturesReadLookAheadCB: External smSatInternalIo_t satIntIoContext\n"));
12632 satOrgIOContext = satIOContext;
12633 smOrgIORequest = smIORequestBody->smIORequest;
12634 scsiCmnd = satIOContext->pScsiCmnd;
12635 }
12636 else
12637 {
12638 SM_DBG2(("smsatSetFeaturesReadLookAheadCB: Internal smSatInternalIo_t satIntIoContext\n"));
12639 satOrgIOContext = satIOContext->satOrgIOContext;
12640 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
12641 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
12642 scsiCmnd = satOrgIOContext->pScsiCmnd;
12643 }
12644 smIORequest = smOrgIORequestBody->smIORequest;
12645 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
12646
12647 smIORequestBody->ioCompleted = agTRUE;
12648 smIORequestBody->ioStarted = agFALSE;
12649
12650 oneDeviceData->satLookAheadEnabled = agTRUE;
12651
12652 /* interal structure free */
12654 oneDeviceData,
12655 satIntIo);
12656
12657 /* check the agIOStatus */
12658 if (agIOStatus == OSSA_IO_ABORTED ||
12659 agIOStatus == OSSA_IO_NO_DEVICE ||
12660 agIOStatus == OSSA_IO_PORT_IN_RESET ||
12661 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL ||
12662 agIOStatus == OSSA_IO_DS_IN_RECOVERY ||
12663 agIOStatus == OSSA_IO_DS_IN_ERROR ||
12664 agIOStatus == OSSA_IO_DS_INVALID
12665 )
12666 {
12667 SM_DBG1(("smsatSetFeaturesReadLookAheadCB: error status 0x%x\n", agIOStatus));
12668 SM_DBG1(("smsatSetFeaturesReadLookAheadCB: did %d!!!\n", oneDeviceData->id));
12669 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12670 return;
12671 }
12672
12673
12674
12675 /* enble Volatile Write Cache feature*/
12676 if (oneDeviceData->satVolatileWriteCacheSupport == agTRUE)
12677 {
12678 satNewIntIo = smsatAllocIntIoResource(smRoot,
12679 smOrgIORequest,
12680 oneDeviceData,
12681 0,
12682 satNewIntIo);
12683 if (satNewIntIo == agNULL)
12684 {
12685 SM_DBG1(("smsatSetFeaturesReadLookAheadCB: memory allocation fails\n"));
12686 /*Complete this identify packet device IO */
12687 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12688 return;
12689 } /* end memory allocation */
12690
12691 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
12692 smOrgIORequest,
12693 oneDeviceData,
12694 scsiCmnd,
12695 satOrgIOContext
12696 );
12697 /* sends SET FEATURES command to enable Volatile Write Cache */
12699 &satNewIntIo->satIntSmIORequest,
12700 satNewIOContext->psmDeviceHandle,
12701 &satNewIntIo->satIntSmScsiXchg,
12702 satNewIOContext
12703 );
12704 if (status != SM_RC_SUCCESS)
12705 {
12706 smsatFreeIntIoResource(smRoot, oneDeviceData, satNewIntIo);
12707 SM_DBG1(("smsatSetFeaturesReadLookAheadCB: failed to call smsatSetFeatures()\n"));
12708 /*Complete this identify device IO */
12709 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12710 }
12711 SM_DBG2(("smsatSetFeaturesReadLookAheadCB: end\n"));
12712
12713 return;
12714 }
12715
12716 /* turn on DMA Setup FIS auto-activate by sending set feature FIS */
12717 if (oneDeviceData->satNCQ == agTRUE && oneDeviceData->satDMASetupAA == agTRUE)
12718 {
12719 satNewIntIo = smsatAllocIntIoResource( smRoot,
12720 smOrgIORequest,
12721 oneDeviceData,
12722 0,
12723 satNewIntIo);
12724
12725 if (satNewIntIo == agNULL)
12726 {
12727 SM_DBG1(("smsatSetFeaturesReadLookAheadCB: momory allocation fails; can't send set feature\n"));
12728 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12729 return;
12730 } /* end memory allocation */
12731
12732 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
12733 smOrgIORequest,
12734 oneDeviceData,
12735 agNULL,
12736 satOrgIOContext
12737 );
12738 /* send the Set Feature ATA command to SATA device for enable DMA Setup FIS auto-activate */
12739 status = smsatSetFeaturesAA(smRoot,
12740 &satNewIntIo->satIntSmIORequest,
12741 satNewIOContext->psmDeviceHandle,
12742 &satNewIntIo->satIntSmScsiXchg, /* orginal from OS layer */
12743 satNewIOContext);
12744
12745 if (status != SM_RC_SUCCESS)
12746 {
12747 SM_DBG1(("smsatSetFeaturesReadLookAheadCB: failed to send set feature!!!\n"));
12748 smsatFreeIntIoResource( smRoot,
12749 oneDeviceData,
12750 satNewIntIo);
12751 /* clean up TD layer's IORequestBody */
12752 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
12753 }
12754 }
12755 else
12756 {
12757 /*Complete this identify device IO */
12758 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12759 }
12760 SM_DBG2(("smsatSetFeaturesReadLookAheadCB: end\n"));
12761}
12762/*****************************************************************************
12763*! \brief smsatSetFeaturesVolatileWriteCacheCB
12764*
12765* This routine is a callback function called from smllSATACompleted().
12766* This CB routine deals with normal non-chained data I/O SATA request.
12767*
12768* \param agRoot: Handles for this instance of SAS/SATA hardware
12769* \param agIORequest: Pointer to the LL I/O request context for this I/O.
12770* \param agIOStatus: Status of completed I/O.
12771* \param agFirstDword:Pointer to the four bytes of FIS.
12772* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
12773* length.
12774* \param agParam: Additional info based on status.
12775* \param ioContext: Pointer to smSatIOContext_t.
12776*
12777* \return: none
12778*
12779*****************************************************************************/
12780osGLOBAL void
12782 agsaRoot_t *agRoot,
12783 agsaIORequest_t *agIORequest,
12784 bit32 agIOStatus,
12785 agsaFisHeader_t *agFirstDword,
12786 bit32 agIOInfoLen,
12787 void *agParam,
12788 void *ioContext
12789 )
12790{
12791 smRoot_t *smRoot = agNULL;
12792 smIntRoot_t *smIntRoot = agNULL;
12793 smIntContext_t *smAllShared = agNULL;
12794 smIORequestBody_t *smIORequestBody;
12795 smIORequestBody_t *smOrgIORequestBody = agNULL;
12796 smSatIOContext_t *satIOContext;
12797 smSatIOContext_t *satOrgIOContext;
12798 smSatIOContext_t *satNewIOContext;
12799 smSatInternalIo_t *satIntIo;
12800 smSatInternalIo_t *satNewIntIo = agNULL;
12801 smDeviceData_t *oneDeviceData;
12802 smIORequest_t *smOrgIORequest;
12803 smDeviceHandle_t *smDeviceHandle;
12804 smIORequest_t *smIORequest;
12805 bit32 ataStatus = 0;
12806 bit32 ataError = 0;
12807 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
12809
12810 SM_DBG2(("smsatSetFeaturesVolatileWriteCacheCB: start\n"));
12811 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
12812 satIOContext = (smSatIOContext_t *) ioContext;
12813 if (satIOContext == agNULL)
12814 {
12815 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: satIOContext is NULL\n"));
12816 return;
12817 }
12818 satIntIo = satIOContext->satIntIoContext;
12819 oneDeviceData = satIOContext->pSatDevData;
12820 smDeviceHandle = satIOContext->psmDeviceHandle;
12821 smRoot = oneDeviceData->smRoot;
12822 smIntRoot = (smIntRoot_t *)smRoot->smData;
12823 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
12824 if (satIntIo == agNULL)
12825 {
12826 SM_DBG5(("smsatSetFeaturesVolatileWriteCacheCB: External smSatInternalIo_t satIntIoContext\n"));
12827 satOrgIOContext = satIOContext;
12828 smOrgIORequest = smIORequestBody->smIORequest;
12829 smIORequest = smOrgIORequest;
12830 }
12831 else
12832 {
12833 SM_DBG5(("smsatSetFeaturesVolatileWriteCacheCB: Internal smSatInternalIo_t satIntIoContext\n"));
12834 satOrgIOContext = satIOContext->satOrgIOContext;
12835 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
12836 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
12837 }
12838 smIORequest = smOrgIORequestBody->smIORequest;
12839 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
12840
12841 smIORequestBody->ioCompleted = agTRUE;
12842 smIORequestBody->ioStarted = agFALSE;
12843 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
12844 {
12845 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: fail, case 1 agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
12846 }
12847 if (agIOStatus != OSSA_IO_SUCCESS)
12848 {
12849 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: fail, case 2 status %d!!!\n", agIOStatus));
12850 }
12851 if (agIOInfoLen != 0 && agIOStatus == OSSA_IO_SUCCESS)
12852 {
12853 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
12854 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
12855 ataError = statDevToHostFisHeader->error; /* ATA Eror register */
12856 if ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
12857 {
12858 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: fail, case 3 ataStatus %d ataError %d!!!\n", ataStatus, ataError));
12859 }
12860 if (ataError != 0)
12861 {
12862 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: fail, case 4 ataStatus %d ataError %d!!!\n", ataStatus, ataError));
12863 }
12864 }
12865
12866 oneDeviceData->satWriteCacheEnabled = agTRUE;
12867
12868 /* interal structure free */
12869 smsatFreeIntIoResource(smRoot,oneDeviceData, satIntIo);
12870 /* check the agIOStatus */
12871 if (agIOStatus == OSSA_IO_ABORTED ||
12872 agIOStatus == OSSA_IO_NO_DEVICE ||
12873 agIOStatus == OSSA_IO_PORT_IN_RESET ||
12874 agIOStatus == OSSA_IO_DS_NON_OPERATIONAL ||
12875 agIOStatus == OSSA_IO_DS_IN_RECOVERY ||
12876 agIOStatus == OSSA_IO_DS_IN_ERROR ||
12877 agIOStatus == OSSA_IO_DS_INVALID
12878 )
12879 {
12880 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: error status 0x%x\n", agIOStatus));
12881 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: did %d!!!\n", oneDeviceData->id));
12882 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12883 return;
12884 }
12885 /* turn on DMA Setup FIS auto-activate by sending set feature FIS */
12886 if (oneDeviceData->satNCQ == agTRUE && oneDeviceData->satDMASetupAA == agTRUE)
12887 {
12888 satNewIntIo = smsatAllocIntIoResource( smRoot,
12889 smOrgIORequest,
12890 oneDeviceData,
12891 0,
12892 satNewIntIo);
12893 if (satNewIntIo == agNULL)
12894 {
12895 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: momory allocation fails; can't send set feature\n"));
12896 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12897 return;
12898 } /* end memory allocation */
12899 satNewIOContext = smsatPrepareNewIO(satNewIntIo,
12900 smOrgIORequest,
12901 oneDeviceData,
12902 agNULL,
12903 satOrgIOContext
12904 );
12905 /* send the Set Feature ATA command to SATA device for enable DMA Setup FIS auto-activate */
12906 status = smsatSetFeaturesAA(smRoot,
12907 &satNewIntIo->satIntSmIORequest,
12908 satNewIOContext->psmDeviceHandle,
12909 &satNewIntIo->satIntSmScsiXchg, /* orginal from OS layer */
12910 satNewIOContext);
12911 if (status != SM_RC_SUCCESS)
12912 {
12913 SM_DBG1(("smsatSetFeaturesVolatileWriteCacheCB: failed to send set feature!!!\n"));
12914 smsatFreeIntIoResource( smRoot,
12915 oneDeviceData,
12916 satNewIntIo);
12917 /* clean up TD layer's IORequestBody */
12918 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOFailed, &(oneDeviceData->satIdentifyData));
12919 }
12920 }
12921 else
12922 {
12923 /*Complete this identify device IO */
12924 tdsmIDCompletedCB(smRoot, smIORequest, smDeviceHandle, smIOSuccess, &(oneDeviceData->satIdentifyData));
12925 }
12926 SM_DBG2(("smsatSetFeaturesVolatileWriteCacheCB: end\n"));
12927}
12928
12929
12930osGLOBAL void
12932 agsaRoot_t *agRoot,
12933 agsaIORequest_t *agIORequest,
12934 bit32 agIOStatus,
12935 agsaFisHeader_t *agFirstDword,
12936 bit32 agIOInfoLen,
12937 agsaFrameHandle_t agFrameHandle,
12938 void *ioContext
12939 )
12940 {
12941
12942 smRoot_t *smRoot = agNULL;
12943 smIntRoot_t *smIntRoot = agNULL;
12944 smIntContext_t *smAllShared = agNULL;
12945 smIORequestBody_t *smIORequestBody;
12946 smIORequestBody_t *smOrgIORequestBody;
12947 smSatIOContext_t *satIOContext;
12948 smSatIOContext_t *satOrgIOContext;
12949 //smSatIOContext_t *satNewIOContext;
12950 smSatInternalIo_t *satIntIo;
12951 //smSatInternalIo_t *satNewIntIo = agNULL;
12952// satDeviceData_t *satDevData;
12953 smDeviceData_t *oneDeviceData;
12954 smIniScsiCmnd_t *scsiCmnd;
12955 smIORequest_t *smOrgIORequest;
12956 //bit32 status;
12957 smScsiRspSense_t *pSense;
12958 bit8 bSenseKey = 0;
12959 bit16 bSenseCodeInfo = 0;
12960
12961
12962 SM_DBG2(("smsatSMARTEnablePassCB: start\n"));
12963 SM_DBG4(("smsatSMARTEnablePassCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
12964
12965 /* internally generate tiIOContext */
12966 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
12967 satIOContext = (smSatIOContext_t *) ioContext;
12968 satIntIo = satIOContext->satIntIoContext;
12969 oneDeviceData = satIOContext->pSatDevData;
12970 smRoot = oneDeviceData->smRoot;
12971 smIntRoot = (smIntRoot_t *)smRoot->smData;
12972 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
12973 /*ttttttthe one */
12974 if (satIntIo == agNULL)
12975 {
12976 SM_DBG4(("smsatSMARTEnablePassCB: External smSatInternalIo_t satIntIoContext\n"));
12977 satOrgIOContext = satIOContext;
12978 smOrgIORequest = smIORequestBody->smIORequest;
12979 scsiCmnd = satOrgIOContext->pScsiCmnd;
12980 pSense = satOrgIOContext->pSense;
12981 }
12982 else
12983 {
12984 SM_DBG4(("smsatSMARTEnablePassCB: Internal smSatInternalIo_t satIntIoContext\n"));
12985 satOrgIOContext = satIOContext->satOrgIOContext;
12986 if (satOrgIOContext == agNULL)
12987 {
12988 SM_DBG4(("smsatSMARTEnablePassCB: satOrgIOContext is NULL, wrong\n"));
12989 return;
12990 }
12991 else
12992 {
12993 SM_DBG4(("smsatSMARTEnablePassCB: satOrgIOContext is NOT NULL\n"));
12994 }
12995 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
12996 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
12997 scsiCmnd = satOrgIOContext->pScsiCmnd;
12998 pSense = satOrgIOContext->pSense;
12999 }
13000 smIORequestBody->ioCompleted = agTRUE;
13001 smIORequestBody->ioStarted = agFALSE;
13002
13003 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
13004 {
13005 SM_DBG1(("smsatSMARTEnablePassCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
13007 smRoot,
13008 smOrgIORequest,
13009 smIOFailed,
13011 agNULL,
13012 satOrgIOContext->interruptContext
13013 );
13014 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13015 smsatFreeIntIoResource( smRoot,
13016 oneDeviceData,
13017 satIntIo);
13018 return;
13019 }
13020 /*
13021 checking IO status, FIS type and error status
13022 */
13023 if (agIOStatus != OSSA_IO_SUCCESS)
13024 {
13025 SM_DBG1(("smsatSMARTEnablePassCB: not success status, status %d!!!\n", agIOStatus));
13026 if (agIOStatus == OSSA_IO_ABORTED)
13027 {
13028 smsatProcessAbort(smRoot,
13029 smOrgIORequest,
13030 satOrgIOContext
13031 );
13032
13033 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13034 smsatFreeIntIoResource( smRoot,
13035 oneDeviceData,
13036 satIntIo);
13037 return;
13038 }
13039
13041 agFirstDword->D2H.status,
13042 agFirstDword->D2H.error,
13043 &bSenseKey,
13044 &bSenseCodeInfo
13045 );
13046 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
13047 tdsmIOCompletedCB(smRoot,
13048 smOrgIORequest,
13051 satOrgIOContext->pSmSenseData,
13052 satOrgIOContext->interruptContext );
13053
13054
13055 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13056
13057 smsatFreeIntIoResource( smRoot,
13058 oneDeviceData,
13059 satIntIo);
13060
13061 return;
13062 }
13063 /* process success case */
13064 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13065 smsatFreeIntIoResource( smRoot,
13066 oneDeviceData,
13067 satIntIo);
13068
13069 SM_DBG1(("smsatSMARTEnablePassCB:success status, status %d!!!\n", agIOStatus));
13071 smRoot,
13072 smOrgIORequest,
13073 smIOSuccess,
13075 agNULL,
13076 satOrgIOContext->interruptContext
13077 );
13078
13079
13080
13081 return;
13082}
13083
13084osGLOBAL void
13086 agsaRoot_t *agRoot,
13087 agsaIORequest_t *agIORequest,
13088 bit32 agIOStatus,
13089 agsaFisHeader_t *agFirstDword,
13090 bit32 agIOInfoLen,
13091 void *agParam,
13092 void *ioContext
13093 )
13094
13095{
13096
13097
13098 smRoot_t *smRoot = agNULL;
13099 smIntRoot_t *smIntRoot = agNULL;
13100 smIntContext_t *smAllShared = agNULL;
13101 smIORequestBody_t *smIORequestBody;
13102 smIORequestBody_t *smOrgIORequestBody;
13103 smSatIOContext_t *satIOContext;
13104 smSatIOContext_t *satOrgIOContext;
13105 smSatInternalIo_t *satIntIo;
13106// satDeviceData_t *satDevData;
13107 smDeviceData_t *oneDeviceData;
13108
13109 smScsiRspSense_t *pSense;
13110 smIORequest_t *smOrgIORequest;
13111
13112 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
13113 bit32 ataStatus = 0;
13114 smScsiInitiatorRequest_t *smScsiRequest; /* tiScsiXchg */
13115 smScsiInitiatorRequest_t *smOrgScsiRequest; /* tiScsiXchg */
13116 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
13117// agsaFisRegD2HData_t statDevToHostFisData;
13118 smIniScsiCmnd_t *scsiCmnd;
13119 bit8 bSenseKey = 0;
13120 bit16 bSenseCodeInfo = 0;
13121
13122
13123 SM_DBG2(("smsatSMARTRStatusPassCB: start\n"));
13124 SM_DBG5(("smsatSMARTRStatusPassCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
13125
13126 /* internally generate smIOContext */
13127 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
13128 satIOContext = (smSatIOContext_t *) ioContext;
13129 satIntIo = satIOContext->satIntIoContext;
13130 oneDeviceData = satIOContext->pSatDevData;
13131 hostToDevFis = satIOContext->pFis;
13132 smRoot = oneDeviceData->smRoot;
13133 smIntRoot = (smIntRoot_t *)smRoot->smData;
13134 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
13135
13136 if (satIntIo == agNULL)
13137 {
13138 SM_DBG4(("smsatSMARTRStatusPassCB: External smSatInternalIo_t satIntIoContext\n"));
13139 satOrgIOContext = satIOContext;
13140 smOrgIORequest = smIORequestBody->smIORequest;
13141 pSense = satOrgIOContext->pSense;
13142 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
13143 /* ATA command response payload */
13144 smScsiRequest = satOrgIOContext->smScsiXchg;
13145 scsiCmnd = satOrgIOContext->pScsiCmnd;
13146 SM_DBG1((" 0x%02x, 0x%02x, 0x%02x, 0x%02x,\n", scsiCmnd->cdb[0], scsiCmnd->cdb[1],scsiCmnd->cdb[2], scsiCmnd->cdb[3]));
13147 SM_DBG1((" 0x%02x, 0x%02x, 0x%02x, 0x%02x,\n", scsiCmnd->cdb[4], scsiCmnd->cdb[5],scsiCmnd->cdb[6], scsiCmnd->cdb[7]));
13148 SM_DBG1((" 0x%02x, 0x%02x, 0x%02x, 0x%02x,\n", scsiCmnd->cdb[8], scsiCmnd->cdb[9],scsiCmnd->cdb[10], scsiCmnd->cdb[11]));
13149
13150
13151 }
13152 else
13153 {
13154 SM_DBG4(("smsatSMARTRStatusPassCB: Internal smSatInternalIo_t satIntIoContext\n"));
13155 satOrgIOContext = satIOContext->satOrgIOContext;
13156 if (satOrgIOContext == agNULL)
13157 {
13158 SM_DBG4(("smsatSMARTRStatusPassCB: satOrgIOContext is NULL\n"));
13159
13160 return;
13161
13162 }
13163 else
13164 {
13165 SM_DBG4(("smsatSMARTRStatusPassCB: satOrgIOContext is NOT NULL\n"));
13166 }
13167 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
13168 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
13169
13170 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
13171 /* ATA command response payload */
13172 smScsiRequest = (smScsiInitiatorRequest_t *)&(satIntIo->satIntSmScsiXchg);
13173 scsiCmnd = satOrgIOContext->pScsiCmnd;
13174 pSense = satOrgIOContext->pSense;
13175 }
13176
13177 smIORequestBody->ioCompleted = agTRUE;
13178 smIORequestBody->ioStarted = agFALSE;
13179
13180 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
13181 {
13182 SM_DBG1(("smsatSMARTRStatusPassCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
13184 smRoot,
13185 smOrgIORequest,
13186 smIOFailed,
13188 agNULL,
13189 satOrgIOContext->interruptContext
13190 );
13191 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13192
13193 smsatFreeIntIoResource( smRoot,
13194 oneDeviceData,
13195 satIntIo);
13196 return;
13197 }
13198
13199 if( agIOStatus != OSSA_IO_SUCCESS)
13200 {
13201
13202 /* non-data -> device to host fis are expected */
13203
13204 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
13205 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
13206
13207 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
13208 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
13209 )
13210 {
13211 /* for debugging */
13212 if( agIOStatus != OSSA_IO_SUCCESS)
13213 {
13214 SM_DBG1(("smsatSMARTRStatusPassCB: FAILED, NOT IO_SUCCESS!!!\n"));
13215 }
13216 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
13217 {
13218 SM_DBG1(("smsatSMARTRStatusPassCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
13219 }
13220 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
13221 (ataStatus & DF_ATA_STATUS_MASK)
13222 )
13223 {
13224 SM_DBG1(("smsatSMARTRStatusPassCB: FAILED, FAILED, error status!!!\n"));
13225 }
13226
13227 /* Process abort case */
13228 if (agIOStatus == OSSA_IO_ABORTED)
13229 {
13230 smsatProcessAbort(smRoot,
13231 smOrgIORequest,
13232 satOrgIOContext
13233 );
13234
13235 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13236
13237 smsatFreeIntIoResource( smRoot,
13238 oneDeviceData,
13239 satIntIo);
13240 return;
13241 }
13242
13244 agFirstDword->D2H.status,
13245 agFirstDword->D2H.error,
13246 &bSenseKey,
13247 &bSenseCodeInfo
13248 );
13249 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
13250 tdsmIOCompletedCB(smRoot,
13251 smOrgIORequest,
13254 satOrgIOContext->pSmSenseData,
13255 satOrgIOContext->interruptContext );
13256
13257
13258 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13259
13260 smsatFreeIntIoResource( smRoot,
13261 oneDeviceData,
13262 satIntIo);
13263 return;
13264
13265 } /* error checking */
13266 }
13267
13268 /* prcessing the success case */
13269 SM_DBG5(("smsatSMARTRStatusPassCB: SAT_SMART_RETURN_STATUS success\n"));
13270
13271 tdsmIOCompletedCB( smRoot,
13272 smOrgIORequest,
13275 agNULL,
13276 satOrgIOContext->interruptContext);
13277
13278
13279 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13280
13281 smsatFreeIntIoResource( smRoot,
13282 oneDeviceData,
13283 satIntIo);
13284
13285
13286 return;
13287}
13288
13289osGLOBAL void
13291 agsaRoot_t *agRoot,
13292 agsaIORequest_t *agIORequest,
13293 bit32 agIOStatus,
13294 agsaFisHeader_t *agFirstDword,
13295 bit32 agIOInfoLen,
13296 void *agParam,
13297 void *ioContext
13298 )
13299{
13300
13301 smRoot_t *smRoot = agNULL;
13302 smIntRoot_t *smIntRoot = agNULL;
13303 smIntContext_t *smAllShared = agNULL;
13304 smIORequestBody_t *smIORequestBody;
13305 smIORequestBody_t *smOrgIORequestBody;
13306 smSatIOContext_t *satIOContext;
13307 smSatIOContext_t *satOrgIOContext;
13308 smSatInternalIo_t *satIntIo;
13309// satDeviceData_t *satDevData;
13310 smDeviceData_t *oneDeviceData;
13311
13312 smScsiRspSense_t *pSense;
13313 smIORequest_t *smOrgIORequest;
13314
13315 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
13316 bit32 ataStatus = 0;
13317 smScsiInitiatorRequest_t *smScsiRequest; /* tiScsiXchg */
13318 smScsiInitiatorRequest_t *smOrgScsiRequest; /* tiScsiXchg */
13319// satReadLogExtSelfTest_t *virtAddr1;
13320// satSmartReadLogSelfTest_t *virtAddr2;
13321 //bit8 *pLogPage;
13322// bit8 SelfTestExecutionStatus = 0;
13323// bit32 i = 0;
13324
13325 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
13326// agsaFisRegD2HData_t statDevToHostFisData;
13327 smIniScsiCmnd_t *scsiCmnd;
13328// bit32 lenReceived = 0;
13329 bit8 bSenseKey = 0;
13330 bit16 bSenseCodeInfo = 0;
13331
13332 SM_DBG2(("smsatSMARTReadLogCB: start\n"));
13333 SM_DBG5(("smsatSMARTReadLogCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
13334
13335 /* internally generate smIOContext */
13336 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
13337 satIOContext = (smSatIOContext_t *) ioContext;
13338 satIntIo = satIOContext->satIntIoContext;
13339 oneDeviceData = satIOContext->pSatDevData;
13340 hostToDevFis = satIOContext->pFis;
13341 smRoot = oneDeviceData->smRoot;
13342 smIntRoot = (smIntRoot_t *)smRoot->smData;
13343 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
13344
13345 if (satIntIo == agNULL)
13346 {
13347 SM_DBG4(("smsatSMARTReadLogCB: External smSatInternalIo_t satIntIoContext\n"));
13348 satOrgIOContext = satIOContext;
13349 smOrgIORequest = smIORequestBody->smIORequest;
13350 pSense = satOrgIOContext->pSense;
13351 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
13352
13353 /* ATA command response payload */
13354 smScsiRequest = satOrgIOContext->smScsiXchg;
13355 scsiCmnd = satOrgIOContext->pScsiCmnd;
13356
13357
13358 }
13359 else
13360 {
13361 SM_DBG4(("smsatSMARTReadLogCB: Internal smSatInternalIo_t satIntIoContext\n"));
13362 satOrgIOContext = satIOContext->satOrgIOContext;
13363 if (satOrgIOContext == agNULL)
13364 {
13365 SM_DBG4(("smsatSMARTReadLogCB: satOrgIOContext is NULL\n"));
13366
13367 return;
13368
13369 }
13370 else
13371 {
13372 SM_DBG4(("smsatSMARTReadLogCB: satOrgIOContext is NOT NULL\n"));
13373 }
13374 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
13375 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
13376
13377 pSense = satOrgIOContext->pSense;
13378 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
13379
13380 /* ATA command response payload */
13381 smScsiRequest = (smScsiInitiatorRequest_t *)&(satIntIo->satIntSmScsiXchg);
13382 scsiCmnd = satOrgIOContext->pScsiCmnd;
13383 }
13384
13385 smIORequestBody->ioCompleted = agTRUE;
13386 smIORequestBody->ioStarted = agFALSE;
13387
13388 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
13389 {
13390 SM_DBG1(("smsatSMARTReadLogCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
13392 smRoot,
13393 smOrgIORequest,
13394 smIOFailed,
13396 agNULL,
13397 satOrgIOContext->interruptContext
13398 );
13399 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13400
13401 smsatFreeIntIoResource( smRoot,
13402 oneDeviceData,
13403 satIntIo);
13404 return;
13405 }
13406
13407 //for Debuggings
13408 if(agFirstDword != NULL)
13409 {
13410 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
13411 SM_DBG1(("smsatSMARTReadLogCB: statDevToHostFisHeader->status, status %d!!!\n", statDevToHostFisHeader->status));
13412 }
13413 if ((agIOStatus != OSSA_IO_SUCCESS) && (agFirstDword != NULL))
13414 {
13415 /* non-data and pio read -> device to host and pio setup fis are expected */
13416 /*
13417 first, assumed to be Reg Device to Host FIS
13418 This is OK to just find fis type
13419 */
13420 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
13421 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
13422 }
13423
13424 if( agIOStatus != OSSA_IO_SUCCESS)
13425 {
13426 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
13427 (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) ||
13428 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
13429 )
13430 {
13431 /* for debugging */
13432 if( agIOStatus != OSSA_IO_SUCCESS)
13433 {
13434 SM_DBG1(("smsatSMARTReadLogCB: FAILED, NOT IO_SUCCESS!!!\n"));
13435 }
13436 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
13437 {
13438 SM_DBG1(("smsatSMARTReadLogCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
13439 }
13440 else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)
13441 {
13442 SM_DBG1(("smsatSMARTReadLogCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
13443 }
13444 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
13445 (ataStatus & DF_ATA_STATUS_MASK)
13446 )
13447 {
13448 SM_DBG1(("smsatSMARTReadLogCB: FAILED, FAILED, error status!!!\n"));
13449 }
13450
13451 /* Process abort case */
13452 if (agIOStatus == OSSA_IO_ABORTED)
13453 {
13454 smsatProcessAbort(smRoot,
13455 smOrgIORequest,
13456 satOrgIOContext
13457 );
13458
13459 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13460
13461 smsatFreeIntIoResource( smRoot,
13462 oneDeviceData,
13463 satIntIo);
13464 return;
13465 }
13466
13467 /* for debugging */
13468
13469 if (hostToDevFis->h.command == SAT_SMART)
13470 {
13471 if (hostToDevFis->h.features == SAT_SMART_READ_LOG)
13472 {
13473 SM_DBG1(("smsatSMARTReadLogCB: SAT_SMART_READ_LOG failed!!!\n"));
13474 }
13475 else
13476 {
13477 SM_DBG1(("smsatSMARTReadLogCB: error unknown command 0x%x feature 0x%x!!!\n", hostToDevFis->h.command, hostToDevFis->h.features));
13478 }
13479 }
13480 else
13481 {
13482 SM_DBG1(("smsatSMARTReadLogCB: error default case command 0x%x!!!\n", hostToDevFis->h.command));
13483 }
13484
13486 agFirstDword->D2H.status,
13487 agFirstDword->D2H.error,
13488 &bSenseKey,
13489 &bSenseCodeInfo
13490 );
13491 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
13492 tdsmIOCompletedCB(smRoot,
13493 smOrgIORequest,
13496 satOrgIOContext->pSmSenseData,
13497 satOrgIOContext->interruptContext );
13498
13499
13500 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13501
13502 smsatFreeIntIoResource( smRoot,
13503 oneDeviceData,
13504 satIntIo);
13505 return;
13506
13507 } /* error checking */
13508 }
13509
13510 /* prcessing the success case */
13511
13512
13513 tdsmIOCompletedCB( smRoot,
13514 smOrgIORequest,
13517 agNULL,
13518 satOrgIOContext->interruptContext);
13519
13520 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13521
13522 smsatFreeIntIoResource( smRoot,
13523 oneDeviceData,
13524 satIntIo);
13525
13526 return;
13527}
13528
13529osGLOBAL void
13531 agsaRoot_t *agRoot,
13532 agsaIORequest_t *agIORequest,
13533 bit32 agIOStatus,
13534 agsaFisHeader_t *agFirstDword,
13535 bit32 agIOInfoLen,
13536 void *agParam,
13537 void *ioContext
13538 )
13539{
13540 smRoot_t *smRoot = agNULL;
13541 smIntRoot_t *smIntRoot = agNULL;
13542 smIntContext_t *smAllShared = agNULL;
13543 smIORequestBody_t *smIORequestBody;
13544 smIORequestBody_t *smOrgIORequestBody;
13545 smSatIOContext_t *satIOContext;
13546 smSatIOContext_t *satOrgIOContext;
13547 smSatInternalIo_t *satIntIo;
13548 smDeviceData_t *oneDeviceData;
13549 smScsiRspSense_t *pSense;
13550 smIORequest_t *smOrgIORequest;
13551 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
13552 bit32 ataStatus = 0;
13553 smScsiInitiatorRequest_t *smScsiRequest; /* tiScsiXchg */
13554 smScsiInitiatorRequest_t *smOrgScsiRequest; /* tiScsiXchg */
13555
13556 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
13557 smIniScsiCmnd_t *scsiCmnd;
13558 bit8 bSenseKey = 0;
13559 bit16 bSenseCodeInfo = 0;
13560
13561 SM_DBG2(("smsatPassthroughCB: start\n"));
13562 SM_DBG5(("smsatPassthroughCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
13563
13564 /* internally generate smIOContext */
13565 smIORequestBody = (smIORequestBody_t *)agIORequest->osData;
13566 satIOContext = (smSatIOContext_t *) ioContext;
13567 satIntIo = satIOContext->satIntIoContext;
13568 oneDeviceData = satIOContext->pSatDevData;
13569 hostToDevFis = satIOContext->pFis;
13570 smRoot = oneDeviceData->smRoot;
13571 smIntRoot = (smIntRoot_t *)smRoot->smData;
13572 smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
13573
13574 if (satIntIo == agNULL)
13575 {
13576 SM_DBG4(("smsatPassthroughCB: External smSatInternalIo_t satIntIoContext\n"));
13577 satOrgIOContext = satIOContext;
13578 smOrgIORequest = smIORequestBody->smIORequest;
13579 pSense = satOrgIOContext->pSense;
13580 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
13581
13582 /* ATA command response payload */
13583 smScsiRequest = satOrgIOContext->smScsiXchg;
13584 scsiCmnd = satOrgIOContext->pScsiCmnd;
13585 }
13586 else
13587 {
13588 SM_DBG4(("smsatPassthroughCB: Internal smSatInternalIo_t satIntIoContext\n"));
13589 satOrgIOContext = satIOContext->satOrgIOContext;
13590 if (satOrgIOContext == agNULL)
13591 {
13592 SM_DBG4(("smsatPassthroughCB: satOrgIOContext is NULL\n"));
13593 return;
13594 }
13595 else
13596 {
13597 SM_DBG4(("smsatPassthroughCB: satOrgIOContext is NOT NULL\n"));
13598 }
13599 smOrgIORequestBody = (smIORequestBody_t *)satOrgIOContext->smRequestBody;
13600 smOrgIORequest = (smIORequest_t *)smOrgIORequestBody->smIORequest;
13601
13602 pSense = satOrgIOContext->pSense;
13603 smOrgScsiRequest = satOrgIOContext->smScsiXchg;
13604
13605 /* ATA command response payload */
13606 smScsiRequest = (smScsiInitiatorRequest_t *)&(satIntIo->satIntSmScsiXchg);
13607 scsiCmnd = satOrgIOContext->pScsiCmnd;
13608 }
13609
13610 smIORequestBody->ioCompleted = agTRUE;
13611 smIORequestBody->ioStarted = agFALSE;
13612
13613
13614 if (agIOStatus == OSSA_IO_UNDERFLOW)
13615 {
13616 SM_DBG1(("smsatPassthroughCB: IO_UNDERFLOW, status %d!!!\n", agIOStatus));
13617 tdsmIOCompletedCB( smRoot,
13618 smOrgIORequest,
13620 agIOInfoLen,
13621 agNULL,
13622 satOrgIOContext->interruptContext
13623 );
13624 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13625
13626 smsatFreeIntIoResource( smRoot,
13627 oneDeviceData,
13628 satIntIo);
13629 return;
13630 }
13631
13632
13633 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
13634 {
13635 SM_DBG1(("smsatPassthroughCB: wrong. agFirstDword is NULL when error, status %d!!!\n", agIOStatus));
13636 tdsmIOCompletedCB( smRoot,
13637 smOrgIORequest,
13638 smIOFailed,
13640 agNULL,
13641 satOrgIOContext->interruptContext
13642 );
13643 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13644
13645 smsatFreeIntIoResource( smRoot,
13646 oneDeviceData,
13647 satIntIo);
13648 return;
13649 }
13650
13651 //for Debuggings
13652
13653 if ((agIOStatus != OSSA_IO_SUCCESS) && (agFirstDword != NULL))
13654 {
13655 /* non-data and pio read -> device to host and pio setup fis are expected */
13656 /*
13657 first, assumed to be Reg Device to Host FIS
13658 This is OK to just find fis type
13659 */
13660 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
13661 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
13662 }
13663 if( agIOStatus != OSSA_IO_SUCCESS)
13664 {
13665 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
13666 (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) ||
13667 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
13668 )
13669 {
13670 /* for debugging */
13671 if( agIOStatus != OSSA_IO_SUCCESS)
13672 {
13673 SM_DBG1(("smsatPassthroughCB: FAILED, NOT IO_SUCCESS!!!\n"));
13674 }
13675 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
13676 {
13677 SM_DBG1(("smsatPassthroughCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
13678 }
13679 else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)
13680 {
13681 SM_DBG1(("smsatPassthroughCB: FAILED, Wrong FIS type 0x%x!!!\n",statDevToHostFisHeader->fisType));
13682 }
13683 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
13684 (ataStatus & DF_ATA_STATUS_MASK)
13685 )
13686 {
13687 SM_DBG1(("smsatPassthroughCB: FAILED, FAILED, error status!!!\n"));
13688 }
13689
13690 /* Process abort case */
13691 if (agIOStatus == OSSA_IO_ABORTED)
13692 {
13693 smsatProcessAbort( smRoot,
13694 smOrgIORequest,
13695 satOrgIOContext);
13696
13697 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13698
13699 smsatFreeIntIoResource( smRoot,
13700 oneDeviceData,
13701 satIntIo);
13702 return;
13703 }
13704
13706 agFirstDword->D2H.error,
13707 &bSenseKey,
13708 &bSenseCodeInfo
13709 );
13710 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
13711 tdsmIOCompletedCB( smRoot,
13712 smOrgIORequest,
13715 satOrgIOContext->pSmSenseData,
13716 satOrgIOContext->interruptContext );
13717
13718
13719 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13720 smsatFreeIntIoResource( smRoot,
13721 oneDeviceData,
13722 satIntIo);
13723 return;
13724
13725 } /* error checking */
13726 }
13727
13728 /* prcessing the success case */
13729 if(agFirstDword != NULL)
13730 {
13731 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
13732 SM_DBG1(("smsatPassthroughCB: statDevToHostFisHeader->status, status %d!!!\n", statDevToHostFisHeader->status));
13734 agFirstDword->D2H.error,
13735 &bSenseKey,
13736 &bSenseCodeInfo);
13737 smsatSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
13738 if(agFirstDword->D2H.status & 0x01)
13739 {
13740 tdsmIOCompletedCB( smRoot,
13741 smOrgIORequest,
13744 satOrgIOContext->pSmSenseData,
13745 satOrgIOContext->interruptContext );
13746 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13747 smsatFreeIntIoResource( smRoot,
13748 oneDeviceData,
13749 satIntIo);
13750 return;
13751 }
13752 }
13753
13754 tdsmIOCompletedCB( smRoot,
13755 smOrgIORequest,
13758 agNULL,
13759 satOrgIOContext->interruptContext);
13760
13761 smsatDecrementPendingIO(smRoot, smAllShared, satIOContext);
13762
13763 smsatFreeIntIoResource( smRoot,
13764 oneDeviceData,
13765 satIntIo);
13766
13767 return;
13768}
13769
#define MIN(a, b)
MIN macro.
Definition: dmdefs.h:88
#define SATA_ATAPI_DEVICE
Definition: dmdefs.h:1102
#define PIO_SETUP_DEV_TO_HOST_FIS
Definition: dmdefs.h:56
#define SMP_PHY_CONTROL_HARD_RESET
Definition: dmdefs.h:199
#define SMP_PHY_CONTROL
Definition: dmdefs.h:160
#define SMP_FUNCTION_ACCEPTED
Definition: dmdefs.h:167
#define SET_DEV_BITS_FIS
Definition: dmdefs.h:58
#define REG_DEV_TO_HOST_FIS
Definition: dmdefs.h:57
bit32 status
Definition: encrypt_ioctl.h:12
void ostiInitiatorEvent(tiRoot_t *ptiRoot, tiPortalContext_t *ptiPortalContext, tiDeviceHandle_t *ptiDevHandle, tiIntrEventType_t eventType, U32 eventStatus, void *parm)
Definition: osapi.c:49
unsigned short bit16
Definition: ostypes.h:98
#define NULL
Definition: ostypes.h:142
#define osGLOBAL
Definition: ostypes.h:147
#define agNULL
Definition: ostypes.h:151
#define GLOBAL
Definition: ostypes.h:131
unsigned int bit32
Definition: ostypes.h:99
#define agFALSE
Definition: ostypes.h:150
#define FORCEINLINE
Definition: ostypes.h:86
#define agTRUE
Definition: ostypes.h:149
unsigned char bit8
Definition: ostypes.h:97
The file defines the constants, data structure, and functions defined by LL API.
#define AGSA_PHY_HARD_RESET
Definition: sa.h:835
void * agsaFrameHandle_t
handle to access frame
Definition: sa.h:1719
#define SA_DS_OPERATIONAL
Definition: sa.h:1179
#define AGSA_PHY_LINK_RESET
Definition: sa.h:834
#define AGSA_SATA_PROTOCOL_FPDMA_WRITE
Definition: sa.h:1028
#define AGSA_SATA_PROTOCOL_FPDMA_READ
Definition: sa.h:1025
#define OSSA_SUCCESS
Definition: sa.h:1200
#define OSSA_IO_XFER_ERROR_DMA
Definition: sa_err.h:77
#define OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION
Definition: sa_err.h:70
#define OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID
Definition: sa_err.h:166
#define OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE
Definition: sa_err.h:117
#define OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE
Definition: sa_err.h:131
#define OSSA_IO_ABORTED
Definition: sa_err.h:46
#define OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE
Definition: sa_err.h:84
#define OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS
Definition: sa_err.h:180
#define OSSA_IO_DS_IN_RECOVERY
Definition: sa_err.h:104
#define OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED
Definition: sa_err.h:129
#define OSSA_IO_DS_NON_OPERATIONAL
Definition: sa_err.h:103
#define OSSA_IO_XFER_CMD_FRAME_ISSUED
Definition: sa_err.h:100
#define OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO
Definition: sa_err.h:115
#define OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST
Definition: sa_err.h:83
#define OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE
Definition: sa_err.h:85
#define OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
Definition: sa_err.h:69
#define OSSA_IO_FAILED
Definition: sa_err.h:49
#define OSSA_IO_XFER_ERROR_PHY_NOT_READY
Definition: sa_err.h:62
#define OSSA_IO_ABORT_DELAYED
Definition: sa_err.h:111
#define OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH
Definition: sa_err.h:165
#define OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH
Definition: sa_err.h:194
#define OSSA_IO_OVERFLOW
Definition: sa_err.h:47
#define OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR
Definition: sa_err.h:173
#define OSSA_IO_OPEN_CNX_ERROR_BREAK
Definition: sa_err.h:65
#define OSSA_IO_XFER_ERROR_OFFSET_MISMATCH
Definition: sa_err.h:98
#define OSSA_IO_UNDERFLOW
Definition: sa_err.h:48
#define OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN
Definition: sa_err.h:99
#define OSSA_IO_SUCCESS
Definition: sa_err.h:45
#define OSSA_IO_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK
Definition: sa_err.h:96
#define OSSA_IO_PORT_IN_RESET
Definition: sa_err.h:102
#define OSSA_IO_DS_IN_ERROR
Definition: sa_err.h:108
#define OSSA_IO_XFER_ERROR_DMA_ACTIVATE_TIMEOUT
Definition: sa_err.h:124
#define OSSA_IO_XFER_ERROR_NAK_RECEIVED
Definition: sa_err.h:73
#define OSSA_IO_XFER_ERROR_BREAK
Definition: sa_err.h:61
#define OSSA_IO_XFER_ERROR_PEER_ABORTED
Definition: sa_err.h:75
#define OSSA_IO_XFR_ERROR_DIF_MISMATCH
Definition: sa_err.h:191
#define OSSA_IO_NOT_VALID
Definition: sa_err.h:51
#define OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE
Definition: sa_err.h:181
#define OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT
Definition: sa_err.h:74
#define OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT
Definition: sa_err.h:93
#define OSSA_IO_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NAK
Definition: sa_err.h:95
#define OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED
Definition: sa_err.h:118
#define OSSA_IO_XFER_PIO_SETUP_ERROR
Definition: sa_err.h:106
#define OSSA_IO_XFER_ERROR_SATA
Definition: sa_err.h:80
#define OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS
Definition: sa_err.h:160
#define OSSA_IO_ILLEGAL_PARAMETER
Definition: sa_err.h:53
#define OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS
Definition: sa_err.h:66
#define OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT
Definition: sa_err.h:79
#define OSSA_IO_ABORT_RESET
Definition: sa_err.h:50
#define OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH
Definition: sa_err.h:192
#define OSSA_IO_XFER_OPEN_RETRY_TIMEOUT
Definition: sa_err.h:86
#define OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN
Definition: sa_err.h:127
#define OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH
Definition: sa_err.h:171
#define OSSA_IO_LINK_FAILURE
Definition: sa_err.h:55
#define OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED
Definition: sa_err.h:63
#define OSSA_MPI_ERR_ATAPI_DEVICE_BUSY
Definition: sa_err.h:145
#define OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED
Definition: sa_err.h:114
#define OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION
Definition: sa_err.h:64
#define OSSA_MPI_IO_RQE_BUSY_FULL
Definition: sa_err.h:126
#define OSSA_IO_NO_DEVICE
Definition: sa_err.h:52
#define OSSA_IO_PROG_ERROR
Definition: sa_err.h:56
#define OSSA_IO_ABORT_IN_PROGRESS
Definition: sa_err.h:110
#define OSSA_IO_DS_INVALID
Definition: sa_err.h:119
#define OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION
Definition: sa_err.h:67
#define OSSA_IO_XFER_ERROR_RX_FRAME
Definition: sa_err.h:76
#define OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR
Definition: sa_err.h:72
#define OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH
Definition: sa_err.h:193
#define OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED
Definition: sa_err.h:68
#define OSSA_IO_XFER_ERROR_CREDIT_TIMEOUT
Definition: sa_err.h:78
#define OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST
Definition: sa_err.h:116
struct agsaSATAIdentifyData_s agsaSATAIdentifyData_t
data structure provides the identify data of the SATA device
The file defines the declaration of tSDK APIs.
GLOBAL void saFrameReadBlock(agsaRoot_t *agRoot, agsaFrameHandle_t agFrame, bit32 frameOffset, void *frameBuffer, bit32 frameBufLen)
Read a block from a frame.
Definition: saframe.c:96
GLOBAL bit32 saSATAAbort(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 queueNum, agsaDevHandle_t *agDevHandle, bit32 flag, void *abortParam, ossaGenericAbortCB_t agCB)
Abort SATA command.
Definition: sasata.c:592
GLOBAL bit32 saSetDeviceState(agsaRoot_t *agRoot, agsaContext_t *agContext, bit32 queueNum, agsaDevHandle_t *agDevHandle, bit32 newDeviceState)
Set Device State.
Definition: sadisc.c:801
The file defines the declaration of OS APIs.
osGLOBAL bit32 satSubTM(tiRoot_t *tiRoot, tiDeviceHandle_t *tiDeviceHandle, bit32 task, tiLUN_t *lun, tiIORequest_t *taskTag, tiIORequest_t *currentTaskTag, bit32 NotifyOS)
@ smTMFailed
Definition: sm.h:121
@ smTMOK
Definition: sm.h:120
@ smIntrEventTypeLocalAbort
Definition: sm.h:115
@ smIntrEventTypeTaskManagement
Definition: sm.h:112
@ smDetailDifCrcMismatch
Definition: sm.h:85
@ smDetailOtherError
Definition: sm.h:91
@ smDetailNoLogin
Definition: sm.h:78
@ smDetailCipherModeInvalid
Definition: sm.h:87
@ smDetailAborted
Definition: sm.h:81
@ smDetailAbortReset
Definition: sm.h:80
@ smDetailDifRefTagMismatch
Definition: sm.h:84
@ smDetailDekIndexOutofBounds
Definition: sm.h:90
@ smDetailDekKeyCacheMiss
Definition: sm.h:86
@ smDetailBusy
Definition: sm.h:76
@ smDetailDekRamInterfaceError
Definition: sm.h:89
@ smDetailNotValid
Definition: sm.h:77
@ smDetailDifAppTagMismatch
Definition: sm.h:83
@ smDetailDekIVMismatch
Definition: sm.h:88
@ SM_RC_SUCCESS
Definition: sm.h:48
@ SM_RC_FAILURE
Definition: sm.h:49
@ smIODifError
Definition: sm.h:68
@ smIOSTPResourceBusy
Definition: sm.h:71
@ smIOEncryptError
Definition: sm.h:69
@ smIOFailed
Definition: sm.h:67
@ smIOUnderRun
Definition: sm.h:66
@ smIOOverRun
Definition: sm.h:65
@ smIORetry
Definition: sm.h:70
@ smIOSuccess
Definition: sm.h:64
#define SELFTEST_RESULTS_LOG_PAGE_LENGTH
Definition: smdefs.h:319
#define SCSIOPC_WRITE_16
Definition: smdefs.h:458
#define SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE
Definition: smdefs.h:398
#define SCSI_SNSCODE_UNRECOVERED_READ_ERROR
Definition: smdefs.h:392
#define SAT_WRITE_DMA_FUA_EXT
Definition: smdefs.h:74
#define INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE
Definition: smdefs.h:215
#define SAT_READ_DMA_EXT
Definition: smdefs.h:70
#define SM_DBG2(format)
Definition: smdefs.h:534
#define SCSIOPC_WRITE_6
Definition: smdefs.h:455
#define SM_DBG6(format)
Definition: smdefs.h:538
#define SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST
Definition: smdefs.h:404
#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS
Definition: smdefs.h:397
#define SCSI_SNSCODE_OPERATOR_MEDIUM_REMOVAL_REQUEST
Definition: smdefs.h:395
#define SCSI_IMMED_MASK
Definition: smdefs.h:243
#define SCSI_SNSKEY_NO_SENSE
Definition: smdefs.h:367
#define SM_DBG3(format)
Definition: smdefs.h:535
#define INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE
Definition: smdefs.h:216
#define SCSI_SNSCODE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE
Definition: smdefs.h:406
#define SAT_READ_LOG_EXT
Definition: smdefs.h:77
#define SAT_READ_BUFFER
Definition: smdefs.h:97
#define SAT_WRITE_DMA_EXT
Definition: smdefs.h:73
#define ABRT_ATA_ERROR_MASK
Definition: smdefs.h:122
#define SCSI_SNSCODE_LOW_POWER_CONDITION_ON
Definition: smdefs.h:399
#define SCSI_SNSCODE_NO_ADDITIONAL_INFO
Definition: smdefs.h:382
#define SAT_STANDBY
Definition: smdefs.h:88
#define SAT_SMART_ENABLE_OPERATIONS
Definition: smdefs.h:84
#define INQUIRY_BLOCK_DEVICE_CHARACTERISTICS_VPD_PAGE
Definition: smdefs.h:218
#define INQUIRY_SUPPORTED_VPD_PAGE
Definition: smdefs.h:214
#define SCSIOPC_READ_16
Definition: smdefs.h:454
#define SAT_WRITE_BUFFER
Definition: smdefs.h:98
#define SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED
Definition: smdefs.h:414
#define SCSI_EVPD_MASK
Definition: smdefs.h:242
#define SATA_PAGE0_INQUIRY_SIZE
Definition: smdefs.h:434
#define SCSI_SNSCODE_INTERNAL_TARGET_FAILURE
Definition: smdefs.h:390
#define SCSIOPC_READ_6
Definition: smdefs.h:451
#define ERR_ATA_STATUS_MASK
Definition: smdefs.h:112
#define SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION
Definition: smdefs.h:411
#define SATA_PAGE80_INQUIRY_SIZE
Definition: smdefs.h:435
#define SAT_READ_FPDMA_QUEUED
Definition: smdefs.h:69
#define SCSI_SNSKEY_ABORTED_COMMAND
Definition: smdefs.h:375
#define SCSI_NM_MASK
Definition: smdefs.h:251
#define STANDARD_INQUIRY_SIZE
Definition: smdefs.h:430
#define SAT_READ_VERIFY_SECTORS_EXT
Definition: smdefs.h:79
#define SAT_WRITE_FPDMA_QUEUED
Definition: smdefs.h:72
#define SCSI_SNSCODE_MEDIUM_NOT_PRESENT
Definition: smdefs.h:391
#define SAT_DEV_STATE_NORMAL
Definition: smdefs.h:554
#define UNC_ATA_ERROR_MASK
Definition: smdefs.h:126
#define SAT_WRITE_DMA
Definition: smdefs.h:75
#define NM_ATA_ERROR_MASK
Definition: smdefs.h:121
#define SCSI_FLUSH_CACHE_IMMED_MASK
Definition: smdefs.h:252
#define SM_GET_SAS_ADDRESSHI(sasAddressHi)
Definition: smdefs.h:824
#define SAT_WRITE_SECTORS_EXT
Definition: smdefs.h:91
#define SAT_SMART_RETURN_STATUS
Definition: smdefs.h:82
#define SAT_READ_DMA
Definition: smdefs.h:71
#define ZERO_MEDIA_SERIAL_NUMBER_LENGTH
Definition: smdefs.h:321
#define SAT_DEV_STATE_IN_RECOVERY
Definition: smdefs.h:555
#define SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR
Definition: smdefs.h:405
#define SATA_PAGE83_INQUIRY_WWN_SIZE
Definition: smdefs.h:431
#define SAT_SMART_DISABLE_OPERATIONS
Definition: smdefs.h:85
#define INQUIRY_ATA_INFORMATION_VPD_PAGE
Definition: smdefs.h:217
#define SM_DBG5(format)
Definition: smdefs.h:537
#define SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED
Definition: smdefs.h:408
#define SM_GET_SAS_ADDRESSLO(sasAddressLo)
Definition: smdefs.h:821
#define SAT_READ_SECTORS_EXT
Definition: smdefs.h:93
#define SCSIOPC_READ_12
Definition: smdefs.h:453
#define SAT_FLUSH_CACHE
Definition: smdefs.h:86
#define SAT_READ_SECTORS
Definition: smdefs.h:92
#define SAT_WRITE_SECTORS
Definition: smdefs.h:90
@ SM_EXTERNAL_IO_LOCK
Definition: smdefs.h:45
#define SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE
Definition: smdefs.h:81
#define MCR_ATA_ERROR_MASK
Definition: smdefs.h:123
#define AG_SAT_INT_IO_FLAG_ORG_IO_COMPLETED
Definition: smdefs.h:212
#define SCSIOPC_WRITE_10
Definition: smdefs.h:456
#define SATA_PAGE83_INQUIRY_NO_WWN_SIZE
Definition: smdefs.h:432
#define SCSIOPC_READ_10
Definition: smdefs.h:452
#define SCSI_SNSCODE_ATA_PASS_THROUGH_INFORMATION_AVAILABLE
Definition: smdefs.h:415
#define SAT_SMART
Definition: smdefs.h:80
#define SAT_MEDIA_EJECT
Definition: smdefs.h:89
#define IDNF_ATA_ERROR_MASK
Definition: smdefs.h:124
#define SAT_CHECK_POWER_MODE
Definition: smdefs.h:76
#define SCSI_SNSKEY_HARDWARE_ERROR
Definition: smdefs.h:371
#define SM_DBG1(format)
Definition: smdefs.h:533
#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE
Definition: smdefs.h:410
#define SENSE_DATA_LENGTH
Definition: smdefs.h:318
#define SCSI_SNSKEY_RECOVERED_ERROR
Definition: smdefs.h:368
#define SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN
Definition: smdefs.h:412
#define SCSI_SNSCODE_INFORMATION_UNIT_CRC_ERROR
Definition: smdefs.h:396
#define SM_DBG4(format)
Definition: smdefs.h:536
#define DF_ATA_STATUS_MASK
Definition: smdefs.h:114
#define SCSI_SNSCODE_NOT_READY_TO_READY_CHANGE
Definition: smdefs.h:394
#define SCSIOPC_WRITE_12
Definition: smdefs.h:457
#define INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH
Definition: smdefs.h:320
#define SATA_PAGEB1_INQUIRY_SIZE
Definition: smdefs.h:436
#define SCSI_SNSKEY_MEDIUM_ERROR
Definition: smdefs.h:370
#define SAT_SET_FEATURES
Definition: smdefs.h:95
#define SCSI_SNSCODE_INVALID_FIELD_IN_CDB
Definition: smdefs.h:386
#define SAT_READ_VERIFY_SECTORS
Definition: smdefs.h:78
#define SAT_GET_MEDIA_STATUS
Definition: smdefs.h:94
#define MC_ATA_ERROR_MASK
Definition: smdefs.h:125
#define ICRC_ATA_ERROR_MASK
Definition: smdefs.h:127
#define SATA_PAGE89_INQUIRY_SIZE
Definition: smdefs.h:433
#define SCSI_SNSKEY_UNIT_ATTENTION
Definition: smdefs.h:373
#define SAT_SMART_READ_LOG
Definition: smdefs.h:83
#define SCSI_SNSKEY_NOT_READY
Definition: smdefs.h:369
#define SCSI_SNSKEY_ILLEGAL_REQUEST
Definition: smdefs.h:372
#define SAT_FLUSH_CACHE_EXT
Definition: smdefs.h:87
FORCEINLINE void smIOReInit(smRoot_t *smRoot, smIORequestBody_t *smIORequestBody)
Definition: sminit.c:484
#define SMLIST_OBJECT_BASE(baseType, fieldName, fieldPtr)
Definition: smlist.h:151
#define SMLIST_DEQUEUE_THIS(hdr)
Definition: smlist.h:69
osGLOBAL void smhexdump(const char *ptitle, bit8 *pbuf, size_t len)
Definition: smmisc.c:91
FORCEINLINE void * sm_memcpy(void *dst, const void *src, bit32 count)
Definition: smmisc.c:60
osGLOBAL void smsatInquiryStandard(bit8 *pInquiry, agsaSATAIdentifyData_t *pSATAIdData, smIniScsiCmnd_t *scsiCmnd)
Definition: smsat.c:2273
osGLOBAL bit32 smsatNonChainedWriteNVerify_Verify(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:17830
osGLOBAL FORCEINLINE bit32 smsatTagRelease(smRoot_t *smRoot, smDeviceData_t *pSatDevData, bit8 tag)
Definition: smsat.c:20187
osGLOBAL void smsatAbort(smRoot_t *smRoot, agsaRoot_t *agRoot, smSatIOContext_t *satIOContext)
Definition: smsat.c:732
osGLOBAL bit32 smsatReassignBlocks_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext, smSatIOContext_t *satOrgIOContext)
Definition: smsat.c:19484
osGLOBAL FORCEINLINE void smsatFreeIntIoResource(smRoot_t *smRoot, smDeviceData_t *satDevData, smSatInternalIo_t *satIntIo)
Definition: smsat.c:1490
osGLOBAL void smsatSetDevInfo(smDeviceData_t *oneDeviceData, agsaSATAIdentifyData_t *SATAIdData)
Definition: smsat.c:2008
osGLOBAL bit32 smsatChainedVerify(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:18467
osGLOBAL bit32 smsatModeSelect6n10_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:19045
osGLOBAL bit32 smsatDeResetDevice(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:19791
osGLOBAL void smsatInquiryPage83(bit8 *pInquiry, agsaSATAIdentifyData_t *pSATAIdData, smDeviceData_t *oneDeviceData)
Definition: smsat.c:2479
osGLOBAL bit32 smsatRequestSense_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:9318
osGLOBAL bit32 smsatTestUnitReady_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:8751
osGLOBAL bit32 smsatRequestSenseForATAPI(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
SAT implementation for SCSI REQUEST SENSE to ATAPI device.
Definition: smsat.c:4213
osGLOBAL bit32 smsatChainedWriteNVerify_Write(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:18066
osGLOBAL bit32 smsatChainedWriteNVerify_Start_Verify(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:17900
osGLOBAL void smsatSetDeferredSensePayload(smScsiRspSense_t *pSense, bit8 SnsKey, bit32 SnsInfo, bit16 SnsCode, smSatIOContext_t *satIOContext)
Definition: smsat.c:4453
osGLOBAL bit32 smsatSetFeaturesAA(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:19863
osGLOBAL bit32 smsatSendDiagnostic_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:18863
osGLOBAL bit32 smsatStartStopUnit_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:18804
osGLOBAL bit32 smsatChainedWriteNVerify_Verify(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:18328
osGLOBAL bit32 smsatWriteSame10_2(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext, bit32 lba)
Definition: smsat.c:18670
osGLOBAL void smsatInquiryPage89(bit8 *pInquiry, agsaSATAIdentifyData_t *pSATAIdData, smDeviceData_t *oneDeviceData, bit32 len)
Definition: smsat.c:2775
osGLOBAL void smsatDefaultTranslation(smRoot_t *smRoot, smIORequest_t *smIORequest, smSatIOContext_t *satIOContext, smScsiRspSense_t *pSense, bit8 ataStatus, bit8 ataError, bit32 interruptContext)
Definition: smsat.c:2982
osGLOBAL bit32 smsatWriteSame10_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext, bit32 lba)
Definition: smsat.c:18606
osGLOBAL bit32 smsatReassignBlocks_2(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext, bit8 *LBA)
Definition: smsat.c:19268
osGLOBAL bit32 smsatWrite_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:17352
osGLOBAL void smsatInquiryPage80(bit8 *pInquiry, agsaSATAIdentifyData_t *pSATAIdData)
Definition: smsat.c:2899
osGLOBAL bit32 smsatSendDiagnostic_2(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:18954
osGLOBAL void smsatInquiryPage0(bit8 *pInquiry, agsaSATAIdentifyData_t *pSATAIdData)
Definition: smsat.c:2452
osGLOBAL bit32 smsatSetFeaturesPIO(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
SAT implementation for satSetFeatures.
Definition: smsat.c:4133
osGLOBAL bit32 smsatWriteSame10_3(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext, bit32 lba)
Definition: smsat.c:18734
osGLOBAL smSatInternalIo_t * smsatAllocIntIoResource(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceData_t *satDevData, bit32 dmaAllocLength, smSatInternalIo_t *satIntIo)
Definition: smsat.c:1547
osGLOBAL bit32 smsatSetFeaturesDMA(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:19928
osGLOBAL bit32 smsatSetFeaturesReadLookAhead(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:19996
osGLOBAL bit32 smsatSetFeaturesVolatileWriteCache(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:20062
osGLOBAL bit32 smsatRead_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:17076
osGLOBAL bit32 smsatSendReadLogExt(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:19603
osGLOBAL bit32 smsatLogSense_1(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsat.c:19162
osGLOBAL smSatIOContext_t * smsatPrepareNewIO(smSatInternalIo_t *satNewIntIo, smIORequest_t *smOrgIORequest, smDeviceData_t *satDevData, smIniScsiCmnd_t *scsiCmnd, smSatIOContext_t *satOrgIOContext)
Definition: smsat.c:1964
osGLOBAL void smsatInquiryPageB1(bit8 *pInquiry, agsaSATAIdentifyData_t *pSATAIdData)
Definition: smsat.c:2940
osGLOBAL void smsatSetSensePayload(smScsiRspSense_t *pSense, bit8 SnsKey, bit32 SnsInfo, bit16 SnsCode, smSatIOContext_t *satIOContext)
Definition: smsat.c:3850
osGLOBAL bit32 smPhyControlSend(smRoot_t *smRoot, smDeviceData_t *oneDeviceData, bit8 phyOp, smIORequest_t *CurrentTaskTag, bit32 queueNumber)
Definition: smsat.c:1182
osGLOBAL void smLocalPhyControlCB(agsaRoot_t *agRoot, agsaContext_t *agContext, bit32 phyId, bit32 phyOperation, bit32 status, void *parm)
Definition: smsatcb.c:12145
osGLOBAL void smsatReadMediaSerialNumberCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:6703
osGLOBAL void smsatExecuteDeviceDiagnosticCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:868
osGLOBAL void smsatSetFeaturesVolatileWriteCacheCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:12781
osGLOBAL void smsatWriteBufferCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:7087
osGLOBAL void smaSATAAbortCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 flag, bit32 status)
Definition: smsatcb.c:11998
osGLOBAL void smsatChainedWriteNVerifyCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:6333
osGLOBAL void smsatSMARTEnablePassCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:12931
osGLOBAL void smsatStartStopUnitCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:3316
osGLOBAL void smsatSetFeaturesDMACB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:12353
osGLOBAL void smsatCheckPowerModePassCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:11288
osGLOBAL void smsatCheckPowerModeCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:11123
osGLOBAL void smsatDeResetDeviceCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:11837
osGLOBAL void smsatRequestSenseCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:2301
smRoot_t * gsmRoot
Definition: sminit.c:47
osGLOBAL void smsatModeSelect6n10CB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:5229
osGLOBAL void smsatNonChainedVerifyCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:1409
osGLOBAL void smsatReadLogExtCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:10348
osGLOBAL void smsatTestUnitReadyCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:1932
osGLOBAL void smsatDeviceResetCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:697
osGLOBAL void smsatChainedVerifyCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:1630
GLOBAL void smsatTranslateATAErrorsToSCSIErrors(bit8 bATAStatus, bit8 bATAError, bit8 *pSenseKey, bit16 *pSenseCodeInfo)
Definition: smsatcb.c:989
osGLOBAL void ossaSATAEvent(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, agsaPortContext_t *agPortContext, agsaDevHandle_t *agDevHandle, bit32 event, bit32 agIOInfoLen, void *agParam)
Definition: smsatcb.c:10524
osGLOBAL void smsatResetDeviceCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:11626
osGLOBAL void smsatSMARTRStatusPassCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:13085
osGLOBAL FORCEINLINE void smsatDecrementPendingIO(smRoot_t *smRoot, smIntContext_t *smAllShared, smSatIOContext_t *satIOContext)
Definition: smsatcb.c:7626
osGLOBAL void smsatSetFeaturesAACB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:12243
osGLOBAL void smsatProcessAbort(smRoot_t *smRoot, smIORequest_t *smIORequest, smSatIOContext_t *satIOContext)
Definition: smsatcb.c:9439
__FBSDID("$FreeBSD$")
osGLOBAL void smsatInquiryIntCB(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smScsiRequest, smSatIOContext_t *satIOContext)
Definition: smsatcb.c:9955
osGLOBAL void smsatInquiryCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:9572
osGLOBAL void smsatPacketCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:222
osGLOBAL void smsatIDDataPassCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:11447
osGLOBAL void smsatNonChainedWriteNVerifyCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:5948
osGLOBAL void smsatSetFeaturesPIOCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:550
osGLOBAL void smsatLogSenseCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:4390
osGLOBAL void smPhyControlRespRcvd(smRoot_t *smRoot, agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, smDeviceData_t *oneDeviceData, smSMPFrameHeader_t *frameHeader, agsaFrameHandle_t frameHandle, smIORequest_t *CurrentTaskTag)
Definition: smsatcb.c:11050
osGLOBAL void smsatSendDiagnosticCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:2882
osGLOBAL void smSMPCompletedCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle)
Definition: smsatcb.c:10871
osGLOBAL void smsatDifHandler(smRoot_t *smRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, bit32 agIOInfoLen, void *agParam, bit32 agOtherInfo, bit32 interruptContext)
Definition: smsatcb.c:9383
osGLOBAL void smsatSMARTEnableCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:5069
osGLOBAL void smsatDelayedProcessAbnormalCompletion(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, smSatIOContext_t *satIOContext)
Definition: smsatcb.c:8222
osGLOBAL void smsatProcessAbnormalCompletion(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, smSatIOContext_t *satIOContext)
Definition: smsatcb.c:7748
FORCEINLINE void smsatNonChainedDataIOCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:1060
osGLOBAL void smsatReadBufferCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:6923
FORCEINLINE void smsatChainedDataIOCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:1124
osGLOBAL void smsatEncryptionHandler(smRoot_t *smRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, bit32 agIOInfoLen, void *agParam, bit32 agOtherInfo, bit32 interruptContext)
Definition: smsatcb.c:9322
osGLOBAL void smsatVerify10CB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:10130
osGLOBAL void smSMPCompleted(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle)
Definition: smsatcb.c:10907
osGLOBAL void smsatSynchronizeCache10n16CB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:5633
osGLOBAL void smsatNonDataIOCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:9507
osGLOBAL void smsatSMARTReadLogCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:13290
FORCEINLINE void smllSATACompleted(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, void *agFirstDword, bit32 agIOInfoLen, void *agParam)
Definition: smsatcb.c:49
osGLOBAL void smsatPassthroughCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:13530
osGLOBAL void smsatWriteSame10CB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:3947
GLOBAL void smsatTranslateATAPIErrorsToSCSIErrors(bit8 bCommand, bit8 bATAStatus, bit8 bATAError, bit8 *pSenseKey, bit16 *pSenseCodeInfo)
Definition: smsatcb.c:923
osGLOBAL void smsatReassignBlocksCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, agsaFrameHandle_t agFrameHandle, void *ioContext)
Definition: smsatcb.c:7242
osGLOBAL void smsatRequestSenseForATAPICB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:415
osGLOBAL void smsatSetFeaturesReadLookAheadCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:12587
osGLOBAL void smsatIOCompleted(smRoot_t *smRoot, smIORequest_t *smIORequest, agsaFisHeader_t *agFirstDword, bit32 respFisLen, agsaFrameHandle_t agFrameHandle, smSatIOContext_t *satIOContext, bit32 interruptContext)
Definition: smsatcb.c:9014
osGLOBAL void smsatIDStartCB(agsaRoot_t *agRoot, agsaIORequest_t *agIORequest, bit32 agIOStatus, agsaFisHeader_t *agFirstDword, bit32 agIOInfoLen, void *agParam, void *ioContext)
Definition: smsatcb.c:8698
data structure stores OS specific and LL specific context
Definition: sa.h:1658
void * osData
Definition: sa.h:1659
void * sdkData
Definition: sa.h:1660
bit8 sasAddressHi[4]
Definition: sa.h:3359
bit32 LowerLBA
Definition: sa.h:3358
bit32 ErrBoffsetEDataLen
Definition: sa.h:3366
bit8 sasAddressLo[4]
Definition: sa.h:3360
bit32 UpperLBA
Definition: sa.h:3357
bit32 DIFErrDevID
Definition: sa.h:3365
agsaFisRegH2DData_t d
Definition: sa_spec.h:366
agsaFisRegH2DHeader_t h
Definition: sa_spec.h:365
data structure provides the identify data of the SATA device
Definition: sa_spec.h:530
agsaSATAHostFis_t fis
Definition: sa.h:3140
void * tdData
Definition: sm.h:138
void * smData
Definition: sm.h:139
bit32 satWWNSupport
Definition: smtypes.h:123
smIORequest_t * satTmTaskTag
Definition: smtypes.h:150
bit32 satDeviceFaultState
Definition: smtypes.h:137
bit32 satNCQ
Definition: smtypes.h:110
smDeviceHandle_t * smDevHandle
Definition: smtypes.h:97
bit32 IDDeviceValid
Definition: smtypes.h:145
bit32 satDeviceType
Definition: smtypes.h:142
bit32 SMAbortAll
Definition: smtypes.h:96
agsaSATAIdentifyData_t satIdentifyData
Definition: smtypes.h:109
bit32 OSAbortAll
Definition: smtypes.h:153
smRoot_t * smRoot
Definition: smtypes.h:92
bit32 satSectorDone
Definition: smtypes.h:143
bit32 satVerifyState
Definition: smtypes.h:133
bit32 satAbortAfterReset
Definition: smtypes.h:131
agsaDevHandle_t * agDevHandle
Definition: smtypes.h:93
bit32 volatile satPendingNONNCQIO
Definition: smtypes.h:128
bit32 satLookAheadEnabled
Definition: smtypes.h:136
bit32 volatile satPendingNCQIO
Definition: smtypes.h:127
bit32 valid
Definition: smtypes.h:94
bit32 SMNumOfFCA
Definition: smtypes.h:102
bit32 satFormatState
Definition: smtypes.h:139
bit32 satDriveState
Definition: smtypes.h:130
bit32 satDMASupport
Definition: smtypes.h:117
bit32 satReadLookAheadSupport
Definition: smtypes.h:121
bit32 satBGPendingDiag
Definition: smtypes.h:147
bit32 satVolatileWriteCacheSupport
Definition: smtypes.h:122
bit32 volatile satPendingIO
Definition: smtypes.h:126
bit32 satWriteCacheEnabled
Definition: smtypes.h:135
bit32 satStopState
Definition: smtypes.h:138
bit32 id
Definition: smtypes.h:91
bit32 satNCQMaxIO
Definition: smtypes.h:129
bit32 satDMASetupAA
Definition: smtypes.h:124
bit32 satDMAEnabled
Definition: smtypes.h:118
smDeviceHandle_t * smDevHandle
Definition: smtypes.h:270
void * osMemHandle
Definition: smtypes.h:295
smSenseData_t smSenseData
Definition: smtypes.h:280
struct smIORequestBody_s::@5::@7 SATA
union smIORequestBody_s::@6 IOType
bit32 ioCompleted
Definition: smtypes.h:285
agsaSATAInitiatorRequest_t agSATARequestBody
Definition: smtypes.h:278
smScsiRspSense_t sensePayload
Definition: smtypes.h:279
struct smIORequestBody_s::@6::@9 InitiatorTMIO
agsaIORequest_t agIORequest
Definition: smtypes.h:272
union smIORequestBody_s::@5 transport
smIORequest_t * smIORequest
Definition: smtypes.h:271
smSatIOContext_t satIOContext
Definition: smtypes.h:281
bit8 cdb[16]
Definition: sm.h:159
bit32 expDataLength
Definition: sm.h:156
smIntContext_t smAllShared
Definition: smtypes.h:354
smList_t * flink
Definition: smlist.h:31
void * virtPtr
Definition: sm.h:165
bit8 smpFunctionResult
Definition: smdefs.h:805
smDeviceHandle_t * smDevHandle
Definition: smtypes.h:306
smDeviceData_t * smDeviceData
Definition: smtypes.h:310
smIORequest_t * CurrentTaskTag
Definition: smtypes.h:311
void * osMemHandle
Definition: smtypes.h:309
smSMPCompleted_t SMPCompletionFunc
Definition: smtypes.h:304
struct smSatIOContext_s * satOrgIOContext
Definition: smtypes.h:249
smSatInternalIo_t * satIntIoContext
Definition: smtypes.h:232
bit32 LoopNum2
Definition: smtypes.h:242
void * smRequestBody
Definition: smtypes.h:227
struct smSatIOContext_s * satToBeAbortedIOContext
Definition: smtypes.h:248
smList_t satIoContextLink
Definition: smtypes.h:221
bit32 ParmIndex
Definition: smtypes.h:244
bit8 superIOFlag
Definition: smtypes.h:235
bit8 sectorCnt07
Definition: smtypes.h:258
smScsiRspSense_t * pSense
Definition: smtypes.h:225
bit8 LBA[8]
Definition: smtypes.h:243
bit32 interruptContext
Definition: smtypes.h:230
smDeviceHandle_t * psmDeviceHandle
Definition: smtypes.h:233
smIniScsiCmnd_t * pScsiCmnd
Definition: smtypes.h:224
void * smScsiXchg
Definition: smtypes.h:228
smSatCompleteCbPtr_t satCompleteCB
Definition: smtypes.h:231
smSenseData_t * pSmSenseData
Definition: smtypes.h:226
agsaFisRegHostToDevice_t * pFis
Definition: smtypes.h:223
smDeviceData_t * pSatDevData
Definition: smtypes.h:222
smIORequest_t satIntSmIORequest
Definition: smtypes.h:76
bit32 satIntFlag
Definition: smtypes.h:81
void * satIntRequestBody
Definition: smtypes.h:77
smScsiInitiatorRequest_t satIntSmScsiXchg
Definition: smtypes.h:78
smMem_t satIntDmaMem
Definition: smtypes.h:79
smIORequest_t * satOrgSmIORequest
Definition: smtypes.h:82
void * sglVirtualAddr
Definition: sm.h:242
smIniScsiCmnd_t scsiCmnd
Definition: sm.h:243
bit8 senseLen
Definition: sm.h:268
void * senseData
Definition: sm.h:267
Definition: titypes.h:61
#define TD_INTERNAL_TM_RESET
Definition: tddefs.h:1085
osGLOBAL FORCEINLINE bit32 tdsmRotateQnumber(smRoot_t *smRoot, smDeviceHandle_t *smDeviceHandle)
osGLOBAL bit32 tdsmFreeMemory(smRoot_t *smRoot, void *osDMAHandle, bit32 allocLength)
osGLOBAL FORCEINLINE sbit32 tdsmInterlockedExchange(smRoot_t *smRoot, sbit32 volatile *Target, sbit32 Value)
osGLOBAL void tdsmEventCB(smRoot_t *smRoot, smDeviceHandle_t *smDeviceHandle, smIntrEventType_t eventType, bit32 eventStatus, void *parm)
osGLOBAL void tdsmIDCompletedCB(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, bit32 status, void *IDdata)
osGLOBAL FORCEINLINE sbit32 tdsmInterlockedDecrement(smRoot_t *smRoot, sbit32 volatile *Addend)
osGLOBAL bit32 tdsmSetDeviceQueueDepth(smRoot_t *smRoot, smIORequest_t *smIORequest, bit32 QueueDepth)
osGLOBAL FORCEINLINE void tdsmSingleThreadedEnter(smRoot_t *smRoot, bit32 syncLockId)
osGLOBAL FORCEINLINE void tdsmIOCompletedCB(smRoot_t *smRoot, smIORequest_t *smIORequest, bit32 status, bit32 statusDetail, smSenseData_t *senseData, bit32 interruptContext)
osGLOBAL FORCEINLINE void tdsmSingleThreadedLeave(smRoot_t *smRoot, bit32 syncLockId)
osGLOBAL bit32 tdsmAllocMemory(smRoot_t *smRoot, void **osMemHandle, void **virtPtr, bit32 *physAddrUpper, bit32 *physAddrLower, bit32 alignment, bit32 allocLength, smBOOLEAN isCacheable)
#define SCSI_STAT_CHECK_CONDITION
Definition: tidefs.h:364
@ tiAbortOK
Definition: tidefs.h:511
@ tiSuccess
Definition: tidefs.h:67
@ tiError
Definition: tidefs.h:68
#define SCSI_STAT_GOOD
Definition: tidefs.h:363
@ tiIntrEventTypeLocalAbort
Definition: tidefs.h:463
#define AG_ABORT_TASK
Definition: tidefs.h:441
agsaFisRegD2HHeader_t D2H
Definition: sa_spec.h:261
agsaFisPioSetupHeader_t PioSetup
Definition: sa_spec.h:264
agsaFisRegHostToDevice_t fisRegHostToDev
Definition: sa_spec.h:397