1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
3 *
4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5 *that the following conditions are met:
6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7 *following disclaimer.
8 *2. Redistributions in binary form must reproduce the above copyright notice,
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10 *with the distribution.
11 *
12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21 ********************************************************************************/
22 /*****************************************************************************/
23 /** \file
24 *
25 * The file implementing SCSI/ATA Translation (SAT) for LL Layer callback
26 *
27 */
28 /*****************************************************************************/
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 #include <dev/pms/config.h>
32
33 #include <dev/pms/freebsd/driver/common/osenv.h>
34 #include <dev/pms/freebsd/driver/common/ostypes.h>
35 #include <dev/pms/freebsd/driver/common/osdebug.h>
36
37 #ifdef SATA_ENABLE
38
39 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
40 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
41 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
42
43 #include <dev/pms/RefTisa/tisa/api/titypes.h>
44 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
45 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
46 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
47
48 #ifdef FDS_SM
49 #include <dev/pms/RefTisa/sat/api/sm.h>
50 #include <dev/pms/RefTisa/sat/api/smapi.h>
51 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
52 #endif
53
54 #ifdef FDS_DM
55 #include <dev/pms/RefTisa/discovery/api/dm.h>
56 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
57 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
58 #endif
59
60 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
61 #include <dev/pms/freebsd/driver/common/osstring.h>
62 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
63
64 #ifdef INITIATOR_DRIVER
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
66 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
67 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
68 #endif
69
70 #ifdef TARGET_DRIVER
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
72 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
73 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
74 #endif
75
76 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
77 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
78
79 #include <dev/pms/RefTisa/tisa/sassata/sata/host/sat.h>
80 #include <dev/pms/RefTisa/tisa/sassata/sata/host/satproto.h>
81
82 /*****************************************************************************
83 *! \brief ossaSATACompleted
84 *
85 * This routine is called to complete a SATA request previously issued to the
86 * LL Layer in saSATAStart()
87 *
88 * \param agRoot: Handles for this instance of SAS/SATA hardware
89 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
90 * \param agIOStatus: Status of completed I/O.
91 * \param agFirstDword:Pointer to the four bytes of FIS.
92 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
93 * length.
94 * \param agParam: Additional info based on status.
95 *
96 * \return: none
97 *
98 *****************************************************************************/
99 GLOBAL void
100 ossaSATACompleted(
101 agsaRoot_t *agRoot,
102 agsaIORequest_t *agIORequest,
103 bit32 agIOStatus,
104 void *agFirstDword,
105 bit32 agIOInfoLen,
106 void *agParam
107 )
108
109 {
110 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
111 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
112 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
113 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
114 tdIORequestBody_t *tdIORequestBody;
115 satIOContext_t *satIOContext;
116 satDeviceData_t *pSatDevData;
117 tdsaDeviceData_t *tdsaDeviceData = agNULL;
118 tdsaPortContext_t *onePortContext;
119 tiDeviceHandle_t *tiDeviceHandle = agNULL;
120 agsaDevHandle_t *agDevHandle = agNULL;
121 bit32 status;
122 tdsaDeviceData_t *oneDeviceData = agNULL;
123
124 TDSA_OUT_ENTER(tiRoot);
125
126 TI_DBG6(("ossaSATACompleted: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
127 agIORequest, agIOStatus, agIOInfoLen));
128
129 if (agIORequest == agNULL)
130 {
131 TI_DBG1(("ossaSATACompleted: agIORequest is NULL!!!!\n"));
132 return;
133 }
134
135 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
136
137 if (tdIORequestBody == agNULL)
138 {
139 TI_DBG1(("ossaSATACompleted: tdIORequestBody is NULL!!!!\n"));
140 return;
141 }
142 /* for debugging */
143 if (tdIORequestBody->ioCompleted == agTRUE)
144 {
145 tiDeviceHandle = tdIORequestBody->tiDevHandle;
146 if (tiDeviceHandle == agNULL)
147 {
148 TI_DBG1(("ossaSATACompleted: tiDeviceHandle is NULL!!!!\n"));
149 return;
150 }
151 tdsaDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
152 TI_DBG1(("ossaSATACompleted: Error!!!!!! double completion\n"));
153 if (tdsaDeviceData == agNULL)
154 {
155 TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
156 return;
157 }
158 TI_DBG1(("ossaSATACompleted: did %d \n", tdsaDeviceData->id));
159 return;
160 }
161
162 tdIORequestBody->ioCompleted = agTRUE;
163 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
164
165 if (satIOContext == agNULL)
166 {
167 TI_DBG1(("ossaSATACompleted: satIOContext is NULL!!!!\n"));
168 return;
169 }
170
171 pSatDevData = satIOContext->pSatDevData;
172
173 if (tdIORequestBody->tiDevHandle != agNULL)
174 {
175 oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
176 }
177
178 if (pSatDevData == agNULL && oneDeviceData != agNULL)
179 {
180 TI_DBG1(("ossaSATACompleted: pSatDevData is NULL, loc 1, wrong\n"));
181 pSatDevData = &(oneDeviceData->satDevData);
182 }
183
184 if (pSatDevData == agNULL)
185 {
186 TI_DBG1(("ossaSATACompleted: pSatDevData is NULL loc 2, wrong\n"));
187 if (satIOContext->satOrgIOContext == agNULL)
188 {
189 TI_DBG1(("ossaSATACompleted: external command\n"));
190 }
191 else
192 {
193 TI_DBG1(("ossaSATACompleted: internal command\n"));
194 }
195 goto ext;
196 }
197
198 tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
199 if (oneDeviceData != tdsaDeviceData)
200 {
201 if (satIOContext->satOrgIOContext == agNULL)
202 {
203 TI_DBG1(("ossaSATACompleted: diff device handle; external command\n"));
204 }
205 else
206 {
207 TI_DBG1(("ossaSATACompleted: diff device handle; internal command\n"));
208 }
209 }
210
211 if (tdsaDeviceData == agNULL)
212 {
213 TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n"));
214 return;
215 }
216
217 onePortContext = tdsaDeviceData->tdPortContext;
218
219 /* retries in OSSA_IO_XFER_OPEN_RETRY_TIMEOUT */
220 if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
221 {
222 if (tdsaDeviceData->valid == agTRUE && tdsaDeviceData->registered == agTRUE &&
223 tdsaDeviceData->tdPortContext != agNULL )
224 {
225 if (tdIORequestBody->reTries <= OPEN_RETRY_RETRIES) /* 10 */
226 {
227 agDevHandle = tdsaDeviceData->agDevHandle;
228 status = saSATAStart( agRoot,
229 agIORequest,
230 tdsaRotateQnumber(tiRoot, tdsaDeviceData),
231 agDevHandle,
232 satIOContext->reqType,
233 &(tdIORequestBody->transport.SATA.agSATARequestBody),
234 satIOContext->sataTag,
235 ossaSATACompleted);
236
237 if (status == AGSA_RC_SUCCESS)
238 {
239 TI_DBG1(("ossaSATACompleted: retried\n"));
240 tdIORequestBody->ioStarted = agTRUE;
241 tdIORequestBody->ioCompleted = agFALSE;
242 tdIORequestBody->reTries++;
243 goto ext;
244 }
245 else
246 {
247 TI_DBG1(("ossaSATACompleted: retry failed\n"));
248 tdIORequestBody->ioStarted = agFALSE;
249 tdIORequestBody->ioCompleted = agTRUE;
250 tdIORequestBody->reTries = 0;
251 }
252 }
253 else
254 {
255 /* retries is over, do nothing */
256 TI_DBG1(("ossaSATACompleted: retry is over and fail\n"));
257 tdIORequestBody->reTries = 0;
258 }
259 }
260 else
261 {
262 TI_DBG1(("ossaSATACompleted: incorrect device state or no portcontext\n"));
263 tdIORequestBody->reTries = 0;
264 }
265 } /* if OSSA_IO_XFER_OPEN_RETRY_TIMEOUT*/
266
267 /* release tag value for SATA */
268 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
269 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
270 {
271 satTagRelease(tiRoot, pSatDevData, satIOContext->sataTag);
272 }
273
274 /* send SMP_PHY_CONTROL_HARD_RESET */
275 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
276 {
277 if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
278 {
279 TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
280 pSatDevData->NumOfFCA++;
281 tdsaPhyControlSend(tiRoot,
282 tdsaDeviceData,
283 SMP_PHY_CONTROL_HARD_RESET,
284 agNULL,
285 tdsaRotateQnumber(tiRoot, tdsaDeviceData)
286 );
287 }
288 else
289 {
290 /* given up after one time of SMP HARD RESET; */
291 TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
292 if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
293 {
294 /*
295 1. remove this device
296 2. device removal event
297 */
298 tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
299 tdsaDeviceData->valid = agFALSE;
300 tdsaDeviceData->valid2 = agFALSE;
301 tdsaDeviceData->registered = agFALSE;
302 // pSatDevData->NumOfFCA = 0;
303 ostiInitiatorEvent(
304 tiRoot,
305 onePortContext->tiPortalContext,
306 agNULL,
307 tiIntrEventTypeDeviceChange,
308 tiDeviceRemoval,
309 agNULL
310 );
311 }
312 }
313 }
314
315 if (agIOStatus == OSSA_IO_ABORTED)
316 {
317 /*
318 free abort IO request itself - agParam; done in ossaSATAEvent()
319 */
320 }
321 /* just for debugging */
322 if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
323 {
324 TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
325 }
326 if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
327 {
328 TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
329 }
330
331 satIOContext->satCompleteCB( agRoot,
332 agIORequest,
333 agIOStatus,
334 agFirstDword,
335 agIOInfoLen,
336 agParam,
337 satIOContext);
338 ext:
339 TDSA_OUT_LEAVE(tiRoot);
340 }
341
342 /*****************************************************************************
343 *! \brief satPacketCB
344 *
345 * This routine is a callback function called from ossaSATACompleted().
346 * This CB routine deals with normal Packet command I/O SATA request.
347 *
348 * \param agRoot: Handles for this instance of SAS/SATA hardware
349 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
350 * \param agIOStatus: Status of completed I/O.
351 * \param agFirstDword:Pointer to the four bytes of FIS.
352 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
353 * length.
354 * \param agParam: Additional info based on status.
355 * \param ioContext: Pointer to satIOContext_t.
356 *
357 * \return: none
358 *
359 *****************************************************************************/
360
361 void satPacketCB(
362 agsaRoot_t *agRoot,
363 agsaIORequest_t *agIORequest,
364 bit32 agIOStatus,
365 agsaFisHeader_t *agFirstDword,
366 bit32 agIOInfoLen,
367 void *agParam,
368 void *ioContext
369 )
370 {
371 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
372 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
373 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
374 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
375 tdIORequestBody_t *tdIORequestBody;
376 tdIORequestBody_t *tdOrgIORequestBody;
377 satIOContext_t *satIOContext;
378 satIOContext_t *satOrgIOContext;
379 satIOContext_t *satNewIOContext;
380 satInternalIo_t *satIntIo;
381 satInternalIo_t *satNewIntIo = agNULL;
382 satDeviceData_t *satDevData;
383 scsiRspSense_t *pSense;
384 tiIORequest_t *tiOrgIORequest;
385 tiIniScsiCmnd_t *scsiCmnd;
386 bit32 interruptContext = osData->IntContext;
387 bit8 bSenseKey = 0;
388 bit16 bSenseCodeInfo = 0;
389 bit32 status = 0;
390
391 TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
392
393 /* internally generate tiIOContext */
394 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
395 satIOContext = (satIOContext_t *) ioContext;
396 satIntIo = satIOContext->satIntIoContext;
397 satDevData = satIOContext->pSatDevData;
398
399 /*ttttttthe one */
400 if (satIntIo == agNULL)
401 {
402 TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
403 satOrgIOContext = satIOContext;
404 tiOrgIORequest = tdIORequestBody->tiIORequest;
405 pSense = satOrgIOContext->pSense;
406 scsiCmnd = satOrgIOContext->pScsiCmnd;
407 }
408 else
409 {
410 TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
411 satOrgIOContext = satIOContext->satOrgIOContext;
412 if (satOrgIOContext == agNULL)
413 {
414 TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
415 return;
416 }
417 else
418 {
419 TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
420 }
421 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
422 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
423 pSense = satOrgIOContext->pSense;
424 scsiCmnd = satOrgIOContext->pScsiCmnd;
425 }
426
427 /* Parse CDB */
428 switch(scsiCmnd->cdb[0])
429 {
430 case SCSIOPC_TEST_UNIT_READY:
431 //satTestUnitReadyCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
432 //break;
433 case SCSIOPC_GET_EVENT_STATUS_NOTIFICATION:
434 //break;
435 case SCSIOPC_READ_CAPACITY_10:
436 case SCSIOPC_READ_CAPACITY_16:
437 //satPacketReadCapacityCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext);
438 //break;
439 default:
440 break;
441 }
442
443 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
444
445 tdIORequestBody->ioCompleted = agTRUE;
446 tdIORequestBody->ioStarted = agFALSE;
447
448 /* interal structure free */
449 satFreeIntIoResource( tiRoot, satDevData, satIntIo);
450
451 if( agIOStatus == OSSA_IO_SUCCESS && agFirstDword == agNULL)
452 {
453 TI_DBG1(("satPacketCB: agIOStatus == OSSA_IO_SUCCESS, agFirstDword == agNULL \n"));
454 ostiInitiatorIOCompleted( tiRoot,
455 tdIORequestBody->tiIORequest,
456 tiIOSuccess,
457 SCSI_STAT_GOOD,
458 agNULL,
459 interruptContext);
460 }
461 else if (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL)
462 {
463 TI_DBG1(("satPacketCB: wrong. agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL \n"));
464 satNewIntIo = satAllocIntIoResource( tiRoot,
465 tiOrgIORequest,
466 satDevData,
467 32,
468 satNewIntIo);
469 if (satNewIntIo == agNULL)
470 {
471 /* memory allocation failure */
472 /* just translate the ATAPI error register to sense information */
473 satTranslateATAPIErrorsToSCSIErrors(
474 scsiCmnd->cdb[0],
475 agFirstDword->D2H.status,
476 agFirstDword->D2H.error,
477 &bSenseKey,
478 &bSenseCodeInfo
479 );
480 satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
481 ostiInitiatorIOCompleted( tiRoot,
482 tdIORequestBody->tiIORequest,
483 tiIOSuccess,
484 SCSI_STAT_CHECK_CONDITION,
485 satOrgIOContext->pTiSenseData,
486 interruptContext);
487 TI_DBG1(("satPacketCB: momory allocation fails\n"));
488 return;
489 } /* end memory allocation */
490
491 satNewIOContext = satPrepareNewIO(satNewIntIo,
492 tiOrgIORequest,
493 satDevData,
494 scsiCmnd,
495 satOrgIOContext
496 );
497 /* sends request sense to ATAPI device for acquiring sense information */
498 status = satRequestSenseForATAPI(tiRoot,
499 &satNewIntIo->satIntTiIORequest,
500 satNewIOContext->ptiDeviceHandle,
501 &satNewIntIo->satIntTiScsiXchg,
502 satNewIOContext
503 );
504 if (status != tiSuccess)
505 {
506 satFreeIntIoResource( tiRoot,
507 satDevData,
508 satNewIntIo);
509 /* just translate the ATAPI error register to sense information */
510 satTranslateATAPIErrorsToSCSIErrors(
511 scsiCmnd->cdb[0],
512 agFirstDword->D2H.status,
513 agFirstDword->D2H.error,
514 &bSenseKey,
515 &bSenseCodeInfo
516 );
517 satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext);
518 ostiInitiatorIOCompleted( tiRoot,
519 tdIORequestBody->tiIORequest,
520 tiIOSuccess,
521 SCSI_STAT_CHECK_CONDITION,
522 satOrgIOContext->pTiSenseData,
523 interruptContext);
524 TI_DBG1(("satPacketCB: failed to call satRequestSenseForATAPI()\n"));
525 }
526 }
527 else if (agIOStatus != OSSA_IO_SUCCESS)
528 {
529 TI_DBG1(("satPacketCB: wrong. agIOStatus != OSSA_IO_SUCCESS, status %d\n", agIOStatus));
530 itdsatProcessAbnormalCompletion(
531 agRoot,
532 agIORequest,
533 agIOStatus,
534 agFirstDword,
535 agIOInfoLen,
536 agParam,
537 satIOContext);
538 }
539 else
540 {
541 TI_DBG1(("satPacketCB: Unknown error \n"));
542 ostiInitiatorIOCompleted( tiRoot,
543 tdIORequestBody->tiIORequest,
544 tiIOFailed,
545 tiDetailOtherError,
546 agNULL,
547 interruptContext);
548 }
549 }
550 /*****************************************************************************
551 *! \brief satRequestSenseForATAPICB
552 *
553 * This routine is a callback function called from ossaSATACompleted().
554 * This CB routine deals with normal non-chained data I/O SATA request.
555 *
556 * \param agRoot: Handles for this instance of SAS/SATA hardware
557 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
558 * \param agIOStatus: Status of completed I/O.
559 * \param agFirstDword:Pointer to the four bytes of FIS.
560 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
561 * length.
562 * \param agParam: Additional info based on status.
563 * \param ioContext: Pointer to satIOContext_t.
564 *
565 * \return: none
566 *
567 *****************************************************************************/
568 void satRequestSenseForATAPICB(
569 agsaRoot_t *agRoot,
570 agsaIORequest_t *agIORequest,
571 bit32 agIOStatus,
572 agsaFisHeader_t *agFirstDword,
573 bit32 agIOInfoLen,
574 void *agParam,
575 void *ioContext
576 )
577 {
578 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
579 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
580 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
581 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
582 tdIORequestBody_t *tdIORequestBody;
583 tdIORequestBody_t *tdOrgIORequestBody;
584 satIOContext_t *satIOContext;
585 satIOContext_t *satOrgIOContext;
586 satInternalIo_t *satIntIo;
587 satDeviceData_t *satDevData;
588 tiIORequest_t *tiOrgIORequest;
589 bit32 interruptContext = osData->IntContext;
590
591 TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
592
593 /* internally generate tiIOContext */
594 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
595 satIOContext = (satIOContext_t *) ioContext;
596 satIntIo = satIOContext->satIntIoContext;
597 satDevData = satIOContext->pSatDevData;
598
599 /*ttttttthe one */
600 if (satIntIo == agNULL)
601 {
602 TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n"));
603 satOrgIOContext = satIOContext;
604 tiOrgIORequest = tdIORequestBody->tiIORequest;
605 }
606 else
607 {
608 TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n"));
609 satOrgIOContext = satIOContext->satOrgIOContext;
610 if (satOrgIOContext == agNULL)
611 {
612 TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n"));
613 return;
614 }
615 else
616 {
617 TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n"));
618 }
619 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
620 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
621 }
622
623 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
624
625 tdIORequestBody->ioCompleted = agTRUE;
626 tdIORequestBody->ioStarted = agFALSE;
627
628 /* copy the request sense buffer to original IO buffer*/
629 if (satIntIo != agNULL)
630 {
631 osti_memcpy(satOrgIOContext->pTiSenseData->senseData, satIntIo->satIntDmaMem.virtPtr, SENSE_DATA_LENGTH);
632 satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
633 /* interal structure free */
634 satFreeIntIoResource( tiRoot, satDevData, satIntIo);
635 }
636
637 /* notify the OS to complete this SRB */
638 ostiInitiatorIOCompleted( tiRoot,
639 tiOrgIORequest,
640 tiIOSuccess,
641 SCSI_STAT_CHECK_CONDITION,
642 satOrgIOContext->pTiSenseData,
643 interruptContext);
644 }
645 /*****************************************************************************
646 *! \brief satSetFeaturesPIOCB
647 *
648 * This routine is a callback function called from ossaSATACompleted().
649 * This CB routine deals with normal non-chained data I/O SATA request.
650 *
651 * \param agRoot: Handles for this instance of SAS/SATA hardware
652 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
653 * \param agIOStatus: Status of completed I/O.
654 * \param agFirstDword:Pointer to the four bytes of FIS.
655 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
656 * length.
657 * \param agParam: Additional info based on status.
658 * \param ioContext: Pointer to satIOContext_t.
659 *
660 * \return: none
661 *
662 *****************************************************************************/
663 void satSetFeaturesPIOCB(
664 agsaRoot_t *agRoot,
665 agsaIORequest_t *agIORequest,
666 bit32 agIOStatus,
667 agsaFisHeader_t *agFirstDword,
668 bit32 agIOInfoLen,
669 void *agParam,
670 void *ioContext
671 )
672 {
673 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
674 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
675 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
676 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
677 tdIORequestBody_t *tdIORequestBody;
678 tdIORequestBody_t *tdOrgIORequestBody;
679 satIOContext_t *satIOContext;
680 satIOContext_t *satOrgIOContext;
681 satIOContext_t *satNewIOContext;
682 satInternalIo_t *satIntIo;
683 satInternalIo_t *satNewIntIo = agNULL;
684 satDeviceData_t *satDevData;
685 tiIORequest_t *tiOrgIORequest;
686 tiIniScsiCmnd_t *scsiCmnd;
687 bit32 status;
688
689 TI_DBG3(("satSetFeaturesPIOCB start\n"));
690
691 /* internally generate tiIOContext */
692 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
693 satIOContext = (satIOContext_t *) ioContext;
694 satIntIo = satIOContext->satIntIoContext;
695 satDevData = satIOContext->pSatDevData;
696
697 /*ttttttthe one */
698 if (satIntIo == agNULL)
699 {
700 TI_DBG4(("satSetFeaturesPIOCB: External satInternalIo_t satIntIoContext\n"));
701 satOrgIOContext = satIOContext;
702 tiOrgIORequest = tdIORequestBody->tiIORequest;
703 scsiCmnd = satOrgIOContext->pScsiCmnd;
704 }
705 else
706 {
707 TI_DBG4(("satSetFeaturesPIOCB: Internal satInternalIo_t satIntIoContext\n"));
708 satOrgIOContext = satIOContext->satOrgIOContext;
709 if (satOrgIOContext == agNULL)
710 {
711 TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NULL, wrong\n"));
712 return;
713 }
714 else
715 {
716 TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NOT NULL\n"));
717 }
718 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
719 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
720 scsiCmnd = satOrgIOContext->pScsiCmnd;
721 }
722 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
723
724 tdIORequestBody->ioCompleted = agTRUE;
725 tdIORequestBody->ioStarted = agFALSE;
726
727 /* interal structure free */
728 satFreeIntIoResource(tiRoot,
729 satDevData,
730 satIntIo);
731
732 /*if the ATAPI device support DMA, then enble this feature*/
733 if (satDevData->satDMASupport && satDevData->satDMAEnabled)
734 {
735 satNewIntIo = satAllocIntIoResource( tiRoot,
736 tiOrgIORequest,
737 satDevData,
738 0,
739 satNewIntIo);
740 if (satNewIntIo == agNULL)
741 {
742 TI_DBG1(("satSetFeaturesPIOCB: momory allocation fails\n"));
743 return;
744 } /* end memory allocation */
745
746 satNewIOContext = satPrepareNewIO(satNewIntIo,
747 tiOrgIORequest,
748 satDevData,
749 scsiCmnd,
750 satOrgIOContext
751 );
752 /* sends either ATA SET FEATURES based on DMA bit */
753 status = satSetFeatures(tiRoot,
754 &satNewIntIo->satIntTiIORequest,
755 satNewIOContext->ptiDeviceHandle,
756 &satNewIntIo->satIntTiScsiXchg,
757 satNewIOContext,
758 agTRUE
759 );
760 if (status != tiSuccess)
761 {
762 satFreeIntIoResource( tiRoot, satDevData, satNewIntIo);
763 TI_DBG1(("satSetFeaturesPIOCB: failed to call satSetFeatures()\n"));
764 }
765 }
766 }
767
768 /*****************************************************************************
769 *! \brief satSetFeaturesCB
770 *
771 * This routine is a callback function called from ossaSATACompleted().
772 * This CB routine deals with normal non-chained data I/O SATA request.
773 *
774 * \param agRoot: Handles for this instance of SAS/SATA hardware
775 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
776 * \param agIOStatus: Status of completed I/O.
777 * \param agFirstDword:Pointer to the four bytes of FIS.
778 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
779 * length.
780 * \param agParam: Additional info based on status.
781 * \param ioContext: Pointer to satIOContext_t.
782 *
783 * \return: none
784 *
785 *****************************************************************************/
786 void satSetFeaturesCB(
787 agsaRoot_t *agRoot,
788 agsaIORequest_t *agIORequest,
789 bit32 agIOStatus,
790 agsaFisHeader_t *agFirstDword,
791 bit32 agIOInfoLen,
792 void *agParam,
793 void *ioContext
794 )
795 {
796 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
797 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
798 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
799 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
800 tdIORequestBody_t *tdIORequestBody;
801 tdIORequestBody_t *tdOrgIORequestBody = agNULL;
802 satIOContext_t *satIOContext;
803 satIOContext_t *satOrgIOContext;
804 satInternalIo_t *satIntIo;
805 satDeviceData_t *satDevData;
806 tdsaPortContext_t *onePortContext = agNULL;
807 tiPortalContext_t *tiPortalContext = agNULL;
808 tdsaDeviceData_t *oneDeviceData = agNULL;
809 bit8 PhyID =0;
810 TI_DBG3(("satSetFeaturesCB start\n"));
811
812 /* internally generate tiIOContext */
813 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
814 satIOContext = (satIOContext_t *) ioContext;
815 satIntIo = satIOContext->satIntIoContext;
816 satDevData = satIOContext->pSatDevData;
817 oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData;
818 onePortContext = oneDeviceData->tdPortContext;
819 if (onePortContext == agNULL)
820 {
821 TI_DBG4(("satSetFeaturesCB: onePortContext is NULL, wrong\n"));
822 return;
823 }
824 tiPortalContext = onePortContext->tiPortalContext;
825 PhyID = oneDeviceData->phyID;
826 /*ttttttthe one */
827 if (satIntIo == agNULL)
828 {
829 TI_DBG4(("satSetFeaturesCB: External satInternalIo_t satIntIoContext\n"));
830 satOrgIOContext = satIOContext;
831 }
832 else
833 {
834 TI_DBG4(("satSetFeaturesCB: Internal satInternalIo_t satIntIoContext\n"));
835 satOrgIOContext = satIOContext->satOrgIOContext;
836 if (satOrgIOContext == agNULL)
837 {
838 TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NULL, wrong\n"));
839 return;
840 }
841 else
842 {
843 TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NOT NULL\n"));
844 }
845 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
846 }
847 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
848
849 tdIORequestBody->ioCompleted = agTRUE;
850 tdIORequestBody->ioStarted = agFALSE;
851
852 /* interal structure free */
853 satFreeIntIoResource(tiRoot,
854 satDevData,
855 satIntIo);
856
857
858 /* clean up TD layer's IORequestBody */
859 if (tdOrgIORequestBody!= agNULL)
860 {
861 ostiFreeMemory(tiRoot,
862 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
863 sizeof(tdIORequestBody_t)
864 );
865 }
866
867 if (onePortContext != agNULL)
868 {
869 /* this condition is for tdsaDiscoveryStartIDDevCB routine*/
870 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
871 {
872 TI_DBG1(("satSetFeaturesCB: ID completed after discovery is done; tiDeviceArrival\n"));
873 /* in case registration is finished after discovery is finished */
874 ostiInitiatorEvent(
875 tiRoot,
876 tiPortalContext,
877 agNULL,
878 tiIntrEventTypeDeviceChange,
879 tiDeviceArrival,
880 agNULL
881 );
882 return;
883 }
884 TI_DBG2(("satSetFeaturesCB: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
885 /* the below codes is for satAddSATAIDDevCB routine*/
886 /* notifying link up */
887 ostiPortEvent (
888 tiRoot,
889 tiPortLinkUp,
890 tiSuccess,
891 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
892 );
893 #ifdef INITIATOR_DRIVER
894 /* triggers discovery */
895 ostiPortEvent(
896 tiRoot,
897 tiPortDiscoveryReady,
898 tiSuccess,
899 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
900 );
901 #endif
902 }
903 else
904 {
905 TI_DBG1(("satSetFeaturesCB: onePortContext is NULL, wrong\n"));
906 }
907 }
908 /*****************************************************************************
909 *! \brief satDeviceResetCB
910 *
911 * This routine is a callback function called from ossaSATACompleted().
912 * This CB routine deals with normal non-chained data I/O SATA request.
913 *
914 * \param agRoot: Handles for this instance of SAS/SATA hardware
915 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
916 * \param agIOStatus: Status of completed I/O.
917 * \param agFirstDword:Pointer to the four bytes of FIS.
918 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
919 * length.
920 * \param agParam: Additional info based on status.
921 * \param ioContext: Pointer to satIOContext_t.
922 *
923 * \return: none
924 *
925 *****************************************************************************/
926 void satDeviceResetCB(
927 agsaRoot_t *agRoot,
928 agsaIORequest_t *agIORequest,
929 bit32 agIOStatus,
930 agsaFisHeader_t *agFirstDword,
931 bit32 agIOInfoLen,
932 void *agParam,
933 void *ioContext
934 )
935 {
936 /* callback for satResetDevice */
937 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
938 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
939 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
940 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
941 tdIORequestBody_t *tdIORequestBody;
942 tdIORequestBody_t *tdOrgIORequestBody = agNULL;
943 satIOContext_t *satIOContext;
944 satIOContext_t *satOrgIOContext;
945 // satIOContext_t *satNewIOContext;
946 satInternalIo_t *satIntIo;
947 // satInternalIo_t *satNewIntIo = agNULL;
948 satDeviceData_t *satDevData;
949 tiIORequest_t *tiOrgIORequest;
950 #ifdef TD_DEBUG_ENABLE
951 bit32 ataStatus = 0;
952 bit32 ataError;
953 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
954 #endif
955 // bit32 status;
956 bit32 report = agFALSE;
957 bit32 AbortTM = agFALSE;
958
959 TI_DBG1(("satDeviceResetCB: start\n"));
960
961 TI_DBG6(("satDeviceResetCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
962
963 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
964 satIOContext = (satIOContext_t *) ioContext;
965 satIntIo = satIOContext->satIntIoContext;
966 satDevData = satIOContext->pSatDevData;
967
968 if (satIntIo == agNULL)
969 {
970 TI_DBG6(("satDeviceResetCB: External, OS generated\n"));
971 satOrgIOContext = satIOContext;
972 tiOrgIORequest = tdIORequestBody->tiIORequest;
973 }
974 else
975 {
976 TI_DBG6(("satDeviceResetCB: Internal, TD generated\n"));
977 satOrgIOContext = satIOContext->satOrgIOContext;
978 if (satOrgIOContext == agNULL)
979 {
980 TI_DBG6(("satDeviceResetCB: satOrgIOContext is NULL, wrong\n"));
981 return;
982 }
983 else
984 {
985 TI_DBG6(("satDeviceResetCB: satOrgIOContext is NOT NULL\n"));
986 }
987 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
988 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
989 }
990
991 tdIORequestBody->ioCompleted = agTRUE;
992 tdIORequestBody->ioStarted = agFALSE;
993
994 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
995 {
996 TI_DBG1(("satDeviceResetCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
997
998 if (satOrgIOContext->NotifyOS == agTRUE)
999 {
1000 ostiInitiatorEvent( tiRoot,
1001 NULL,
1002 NULL,
1003 tiIntrEventTypeTaskManagement,
1004 tiTMFailed,
1005 tiOrgIORequest );
1006 }
1007
1008 satDevData->satTmTaskTag = agNULL;
1009
1010 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1011
1012 satFreeIntIoResource( tiRoot,
1013 satDevData,
1014 satIntIo);
1015 return;
1016 }
1017
1018 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
1019 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
1020 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
1021 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
1022 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
1023 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
1024 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
1025 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
1026 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
1027 )
1028 {
1029 TI_DBG1(("satDeviceResetCB: OSSA_IO_OPEN_CNX_ERROR\n"));
1030
1031 if (satOrgIOContext->NotifyOS == agTRUE)
1032 {
1033 ostiInitiatorEvent( tiRoot,
1034 NULL,
1035 NULL,
1036 tiIntrEventTypeTaskManagement,
1037 tiTMFailed,
1038 tiOrgIORequest );
1039 }
1040
1041 satDevData->satTmTaskTag = agNULL;
1042
1043 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1044
1045 satFreeIntIoResource( tiRoot,
1046 satDevData,
1047 satIntIo);
1048 return;
1049 }
1050
1051 if (agIOStatus != OSSA_IO_SUCCESS)
1052 {
1053 /* only agsaFisPioSetup_t is expected */
1054 #ifdef TD_DEBUG_ENABLE
1055 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
1056 ataStatus = satPIOSetupHeader->status; /* ATA Status register */
1057 ataError = satPIOSetupHeader->error; /* ATA Eror register */
1058 #endif
1059 TI_DBG1(("satDeviceResetCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
1060
1061 if (satOrgIOContext->NotifyOS == agTRUE)
1062 {
1063 ostiInitiatorEvent( tiRoot,
1064 NULL,
1065 NULL,
1066 tiIntrEventTypeTaskManagement,
1067 tiTMFailed,
1068 tiOrgIORequest );
1069 }
1070
1071 satDevData->satTmTaskTag = agNULL;
1072
1073 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1074
1075 satFreeIntIoResource( tiRoot,
1076 satDevData,
1077 satIntIo);
1078 return;
1079 }
1080
1081 /* success */
1082 if (satOrgIOContext->TMF == AG_ABORT_TASK)
1083 {
1084 AbortTM = agTRUE;
1085 }
1086
1087 if (satOrgIOContext->NotifyOS == agTRUE)
1088 {
1089 report = agTRUE;
1090 }
1091
1092 if (AbortTM == agTRUE)
1093 {
1094 TI_DBG1(("satDeResetDeviceCB: calling satAbort\n"));
1095 satAbort(agRoot, satOrgIOContext->satToBeAbortedIOContext);
1096 }
1097 satDevData->satTmTaskTag = agNULL;
1098
1099 satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
1100
1101 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1102
1103 TI_DBG1(("satDeviceResetCB: satPendingIO %d satNCQMaxIO %d\n", satDevData->satPendingIO, satDevData->satNCQMaxIO ));
1104 TI_DBG1(("satDeviceResetCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", satDevData->satPendingNCQIO, satDevData->satPendingNONNCQIO));
1105
1106 satFreeIntIoResource( tiRoot,
1107 satDevData,
1108 satIntIo);
1109
1110 /* clean up TD layer's IORequestBody */
1111 if (tdOrgIORequestBody != agNULL)
1112 {
1113 ostiFreeMemory(
1114 tiRoot,
1115 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
1116 sizeof(tdIORequestBody_t)
1117 );
1118 }
1119 else
1120 {
1121 TI_DBG1(("satDeviceResetCB: tdOrgIORequestBody is NULL, wrong\n"));
1122 }
1123
1124
1125 if (report)
1126 {
1127 ostiInitiatorEvent( tiRoot,
1128 NULL,
1129 NULL,
1130 tiIntrEventTypeTaskManagement,
1131 tiTMOK,
1132 tiOrgIORequest );
1133 }
1134
1135
1136 TI_DBG5(("satDeviceResetCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
1137 TI_DBG6(("satDeviceResetCB: end\n"));
1138 return;
1139 }
1140
1141 /*****************************************************************************
1142 *! \brief satExecuteDeviceDiagnosticCB
1143 *
1144 * This routine is a callback function called from ossaSATACompleted().
1145 * This CB routine deals with normal non-chained data I/O SATA request.
1146 *
1147 * \param agRoot: Handles for this instance of SAS/SATA hardware
1148 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
1149 * \param agIOStatus: Status of completed I/O.
1150 * \param agFirstDword:Pointer to the four bytes of FIS.
1151 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1152 * length.
1153 * \param agParam: Additional info based on status.
1154 * \param ioContext: Pointer to satIOContext_t.
1155 *
1156 * \return: none
1157 *
1158 *****************************************************************************/
1159 void satExecuteDeviceDiagnosticCB(
1160 agsaRoot_t *agRoot,
1161 agsaIORequest_t *agIORequest,
1162 bit32 agIOStatus,
1163 agsaFisHeader_t *agFirstDword,
1164 bit32 agIOInfoLen,
1165 void *agParam,
1166 void *ioContext
1167 )
1168 {
1169 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1170 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1171 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1172 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1173 tdIORequestBody_t *tdIORequestBody;
1174 satIOContext_t *satIOContext;
1175 satIOContext_t *satOrgIOContext;
1176 satInternalIo_t *satIntIo;
1177 satDeviceData_t *satDevData;
1178
1179 TI_DBG3(("satExecuteDeviceDiagnosticCB start\n"));
1180
1181 /* internally generate tiIOContext */
1182 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1183 satIOContext = (satIOContext_t *) ioContext;
1184 satIntIo = satIOContext->satIntIoContext;
1185 satDevData = satIOContext->pSatDevData;
1186
1187 /*ttttttthe one */
1188 if (satIntIo == agNULL)
1189 {
1190 TI_DBG4(("satExecuteDeviceDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
1191 satOrgIOContext = satIOContext;
1192 }
1193 else
1194 {
1195 TI_DBG4(("satExecuteDeviceDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
1196 satOrgIOContext = satIOContext->satOrgIOContext;
1197 if (satOrgIOContext == agNULL)
1198 {
1199 TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
1200 return;
1201 }
1202 else
1203 {
1204 TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NOT NULL\n"));
1205 }
1206 }
1207 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1208
1209 tdIORequestBody->ioCompleted = agTRUE;
1210 tdIORequestBody->ioStarted = agFALSE;
1211
1212 /* interal structure free */
1213 satFreeIntIoResource(tiRoot,
1214 satDevData,
1215 satIntIo);
1216 }
1217 /*****************************************************************************
1218 *! \brief satNonChainedDataIOCB
1219 *
1220 * This routine is a callback function called from ossaSATACompleted().
1221 * This CB routine deals with normal non-chained data I/O SATA request.
1222 *
1223 * \param agRoot: Handles for this instance of SAS/SATA hardware
1224 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
1225 * \param agIOStatus: Status of completed I/O.
1226 * \param agFirstDword:Pointer to the four bytes of FIS.
1227 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1228 * length.
1229 * \param agParam: Additional info based on status.
1230 * \param ioContext: Pointer to satIOContext_t.
1231 *
1232 * \return: none
1233 *
1234 *****************************************************************************/
1235
1236 void satNonChainedDataIOCB(
1237 agsaRoot_t *agRoot,
1238 agsaIORequest_t *agIORequest,
1239 bit32 agIOStatus,
1240 agsaFisHeader_t *agFirstDword,
1241 bit32 agIOInfoLen,
1242 void *agParam,
1243 void *ioContext
1244 )
1245 {
1246
1247 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1248 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1249 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1250 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1251 tdIORequestBody_t *tdIORequestBody;
1252 bit32 interruptContext = osData->IntContext;
1253 satIOContext_t *satIOContext;
1254 satInternalIo_t *SatIntIo;
1255 satDeviceData_t *SatDevData;
1256
1257 TI_DBG6(("satNonChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1258 agIORequest, agIOStatus, agIOInfoLen));
1259
1260 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1261 satIOContext = (satIOContext_t *) ioContext;
1262 SatIntIo = satIOContext->satIntIoContext;
1263 SatDevData = satIOContext->pSatDevData;
1264 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1265 tdIORequestBody->ioCompleted = agTRUE;
1266 tdIORequestBody->ioStarted = agFALSE;
1267
1268 /* interal structure free */
1269 satFreeIntIoResource( tiRoot,
1270 SatDevData,
1271 SatIntIo);
1272
1273 /* Process completion */
1274 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
1275 {
1276 TI_DBG5(("satNonChainedDataIOCB: success\n"));
1277 TI_DBG5(("satNonChainedDataIOCB: success agIORequest %p\n", agIORequest));
1278 /*
1279 * Command was completed OK, this is the normal path.
1280 * Now call the OS-App Specific layer about this completion.
1281 */
1282 ostiInitiatorIOCompleted( tiRoot,
1283 tdIORequestBody->tiIORequest,
1284 tiIOSuccess,
1285 SCSI_STAT_GOOD,
1286 agNULL,
1287 interruptContext);
1288 }
1289 else
1290 {
1291 TI_DBG1(("satNonChainedDataIOCB: calling itdsatProcessAbnormalCompletion\n"));
1292 /* More checking needed */
1293 itdsatProcessAbnormalCompletion( agRoot,
1294 agIORequest,
1295 agIOStatus,
1296 agFirstDword,
1297 agIOInfoLen,
1298 agParam,
1299 satIOContext);
1300 }
1301
1302 return;
1303
1304
1305 }
1306 /*****************************************************************************
1307 *! \brief satChainedDataIOCB
1308 *
1309 * This routine is a callback function called from ossaSATACompleted().
1310 * This CB routine deals with normal chained data I/O SATA request.
1311 *
1312 * \param agRoot: Handles for this instance of SAS/SATA hardware
1313 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
1314 * \param agIOStatus: Status of completed I/O.
1315 * \param agFirstDword:Pointer to the four bytes of FIS.
1316 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
1317 * length.
1318 * \param agParam: Additional info based on status.
1319 * \param ioContext: Pointer to satIOContext_t.
1320 *
1321 * \return: none
1322 *
1323 *****************************************************************************/
1324 void satChainedDataIOCB(
1325 agsaRoot_t *agRoot,
1326 agsaIORequest_t *agIORequest,
1327 bit32 agIOStatus,
1328 agsaFisHeader_t *agFirstDword,
1329 bit32 agIOInfoLen,
1330 void *agParam,
1331 void *ioContext
1332 )
1333 {
1334 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1335 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1336 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1337 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1338 tdIORequestBody_t *tdIORequestBody;
1339 tdIORequestBody_t *tdOrgIORequestBody;
1340 satIOContext_t *satIOContext;
1341 satIOContext_t *satOrgIOContext;
1342 satIOContext_t *satNewIOContext;
1343 satInternalIo_t *satIntIo;
1344 satInternalIo_t *satNewIntIo = agNULL;
1345 satDeviceData_t *satDevData;
1346 scsiRspSense_t *pSense;
1347 tiIniScsiCmnd_t *scsiCmnd;
1348 tiIORequest_t *tiOrgIORequest;
1349
1350 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1351 bit32 ataStatus = 0;
1352 bit32 status = tiError;
1353 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1354 bit32 dataLength;
1355
1356 TI_DBG6(("satChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
1357 agIORequest, agIOStatus, agIOInfoLen));
1358
1359
1360 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1361 satIOContext = (satIOContext_t *) ioContext;
1362 if (satIOContext == agNULL)
1363 {
1364 TI_DBG1(("satChainedDataIOCB: satIOContext is NULL\n"));
1365 return;
1366 }
1367 satIntIo = satIOContext->satIntIoContext;
1368 satDevData = satIOContext->pSatDevData;
1369 hostToDevFis = satIOContext->pFis;
1370
1371 if (satIntIo == agNULL)
1372 {
1373 TI_DBG5(("satChainedDataIOCB: External satInternalIo_t satIntIoContext\n"));
1374 satOrgIOContext = satIOContext;
1375 tiOrgIORequest = tdIORequestBody->tiIORequest;
1376 pSense = satIOContext->pSense;
1377 scsiCmnd = satIOContext->pScsiCmnd;
1378 }
1379 else
1380 {
1381 TI_DBG5(("satChainedDataIOCB: Internal satInternalIo_t satIntIoContext\n"));
1382 satOrgIOContext = satIOContext->satOrgIOContext;
1383 if (satOrgIOContext == agNULL)
1384 {
1385 TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NULL\n"));
1386 }
1387 else
1388 {
1389 TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NOT NULL\n"));
1390 }
1391
1392 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1393 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1394
1395 pSense = satOrgIOContext->pSense;
1396 scsiCmnd = satOrgIOContext->pScsiCmnd;
1397 }
1398
1399 tdIORequestBody->ioCompleted = agTRUE;
1400 tdIORequestBody->ioStarted = agFALSE;
1401
1402 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1403 {
1404 TI_DBG1(("satChainedDataIOCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1405 satSetSensePayload( pSense,
1406 SCSI_SNSKEY_NO_SENSE,
1407 0,
1408 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1409 satOrgIOContext);
1410
1411 ostiInitiatorIOCompleted( tiRoot,
1412 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1413 tiIOSuccess,
1414 SCSI_STAT_CHECK_CONDITION,
1415 satOrgIOContext->pTiSenseData,
1416 satOrgIOContext->interruptContext );
1417
1418 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1419
1420 satFreeIntIoResource( tiRoot,
1421 satDevData,
1422 satIntIo);
1423 return;
1424 }
1425
1426 /*
1427 checking IO status, FIS type and error status
1428 */
1429 if (agIOStatus != OSSA_IO_SUCCESS)
1430 {
1431 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
1432 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
1433 first, assumed to be Reg Device to Host FIS
1434 This is OK to just find fis type
1435 */
1436 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1437 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
1438 /* for debugging */
1439 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
1440 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1441 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1442 )
1443 {
1444 TI_DBG1(("satChainedDataIOCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
1445 }
1446
1447 /* for debugging */
1448 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1449 (ataStatus & DF_ATA_STATUS_MASK)
1450 )
1451 {
1452 TI_DBG1(("satChainedDataIOCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
1453 }
1454
1455 /* the function below handles abort case */
1456 itdsatDelayedProcessAbnormalCompletion(agRoot,
1457 agIORequest,
1458 agIOStatus,
1459 agFirstDword,
1460 agIOInfoLen,
1461 agParam,
1462 satIOContext);
1463
1464 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1465 satFreeIntIoResource( tiRoot,
1466 satDevData,
1467 satIntIo);
1468 return;
1469 } /* end of error */
1470
1471 switch (hostToDevFis->h.command)
1472 {
1473 case SAT_READ_DMA: /* fall through */
1474 case SAT_READ_SECTORS: /* fall through */
1475 case SAT_READ_DMA_EXT: /* fall through */
1476 case SAT_READ_SECTORS_EXT: /* fall through */
1477 case SAT_READ_FPDMA_QUEUED: /* fall through */
1478 case SAT_WRITE_DMA: /* fall through */
1479 case SAT_WRITE_SECTORS:/* fall through */
1480 case SAT_WRITE_DMA_FUA_EXT: /* fall through */
1481 case SAT_WRITE_DMA_EXT: /* fall through */
1482 case SAT_WRITE_SECTORS_EXT: /* fall through */
1483 case SAT_WRITE_FPDMA_QUEUED:
1484
1485 TI_DBG5(("satChainedDataIOCB: READ/WRITE success case\n"));
1486
1487 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1488
1489 /* done with internally genereated SAT_SMART_RETURN_STATUS */
1490 satFreeIntIoResource( tiRoot,
1491 satDevData,
1492 satIntIo);
1493 /* let's loop till TL */
1494
1495 /* lba = lba + tl
1496 loopnum--;
1497 if (loopnum == 0) done
1498 */
1499 (satOrgIOContext->LoopNum)--;
1500 if (satOrgIOContext->LoopNum == 0)
1501 {
1502 /* done with read */
1503 ostiInitiatorIOCompleted( tiRoot,
1504 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1505 tiIOSuccess,
1506 SCSI_STAT_GOOD,
1507 agNULL,
1508 satOrgIOContext->interruptContext );
1509 return;
1510 }
1511 if (satOrgIOContext->superIOFlag)
1512 {
1513 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1514 }
1515 else
1516 {
1517 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
1518 }
1519
1520 satNewIntIo = satAllocIntIoResource( tiRoot,
1521 tiOrgIORequest,
1522 satDevData,
1523 dataLength,
1524 satNewIntIo);
1525 if (satNewIntIo == agNULL)
1526 {
1527 /* memory allocation failure */
1528 satFreeIntIoResource( tiRoot,
1529 satDevData,
1530 satNewIntIo);
1531 ostiInitiatorIOCompleted( tiRoot,
1532 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1533 tiIOFailed,
1534 tiDetailOtherError,
1535 agNULL,
1536 satOrgIOContext->interruptContext );
1537
1538 TI_DBG1(("satChainedDataIOCB: momory allocation fails\n"));
1539 return;
1540 } /* end of memory allocation failure */
1541
1542 /*
1543 * Need to initialize all the fields within satIOContext
1544 */
1545
1546 satNewIOContext = satPrepareNewIO(
1547 satNewIntIo,
1548 tiOrgIORequest,
1549 satDevData,
1550 scsiCmnd,
1551 satOrgIOContext
1552 );
1553
1554 /* sending another ATA command */
1555 switch (scsiCmnd->cdb[0])
1556 {
1557 case SCSIOPC_READ_6:
1558 /* no loop should occur with READ6 since it fits in one ATA command */
1559 break;
1560 case SCSIOPC_READ_10: /* fall through */
1561 case SCSIOPC_READ_12: /* fall through */
1562 case SCSIOPC_READ_16: /* fall through */
1563 status = satRead_1( tiRoot,
1564 &satNewIntIo->satIntTiIORequest,
1565 satNewIOContext->ptiDeviceHandle,
1566 &satNewIntIo->satIntTiScsiXchg,
1567 satNewIOContext);
1568 break;
1569 case SCSIOPC_WRITE_6:
1570 /* no loop should occur with WRITE6 since it fits in one ATA command */
1571 break;
1572 case SCSIOPC_WRITE_10: /* fall through */
1573 case SCSIOPC_WRITE_12: /* fall through */
1574 case SCSIOPC_WRITE_16: /* fall through */
1575 status = satWrite_1( tiRoot,
1576 &satNewIntIo->satIntTiIORequest,
1577 satNewIOContext->ptiDeviceHandle,
1578 &satNewIntIo->satIntTiScsiXchg,
1579 satNewIOContext);
1580 break;
1581 default:
1582 TI_DBG1(("satChainedDataIOCB: success but default case scsi cmd 0x%x ata cmd 0x%x\n",scsiCmnd->cdb[0], hostToDevFis->h.command));
1583 status = tiError;
1584 break;
1585 }
1586
1587
1588
1589 if (status != tiSuccess)
1590 {
1591 satFreeIntIoResource( tiRoot,
1592 satDevData,
1593 satNewIntIo);
1594 ostiInitiatorIOCompleted( tiRoot,
1595 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1596 tiIOFailed,
1597 tiDetailOtherError,
1598 agNULL,
1599 satOrgIOContext->interruptContext );
1600 TI_DBG1(("satChainedDataIOCB: calling satRead10_1 fails\n"));
1601 return;
1602 }
1603
1604 break;
1605
1606
1607 default:
1608 TI_DBG1(("satChainedDataIOCB: success but default case command 0x%x\n",hostToDevFis->h.command));
1609 ostiInitiatorIOCompleted( tiRoot,
1610 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1611 tiIOFailed,
1612 tiDetailOtherError,
1613 agNULL,
1614 satOrgIOContext->interruptContext );
1615
1616 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1617
1618 satFreeIntIoResource( tiRoot,
1619 satDevData,
1620 satIntIo);
1621
1622 break;
1623 }
1624
1625
1626 return;
1627 }
1628 void satNonChainedWriteNVerifyCB(
1629 agsaRoot_t *agRoot,
1630 agsaIORequest_t *agIORequest,
1631 bit32 agIOStatus,
1632 agsaFisHeader_t *agFirstDword,
1633 bit32 agIOInfoLen,
1634 void *agParam,
1635 void *ioContext
1636 )
1637 {
1638
1639 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
1640 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
1641 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1642 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1643 tdIORequestBody_t *tdIORequestBody;
1644 tdIORequestBody_t *tdOrgIORequestBody;
1645 satIOContext_t *satIOContext;
1646 satIOContext_t *satOrgIOContext;
1647 satIOContext_t *satNewIOContext;
1648 satInternalIo_t *satIntIo;
1649 satInternalIo_t *satNewIntIo = agNULL;
1650 satDeviceData_t *satDevData;
1651 scsiRspSense_t *pSense;
1652 tiIniScsiCmnd_t *scsiCmnd;
1653 tiIORequest_t *tiOrgIORequest;
1654
1655 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
1656 bit32 ataStatus = 0;
1657 bit32 status;
1658 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
1659 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
1660 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
1661
1662 TI_DBG5(("satNonChainedWriteNVerifyCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
1663
1664 /* internally generate tiIOContext */
1665 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
1666 satIOContext = (satIOContext_t *) ioContext;
1667 satIntIo = satIOContext->satIntIoContext;
1668 satDevData = satIOContext->pSatDevData;
1669 hostToDevFis = satIOContext->pFis;
1670
1671 /* SPC: Self-Test Result Log page */
1672 tiScsiRequest = satIOContext->tiScsiXchg;
1673
1674 if (satIntIo == agNULL)
1675 {
1676 TI_DBG4(("satNonChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
1677 satOrgIOContext = satIOContext;
1678 tiOrgIORequest = tdIORequestBody->tiIORequest;
1679 pSense = satOrgIOContext->pSense;
1680 scsiCmnd = satOrgIOContext->pScsiCmnd;
1681 }
1682 else
1683 {
1684 TI_DBG4(("satNonChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
1685 satOrgIOContext = satIOContext->satOrgIOContext;
1686 if (satOrgIOContext == agNULL)
1687 {
1688 TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
1689 return;
1690 }
1691 else
1692 {
1693 TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
1694 }
1695 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
1696 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
1697
1698 pSense = satOrgIOContext->pSense;
1699 scsiCmnd = satOrgIOContext->pScsiCmnd;
1700 }
1701
1702 tdIORequestBody->ioCompleted = agTRUE;
1703 tdIORequestBody->ioStarted = agFALSE;
1704
1705
1706 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
1707 {
1708 TI_DBG1(("satNonChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
1709 ostiInitiatorIOCompleted (
1710 tiRoot,
1711 tiOrgIORequest,
1712 tiIOFailed,
1713 tiDetailOtherError,
1714 agNULL,
1715 satOrgIOContext->interruptContext
1716 );
1717 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1718
1719 satFreeIntIoResource( tiRoot,
1720 satDevData,
1721 satIntIo);
1722 return;
1723 }
1724
1725
1726 if (agIOStatus != OSSA_IO_SUCCESS)
1727 {
1728 /*
1729 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1730 */
1731 /* First, assumed to be Reg Device to Host FIS */
1732 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
1733 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
1734 }
1735
1736 if (agIOStatus != OSSA_IO_SUCCESS)
1737 {
1738 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
1739 {
1740 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
1741
1742 /* Get ATA Status register */
1743 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */
1744 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */
1745
1746 /* ATA Eror register */
1747 }
1748 }
1749
1750
1751 if( agIOStatus != OSSA_IO_SUCCESS)
1752 {
1753 /*
1754 checking IO status, FIS type and error status
1755 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
1756 Both have fisType in the same location
1757 */
1758 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
1759 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
1760 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
1761 )
1762 {
1763 /* for debugging */
1764 if( agIOStatus != OSSA_IO_SUCCESS)
1765 {
1766 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, NOT IO_SUCCESS\n"));
1767 }
1768 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
1769 {
1770 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1771 }
1772 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
1773 {
1774 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
1775 }
1776 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
1777 (ataStatus & DF_ATA_STATUS_MASK)
1778 )
1779 {
1780 TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, FAILED, error status\n"));
1781 }
1782
1783
1784 /* Process abort case */
1785 if (agIOStatus == OSSA_IO_ABORTED)
1786 {
1787 satProcessAbort(tiRoot,
1788 tiOrgIORequest,
1789 satOrgIOContext
1790 );
1791
1792 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1793
1794 satFreeIntIoResource( tiRoot,
1795 satDevData,
1796 satIntIo);
1797 return;
1798 }
1799
1800 /* for debugging */
1801 switch (hostToDevFis->h.command)
1802 {
1803 case SAT_WRITE_DMA_FUA_EXT:
1804 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT\n"));
1805 break;
1806 case SAT_WRITE_DMA_EXT:
1807 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT\n"));
1808 break;
1809 case SAT_WRITE_SECTORS_EXT:
1810 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT\n"));
1811 break;
1812 case SAT_WRITE_FPDMA_QUEUED:
1813 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED\n"));
1814 break;
1815 case SAT_READ_VERIFY_SECTORS:
1816 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
1817 break;
1818 case SAT_READ_VERIFY_SECTORS_EXT:
1819 TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
1820 break;
1821 default:
1822 TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
1823 break;
1824 }
1825
1826 satSetSensePayload( pSense,
1827 SCSI_SNSKEY_NO_SENSE,
1828 0,
1829 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1830 satOrgIOContext);
1831
1832 ostiInitiatorIOCompleted( tiRoot,
1833 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1834 tiIOSuccess,
1835 SCSI_STAT_CHECK_CONDITION,
1836 satOrgIOContext->pTiSenseData,
1837 satOrgIOContext->interruptContext );
1838
1839 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1840
1841 satFreeIntIoResource( tiRoot,
1842 satDevData,
1843 satIntIo);
1844 return;
1845 } /* end error checking */
1846 }
1847
1848 /* process success from this point on */
1849
1850 switch (hostToDevFis->h.command)
1851 {
1852 case SAT_WRITE_DMA_FUA_EXT:
1853 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT success\n"));
1854 break;
1855 case SAT_WRITE_DMA_EXT:
1856 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT success\n"));
1857 break;
1858 case SAT_WRITE_SECTORS_EXT:
1859 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT succes\n"));
1860
1861 break;
1862 case SAT_WRITE_FPDMA_QUEUED:
1863 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED succes\n"));
1864 break;
1865 case SAT_READ_VERIFY_SECTORS:
1866 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS succes\n"));
1867 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1868
1869 /* free */
1870 satFreeIntIoResource( tiRoot,
1871 satDevData,
1872 satIntIo);
1873
1874 /* return stat_good */
1875 ostiInitiatorIOCompleted( tiRoot,
1876 tiOrgIORequest,
1877 tiIOSuccess,
1878 SCSI_STAT_GOOD,
1879 agNULL,
1880 satOrgIOContext->interruptContext );
1881 return;
1882 break;
1883 case SAT_READ_VERIFY_SECTORS_EXT:
1884 TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT succes\n"));
1885 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1886
1887 /* free */
1888 satFreeIntIoResource( tiRoot,
1889 satDevData,
1890 satIntIo);
1891
1892 /* return stat_good */
1893 ostiInitiatorIOCompleted( tiRoot,
1894 tiOrgIORequest,
1895 tiIOSuccess,
1896 SCSI_STAT_GOOD,
1897 agNULL,
1898 satOrgIOContext->interruptContext );
1899 return;
1900 break;
1901 default:
1902 TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x success\n", hostToDevFis->h.command));
1903
1904 satSetSensePayload( pSense,
1905 SCSI_SNSKEY_NO_SENSE,
1906 0,
1907 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1908 satOrgIOContext);
1909
1910 ostiInitiatorIOCompleted( tiRoot,
1911 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1912 tiIOSuccess,
1913 SCSI_STAT_CHECK_CONDITION,
1914 satOrgIOContext->pTiSenseData,
1915 satOrgIOContext->interruptContext );
1916
1917 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1918
1919 satFreeIntIoResource( tiRoot,
1920 satDevData,
1921 satIntIo);
1922 return;
1923 break;
1924 }
1925
1926 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
1927
1928 /* free */
1929 satFreeIntIoResource( tiRoot,
1930 satDevData,
1931 satIntIo);
1932
1933 satNewIntIo = satAllocIntIoResource( tiRoot,
1934 tiOrgIORequest,
1935 satDevData,
1936 0,
1937 satNewIntIo);
1938 if (satNewIntIo == agNULL)
1939 {
1940 /* memory allocation failure */
1941 satFreeIntIoResource( tiRoot,
1942 satDevData,
1943 satNewIntIo);
1944
1945 satSetSensePayload( pSense,
1946 SCSI_SNSKEY_NO_SENSE,
1947 0,
1948 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1949 satOrgIOContext);
1950
1951 ostiInitiatorIOCompleted( tiRoot,
1952 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1953 tiIOSuccess,
1954 SCSI_STAT_CHECK_CONDITION,
1955 satOrgIOContext->pTiSenseData,
1956 satOrgIOContext->interruptContext );
1957 TI_DBG1(("satNonChainedWriteNVerifyCB: momory allocation fails\n"));
1958 return;
1959 } /* end memory allocation */
1960
1961 satNewIOContext = satPrepareNewIO(
1962 satNewIntIo,
1963 tiOrgIORequest,
1964 satDevData,
1965 scsiCmnd,
1966 satOrgIOContext
1967 );
1968
1969 /* sends ATA verify command(READ_VERIFY_SECTORS or READ_VERIFY_SECTORS_EXT) */
1970 status = satNonChainedWriteNVerify_Verify(tiRoot,
1971 &satNewIntIo->satIntTiIORequest,
1972 satNewIOContext->ptiDeviceHandle,
1973 tiScsiRequest, /* orginal from OS layer */
1974 satNewIOContext
1975 );
1976
1977
1978 if (status != tiSuccess)
1979 {
1980 /* sending ATA command fails */
1981 satFreeIntIoResource( tiRoot,
1982 satDevData,
1983 satNewIntIo);
1984 satSetSensePayload( pSense,
1985 SCSI_SNSKEY_NO_SENSE,
1986 0,
1987 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
1988 satOrgIOContext);
1989
1990 ostiInitiatorIOCompleted( tiRoot,
1991 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
1992 tiIOSuccess,
1993 SCSI_STAT_CHECK_CONDITION,
1994 satOrgIOContext->pTiSenseData,
1995 satOrgIOContext->interruptContext );
1996 TI_DBG1(("satNonChainedWriteNVerifyCB: calling satWriteAndVerify10_1 fails\n"));
1997 return;
1998 } /* end send fails */
1999
2000 return;
2001 }
2002
2003
2004 void satChainedWriteNVerifyCB(
2005 agsaRoot_t *agRoot,
2006 agsaIORequest_t *agIORequest,
2007 bit32 agIOStatus,
2008 agsaFisHeader_t *agFirstDword,
2009 bit32 agIOInfoLen,
2010 void *agParam,
2011 void *ioContext
2012 )
2013 {
2014 /*
2015 send write in loop
2016 then, send verify in loop
2017 */
2018 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2019 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2020 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2021 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2022 tdIORequestBody_t *tdIORequestBody;
2023 tdIORequestBody_t *tdOrgIORequestBody;
2024 satIOContext_t *satIOContext;
2025 satIOContext_t *satOrgIOContext;
2026 satIOContext_t *satNewIOContext;
2027 satInternalIo_t *satIntIo;
2028 satInternalIo_t *satNewIntIo = agNULL;
2029 satDeviceData_t *satDevData;
2030 scsiRspSense_t *pSense;
2031 tiIniScsiCmnd_t *scsiCmnd;
2032 tiIORequest_t *tiOrgIORequest;
2033
2034 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
2035 bit32 ataStatus = 0;
2036 bit32 dataLength;
2037 bit32 status = tiError;
2038 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
2039
2040 TI_DBG6(("satChainedWriteNVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
2041 agIORequest, agIOStatus, agIOInfoLen));
2042
2043
2044 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2045 satIOContext = (satIOContext_t *) ioContext;
2046 satIntIo = satIOContext->satIntIoContext;
2047 satDevData = satIOContext->pSatDevData;
2048 hostToDevFis = satIOContext->pFis;
2049
2050 if (satIntIo == agNULL)
2051 {
2052 TI_DBG5(("satChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n"));
2053 satOrgIOContext = satIOContext;
2054 tiOrgIORequest = tdIORequestBody->tiIORequest;
2055 pSense = satIOContext->pSense;
2056 scsiCmnd = satIOContext->pScsiCmnd;
2057 }
2058 else
2059 {
2060 TI_DBG5(("satChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
2061 satOrgIOContext = satIOContext->satOrgIOContext;
2062 if (satOrgIOContext == agNULL)
2063 {
2064 TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n"));
2065 return;
2066 }
2067 else
2068 {
2069 TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n"));
2070 }
2071 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
2072 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
2073
2074 pSense = satOrgIOContext->pSense;
2075 scsiCmnd = satOrgIOContext->pScsiCmnd;
2076 }
2077
2078 tdIORequestBody->ioCompleted = agTRUE;
2079 tdIORequestBody->ioStarted = agFALSE;
2080
2081 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
2082 {
2083 TI_DBG1(("satChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
2084 satSetSensePayload( pSense,
2085 SCSI_SNSKEY_NO_SENSE,
2086 0,
2087 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
2088 satOrgIOContext);
2089
2090 ostiInitiatorIOCompleted( tiRoot,
2091 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2092 tiIOSuccess,
2093 SCSI_STAT_CHECK_CONDITION,
2094 satOrgIOContext->pTiSenseData,
2095 satOrgIOContext->interruptContext );
2096
2097 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2098
2099 satFreeIntIoResource( tiRoot,
2100 satDevData,
2101 satIntIo);
2102 return;
2103 }
2104
2105 /*
2106 checking IO status, FIS type and error status
2107 */
2108 if (agIOStatus != OSSA_IO_SUCCESS)
2109 {
2110 /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read
2111 agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write
2112 first, assumed to be Reg Device to Host FIS
2113 This is OK to just find fis type
2114 */
2115 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
2116 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
2117 /* for debugging */
2118 if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) &&
2119 (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
2120 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
2121 )
2122 {
2123 TI_DBG1(("satChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType));
2124 }
2125
2126 /* for debugging */
2127 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
2128 (ataStatus & DF_ATA_STATUS_MASK)
2129 )
2130 {
2131 TI_DBG1(("satChainedWriteNVerifyCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command));
2132 }
2133
2134 /* the function below handles abort case */
2135 itdsatDelayedProcessAbnormalCompletion(agRoot,
2136 agIORequest,
2137 agIOStatus,
2138 agFirstDword,
2139 agIOInfoLen,
2140 agParam,
2141 satIOContext);
2142
2143 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2144 satFreeIntIoResource( tiRoot,
2145 satDevData,
2146 satIntIo);
2147 return;
2148 } /* end of error */
2149
2150 /* process the success case */
2151 switch (hostToDevFis->h.command)
2152 {
2153 case SAT_WRITE_DMA: /* fall through */
2154 case SAT_WRITE_SECTORS:/* fall through */
2155 // case SAT_WRITE_DMA_FUA_EXT: /* fall through */
2156 case SAT_WRITE_DMA_EXT: /* fall through */
2157 case SAT_WRITE_SECTORS_EXT: /* fall through */
2158 case SAT_WRITE_FPDMA_QUEUED:
2159
2160 TI_DBG5(("satChainedWriteNVerifyCB: WRITE success case\n"));
2161
2162 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2163
2164 /* done with internally genereated SAT_SMART_RETURN_STATUS */
2165 satFreeIntIoResource( tiRoot,
2166 satDevData,
2167 satIntIo);
2168 /* let's loop till TL */
2169
2170
2171 (satOrgIOContext->LoopNum)--;
2172
2173 if (satOrgIOContext->superIOFlag)
2174 {
2175 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2176 }
2177 else
2178 {
2179 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2180 }
2181
2182 satNewIntIo = satAllocIntIoResource( tiRoot,
2183 tiOrgIORequest,
2184 satDevData,
2185 dataLength,
2186 satNewIntIo);
2187 if (satNewIntIo == agNULL)
2188 {
2189 /* memory allocation failure */
2190 satFreeIntIoResource( tiRoot,
2191 satDevData,
2192 satNewIntIo);
2193 ostiInitiatorIOCompleted( tiRoot,
2194 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2195 tiIOFailed,
2196 tiDetailOtherError,
2197 agNULL,
2198 satOrgIOContext->interruptContext );
2199
2200 TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2201 return;
2202 } /* end of memory allocation failure */
2203
2204 /*
2205 * Need to initialize all the fields within satIOContext
2206 */
2207
2208 satNewIOContext = satPrepareNewIO(
2209 satNewIntIo,
2210 tiOrgIORequest,
2211 satDevData,
2212 scsiCmnd,
2213 satOrgIOContext
2214 );
2215
2216 if (satOrgIOContext->LoopNum == 0)
2217 {
2218 /*
2219 done with write
2220 start with verify
2221 */
2222 satOrgIOContext->LoopNum = satOrgIOContext->LoopNum2;
2223 status = satChainedWriteNVerify_Start_Verify(tiRoot,
2224 &satNewIntIo->satIntTiIORequest,
2225 satNewIOContext->ptiDeviceHandle,
2226 &satNewIntIo->satIntTiScsiXchg,
2227 satNewIOContext);
2228 }
2229 else
2230 {
2231 status = satChainedWriteNVerify_Write(tiRoot,
2232 &satNewIntIo->satIntTiIORequest,
2233 satNewIOContext->ptiDeviceHandle,
2234 &satNewIntIo->satIntTiScsiXchg,
2235 satNewIOContext);
2236 }
2237
2238 if (status != tiSuccess)
2239 {
2240 satFreeIntIoResource( tiRoot,
2241 satDevData,
2242 satNewIntIo);
2243 ostiInitiatorIOCompleted( tiRoot,
2244 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2245 tiIOFailed,
2246 tiDetailOtherError,
2247 agNULL,
2248 satOrgIOContext->interruptContext );
2249 TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Write fails\n"));
2250 return;
2251 }
2252
2253 break;
2254
2255 case SAT_READ_VERIFY_SECTORS: /* fall through */
2256 case SAT_READ_VERIFY_SECTORS_EXT:
2257 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2258
2259 /* done with internally genereated SAT_SMART_RETURN_STATUS */
2260 satFreeIntIoResource( tiRoot,
2261 satDevData,
2262 satIntIo);
2263 /* let's loop till TL */
2264
2265 /* lba = lba + tl
2266 loopnum--;
2267 if (loopnum == 0) done
2268 */
2269 (satOrgIOContext->LoopNum)--;
2270 if (satOrgIOContext->LoopNum == 0)
2271 {
2272 /*
2273 done with write and verify
2274 */
2275 ostiInitiatorIOCompleted( tiRoot,
2276 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2277 tiIOSuccess,
2278 SCSI_STAT_GOOD,
2279 agNULL,
2280 satOrgIOContext->interruptContext );
2281 return;
2282 }
2283
2284 if (satOrgIOContext->superIOFlag)
2285 {
2286 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2287 }
2288 else
2289 {
2290 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
2291 }
2292
2293 satNewIntIo = satAllocIntIoResource( tiRoot,
2294 tiOrgIORequest,
2295 satDevData,
2296 dataLength,
2297 satNewIntIo);
2298 if (satNewIntIo == agNULL)
2299 {
2300 /* memory allocation failure */
2301 satFreeIntIoResource( tiRoot,
2302 satDevData,
2303 satNewIntIo);
2304 ostiInitiatorIOCompleted( tiRoot,
2305 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2306 tiIOFailed,
2307 tiDetailOtherError,
2308 agNULL,
2309 satOrgIOContext->interruptContext );
2310
2311 TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n"));
2312 return;
2313 } /* end of memory allocation failure */
2314
2315 /*
2316 * Need to initialize all the fields within satIOContext
2317 */
2318
2319 satNewIOContext = satPrepareNewIO(
2320 satNewIntIo,
2321 tiOrgIORequest,
2322 satDevData,
2323 scsiCmnd,
2324 satOrgIOContext
2325 );
2326 status = satChainedWriteNVerify_Verify(tiRoot,
2327 &satNewIntIo->satIntTiIORequest,
2328 satNewIOContext->ptiDeviceHandle,
2329 &satNewIntIo->satIntTiScsiXchg,
2330 satNewIOContext);
2331
2332 if (status != tiSuccess)
2333 {
2334 satFreeIntIoResource( tiRoot,
2335 satDevData,
2336 satNewIntIo);
2337 ostiInitiatorIOCompleted( tiRoot,
2338 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2339 tiIOFailed,
2340 tiDetailOtherError,
2341 agNULL,
2342 satOrgIOContext->interruptContext );
2343 TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Verify fails\n"));
2344 return;
2345 }
2346
2347 break;
2348
2349 default:
2350 TI_DBG1(("satChainedWriteNVerifyCB: success but default case command 0x%x\n",hostToDevFis->h.command));
2351 ostiInitiatorIOCompleted( tiRoot,
2352 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
2353 tiIOFailed,
2354 tiDetailOtherError,
2355 agNULL,
2356 satOrgIOContext->interruptContext );
2357
2358 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
2359
2360 satFreeIntIoResource( tiRoot,
2361 satDevData,
2362 satIntIo);
2363
2364 break;
2365 }
2366
2367
2368 return;
2369 }
2370 /*****************************************************************************
2371 *! \brief itdsatProcessAbnormalCompletion
2372 *
2373 * This routine is called to complete error case for SATA request previously
2374 * issued to the LL Layer in saSATAStart()
2375 *
2376 * \param agRoot: Handles for this instance of SAS/SATA hardware
2377 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
2378 * \param agIOStatus: Status of completed I/O.
2379 * \param agFirstDword:Pointer to the four bytes of FIS.
2380 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2381 * length.
2382 * \param agParam: Additional info based on status.
2383 * \param ioContext: Pointer to satIOContext_t.
2384 *
2385 * \return: none
2386 *
2387 *****************************************************************************/
2388 void itdsatProcessAbnormalCompletion(
2389 agsaRoot_t *agRoot,
2390 agsaIORequest_t *agIORequest,
2391 bit32 agIOStatus,
2392 agsaFisHeader_t *agFirstDword,
2393 bit32 agIOInfoLen,
2394 void *agParam,
2395 satIOContext_t *satIOContext
2396 )
2397 {
2398
2399 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2400 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2401 bit32 interruptContext = osData->IntContext;
2402 tdIORequestBody_t *tdIORequestBody;
2403 satDeviceData_t *pSatDevData;
2404 tiDeviceHandle_t *tiDeviceHandle;
2405 tdsaDeviceData_t *oneDeviceData = agNULL;
2406 agsaDevHandle_t *agDevHandle = agNULL;
2407
2408 TI_DBG5(("itdsatProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2409 agIORequest, agIOStatus, agIOInfoLen));
2410
2411 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2412 pSatDevData = satIOContext->pSatDevData;
2413 tiDeviceHandle = satIOContext->ptiDeviceHandle;
2414
2415 /* Get into the detail */
2416 switch(agIOStatus)
2417 {
2418 case OSSA_IO_SUCCESS:
2419 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS agIOInfoLen %d calling osSatIOCompleted\n", agIOInfoLen));
2420 /*
2421 * At this point agIOInfoLen should be non-zero and there is valid FIS
2422 * to read. Pass this info to the SAT layer in order to do the ATA status
2423 * to SCSI status translation.
2424 */
2425 osSatIOCompleted( tiRoot,
2426 tdIORequestBody->tiIORequest,
2427 agFirstDword,
2428 agIOInfoLen,
2429 agParam,
2430 satIOContext,
2431 interruptContext);
2432 break;
2433
2434
2435 case OSSA_IO_ABORTED:
2436 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2437
2438 ostiInitiatorIOCompleted( tiRoot,
2439 tdIORequestBody->tiIORequest,
2440 tiIOFailed,
2441 tiDetailAborted,
2442 agNULL,
2443 interruptContext);
2444
2445 if ( pSatDevData->satTmTaskTag != agNULL )
2446 {
2447 TI_DBG1(("itdsatProcessAbnormalCompletion: TM callback\n"));
2448 if (tiDeviceHandle == agNULL)
2449 {
2450 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2451 }
2452 /* TM completed */
2453 ostiInitiatorEvent( tiRoot,
2454 agNULL, /* portalContext not used */
2455 tiDeviceHandle,
2456 tiIntrEventTypeTaskManagement,
2457 tiTMOK,
2458 pSatDevData->satTmTaskTag);
2459 /*
2460 * Reset flag
2461 */
2462 pSatDevData->satTmTaskTag = agNULL;
2463 }
2464
2465 /*
2466 * Check if we are in recovery mode and need to update the recovery flag
2467 */
2468 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2469 (pSatDevData->satPendingIO == 0 ))
2470 {
2471 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2472 TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2473 }
2474
2475 TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2476 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2477 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2478
2479 break;
2480 case OSSA_IO_UNDERFLOW:
2481 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2482 ostiInitiatorIOCompleted( tiRoot,
2483 tdIORequestBody->tiIORequest,
2484 tiIOUnderRun,
2485 agIOInfoLen,
2486 agNULL,
2487 interruptContext);
2488 break;
2489
2490
2491 case OSSA_IO_FAILED:
2492 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2493 ostiInitiatorIOCompleted( tiRoot,
2494 tdIORequestBody->tiIORequest,
2495 tiIOFailed,
2496 tiDetailOtherError,
2497 agNULL,
2498 interruptContext);
2499 break;
2500
2501 case OSSA_IO_ABORT_RESET:
2502 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2503 ostiInitiatorIOCompleted( tiRoot,
2504 tdIORequestBody->tiIORequest,
2505 tiIOFailed,
2506 tiDetailAbortReset,
2507 agNULL,
2508 interruptContext);
2509 /*
2510 * Check if we are in recovery mode and need to update the recovery flag
2511 */
2512 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2513 (pSatDevData->satPendingIO == 0 ))
2514 {
2515 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2516 TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n"));
2517 }
2518
2519 TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2520 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2521 TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2522
2523 break;
2524
2525
2526 case OSSA_IO_NO_DEVICE:
2527 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2528 ostiInitiatorIOCompleted( tiRoot,
2529 tdIORequestBody->tiIORequest,
2530 tiIOFailed,
2531 tiDetailNoLogin,
2532 agNULL,
2533 interruptContext);
2534 break;
2535
2536 case OSSA_IO_PROG_ERROR:
2537 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2538 ostiInitiatorIOCompleted( tiRoot,
2539 tdIORequestBody->tiIORequest,
2540 tiIOFailed,
2541 tiDetailOtherError,
2542 agNULL,
2543 interruptContext);
2544 break;
2545 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2546 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2547 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2548 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2549 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2550 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2551 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2552 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2553 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2554 if (tiDeviceHandle == agNULL)
2555 {
2556 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2557 ostiInitiatorIOCompleted( tiRoot,
2558 tdIORequestBody->tiIORequest,
2559 tiIOFailed,
2560 tiDetailOtherError,
2561 agNULL,
2562 interruptContext);
2563 return;
2564 }
2565 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2566 if (oneDeviceData == agNULL)
2567 {
2568 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2569 }
2570 else
2571 {
2572 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2573 }
2574
2575 ostiInitiatorIOCompleted( tiRoot,
2576 tdIORequestBody->tiIORequest,
2577 tiIOFailed,
2578 tiDetailOtherError,
2579 agNULL,
2580 interruptContext);
2581 break;
2582
2583 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2584 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2585 ostiInitiatorIOCompleted( tiRoot,
2586 tdIORequestBody->tiIORequest,
2587 tiIOFailed,
2588 tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2589 agNULL,
2590 interruptContext);
2591 break;
2592
2593 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2594 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2595 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2596 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2597 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2598 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2599 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2600 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2601 ostiInitiatorIOCompleted( tiRoot,
2602 tdIORequestBody->tiIORequest,
2603 tiIOFailed,
2604 tiDetailOtherError,
2605 agNULL,
2606 interruptContext);
2607 break;
2608 case OSSA_IO_DS_IN_ERROR:
2609 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2610 if (tiDeviceHandle == agNULL)
2611 {
2612 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2613 ostiInitiatorIOCompleted( tiRoot,
2614 tdIORequestBody->tiIORequest,
2615 tiIOFailed,
2616 tiDetailOtherError,
2617 agNULL,
2618 interruptContext);
2619 return;
2620 }
2621 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2622 if (oneDeviceData == agNULL)
2623 {
2624 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2625 }
2626 else
2627 {
2628 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2629 }
2630 ostiInitiatorIOCompleted( tiRoot,
2631 tdIORequestBody->tiIORequest,
2632 tiIOFailed,
2633 tiDetailOtherError,
2634 agNULL,
2635 interruptContext);
2636 break;
2637 case OSSA_IO_DS_NON_OPERATIONAL:
2638 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2639 if (tiDeviceHandle == agNULL)
2640 {
2641 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2642 ostiInitiatorIOCompleted( tiRoot,
2643 tdIORequestBody->tiIORequest,
2644 tiIOFailed,
2645 tiDetailOtherError,
2646 agNULL,
2647 interruptContext);
2648 return;
2649 }
2650 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2651 if (oneDeviceData == agNULL)
2652 {
2653 TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2654 }
2655 else
2656 {
2657 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2658 agDevHandle = oneDeviceData->agDevHandle;
2659 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2660 oneDeviceData->tdPortContext != agNULL )
2661 {
2662 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
2663 }
2664 }
2665
2666 ostiInitiatorIOCompleted( tiRoot,
2667 tdIORequestBody->tiIORequest,
2668 tiIOFailed,
2669 tiDetailOtherError,
2670 agNULL,
2671 interruptContext);
2672 break;
2673 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
2674 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
2675 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
2676 itdsatEncryptionHandler(agRoot,
2677 agIORequest,
2678 agIOStatus,
2679 agIOInfoLen,
2680 agParam,
2681 0);
2682 break;
2683 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
2684 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
2685 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
2686 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
2687 itdsatDifHandler(agRoot,
2688 agIORequest,
2689 agIOStatus,
2690 agIOInfoLen,
2691 agParam,
2692 0);
2693 break;
2694 default:
2695 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2696 TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = unknown 0x%x\n", agIOStatus));
2697 if (oneDeviceData != agNULL)
2698 {
2699 TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2700 }
2701 else
2702 {
2703 TI_DBG1(("itdsatProcessAbnormalCompletion: oneDeviceData is NULL\n"));
2704 }
2705
2706 ostiInitiatorIOCompleted( tiRoot,
2707 tdIORequestBody->tiIORequest,
2708 tiIOFailed,
2709 tiDetailOtherError,
2710 agNULL,
2711 interruptContext);
2712 break;
2713
2714 } /* switch */
2715 }
2716
2717
2718 /*****************************************************************************
2719 *! \brief itdsatDelayedProcessAbnormalCompletion
2720 *
2721 * This routine is called to complete error case for SATA request previously
2722 * issued to the LL Layer in saSATAStart().
2723 * This is used when command is chained.
2724 *
2725 * \param agRoot: Handles for this instance of SAS/SATA hardware
2726 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
2727 * \param agIOStatus: Status of completed I/O.
2728 * \param agFirstDword:Pointer to the four bytes of FIS.
2729 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
2730 * length.
2731 * \param agParam: Additional info based on status.
2732 * \param ioContext: Pointer to satIOContext_t.
2733 *
2734 * \return: none
2735 *
2736 *****************************************************************************/
2737 void itdsatDelayedProcessAbnormalCompletion(
2738 agsaRoot_t *agRoot,
2739 agsaIORequest_t *agIORequest,
2740 bit32 agIOStatus,
2741 agsaFisHeader_t *agFirstDword,
2742 bit32 agIOInfoLen,
2743 void *agParam,
2744 satIOContext_t *satIOContext
2745 )
2746 {
2747
2748 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
2749 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
2750 bit32 interruptContext = osData->IntContext;
2751 tdIORequestBody_t *tdIORequestBody;
2752 satDeviceData_t *pSatDevData;
2753 tiDeviceHandle_t *tiDeviceHandle;
2754 tdsaDeviceData_t *oneDeviceData = agNULL;
2755 agsaDevHandle_t *agDevHandle = agNULL;
2756
2757 TI_DBG5(("itdsatDelayedProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n",
2758 agIORequest, agIOStatus, agIOInfoLen));
2759
2760 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
2761 pSatDevData = satIOContext->pSatDevData;
2762 tiDeviceHandle = satIOContext->ptiDeviceHandle;
2763
2764 /* Get into the detail */
2765 switch(agIOStatus)
2766 {
2767 case OSSA_IO_SUCCESS:
2768 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS calling osSatIOCompleted\n"));
2769 /* do nothing */
2770 break;
2771
2772
2773 case OSSA_IO_ABORTED:
2774 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n"));
2775
2776 ostiInitiatorIOCompleted( tiRoot,
2777 tdIORequestBody->tiIORequest,
2778 tiIOFailed,
2779 tiDetailAborted,
2780 agNULL,
2781 interruptContext);
2782
2783 if ( pSatDevData->satTmTaskTag != agNULL )
2784 {
2785 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: TM callback\n"));
2786 if (tiDeviceHandle == agNULL)
2787 {
2788 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2789 }
2790 /* TM completed */
2791 ostiInitiatorEvent( tiRoot,
2792 agNULL, /* portalContext not used */
2793 tiDeviceHandle,
2794 tiIntrEventTypeTaskManagement,
2795 tiTMOK,
2796 pSatDevData->satTmTaskTag);
2797 /*
2798 * Reset flag
2799 */
2800 pSatDevData->satTmTaskTag = agNULL;
2801 }
2802
2803 /*
2804 * Check if we are in recovery mode and need to update the recovery flag
2805 */
2806 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2807 (pSatDevData->satPendingIO == 0 ))
2808 {
2809 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2810 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2811 }
2812
2813 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2814 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2815 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2816
2817 break;
2818 case OSSA_IO_UNDERFLOW:
2819 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n"));
2820 ostiInitiatorIOCompleted( tiRoot,
2821 tdIORequestBody->tiIORequest,
2822 tiIOUnderRun,
2823 agIOInfoLen,
2824 agNULL,
2825 interruptContext);
2826 break;
2827
2828
2829 case OSSA_IO_FAILED:
2830 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n"));
2831 ostiInitiatorIOCompleted( tiRoot,
2832 tdIORequestBody->tiIORequest,
2833 tiIOFailed,
2834 tiDetailOtherError,
2835 agNULL,
2836 interruptContext);
2837 break;
2838
2839 case OSSA_IO_ABORT_RESET:
2840 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n"));
2841 ostiInitiatorIOCompleted( tiRoot,
2842 tdIORequestBody->tiIORequest,
2843 tiIOFailed,
2844 tiDetailAbortReset,
2845 agNULL,
2846 interruptContext);
2847 /*
2848 * Check if we are in recovery mode and need to update the recovery flag
2849 */
2850 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
2851 (pSatDevData->satPendingIO == 0 ))
2852 {
2853 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
2854 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n"));
2855 }
2856
2857 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState));
2858 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
2859 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
2860
2861 break;
2862
2863
2864 case OSSA_IO_NO_DEVICE:
2865 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n"));
2866 ostiInitiatorIOCompleted( tiRoot,
2867 tdIORequestBody->tiIORequest,
2868 tiIOFailed,
2869 tiDetailNoLogin,
2870 agNULL,
2871 interruptContext);
2872 break;
2873
2874 case OSSA_IO_PROG_ERROR:
2875 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n"));
2876 ostiInitiatorIOCompleted( tiRoot,
2877 tdIORequestBody->tiIORequest,
2878 tiIOFailed,
2879 tiDetailOtherError,
2880 agNULL,
2881 interruptContext);
2882 break;
2883 case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */
2884 case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */
2885 case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */
2886 case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */
2887 case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */
2888 case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */
2889 case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */
2890 case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */
2891 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus));
2892 if (tiDeviceHandle == agNULL)
2893 {
2894 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2895 ostiInitiatorIOCompleted( tiRoot,
2896 tdIORequestBody->tiIORequest,
2897 tiIOFailed,
2898 tiDetailOtherError,
2899 agNULL,
2900 interruptContext);
2901 return;
2902 }
2903 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2904 if (oneDeviceData == agNULL)
2905 {
2906 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2907 }
2908 else
2909 {
2910 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2911 }
2912 ostiInitiatorIOCompleted( tiRoot,
2913 tdIORequestBody->tiIORequest,
2914 tiIOFailed,
2915 tiDetailOtherError,
2916 agNULL,
2917 interruptContext);
2918 break;
2919
2920 case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
2921 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
2922 ostiInitiatorIOCompleted( tiRoot,
2923 tdIORequestBody->tiIORequest,
2924 tiIOFailed,
2925 tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted,
2926 agNULL,
2927 interruptContext);
2928 break;
2929
2930 case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */
2931 case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */
2932 case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */
2933 case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */
2934 case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */
2935 case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */
2936 case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */
2937 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus));
2938
2939 ostiInitiatorIOCompleted( tiRoot,
2940 tdIORequestBody->tiIORequest,
2941 tiIOFailed,
2942 tiDetailOtherError,
2943 agNULL,
2944 interruptContext);
2945 break;
2946 case OSSA_IO_DS_IN_ERROR:
2947 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n"));
2948 if (tiDeviceHandle == agNULL)
2949 {
2950 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2951 ostiInitiatorIOCompleted( tiRoot,
2952 tdIORequestBody->tiIORequest,
2953 tiIOFailed,
2954 tiDetailOtherError,
2955 agNULL,
2956 interruptContext);
2957 return;
2958 }
2959 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2960 if (oneDeviceData == agNULL)
2961 {
2962 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2963 }
2964 else
2965 {
2966 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2967 }
2968 ostiInitiatorIOCompleted( tiRoot,
2969 tdIORequestBody->tiIORequest,
2970 tiIOFailed,
2971 tiDetailOtherError,
2972 agNULL,
2973 interruptContext);
2974 break;
2975 case OSSA_IO_DS_NON_OPERATIONAL:
2976 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n"));
2977 if (tiDeviceHandle == agNULL)
2978 {
2979 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n"));
2980 ostiInitiatorIOCompleted( tiRoot,
2981 tdIORequestBody->tiIORequest,
2982 tiIOFailed,
2983 tiDetailOtherError,
2984 agNULL,
2985 interruptContext);
2986 return;
2987 }
2988 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2989 if (oneDeviceData == agNULL)
2990 {
2991 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n"));
2992 }
2993 else
2994 {
2995 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id));
2996 agDevHandle = oneDeviceData->agDevHandle;
2997 if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
2998 oneDeviceData->tdPortContext != agNULL )
2999 {
3000 saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
3001 }
3002 }
3003 ostiInitiatorIOCompleted( tiRoot,
3004 tdIORequestBody->tiIORequest,
3005 tiIOFailed,
3006 tiDetailOtherError,
3007 agNULL,
3008 interruptContext);
3009 break;
3010 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */
3011 case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
3012 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus));
3013 itdsatEncryptionHandler(agRoot,
3014 agIORequest,
3015 agIOStatus,
3016 agIOInfoLen,
3017 agParam,
3018 0);
3019 break;
3020 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */
3021 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */
3022 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3023 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus));
3024 itdsatDifHandler(agRoot,
3025 agIORequest,
3026 agIOStatus,
3027 agIOInfoLen,
3028 agParam,
3029 0);
3030 break;
3031 default:
3032 TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = unknown\n"));
3033 ostiInitiatorIOCompleted( tiRoot,
3034 tdIORequestBody->tiIORequest,
3035 tiIOFailed,
3036 tiDetailOtherError,
3037 agNULL,
3038 interruptContext);
3039 break;
3040
3041 } /* switch */
3042 }
3043
3044 /*****************************************************************************
3045 *! \brief itdsatEncryptionHandler
3046 *
3047 * Purpose: This function processes I/Os completed and returned by SATA lower
3048 * layer with any encryption specific agIOStatus.
3049 *
3050 * \param agRoot: pointer to port instance
3051 * \param agIORequest: pointer to I/O request
3052 * \param agIOStatus: I/O status given by LL layer
3053 * \param agIOInfoLen: lenth of complete SAS RESP frame
3054 * \param agParam A Handle used to refer to the response frame or handle
3055 * of abort request
3056 * \return: None
3057 *
3058 *
3059 *****************************************************************************/
3060 osGLOBAL void
3061 itdsatEncryptionHandler(
3062 agsaRoot_t *agRoot,
3063 agsaIORequest_t *agIORequest,
3064 bit32 agIOStatus,
3065 bit32 agIOInfoLen,
3066 void *agParam,
3067 bit32 agOtherInfo
3068 )
3069 {
3070 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3071 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3072 bit32 intContext = osData->IntContext;
3073 bit32 errorDetail = tiDetailOtherError;
3074 tdIORequestBody_t *tdIORequestBody;
3075 TI_DBG1(("itdsatEncryptionHandler: start\n"));
3076 TI_DBG1(("itdsatEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
3077
3078 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3079
3080 switch (agIOStatus)
3081 {
3082 case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
3083 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
3084 errorDetail = tiDetailDekKeyCacheMiss;
3085 break;
3086 case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
3087 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
3088 errorDetail = tiDetailCipherModeInvalid;
3089 break;
3090 case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
3091 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
3092 errorDetail = tiDetailDekIVMismatch;
3093 break;
3094 case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
3095 TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
3096 errorDetail = tiDetailDekRamInterfaceError;
3097 break;
3098 default:
3099 TI_DBG1(("itdsatEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
3100 errorDetail = tiDetailOtherError;
3101 break;
3102 }
3103
3104 ostiInitiatorIOCompleted (
3105 tiRoot,
3106 tdIORequestBody->tiIORequest,
3107 tiIOEncryptError,
3108 errorDetail,
3109 agNULL,
3110 intContext
3111 );
3112 return;
3113 }
3114
3115 /*****************************************************************************
3116 *! \brief itdsatDifHandler
3117 *
3118 * Purpose: This function processes I/Os completed and returned by SATA lower
3119 * layer with any DIF specific agIOStatus.
3120 *
3121 * \param agRoot: pointer to port instance
3122 * \param agIORequest: pointer to I/O request
3123 * \param agIOStatus: I/O status given by LL layer
3124 * \param agIOInfoLen: lenth of complete SAS RESP frame
3125 * \param agParam A Handle used to refer to the response frame or handle
3126 * of abort request
3127 * \return: None
3128 *
3129 *
3130 *****************************************************************************/
3131 osGLOBAL void
3132 itdsatDifHandler(
3133 agsaRoot_t *agRoot,
3134 agsaIORequest_t *agIORequest,
3135 bit32 agIOStatus,
3136 bit32 agIOInfoLen,
3137 void *agParam,
3138 bit32 agOtherInfo
3139 )
3140 {
3141 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3142 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3143 bit32 intContext = osData->IntContext;
3144 bit32 errorDetail = tiDetailOtherError;
3145 tdIORequestBody_t *tdIORequestBody;
3146 #ifdef TD_DEBUG_ENABLE
3147 agsaDifDetails_t *DifDetail;
3148 #endif
3149
3150 TI_DBG2(("itdsatDifHandler: start\n"));
3151 TI_DBG2(("itdsatDifHandler: agIOStatus 0x%x\n", agIOStatus));
3152
3153 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3154 #ifdef TD_DEBUG_ENABLE
3155 DifDetail = (agsaDifDetails_t *)agParam;
3156 #endif
3157 switch (agIOStatus)
3158 {
3159 case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
3160 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
3161 errorDetail = tiDetailDifAppTagMismatch;
3162 break;
3163 case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
3164 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
3165 errorDetail = tiDetailDifRefTagMismatch;
3166 break;
3167 case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
3168 TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
3169 errorDetail = tiDetailDifCrcMismatch;
3170 break;
3171 default:
3172 TI_DBG1(("itdsatDifHandler: other error!!! 0x%x\n", agIOStatus));
3173 errorDetail = tiDetailOtherError;
3174 break;
3175 }
3176
3177 TI_DBG1(("smsatDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
3178
3179 ostiInitiatorIOCompleted (
3180 tiRoot,
3181 tdIORequestBody->tiIORequest,
3182 tiIODifError,
3183 errorDetail,
3184 agNULL,
3185 intContext
3186 );
3187 return;
3188 }
3189
3190 /*****************************************************************************/
3191 /*! \brief satProcessAbort
3192 *
3193 * This function processes abort.
3194 *
3195 * \param tiRoot: Pointer to TISA initiator driver/port instance.
3196 * \param tiIORequest: Pointer to TISA I/O request context for this I/O.
3197 * \param satIOContext_t: Pointer to the SAT IO Context
3198 *
3199 * \return
3200 * None
3201 */
3202 /*****************************************************************************/
3203 void satProcessAbort(
3204 tiRoot_t *tiRoot,
3205 tiIORequest_t *tiIORequest,
3206 satIOContext_t *satIOContext
3207 )
3208 {
3209 satDeviceData_t *pSatDevData;
3210 //tiDeviceHandle_t *tiDeviceHandle;
3211 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
3212
3213 TI_DBG5(("satProcessAbort: start\n"));
3214
3215 pSatDevData = satIOContext->pSatDevData;
3216 //tiDeviceHandle = satIOContext->ptiDeviceHandle;
3217 hostToDevFis = satIOContext->pFis;
3218 if ( (hostToDevFis->h.command == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE) &&
3219 (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
3220 )
3221 {
3222 /* no completion for send diagnotic in background. It is done in satSendDiagnostic() */
3223 ostiInitiatorIOCompleted( tiRoot,
3224 tiIORequest,
3225 tiIOFailed,
3226 tiDetailAborted,
3227 agNULL,
3228 satIOContext->interruptContext);
3229 }
3230
3231 if ( pSatDevData->satTmTaskTag != agNULL )
3232 {
3233 TI_DBG1(("satProcessAbort: TM callback\n"));
3234 /*
3235 * Reset flag
3236 */
3237 pSatDevData->satTmTaskTag = agNULL;
3238 }
3239
3240 /*
3241 * Check if we are in recovery mode and need to update the recovery flag
3242 */
3243 if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) &&
3244 (pSatDevData->satPendingIO == 0 ))
3245 {
3246 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3247 TI_DBG1(("satProcessAbort: STATE NORMAL.\n"));
3248 }
3249 TI_DBG1(("satProcessAbort: satDriveState %d\n", pSatDevData->satDriveState));
3250 TI_DBG1(("satProcessAbort: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
3251 TI_DBG1(("satProcessAbort: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
3252
3253
3254
3255 return;
3256 }
3257
3258 /*****************************************************************************
3259 *! \brief satNonDataIOCB
3260 *
3261 * This routine is a callback function called from ossaSATACompleted().
3262 * This CB routine deals with non-data I/O SATA request.
3263 *
3264 * \param agRoot: Handles for this instance of SAS/SATA hardware
3265 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
3266 * \param agIOStatus: Status of completed I/O.
3267 * \param agFirstDword:Pointer to the four bytes of FIS.
3268 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
3269 * length.
3270 * \param agParam: Additional info based on status.
3271 * \param ioContext: Pointer to satIOContext_t.
3272 *
3273 * \return: none
3274 *
3275 *****************************************************************************/
3276 void satNonDataIOCB(
3277 agsaRoot_t *agRoot,
3278 agsaIORequest_t *agIORequest,
3279 bit32 agIOStatus,
3280 agsaFisHeader_t *agFirstDword,
3281 bit32 agIOInfoLen,
3282 void *agParam,
3283 void *ioContext
3284 )
3285 {
3286
3287 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3288 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3289 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3290 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3291 tdIORequestBody_t *tdIORequestBody;
3292 bit32 interruptContext = osData->IntContext;
3293 satIOContext_t *satIOContext;
3294
3295 TI_DBG5(("satNonDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3296 agIORequest, agIOStatus, agIOInfoLen));
3297
3298 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
3299 satIOContext = (satIOContext_t *) ioContext;
3300 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
3301
3302 tdIORequestBody->ioCompleted = agTRUE;
3303 tdIORequestBody->ioStarted = agFALSE;
3304
3305 /* Process completion */
3306 if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen==0))
3307 {
3308 /*
3309 * !!! We expect that agIOInfoLen should be non-zero !!!!.
3310 * Now call the OS-App Specific layer about this unexpected completion.
3311 */
3312 TI_DBG1(("satNonDataIOCB: *** ERROR*** agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
3313 agIORequest, agIOStatus, agIOInfoLen));
3314
3315 ostiInitiatorIOCompleted( tiRoot,
3316 tdIORequestBody->tiIORequest,
3317 tiIOFailed,
3318 tiDetailOtherError,
3319 agNULL,
3320 interruptContext);
3321 }
3322 else
3323 {
3324 /* More checking needed, for non-data IO this should be the normal case */
3325 itdsatProcessAbnormalCompletion( agRoot,
3326 agIORequest,
3327 agIOStatus,
3328 agFirstDword,
3329 agIOInfoLen,
3330 agParam,
3331 satIOContext);
3332 }
3333
3334 }
3335
3336 /*****************************************************************************
3337 *! \brief tdssSATADeviceTypeDecode
3338 *
3339 * This routine decodes ATA signature
3340 *
3341 * \param pSignature: ATA signature
3342 *
3343 *
3344 * \return:
3345 * TRUE if ATA signature
3346 * FALSE otherwise
3347 *
3348 *****************************************************************************/
3349 /*
3350 ATA p65
3351 PM p65
3352 SATAII p79, p80
3353 */
3354 GLOBAL bit32
3355 tdssSATADeviceTypeDecode(
3356 bit8 *pSignature
3357 )
3358 {
3359 bit32 deviceType = UNKNOWN_DEVICE;
3360
3361 if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3362 && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3363 && (pSignature)[4] == 0xA0 ) /* this is the signature of a Hitachi SATA HDD*/
3364 {
3365 deviceType = SATA_ATA_DEVICE;
3366 }
3367 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3368 && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00
3369 && (pSignature)[4] == 0x00 )
3370 {
3371 deviceType = SATA_ATA_DEVICE;
3372 }
3373 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3374 && (pSignature)[2] == 0x14 && (pSignature)[3] == 0xEB
3375 && ( (pSignature)[4] == 0x00 || (pSignature)[4] == 0x10) )
3376 {
3377 deviceType = SATA_ATAPI_DEVICE;
3378 }
3379 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3380 && (pSignature)[2] == 0x69 && (pSignature)[3] == 0x96
3381 && (pSignature)[4] == 0x00 )
3382 {
3383 deviceType = SATA_PM_DEVICE;
3384 }
3385 else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01
3386 && (pSignature)[2] == 0x3C && (pSignature)[3] == 0xC3
3387 && (pSignature)[4] == 0x00 )
3388 {
3389 deviceType = SATA_SEMB_DEVICE;
3390 }
3391 else if ( (pSignature)[0] == 0xFF && (pSignature)[1] == 0xFF
3392 && (pSignature)[2] == 0xFF && (pSignature)[3] == 0xFF
3393 && (pSignature)[4] == 0xFF )
3394 {
3395 deviceType = SATA_SEMB_WO_SEP_DEVICE;
3396 }
3397
3398 return deviceType;
3399 }
3400
3401 /*****************************************************************************
3402 *! \brief ossaDiscoverSataCB
3403 *
3404 * Purpose: This function is called by lower layer to inform TD layer of
3405 * STP/SATA discovery results
3406 *
3407 *
3408 * \param agRoot Pointer to chip/driver Instance.
3409 * \param agPortContext Pointer to the port context of TD and Lower layer
3410 * \param event event type
3411 * \param pParm1 Pointer to data associated with event
3412 * \param pParm2 Pointer to data associated with event
3413 *
3414 * \return: none
3415 *
3416 * \note - For details, refer to SAS/SATA Low-Level API Specification
3417 *
3418 *****************************************************************************/
3419
3420 osGLOBAL void ossaDiscoverSataCB( agsaRoot_t *agRoot,
3421 agsaPortContext_t *agPortContext,
3422 bit32 event,
3423 void *pParm1,
3424 void *pParm2
3425 )
3426 {
3427 tdsaRootOsData_t *osData;
3428 tiRoot_t *tiRoot;
3429 tdsaPortContext_t *onePortContext;
3430 tdsaDeviceData_t *oneDeviceData;
3431 agsaDevHandle_t *agDevHandle;
3432 agsaSATADeviceInfo_t *agSATADeviceInfo;
3433 tiPortalContext_t *tiPortalContext;
3434
3435 bit32 devicetype = UNKNOWN_DEVICE;
3436
3437 osData = (tdsaRootOsData_t *)agRoot->osData;
3438 tiRoot = (tiRoot_t *)osData->tiRoot;
3439
3440 TI_DBG5(("ossaDiscoverSataCB: start\n"));
3441
3442 if (agPortContext == agNULL)
3443 {
3444 TI_DBG1(("ossaDiscoverSataCB: NULL agsaPortContext; wrong\n"));
3445 return;
3446 }
3447
3448 onePortContext = (tdsaPortContext_t *)agPortContext->osData;
3449 tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
3450
3451 switch ( event )
3452 {
3453 case OSSA_DISCOVER_STARTED:
3454 {
3455 TI_DBG5(("ossaDiscoverSataCB: STARTED\n"));
3456 /* Do nothing */
3457 break;
3458 }
3459
3460 case OSSA_DISCOVER_FOUND_DEVICE:
3461 {
3462 TI_DBG5(("ossaDiscoverSataCB: ***** FOUND DEVICE\n"));
3463 agDevHandle = (agsaDevHandle_t *) pParm1;
3464 agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3465
3466 /* parse the device type */
3467 devicetype = tdssSATADeviceTypeDecode(agSATADeviceInfo->signature);
3468
3469
3470 /* for now, TD handles only ATA Device or ATAPI Device */
3471 if (devicetype == SATA_ATA_DEVICE || devicetype == SATA_ATAPI_DEVICE)
3472 {
3473 TI_DBG5(("ossaDiscoverSataCB: ***** adding ....\n"));
3474 /* Add SATA device */
3475 tdssAddSATAToSharedcontext( onePortContext,
3476 agRoot,
3477 agDevHandle,
3478 agSATADeviceInfo,
3479 agTRUE,
3480 agSATADeviceInfo->stpPhyIdentifier
3481 );
3482 #ifdef INITIATOR_DRIVER
3483 ostiInitiatorEvent(
3484 tiRoot,
3485 tiPortalContext,
3486 agNULL,
3487 tiIntrEventTypeDeviceChange,
3488 tiDeviceArrival,
3489 agNULL
3490 );
3491 #endif
3492 } /* end of ATA_ATA_DEVICE or ATA_ATAPI_DEVICE */
3493 else
3494 {
3495 TI_DBG5(("ossaDiscoverSataCB: ***** not adding ..... devicetype 0x%x\n", devicetype));
3496 }
3497 break;
3498 }
3499
3500 case OSSA_DISCOVER_REMOVED_DEVICE:
3501 {
3502 TI_DBG1(("ossaDiscoverSataCB: REMOVED_DEVICE\n"));
3503 agDevHandle = (agsaDevHandle_t *) pParm1;
3504 agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2;
3505
3506 oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
3507
3508 TI_DBG1(("ossaDiscoverSataCB: signature: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3509 agSATADeviceInfo->signature[0], agSATADeviceInfo->signature[1],
3510 agSATADeviceInfo->signature[2], agSATADeviceInfo->signature[3],
3511 agSATADeviceInfo->signature[4], agSATADeviceInfo->signature[5],
3512 agSATADeviceInfo->signature[6], agSATADeviceInfo->signature[7] ));
3513
3514 if (oneDeviceData == agNULL)
3515 {
3516 TI_DBG1(("ossaDiscoverSataCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
3517 }
3518 tdssRemoveSATAFromSharedcontext( onePortContext,
3519 oneDeviceData,
3520 agRoot
3521 );
3522 agDevHandle->osData = agNULL;
3523 #ifdef INITIATOR_DRIVER
3524 ostiInitiatorEvent(
3525 tiRoot,
3526 tiPortalContext,
3527 agNULL,
3528 tiIntrEventTypeDeviceChange,
3529 tiDeviceRemoval,
3530 agNULL
3531 );
3532 #endif
3533 break;
3534 }
3535
3536 case OSSA_DISCOVER_COMPLETE:
3537 {
3538 TI_DBG1(("ossaDiscoverSataCB: COMPLETE\n"));
3539 onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
3540 TI_DBG6(("ossaDiscoverSataCB: COMPLETE pid %d\n", onePortContext->id));
3541
3542 /* Let OS-Apps specific layer know discovery has been successfully complete */
3543 ostiInitiatorEvent( tiRoot,
3544 tiPortalContext,
3545 agNULL,
3546 tiIntrEventTypeDiscovery,
3547 tiDiscOK,
3548 agNULL );
3549 break;
3550 }
3551
3552 case OSSA_DISCOVER_ABORT:
3553 {
3554 TI_DBG1(("ossaDiscoverSataCB: OSSA_DISCOVER_ABORT\n"));
3555 /* Let OS-Apps specific layer know discovery has failed */
3556 ostiInitiatorEvent( tiRoot,
3557 tiPortalContext,
3558 agNULL,
3559 tiIntrEventTypeDiscovery,
3560 tiDiscFailed,
3561 agNULL );
3562
3563 break;
3564 }
3565
3566 default:
3567 {
3568 TI_DBG1(("ossaDiscoverSataCB: error default event 0x%x\n", event));
3569 /* Let OS-Apps specific layer know discovery has failed */
3570 ostiInitiatorEvent( tiRoot,
3571 tiPortalContext,
3572 agNULL,
3573 tiIntrEventTypeDiscovery,
3574 tiDiscFailed,
3575 agNULL );
3576 break;
3577 }
3578
3579 } /* end of switch */
3580
3581 return;
3582 }
3583
3584 /*****************************************************************************
3585 *! \brief tdssAddSataToSharedcontext
3586 *
3587 * Purpose: This function adds a discovered SATA device to a device list of
3588 * a port context
3589 *
3590 * \param tsddPortContext_Instance Pointer to the target port context
3591 * \param agRoot Pointer to the root data structure of
3592 * TD and Lower layer
3593 * \param agDevHandle Pointer to a device handle
3594 * \param agSATADeviceInfo Pointer to SATA device info structure
3595 * \param registered indication flag for registration to LL
3596 *
3597 * \Return: none
3598 *
3599 *****************************************************************************/
3600 /* split into devicedata allocation/registration and sending identify device data */
3601 osGLOBAL void
3602 tdssAddSATAToSharedcontext( tdsaPortContext_t *tdsaPortContext_Instance,
3603 agsaRoot_t *agRoot,
3604 agsaDevHandle_t *agDevHandle,
3605 agsaSATADeviceInfo_t *agSATADeviceInfo,
3606 bit32 registered,
3607 bit8 phyID
3608 )
3609 {
3610 tdsaPortContext_t *onePortContext = agNULL;
3611 tdList_t *PortContextList;
3612 tdsaDeviceData_t *oneDeviceData = agNULL;
3613 tdList_t *DeviceListList = agNULL;
3614 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
3615 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
3616 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3617 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3618 satDeviceData_t *pSatDevData;
3619 bit32 Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
3620 bit32 Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
3621 bit8 dev_s_rate = 0;
3622 bit8 sasorsata = 1;
3623 bit8 connectionRate;
3624 bit8 flag = 0;
3625 bit8 TLR = 0;
3626 bit32 found = agFALSE;
3627 TI_DBG5(("tdssAddSataToSharedcontext: start\n"));
3628
3629 /*
3630 * Find a right portcontext, then get devicedata from FreeLink in DeviceList.
3631 * Then, add the devicedata to the portcontext.
3632 */
3633
3634 /* Find a right portcontext */
3635 PortContextList = tdsaAllShared->MainPortContextList.flink;
3636 while (PortContextList != &(tdsaAllShared->MainPortContextList))
3637 {
3638 onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
3639 if (onePortContext == tdsaPortContext_Instance)
3640 {
3641 TI_DBG5(("tdssAddSataToSharedcontext: found; oneportContext ID %d\n",
3642 onePortContext->id));
3643 found = agTRUE;
3644 break;
3645 }
3646 PortContextList = PortContextList->flink;
3647 }
3648
3649 if (found == agFALSE)
3650 {
3651 TI_DBG1(("tdssAddSataToSharedcontext: No corressponding tdsaPortContext\n"));
3652 return;
3653 }
3654
3655 /*
3656 1. add the devicedata
3657 2. Send Identify Device Data
3658 3. In CB of Identify Device Data (satAddSATAIDDevCB), finds out the devicedata is new or old
3659 */
3660
3661
3662 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3663 if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList)))
3664 {
3665 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3666 TI_DBG1(("tdssAddSataToSharedcontext: ERROR empty DeviceData FreeLink\n"));
3667 /* notifying link up */
3668 ostiPortEvent (
3669 tiRoot,
3670 tiPortLinkUp,
3671 tiSuccess,
3672 (void *)tdsaAllShared->Ports[phyID].tiPortalContext
3673 );
3674 #ifdef INITIATOR_DRIVER
3675 /* triggers discovery */
3676 ostiPortEvent(
3677 tiRoot,
3678 tiPortDiscoveryReady,
3679 tiSuccess,
3680 (void *) tdsaAllShared->Ports[phyID].tiPortalContext
3681 );
3682 #endif
3683 return;
3684 }
3685
3686 TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList));
3687 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3688 oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList);
3689 TDLIST_DEQUEUE_THIS(&(oneDeviceData->FreeLink));
3690
3691 TI_DBG1(("tdssAddSataToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id));
3692 oneDeviceData->InQID = oneDeviceData->id % Indenom;
3693 oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
3694
3695 pSatDevData = (satDeviceData_t *)&(oneDeviceData->satDevData);
3696 pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
3697 pSatDevData->satPendingIO = 0;
3698 pSatDevData->satNCQMaxIO = 0;
3699 pSatDevData->satPendingNCQIO = 0;
3700 pSatDevData->satPendingNONNCQIO = 0;
3701 pSatDevData->IDDeviceValid = agFALSE;
3702 pSatDevData->satDeviceType = tdssSATADeviceTypeDecode(onePortContext->remoteSignature);
3703
3704 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
3705
3706 onePortContext->Count++;
3707 oneDeviceData->DeviceType = TD_SATA_DEVICE; // either TD_SAS_DEVICE or TD_SATA_DEVICE
3708 oneDeviceData->agRoot = agRoot;
3709 // oneDeviceData->agDevHandle = agDevHandle;
3710
3711 // agDevHandle->osData = oneDeviceData; /* TD layer */
3712 oneDeviceData->tdPortContext = onePortContext;
3713 oneDeviceData->valid = agTRUE;
3714
3715 oneDeviceData->directlyAttached = agTRUE;
3716 oneDeviceData->initiator_ssp_stp_smp = 0;
3717 oneDeviceData->target_ssp_stp_smp = 0x1; /* setting SATA device bit */
3718 oneDeviceData->phyID = phyID;
3719
3720 /* parse sasIDframe to fill in agDeviceInfo */
3721 flag = (bit8)((phyID << 4) | TLR);
3722 DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT);
3723 DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout);
3724 DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0);
3725 //temp
3726 //DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 0);
3727 DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, flag);
3728
3729 sasorsata = SATA_DEVICE_TYPE; /* SATA disk */
3730 connectionRate = onePortContext->LinkRate;
3731 dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4));
3732 dev_s_rate = (bit8)(dev_s_rate | connectionRate);
3733 DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate);
3734
3735 DEVINFO_PUT_SAS_ADDRESSLO(
3736 &oneDeviceData->agDeviceInfo,
3737 0
3738 );
3739 DEVINFO_PUT_SAS_ADDRESSHI(
3740 &oneDeviceData->agDeviceInfo,
3741 0
3742 );
3743
3744 if (pSatDevData->satDeviceType == SATA_ATAPI_DEVICE )
3745 {
3746 oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; /* ATAPI device flag*/
3747 }
3748
3749 oneDeviceData->agContext.osData = oneDeviceData;
3750 oneDeviceData->agContext.sdkData = agNULL;
3751
3752 if (oneDeviceData->registered == agFALSE)
3753 {
3754 saRegisterNewDevice( /* tdssAddSATAToSharedcontext */
3755 agRoot,
3756 &oneDeviceData->agContext,
3757 0,/*tdsaRotateQnumber(tiRoot, oneDeviceData),*/
3758 &oneDeviceData->agDeviceInfo,
3759 onePortContext->agPortContext,
3760 0
3761 );
3762 }
3763 return;
3764 }
3765 /*****************************************************************************
3766 *! \brief tdssRetrySATAID
3767 *
3768 * Purpose: This function retries identify device data to directly attached SATA
3769 * device after device registration
3770 *
3771 * \param tiRoot: Pointer to TISA initiator driver/port instance.
3772 * \param oneDeviceData Pointer to a device data
3773 * \Return: none
3774 *
3775 *****************************************************************************/
3776 osGLOBAL void
3777 tdssRetrySATAID( tiRoot_t *tiRoot,
3778 tdsaDeviceData_t *oneDeviceData
3779 )
3780 {
3781 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3782 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3783 void *osMemHandle;
3784 tdIORequestBody_t *tdIORequestBody;
3785 bit32 PhysUpper32;
3786 bit32 PhysLower32;
3787 bit32 memAllocStatus;
3788 agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */
3789 satIOContext_t *satIOContext = agNULL;
3790 bit32 status;
3791
3792 TI_DBG5(("tdssRetrySATAID: start\n"));
3793 /* allocate identify device data and sends it */
3794 /* allocation tdIORequestBody and pass it to satTM() */
3795 memAllocStatus = ostiAllocMemory(
3796 tiRoot,
3797 &osMemHandle,
3798 (void **)&tdIORequestBody,
3799 &PhysUpper32,
3800 &PhysLower32,
3801 8,
3802 sizeof(tdIORequestBody_t),
3803 agTRUE
3804 );
3805
3806 if (memAllocStatus != tiSuccess)
3807 {
3808 TI_DBG1(("tdssRetrySATAID: ostiAllocMemory failed... loc 2\n"));
3809 /* notifying link up */
3810 ostiPortEvent (
3811 tiRoot,
3812 tiPortLinkUp,
3813 tiSuccess,
3814 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3815 );
3816 #ifdef INITIATOR_DRIVER
3817 /* triggers discovery */
3818 ostiPortEvent(
3819 tiRoot,
3820 tiPortDiscoveryReady,
3821 tiSuccess,
3822 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3823 );
3824 #endif
3825
3826 return;
3827 }
3828
3829 if (tdIORequestBody == agNULL)
3830 {
3831 TI_DBG1(("tdssRetrySATAID: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
3832 /* notifying link up */
3833 ostiPortEvent (
3834 tiRoot,
3835 tiPortLinkUp,
3836 tiSuccess,
3837 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3838 );
3839 #ifdef INITIATOR_DRIVER
3840 /* triggers discovery */
3841 ostiPortEvent(
3842 tiRoot,
3843 tiPortDiscoveryReady,
3844 tiSuccess,
3845 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3846 );
3847 #endif
3848
3849 return;
3850 }
3851
3852 /* setup identify device data IO structure */
3853 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
3854 tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
3855 tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
3856
3857 /* initialize tiDevhandle */
3858 tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
3859 tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
3860
3861 /* initialize tiIORequest */
3862 tdIORequestBody->tiIORequest = agNULL;
3863
3864 /* initialize agIORequest */
3865 agIORequest = &(tdIORequestBody->agIORequest);
3866 agIORequest->osData = (void *) tdIORequestBody;
3867 agIORequest->sdkData = agNULL; /* SA takes care of this */
3868
3869 /* set up satIOContext */
3870 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
3871 satIOContext->pSatDevData = &(oneDeviceData->satDevData);
3872 satIOContext->pFis =
3873 &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
3874
3875
3876 satIOContext->tiRequestBody = tdIORequestBody;
3877 satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
3878 satIOContext->tiScsiXchg = agNULL;
3879 satIOContext->satIntIoContext = agNULL;
3880 satIOContext->satOrgIOContext = agNULL;
3881
3882 /* followings are used only for internal IO */
3883 satIOContext->currentLBA = 0;
3884 satIOContext->OrgTL = 0;
3885
3886
3887 satIOContext->satToBeAbortedIOContext = agNULL;
3888
3889 satIOContext->NotifyOS = agFALSE;
3890
3891 satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
3892
3893 status = satAddSATAStartIDDev(tiRoot,
3894 agNULL,
3895 &(oneDeviceData->tiDeviceHandle),
3896 agNULL,
3897 satIOContext
3898 );
3899
3900 /* assumption; always new device data */
3901
3902
3903 if (status == tiSuccess)
3904 {
3905 TI_DBG6(("tdssRetrySATAID: successfully sent identify device data\n"));
3906 TI_DBG6(("tdssRetrySATAID: one case did %d \n", oneDeviceData->id));
3907 }
3908 else
3909 {
3910 TI_DBG1(("tdssRetrySATAID: failed in sending identify device data\n"));
3911 /* put onedevicedata back to free list */
3912 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
3913 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
3914 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
3915 /* notifying link up */
3916 ostiPortEvent (
3917 tiRoot,
3918 tiPortLinkUp,
3919 tiSuccess,
3920 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3921 );
3922 #ifdef INITIATOR_DRIVER
3923 /* triggers discovery */
3924 ostiPortEvent(
3925 tiRoot,
3926 tiPortDiscoveryReady,
3927 tiSuccess,
3928 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3929 );
3930 #endif
3931
3932 }
3933
3934 return;
3935 }
3936
3937 /*****************************************************************************
3938 *! \brief tdssSubAddSATAToSharedcontext
3939 *
3940 * Purpose: This function sends identify device data to directly attached SATA
3941 * device after device registration
3942 *
3943 * \param tiRoot: Pointer to TISA initiator driver/port instance.
3944 * \param oneDeviceData Pointer to a device data
3945 * \Return: none
3946 *
3947 *****************************************************************************/
3948 osGLOBAL void
3949 tdssSubAddSATAToSharedcontext( tiRoot_t *tiRoot,
3950 tdsaDeviceData_t *oneDeviceData
3951 )
3952 {
3953 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3954 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3955 void *osMemHandle;
3956 tdIORequestBody_t *tdIORequestBody;
3957 bit32 PhysUpper32;
3958 bit32 PhysLower32;
3959 bit32 memAllocStatus;
3960 agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */
3961 satIOContext_t *satIOContext = agNULL;
3962 bit32 status;
3963
3964 TI_DBG1(("tdssSubAddSATAToSharedcontext: start\n"));
3965 /* allocate identify device data and sends it */
3966 /* allocation tdIORequestBody and pass it to satTM() */
3967 memAllocStatus = ostiAllocMemory(
3968 tiRoot,
3969 &osMemHandle,
3970 (void **)&tdIORequestBody,
3971 &PhysUpper32,
3972 &PhysLower32,
3973 8,
3974 sizeof(tdIORequestBody_t),
3975 agTRUE
3976 );
3977
3978 if (memAllocStatus != tiSuccess)
3979 {
3980 TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory failed... loc 2\n"));
3981 /* notifying link up */
3982 ostiPortEvent (
3983 tiRoot,
3984 tiPortLinkUp,
3985 tiSuccess,
3986 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3987 );
3988 #ifdef INITIATOR_DRIVER
3989 /* triggers discovery */
3990 ostiPortEvent(
3991 tiRoot,
3992 tiPortDiscoveryReady,
3993 tiSuccess,
3994 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
3995 );
3996 #endif
3997
3998 return;
3999 }
4000
4001 if (tdIORequestBody == agNULL)
4002 {
4003 TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory returned NULL tdIORequestBody loc 2\n"));
4004 /* notifying link up */
4005 ostiPortEvent (
4006 tiRoot,
4007 tiPortLinkUp,
4008 tiSuccess,
4009 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4010 );
4011 #ifdef INITIATOR_DRIVER
4012 /* triggers discovery */
4013 ostiPortEvent(
4014 tiRoot,
4015 tiPortDiscoveryReady,
4016 tiSuccess,
4017 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4018 );
4019 #endif
4020
4021 return;
4022 }
4023
4024 /* setup identify device data IO structure */
4025 tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
4026 tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
4027 tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL;
4028
4029 /* initialize tiDevhandle */
4030 tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle);
4031 tdIORequestBody->tiDevHandle->tdData = oneDeviceData;
4032
4033 /* initialize tiIORequest */
4034 tdIORequestBody->tiIORequest = agNULL;
4035
4036 /* initialize agIORequest */
4037 agIORequest = &(tdIORequestBody->agIORequest);
4038 agIORequest->osData = (void *) tdIORequestBody;
4039 agIORequest->sdkData = agNULL; /* SA takes care of this */
4040
4041 /* set up satIOContext */
4042 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
4043 satIOContext->pSatDevData = &(oneDeviceData->satDevData);
4044 satIOContext->pFis =
4045 &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
4046
4047
4048 satIOContext->tiRequestBody = tdIORequestBody;
4049 satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
4050 satIOContext->tiScsiXchg = agNULL;
4051 satIOContext->satIntIoContext = agNULL;
4052 satIOContext->satOrgIOContext = agNULL;
4053
4054 /* followings are used only for internal IO */
4055 satIOContext->currentLBA = 0;
4056 satIOContext->OrgTL = 0;
4057
4058
4059 satIOContext->satToBeAbortedIOContext = agNULL;
4060
4061 satIOContext->NotifyOS = agFALSE;
4062
4063 satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id;
4064
4065 status = satAddSATAStartIDDev(tiRoot,
4066 agNULL,
4067 &(oneDeviceData->tiDeviceHandle),
4068 agNULL,
4069 satIOContext
4070 );
4071
4072 /* assumption; always new device data */
4073
4074
4075 if (status == tiSuccess)
4076 {
4077 TI_DBG6(("tdssSubAddSATAToSharedcontext: successfully sent identify device data\n"));
4078
4079 /* Add the devicedata to the mainlink */
4080 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4081 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
4082 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4083 TI_DBG6(("tdssSubAddSATAToSharedcontext: one case did %d \n", oneDeviceData->id));
4084 }
4085 else
4086 {
4087 TI_DBG1(("tdssSubAddSATAToSharedcontext: failed in sending identify device data\n"));
4088 /* put onedevicedata back to free list */
4089 tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
4090 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
4091 tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
4092 /* notifying link up */
4093 ostiPortEvent (
4094 tiRoot,
4095 tiPortLinkUp,
4096 tiSuccess,
4097 (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4098 );
4099 #ifdef INITIATOR_DRIVER
4100 /* triggers discovery */
4101 ostiPortEvent(
4102 tiRoot,
4103 tiPortDiscoveryReady,
4104 tiSuccess,
4105 (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext
4106 );
4107 #endif
4108
4109 }
4110
4111 return;
4112 }
4113
4114
4115 /*****************************************************************************
4116 *! \brief tdssRemoveSATAFromSharedcontext
4117 *
4118 * Purpose: This function removes a discovered device from a device list of
4119 * a port context
4120 *
4121 * \param tsddPortContext_Ins Pointer to the target port context
4122 * \param tdsaDeviceData_Ins Pointer to the target device
4123 * \param agRoot Pointer to the root data structure of
4124 * TD and Lower layer
4125
4126 *
4127 * \Return: none
4128 *
4129 *****************************************************************************/
4130 osGLOBAL void
4131 tdssRemoveSATAFromSharedcontext(
4132 tdsaPortContext_t *tdsaPortContext_Ins,
4133 tdsaDeviceData_t *tdsaDeviceData_ins,
4134 agsaRoot_t *agRoot
4135 )
4136 {
4137 TI_DBG1(("tdssRemoveSATAFromSharedcontex: start\n"));
4138 return;
4139 }
4140
4141
4142 /*****************************************************************************
4143 *! \brief satSetDevInfo
4144 *
4145 * Purpose: Based on ATA identify device data, this functions sets fields of
4146 * device data maintained in TD layer
4147 *
4148 * \param satDevData Pointer to a device data
4149 * \param SATAIdData Pointer to ATA identify device data
4150 *
4151 *
4152 * \Return: none
4153 *
4154 *****************************************************************************/
4155 void satSetDevInfo(
4156 satDeviceData_t *satDevData,
4157 agsaSATAIdentifyData_t *SATAIdData
4158 )
4159 {
4160 TI_DBG3(("satSetDevInfo: start\n"));
4161
4162 satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
4163 satDevData->satFormatState = agFALSE;
4164 satDevData->satDeviceFaultState = agFALSE;
4165 satDevData->satTmTaskTag = agNULL;
4166 satDevData->satAbortAfterReset = agFALSE;
4167 satDevData->satAbortCalled = agFALSE;
4168 satDevData->satSectorDone = 0;
4169
4170 /* Qeueu depth, Word 75 */
4171 satDevData->satNCQMaxIO = SATAIdData->queueDepth + 1;
4172 TI_DBG3(("satSetDevInfo: max queue depth %d\n",satDevData->satNCQMaxIO));
4173
4174 /* Support NCQ, if Word 76 bit 8 is set */
4175 if (SATAIdData->sataCapabilities & 0x100)
4176 {
4177 TI_DBG3(("satSetDevInfo: device supports NCQ\n"));
4178 satDevData->satNCQ = agTRUE;
4179 }
4180 else
4181 {
4182 TI_DBG3(("satSetDevInfo: no NCQ\n"));
4183 satDevData->satNCQ = agFALSE;
4184 }
4185
4186 /* Support 48 bit addressing, if Word 83 bit 10 and Word 86 bit 10 are set */
4187 if ((SATAIdData->commandSetSupported1 & 0x400) &&
4188 (SATAIdData->commandSetFeatureEnabled1 & 0x400) )
4189 {
4190 TI_DBG3(("satSetDevInfo: support 48 bit addressing\n"));
4191 satDevData->sat48BitSupport = agTRUE;
4192 }
4193 else
4194 {
4195 TI_DBG3(("satSetDevInfo: NO 48 bit addressing\n"));
4196 satDevData->sat48BitSupport = agFALSE;
4197 }
4198
4199 /* Support SMART Self Test, word84 bit 1 */
4200 if (SATAIdData->commandSetFeatureSupportedExt & 0x02)
4201 {
4202 TI_DBG3(("satSetDevInfo: SMART self-test supported \n"));
4203 satDevData->satSMARTSelfTest = agTRUE;
4204 }
4205 else
4206 {
4207 TI_DBG3(("satSetDevInfo: no SMART self-test suppored\n"));
4208 satDevData->satSMARTSelfTest = agFALSE;
4209 }
4210
4211
4212
4213 /* Support SMART feature set, word82 bit 0 */
4214 if (SATAIdData->commandSetSupported & 0x01)
4215 {
4216 TI_DBG3(("satSetDevInfo: SMART feature set supported \n"));
4217 satDevData->satSMARTFeatureSet = agTRUE;
4218 }
4219 else
4220 {
4221 TI_DBG3(("satSetDevInfo: no SMART feature set suppored\n"));
4222 satDevData->satSMARTFeatureSet = agFALSE;
4223 }
4224
4225
4226
4227 /* Support SMART enabled, word85 bit 0 */
4228 if (SATAIdData->commandSetFeatureEnabled & 0x01)
4229 {
4230 TI_DBG3(("satSetDevInfo: SMART enabled \n"));
4231 satDevData->satSMARTEnabled = agTRUE;
4232 }
4233 else
4234 {
4235 TI_DBG3(("satSetDevInfo: no SMART enabled\n"));
4236 satDevData->satSMARTEnabled = agFALSE;
4237 }
4238
4239 satDevData->satVerifyState = 0;
4240
4241 /* Removable Media feature set support, word82 bit 2 */
4242 if (SATAIdData->commandSetSupported & 0x4)
4243 {
4244 TI_DBG3(("satSetDevInfo: Removable Media supported \n"));
4245 satDevData->satRemovableMedia = agTRUE;
4246 }
4247 else
4248 {
4249 TI_DBG3(("satSetDevInfo: no Removable Media suppored\n"));
4250 satDevData->satRemovableMedia = agFALSE;
4251 }
4252
4253 /* Removable Media feature set enabled, word 85, bit 2 */
4254 if (SATAIdData->commandSetFeatureEnabled & 0x4)
4255 {
4256 TI_DBG3(("satSetDevInfo: Removable Media enabled\n"));
4257 satDevData->satRemovableMediaEnabled = agTRUE;
4258 }
4259 else
4260 {
4261 TI_DBG3(("satSetDevInfo: no Removable Media enabled\n"));
4262 satDevData->satRemovableMediaEnabled = agFALSE;
4263 }
4264
4265 /* DMA Support, word49 bit8 */
4266 if (SATAIdData->dma_lba_iod_ios_stimer & 0x100)
4267 {
4268 TI_DBG3(("satSetDevInfo: DMA supported \n"));
4269 satDevData->satDMASupport = agTRUE;
4270 }
4271 else
4272 {
4273 TI_DBG3(("satSetDevInfo: no DMA suppored\n"));
4274 satDevData->satDMASupport = agFALSE;
4275 }
4276
4277 /* DMA Enabled, word88 bit0-6, bit8-14*/
4278 /* 0x7F7F = 0111 1111 0111 1111*/
4279 if (SATAIdData->ultraDMAModes & 0x7F7F)
4280 {
4281 TI_DBG3(("satSetDevInfo: DMA enabled \n"));
4282 satDevData->satDMAEnabled = agTRUE;
4283 }
4284 else
4285 {
4286 TI_DBG3(("satSetDevInfo: no DMA enabled\n"));
4287 satDevData->satDMAEnabled = agFALSE;
4288 }
4289
4290 /*
4291 setting MaxUserAddrSectors: max user addressable setctors
4292 word60 - 61, should be 0x 0F FF FF FF
4293 */
4294 satDevData->satMaxUserAddrSectors
4295 = (SATAIdData->numOfUserAddressableSectorsHi << (8*2) )
4296 + SATAIdData->numOfUserAddressableSectorsLo;
4297 TI_DBG3(("satSetDevInfo: MaxUserAddrSectors 0x%x decimal %d\n", satDevData->satMaxUserAddrSectors, satDevData->satMaxUserAddrSectors));
4298 /* Support DMADIR, if Word 62 bit 8 is set */
4299 if (SATAIdData->word62_74[0] & 0x8000)
4300 {
4301 TI_DBG3(("satSetDevInfo: DMADIR enabled\n"));
4302 satDevData->satDMADIRSupport = agTRUE;
4303 }
4304 else
4305 {
4306 TI_DBG3(("satSetDevInfo: DMADIR disabled\n"));
4307 satDevData->satDMADIRSupport = agFALSE;
4308 }
4309
4310
4311 /* write cache enabled for caching mode page SAT Table 67 p69, word85 bit5 */
4312 if (SATAIdData->commandSetFeatureEnabled & 0x20)
4313 {
4314 TI_DBG3(("satSetDevInfo: write cache enabled\n"));
4315 satDevData->satWriteCacheEnabled = agTRUE;
4316 }
4317 else
4318 {
4319 TI_DBG3(("satSetDevInfo: no write cache enabled\n"));
4320 satDevData->satWriteCacheEnabled = agFALSE;
4321 }
4322
4323 /* look ahead enabled for caching mode page SAT Table 67 p69, word85 bit6 */
4324 if (SATAIdData->commandSetFeatureEnabled & 0x40)
4325 {
4326 TI_DBG3(("satSetDevInfo: look ahead enabled\n"));
4327 satDevData->satLookAheadEnabled = agTRUE;
4328 }
4329 else
4330 {
4331 TI_DBG3(("satSetDevInfo: no look ahead enabled\n"));
4332 satDevData->satLookAheadEnabled = agFALSE;
4333 }
4334
4335 /* Support WWN, if Word 87 bit 8 is set */
4336 if (SATAIdData->commandSetFeatureDefault & 0x100)
4337 {
4338 TI_DBG3(("satSetDevInfo: device supports WWN\n"));
4339 satDevData->satWWNSupport = agTRUE;
4340 }
4341 else
4342 {
4343 TI_DBG3(("satSetDevInfo: no WWN\n"));
4344 satDevData->satWWNSupport = agFALSE;
4345 }
4346
4347
4348 return;
4349 }
4350
4351 /*****************************************************************************
4352 *! \brief satInquiryCB
4353 *
4354 * This routine is a callback function for satInquiry()
4355 *
4356 * \param agRoot: Handles for this instance of SAS/SATA hardware
4357 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
4358 * \param agIOStatus: Status of completed I/O.
4359 * \param agFirstDword:Pointer to the four bytes of FIS.
4360 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4361 * length.
4362 * \param agParam: Additional info based on status.
4363 * \param ioContext: Pointer to satIOContext_t.
4364 *
4365 * \return: none
4366 *
4367 *****************************************************************************/
4368 void satInquiryCB(
4369 agsaRoot_t *agRoot,
4370 agsaIORequest_t *agIORequest,
4371 bit32 agIOStatus,
4372 agsaFisHeader_t *agFirstDword,
4373 bit32 agIOInfoLen,
4374 void *agParam,
4375 void *ioContext
4376 )
4377 {
4378 /*
4379 In the process of Inquiry
4380 Process SAT_IDENTIFY_DEVICE
4381 */
4382 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4383 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4384 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
4385 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4386 tdIORequestBody_t *tdIORequestBody;
4387 tdIORequestBody_t *tdOrgIORequestBody;
4388 satIOContext_t *satIOContext;
4389 satIOContext_t *satOrgIOContext;
4390 satInternalIo_t *satIntIo;
4391 satDeviceData_t *satDevData;
4392 #ifdef TD_DEBUG_ENABLE
4393 tdsaDeviceData_t *tdsaDeviceData;
4394 bit32 ataStatus = 0;
4395 bit32 ataError;
4396 agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL;
4397 #endif
4398 scsiRspSense_t *pSense;
4399 tiIniScsiCmnd_t *scsiCmnd;
4400 tiIORequest_t *tiOrgIORequest;
4401 tiScsiInitiatorRequest_t *tiScsiRequest; /* TD's tiScsiXchg */
4402 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* OS's tiScsiXchg */
4403 agsaSATAIdentifyData_t *pSATAIdData;
4404 bit8 *pInquiry;
4405 bit8 page = 0xFF;
4406 bit16 *tmpptr,tmpptr_tmp;
4407 bit32 x;
4408 bit32 lenReceived;
4409 bit32 lenNeeded = 0;
4410
4411 TI_DBG6(("satInquiryCB: start\n"));
4412 TI_DBG6(("satInquiryCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4413 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4414 satIOContext = (satIOContext_t *) ioContext;
4415 satIntIo = satIOContext->satIntIoContext;
4416 satDevData = satIOContext->pSatDevData;
4417 #ifdef TD_DEBUG_ENABLE
4418 tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
4419 #endif
4420 tiScsiRequest = satIOContext->tiScsiXchg;
4421 if (satIntIo == agNULL)
4422 {
4423 TI_DBG6(("satInquiryCB: External, OS generated\n"));
4424 pSense = satIOContext->pSense;
4425 scsiCmnd = satIOContext->pScsiCmnd;
4426 satOrgIOContext = satIOContext;
4427 tiOrgIORequest = tdIORequestBody->tiIORequest;
4428 }
4429 else
4430 {
4431 TI_DBG6(("satInquiryCB: Internal, TD generated\n"));
4432 satOrgIOContext = satIOContext->satOrgIOContext;
4433 if (satOrgIOContext == agNULL)
4434 {
4435 TI_DBG1(("satInquiryCB: satOrgIOContext is NULL, wrong\n"));
4436 return;
4437 }
4438 else
4439 {
4440 TI_DBG6(("satInquiryCB: satOrgIOContext is NOT NULL\n"));
4441 }
4442 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4443 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4444 pSense = satOrgIOContext->pSense;
4445 scsiCmnd = satOrgIOContext->pScsiCmnd;
4446 }
4447
4448 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
4449 pInquiry = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
4450
4451 tdIORequestBody->ioCompleted = agTRUE;
4452 tdIORequestBody->ioStarted = agFALSE;
4453
4454 TI_DBG3(("satInquiryCB: did %d\n", tdsaDeviceData->id));
4455
4456 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4457 {
4458 TI_DBG1(("satInquiryCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4459 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY)
4460 {
4461 TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4462 /* should NOT be retried */
4463 ostiInitiatorIOCompleted (
4464 tiRoot,
4465 tiOrgIORequest,
4466 tiIOFailed,
4467 tiDetailNoLogin,
4468 agNULL,
4469 satOrgIOContext->interruptContext
4470 );
4471 }
4472 else
4473 {
4474 TI_DBG1(("satInquiryCB: NOT OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n"));
4475 ostiInitiatorIOCompleted (
4476 tiRoot,
4477 tiOrgIORequest,
4478 tiIOFailed,
4479 tiDetailNoLogin,
4480 agNULL,
4481 satOrgIOContext->interruptContext
4482 );
4483 }
4484 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4485
4486 satFreeIntIoResource( tiRoot,
4487 satDevData,
4488 satIntIo);
4489 return;
4490 }
4491 if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED ||
4492 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION ||
4493 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK ||
4494 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
4495 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION ||
4496 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED ||
4497 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION ||
4498 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR ||
4499 agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY
4500 )
4501 {
4502 TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR\n"));
4503
4504 ostiInitiatorIOCompleted (
4505 tiRoot,
4506 tiOrgIORequest,
4507 tiIOFailed,
4508 tiDetailNoLogin,
4509 agNULL,
4510 satOrgIOContext->interruptContext
4511 );
4512
4513 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4514
4515 satFreeIntIoResource( tiRoot,
4516 satDevData,
4517 satIntIo);
4518 return;
4519 }
4520
4521 if ( agIOStatus != OSSA_IO_SUCCESS ||
4522 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
4523 )
4524 {
4525 #ifdef TD_DEBUG_ENABLE
4526 // only agsaFisPioSetup_t is expected
4527 satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup);
4528 ataStatus = satPIOSetupHeader->status; // ATA Status register
4529 ataError = satPIOSetupHeader->error; // ATA Eror register
4530 #endif
4531 TI_DBG1(("satInquiryCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError));
4532 /* Process abort case */
4533 if (agIOStatus == OSSA_IO_ABORTED)
4534 {
4535 satProcessAbort(tiRoot,
4536 tiOrgIORequest,
4537 satOrgIOContext
4538 );
4539
4540 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4541
4542 satFreeIntIoResource( tiRoot,
4543 satDevData,
4544 satIntIo);
4545 return;
4546 }
4547
4548 ostiInitiatorIOCompleted (
4549 tiRoot,
4550 tiOrgIORequest,
4551 tiIOFailed,
4552 tiDetailOtherError,
4553 agNULL,
4554 satOrgIOContext->interruptContext
4555 );
4556
4557 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4558
4559 satFreeIntIoResource( tiRoot,
4560 satDevData,
4561 satIntIo);
4562 return;
4563 }
4564
4565 /* success */
4566
4567
4568 /* Convert to host endian */
4569 tmpptr = (bit16*)(tiScsiRequest->sglVirtualAddr);
4570 for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++)
4571 {
4572 OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0);
4573 *tmpptr = tmpptr_tmp;
4574 tmpptr++;
4575 /*Print tmpptr_tmp here for debugging purpose*/
4576 }
4577
4578 pSATAIdData = (agsaSATAIdentifyData_t *)(tiScsiRequest->sglVirtualAddr);
4579
4580 TI_DBG5(("satInquiryCB: OS satOrgIOContext %p \n", satOrgIOContext));
4581 TI_DBG5(("satInquiryCB: TD satIOContext %p \n", satIOContext));
4582 TI_DBG5(("satInquiryCB: OS tiScsiXchg %p \n", satOrgIOContext->tiScsiXchg));
4583 TI_DBG5(("satInquiryCB: TD tiScsiXchg %p \n", satIOContext->tiScsiXchg));
4584
4585 /* copy ID Dev data to satDevData */
4586 satDevData->satIdentifyData = *pSATAIdData;
4587 satDevData->IDDeviceValid = agTRUE;
4588 #ifdef TD_INTERNAL_DEBUG
4589 tdhexdump("satInquiryCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
4590 tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4591 #endif
4592 // tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t));
4593
4594 /* set satDevData fields from IndentifyData */
4595 satSetDevInfo(satDevData,pSATAIdData);
4596
4597 lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4598
4599 /* SPC-4, spec 6.4 p 141 */
4600 /* EVPD bit == 0 */
4601 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4602 {
4603 /* Returns the standard INQUIRY data */
4604 lenNeeded = STANDARD_INQUIRY_SIZE;
4605
4606
4607 satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4608 //tdhexdump("satInquiryCB ***standard***", (bit8 *)pInquiry, 36);
4609
4610 }
4611 else
4612 {
4613 /* EVPD bit != 0 && PAGE CODE != 0 */
4614 /* returns the pages of vital product data information */
4615
4616 /* we must support page 00h, 83h and 89h */
4617 page = scsiCmnd->cdb[2];
4618 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4619 (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4620 (page != INQUIRY_ATA_INFORMATION_VPD_PAGE))
4621 {
4622 satSetSensePayload( pSense,
4623 SCSI_SNSKEY_ILLEGAL_REQUEST,
4624 0,
4625 SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4626 satOrgIOContext);
4627
4628 ostiInitiatorIOCompleted( tiRoot,
4629 tiOrgIORequest,
4630 tiIOSuccess,
4631 SCSI_STAT_CHECK_CONDITION,
4632 satOrgIOContext->pTiSenseData,
4633 satOrgIOContext->interruptContext );
4634
4635 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4636
4637 satFreeIntIoResource( tiRoot,
4638 satDevData,
4639 satIntIo);
4640 TI_DBG1(("satInquiryCB: invalid PAGE CODE 0x%x\n", page));
4641 return;
4642 }
4643
4644 /* checking length */
4645 switch (page)
4646 {
4647 case INQUIRY_SUPPORTED_VPD_PAGE:
4648 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4649 break;
4650 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4651 if (satDevData->satWWNSupport)
4652 {
4653 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4654 }
4655 else
4656 {
4657 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4658 }
4659 break;
4660 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4661 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4662 break;
4663 default:
4664 TI_DBG1(("satInquiryCB: wrong!!! invalid PAGE CODE 0x%x\n", page));
4665 break;
4666 }
4667
4668
4669 /*
4670 * Fill in the Inquiry data depending on what Inquiry data we are returning.
4671 */
4672 switch (page)
4673 {
4674 case INQUIRY_SUPPORTED_VPD_PAGE:
4675 satInquiryPage0(pInquiry, pSATAIdData);
4676 break;
4677 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4678 satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4679 break;
4680 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4681 satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4682 break;
4683 default:
4684 TI_DBG1(("satInquiryCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4685 break;
4686 }
4687 } /* else */
4688
4689 TI_DBG6(("satInquiryCB: calling ostiInitiatorIOCompleted\n"));
4690
4691 if (lenReceived > lenNeeded)
4692 {
4693 TI_DBG6(("satInquiryCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4694 lenNeeded, lenReceived, tiOrgIORequest));
4695
4696 ostiInitiatorIOCompleted( tiRoot,
4697 tiOrgIORequest,
4698 tiIOUnderRun,
4699 lenReceived - lenNeeded,
4700 agNULL,
4701 satOrgIOContext->interruptContext );
4702 }
4703 else
4704 {
4705 ostiInitiatorIOCompleted( tiRoot,
4706 tiOrgIORequest,
4707 tiIOSuccess,
4708 SCSI_STAT_GOOD,
4709 agNULL,
4710 satOrgIOContext->interruptContext);
4711 }
4712
4713 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4714
4715 satFreeIntIoResource( tiRoot,
4716 satDevData,
4717 satIntIo);
4718 TI_DBG5(("satInquiryCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4719 TI_DBG6(("satInquiryCB: end\n"));
4720 return;
4721 }
4722
4723
4724 /*****************************************************************************/
4725 /*! \brief satInquiryIntCB.
4726 *
4727 * This function is part of INQUIRY SAT implementation. This is called when
4728 * ATA identify device data is available.
4729 *
4730 * \param tiRoot: Pointer to TISA initiator driver/port instance.
4731 * \param tiIORequest: Pointer to TISA I/O request context for this I/O.
4732 * \param tiDeviceHandle: Pointer to TISA device handle for this I/O.
4733 * \param tiScsiRequest: Pointer to TISA SCSI I/O request and SGL list.
4734 * \param satIOContext_t: Pointer to the SAT IO Context
4735 *
4736 * \return If command is started successfully
4737 * - \e tiSuccess: I/O request successfully initiated.
4738 * - \e tiBusy: No resources available, try again later.
4739 * - \e tiIONoDevice: Invalid device handle.
4740 * - \e tiError: Other errors.
4741 */
4742 /*****************************************************************************/
4743 void satInquiryIntCB(
4744 tiRoot_t *tiRoot,
4745 tiIORequest_t *tiIORequest,
4746 tiDeviceHandle_t *tiDeviceHandle,
4747 tiScsiInitiatorRequest_t *tiScsiRequest,
4748 satIOContext_t *satIOContext
4749 )
4750 {
4751 scsiRspSense_t *pSense;
4752 tiIniScsiCmnd_t *scsiCmnd;
4753 satDeviceData_t *satDevData;
4754 agsaSATAIdentifyData_t *pSATAIdData;
4755
4756 bit8 *pInquiry;
4757 bit8 page = 0xFF;
4758 bit32 lenReceived;
4759 bit32 lenNeeded = 0;
4760
4761 TI_DBG6(("satInquiryIntCB: start\n"));
4762
4763 pSense = satIOContext->pSense;
4764 scsiCmnd = &tiScsiRequest->scsiCmnd;
4765 pInquiry = (bit8 *) tiScsiRequest->sglVirtualAddr;
4766 satDevData = satIOContext->pSatDevData;
4767 pSATAIdData = &satDevData->satIdentifyData;
4768
4769
4770 lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4];
4771
4772 /* SPC-4, spec 6.4 p 141 */
4773 /* EVPD bit == 0 */
4774 if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK))
4775 {
4776 /* Returns the standard INQUIRY data */
4777 lenNeeded = STANDARD_INQUIRY_SIZE;
4778
4779 satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd);
4780 //tdhexdump("satInquiryIntCB ***standard***", (bit8 *)pInquiry, 36);
4781
4782 }
4783 else
4784 {
4785 /* EVPD bit != 0 && PAGE CODE != 0 */
4786 /* returns the pages of vital product data information */
4787
4788 /* we must support page 00h, 83h and 89h */
4789 page = scsiCmnd->cdb[2];
4790 if ((page != INQUIRY_SUPPORTED_VPD_PAGE) &&
4791 (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) &&
4792 (page != INQUIRY_ATA_INFORMATION_VPD_PAGE) &&
4793 (page != INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE))
4794 {
4795 satSetSensePayload( pSense,
4796 SCSI_SNSKEY_ILLEGAL_REQUEST,
4797 0,
4798 SCSI_SNSCODE_INVALID_FIELD_IN_CDB,
4799 satIOContext);
4800
4801 ostiInitiatorIOCompleted( tiRoot,
4802 tiIORequest,
4803 tiIOSuccess,
4804 SCSI_STAT_CHECK_CONDITION,
4805 satIOContext->pTiSenseData,
4806 satIOContext->interruptContext );
4807
4808 TI_DBG1(("satInquiryIntCB: invalid PAGE CODE 0x%x\n", page));
4809 return;
4810 }
4811
4812 /* checking length */
4813 switch (page)
4814 {
4815 case INQUIRY_SUPPORTED_VPD_PAGE:
4816 lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */
4817 break;
4818 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4819 if (satDevData->satWWNSupport)
4820 {
4821 lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */
4822 }
4823 else
4824 {
4825 lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */
4826 }
4827 break;
4828 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4829 lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */
4830 break;
4831 case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4832 lenNeeded = SATA_PAGE80_INQUIRY_SIZE; /* 24 */
4833 break;
4834
4835 default:
4836 TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4837 break;
4838 }
4839
4840
4841 /*
4842 * Fill in the Inquiry data depending on what Inquiry data we are returning.
4843 */
4844 switch (page)
4845 {
4846 case INQUIRY_SUPPORTED_VPD_PAGE:
4847 satInquiryPage0(pInquiry, pSATAIdData);
4848 break;
4849 case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE:
4850 satInquiryPage83(pInquiry, pSATAIdData, satDevData);
4851 break;
4852 case INQUIRY_ATA_INFORMATION_VPD_PAGE:
4853 satInquiryPage89(pInquiry, pSATAIdData, satDevData);
4854 break;
4855 case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE:
4856 satInquiryPage80(pInquiry, pSATAIdData);
4857 break;
4858 default:
4859 TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page));
4860 break;
4861 }
4862 } /* else */
4863
4864 TI_DBG6(("satInquiryIntCB: calling ostiInitiatorIOCompleted\n"));
4865
4866 if (lenReceived > lenNeeded)
4867 {
4868 TI_DBG6(("satInquiryIntCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
4869 lenNeeded, lenReceived, tiIORequest));
4870
4871 ostiInitiatorIOCompleted( tiRoot,
4872 tiIORequest,
4873 tiIOUnderRun,
4874 lenReceived - lenNeeded,
4875 agNULL,
4876 satIOContext->interruptContext );
4877 }
4878 else
4879 {
4880 ostiInitiatorIOCompleted( tiRoot,
4881 tiIORequest,
4882 tiIOSuccess,
4883 SCSI_STAT_GOOD,
4884 agNULL,
4885 satIOContext->interruptContext);
4886 }
4887
4888 TI_DBG5(("satInquiryIntCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO));
4889 TI_DBG6(("satInquiryIntCB: end\n"));
4890 return;
4891 }
4892
4893
4894 /*****************************************************************************
4895 *! \brief satVerify10CB
4896 *
4897 * This routine is a callback function called from ossaSATACompleted().
4898 * This CB routine deals with Verify(10) completion.
4899 *
4900 * \param agRoot: Handles for this instance of SAS/SATA hardware
4901 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
4902 * \param agIOStatus: Status of completed I/O.
4903 * \param agFirstDword:Pointer to the four bytes of FIS.
4904 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
4905 * length.
4906 * \param agParam: Additional info based on status.
4907 * \param ioContext: Pointer to satIOContext_t.
4908 *
4909 * \return: none
4910 *
4911 *****************************************************************************/
4912 void satVerify10CB(
4913 agsaRoot_t *agRoot,
4914 agsaIORequest_t *agIORequest,
4915 bit32 agIOStatus,
4916 agsaFisHeader_t *agFirstDword,
4917 bit32 agIOInfoLen,
4918 void *agParam,
4919 void *ioContext
4920 )
4921 {
4922 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
4923 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
4924 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
4925 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4926 tdIORequestBody_t *tdIORequestBody;
4927 tdIORequestBody_t *tdOrgIORequestBody;
4928 satIOContext_t *satIOContext;
4929 satIOContext_t *satOrgIOContext;
4930 satInternalIo_t *satIntIo;
4931 satDeviceData_t *satDevData;
4932 scsiRspSense_t *pSense;
4933 tiIORequest_t *tiOrgIORequest;
4934
4935 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
4936 bit32 ataStatus = 0;
4937 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
4938
4939 TI_DBG5(("satVerify10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
4940
4941 /* internally generate tiIOContext */
4942 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4943 satIOContext = (satIOContext_t *) ioContext;
4944 satIntIo = satIOContext->satIntIoContext;
4945 satDevData = satIOContext->pSatDevData;
4946 hostToDevFis = satIOContext->pFis;
4947
4948 if (satIntIo == agNULL)
4949 {
4950 TI_DBG4(("satVerify10CB: External satInternalIo_t satIntIoContext\n"));
4951 satOrgIOContext = satIOContext;
4952 tiOrgIORequest = tdIORequestBody->tiIORequest;
4953 pSense = satIOContext->pSense;
4954 }
4955 else
4956 {
4957 TI_DBG4(("satVerify10CB: Internal satInternalIo_t satIntIoContext\n"));
4958 satOrgIOContext = satIOContext->satOrgIOContext;
4959 if (satOrgIOContext == agNULL)
4960 {
4961 TI_DBG4(("satVerify10CB: satOrgIOContext is NULL, wrong\n"));
4962 return;
4963 }
4964 else
4965 {
4966 TI_DBG4(("satVerify10CB: satOrgIOContext is NOT NULL\n"));
4967 }
4968 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
4969 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
4970 pSense = satOrgIOContext->pSense;
4971 }
4972
4973 tdIORequestBody->ioCompleted = agTRUE;
4974 tdIORequestBody->ioStarted = agFALSE;
4975
4976 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
4977 {
4978 TI_DBG1(("satVerify10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
4979 satSetSensePayload( pSense,
4980 SCSI_SNSKEY_NO_SENSE,
4981 0,
4982 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
4983 satOrgIOContext);
4984
4985 ostiInitiatorIOCompleted( tiRoot,
4986 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
4987 tiIOSuccess,
4988 SCSI_STAT_CHECK_CONDITION,
4989 satOrgIOContext->pTiSenseData,
4990 satOrgIOContext->interruptContext );
4991
4992 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
4993
4994 satFreeIntIoResource( tiRoot,
4995 satDevData,
4996 satIntIo);
4997 return;
4998 }
4999
5000 if (agIOStatus != OSSA_IO_SUCCESS)
5001 {
5002 /* only agsaFisRegDeviceToHost_t is expected */
5003 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5004 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5005 }
5006
5007 if( agIOStatus != OSSA_IO_SUCCESS)
5008 {
5009 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5010 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5011 )
5012 {
5013 /* for debugging */
5014 if( agIOStatus != OSSA_IO_SUCCESS)
5015 {
5016 TI_DBG1(("satVerify10CB: FAILED, NOT IO_SUCCESS\n"));
5017 }
5018 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5019 {
5020 TI_DBG1(("satVerify10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5021 }
5022 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5023 (ataStatus & DF_ATA_STATUS_MASK)
5024 )
5025 {
5026 TI_DBG1(("satVerify10CB: FAILED, FAILED, error status\n"));
5027 }
5028
5029 /* Process abort case */
5030 if (agIOStatus == OSSA_IO_ABORTED)
5031 {
5032 satProcessAbort(tiRoot,
5033 tiOrgIORequest,
5034 satOrgIOContext
5035 );
5036
5037 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5038
5039 satFreeIntIoResource( tiRoot,
5040 satDevData,
5041 satIntIo);
5042 return;
5043 }
5044
5045 /* for debugging */
5046 switch (hostToDevFis->h.command)
5047 {
5048 case SAT_READ_VERIFY_SECTORS_EXT:
5049 TI_DBG1(("satVerify10CB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5050 break;
5051 default:
5052 TI_DBG1(("satVerify10CB: error default case command 0x%x\n", hostToDevFis->h.command));
5053 break;
5054 }
5055
5056 satSetSensePayload( pSense,
5057 SCSI_SNSKEY_NO_SENSE,
5058 0,
5059 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5060 satOrgIOContext);
5061
5062 ostiInitiatorIOCompleted( tiRoot,
5063 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5064 tiIOSuccess,
5065 SCSI_STAT_CHECK_CONDITION,
5066 satOrgIOContext->pTiSenseData,
5067 satOrgIOContext->interruptContext );
5068
5069 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5070
5071 satFreeIntIoResource( tiRoot,
5072 satDevData,
5073 satIntIo);
5074 return;
5075 } /* end error checking */
5076 }
5077
5078 /* process success from this point on */
5079 switch (hostToDevFis->h.command)
5080 {
5081 case SAT_READ_VERIFY_SECTORS_EXT:
5082 TI_DBG5(("satVerify10CB: SAT_WRITE_DMA_EXT success \n"));
5083
5084 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5085
5086 satFreeIntIoResource( tiRoot,
5087 satDevData,
5088 satIntIo);
5089
5090 ostiInitiatorIOCompleted( tiRoot,
5091 tiOrgIORequest,
5092 tiIOSuccess,
5093 SCSI_STAT_GOOD,
5094 agNULL,
5095 satOrgIOContext->interruptContext);
5096 break;
5097 default:
5098 TI_DBG1(("satVerify10CB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5099
5100 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5101
5102 satFreeIntIoResource( tiRoot,
5103 satDevData,
5104 satIntIo);
5105
5106 satSetSensePayload( pSense,
5107 SCSI_SNSKEY_NO_SENSE,
5108 0,
5109 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5110 satOrgIOContext);
5111
5112 ostiInitiatorIOCompleted( tiRoot,
5113 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5114 tiIOSuccess,
5115 SCSI_STAT_CHECK_CONDITION,
5116 satOrgIOContext->pTiSenseData,
5117 satOrgIOContext->interruptContext );
5118
5119 break;
5120 }
5121
5122 return;
5123 }
5124
5125 /* similar to satVerify10CB */
5126 void satNonChainedVerifyCB(
5127 agsaRoot_t *agRoot,
5128 agsaIORequest_t *agIORequest,
5129 bit32 agIOStatus,
5130 agsaFisHeader_t *agFirstDword,
5131 bit32 agIOInfoLen,
5132 agsaFrameHandle_t agFrameHandle,
5133 void *ioContext
5134 )
5135 {
5136 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5137 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5138 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5139 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5140 tdIORequestBody_t *tdIORequestBody;
5141 tdIORequestBody_t *tdOrgIORequestBody;
5142 satIOContext_t *satIOContext;
5143 satIOContext_t *satOrgIOContext;
5144 satInternalIo_t *satIntIo;
5145 satDeviceData_t *satDevData;
5146 scsiRspSense_t *pSense;
5147 tiIORequest_t *tiOrgIORequest;
5148
5149 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5150 bit32 ataStatus = 0;
5151 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5152
5153 TI_DBG5(("satNonChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5154
5155 /* internally generate tiIOContext */
5156 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5157 satIOContext = (satIOContext_t *) ioContext;
5158 satIntIo = satIOContext->satIntIoContext;
5159 satDevData = satIOContext->pSatDevData;
5160 hostToDevFis = satIOContext->pFis;
5161
5162 if (satIntIo == agNULL)
5163 {
5164 TI_DBG4(("satNonChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5165 satOrgIOContext = satIOContext;
5166 tiOrgIORequest = tdIORequestBody->tiIORequest;
5167 pSense = satIOContext->pSense;
5168 }
5169 else
5170 {
5171 TI_DBG4(("satNonChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5172 satOrgIOContext = satIOContext->satOrgIOContext;
5173 if (satOrgIOContext == agNULL)
5174 {
5175 TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5176 return;
5177 }
5178 else
5179 {
5180 TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5181 }
5182 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5183 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5184 pSense = satOrgIOContext->pSense;
5185 }
5186
5187 tdIORequestBody->ioCompleted = agTRUE;
5188 tdIORequestBody->ioStarted = agFALSE;
5189
5190 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5191 {
5192 TI_DBG1(("satNonChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5193 satSetSensePayload( pSense,
5194 SCSI_SNSKEY_NO_SENSE,
5195 0,
5196 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5197 satOrgIOContext);
5198
5199 ostiInitiatorIOCompleted( tiRoot,
5200 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5201 tiIOSuccess,
5202 SCSI_STAT_CHECK_CONDITION,
5203 satOrgIOContext->pTiSenseData,
5204 satOrgIOContext->interruptContext );
5205
5206 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5207
5208 satFreeIntIoResource( tiRoot,
5209 satDevData,
5210 satIntIo);
5211 return;
5212 }
5213
5214 if (agIOStatus != OSSA_IO_SUCCESS)
5215 {
5216 /* only agsaFisRegDeviceToHost_t is expected */
5217 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5218 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5219 }
5220
5221 if( agIOStatus != OSSA_IO_SUCCESS)
5222 {
5223 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5224 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5225 )
5226 {
5227 /* for debugging */
5228 if( agIOStatus != OSSA_IO_SUCCESS)
5229 {
5230 TI_DBG1(("satNonChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5231 }
5232 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5233 {
5234 TI_DBG1(("satNonChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5235 }
5236 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5237 (ataStatus & DF_ATA_STATUS_MASK)
5238 )
5239 {
5240 TI_DBG1(("satNonChainedVerifyCB: FAILED, FAILED, error status\n"));
5241 }
5242
5243 /* Process abort case */
5244 if (agIOStatus == OSSA_IO_ABORTED)
5245 {
5246 satProcessAbort(tiRoot,
5247 tiOrgIORequest,
5248 satOrgIOContext
5249 );
5250
5251 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5252
5253 satFreeIntIoResource( tiRoot,
5254 satDevData,
5255 satIntIo);
5256 return;
5257 }
5258
5259 /* for debugging */
5260 switch (hostToDevFis->h.command)
5261 {
5262 case SAT_READ_VERIFY_SECTORS:
5263 TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5264 break;
5265 case SAT_READ_VERIFY_SECTORS_EXT:
5266 TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5267 break;
5268 default:
5269 TI_DBG1(("satNonChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5270 break;
5271 }
5272
5273 satSetSensePayload( pSense,
5274 SCSI_SNSKEY_NO_SENSE,
5275 0,
5276 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5277 satOrgIOContext);
5278
5279 ostiInitiatorIOCompleted( tiRoot,
5280 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5281 tiIOSuccess,
5282 SCSI_STAT_CHECK_CONDITION,
5283 satOrgIOContext->pTiSenseData,
5284 satOrgIOContext->interruptContext );
5285
5286 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5287
5288 satFreeIntIoResource( tiRoot,
5289 satDevData,
5290 satIntIo);
5291 return;
5292 } /* end error checking */
5293 }
5294
5295 /* process success from this point on */
5296 switch (hostToDevFis->h.command)
5297 {
5298 case SAT_READ_VERIFY_SECTORS: /* fall through */
5299 case SAT_READ_VERIFY_SECTORS_EXT:
5300 TI_DBG5(("satNonChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5301
5302 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5303
5304 satFreeIntIoResource( tiRoot,
5305 satDevData,
5306 satIntIo);
5307
5308 ostiInitiatorIOCompleted( tiRoot,
5309 tiOrgIORequest,
5310 tiIOSuccess,
5311 SCSI_STAT_GOOD,
5312 agNULL,
5313 satOrgIOContext->interruptContext);
5314 break;
5315 default:
5316 TI_DBG1(("satNonChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5317
5318 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5319
5320 satFreeIntIoResource( tiRoot,
5321 satDevData,
5322 satIntIo);
5323
5324 satSetSensePayload( pSense,
5325 SCSI_SNSKEY_NO_SENSE,
5326 0,
5327 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5328 satOrgIOContext);
5329
5330 ostiInitiatorIOCompleted( tiRoot,
5331 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5332 tiIOSuccess,
5333 SCSI_STAT_CHECK_CONDITION,
5334 satOrgIOContext->pTiSenseData,
5335 satOrgIOContext->interruptContext );
5336
5337 break;
5338 }
5339
5340 return;
5341 }
5342
5343 void satChainedVerifyCB(
5344 agsaRoot_t *agRoot,
5345 agsaIORequest_t *agIORequest,
5346 bit32 agIOStatus,
5347 agsaFisHeader_t *agFirstDword,
5348 bit32 agIOInfoLen,
5349 agsaFrameHandle_t agFrameHandle,
5350 void *ioContext
5351 )
5352 {
5353 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5354 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5355 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5356 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5357 tdIORequestBody_t *tdIORequestBody;
5358 tdIORequestBody_t *tdOrgIORequestBody;
5359 satIOContext_t *satIOContext;
5360 satIOContext_t *satOrgIOContext;
5361 satIOContext_t *satNewIOContext;
5362 satInternalIo_t *satIntIo;
5363 satInternalIo_t *satNewIntIo = agNULL;
5364 satDeviceData_t *satDevData;
5365 scsiRspSense_t *pSense;
5366 tiIniScsiCmnd_t *scsiCmnd;
5367 tiIORequest_t *tiOrgIORequest;
5368
5369 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5370 bit32 ataStatus = 0;
5371 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5372 bit32 status = tiError;
5373 bit32 dataLength;
5374
5375 TI_DBG5(("satChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5376
5377 /* internally generate tiIOContext */
5378 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5379 satIOContext = (satIOContext_t *) ioContext;
5380 satIntIo = satIOContext->satIntIoContext;
5381 satDevData = satIOContext->pSatDevData;
5382 hostToDevFis = satIOContext->pFis;
5383
5384 if (satIntIo == agNULL)
5385 {
5386 TI_DBG4(("satChainedVerifyCB: External satInternalIo_t satIntIoContext\n"));
5387 satOrgIOContext = satIOContext;
5388 tiOrgIORequest = tdIORequestBody->tiIORequest;
5389 pSense = satIOContext->pSense;
5390 scsiCmnd = satIOContext->pScsiCmnd;
5391 }
5392 else
5393 {
5394 TI_DBG4(("satChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n"));
5395 satOrgIOContext = satIOContext->satOrgIOContext;
5396 if (satOrgIOContext == agNULL)
5397 {
5398 TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NULL, wrong\n"));
5399 return;
5400 }
5401 else
5402 {
5403 TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NOT NULL\n"));
5404 }
5405 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
5406 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
5407 pSense = satOrgIOContext->pSense;
5408 scsiCmnd = satOrgIOContext->pScsiCmnd;
5409 }
5410
5411 tdIORequestBody->ioCompleted = agTRUE;
5412 tdIORequestBody->ioStarted = agFALSE;
5413
5414 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5415 {
5416 TI_DBG1(("satChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5417 satSetSensePayload( pSense,
5418 SCSI_SNSKEY_NO_SENSE,
5419 0,
5420 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5421 satOrgIOContext);
5422
5423 ostiInitiatorIOCompleted( tiRoot,
5424 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5425 tiIOSuccess,
5426 SCSI_STAT_CHECK_CONDITION,
5427 satOrgIOContext->pTiSenseData,
5428 satOrgIOContext->interruptContext );
5429
5430 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5431
5432 satFreeIntIoResource( tiRoot,
5433 satDevData,
5434 satIntIo);
5435 return;
5436 }
5437
5438 if (agIOStatus != OSSA_IO_SUCCESS)
5439 {
5440 /* only agsaFisRegDeviceToHost_t is expected */
5441 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5442 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5443 }
5444
5445 if( agIOStatus != OSSA_IO_SUCCESS)
5446 {
5447 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
5448 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
5449 )
5450 {
5451 /* for debugging */
5452 if( agIOStatus != OSSA_IO_SUCCESS)
5453 {
5454 TI_DBG1(("satChainedVerifyCB: FAILED, NOT IO_SUCCESS\n"));
5455 }
5456 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5457 {
5458 TI_DBG1(("satChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5459 }
5460 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5461 (ataStatus & DF_ATA_STATUS_MASK)
5462 )
5463 {
5464 TI_DBG1(("satChainedVerifyCB: FAILED, FAILED, error status\n"));
5465 }
5466
5467 /* Process abort case */
5468 if (agIOStatus == OSSA_IO_ABORTED)
5469 {
5470 satProcessAbort(tiRoot,
5471 tiOrgIORequest,
5472 satOrgIOContext
5473 );
5474
5475 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5476
5477 satFreeIntIoResource( tiRoot,
5478 satDevData,
5479 satIntIo);
5480 return;
5481 }
5482
5483 /* for debugging */
5484 switch (hostToDevFis->h.command)
5485 {
5486 case SAT_READ_VERIFY_SECTORS:
5487 TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n"));
5488 break;
5489 case SAT_READ_VERIFY_SECTORS_EXT:
5490 TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n"));
5491 break;
5492 default:
5493 TI_DBG1(("satChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command));
5494 break;
5495 }
5496
5497 satSetSensePayload( pSense,
5498 SCSI_SNSKEY_NO_SENSE,
5499 0,
5500 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5501 satOrgIOContext);
5502
5503 ostiInitiatorIOCompleted( tiRoot,
5504 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5505 tiIOSuccess,
5506 SCSI_STAT_CHECK_CONDITION,
5507 satOrgIOContext->pTiSenseData,
5508 satOrgIOContext->interruptContext );
5509
5510 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5511
5512 satFreeIntIoResource( tiRoot,
5513 satDevData,
5514 satIntIo);
5515 return;
5516 } /* end error checking */
5517 }
5518
5519 /* process success from this point on */
5520 switch (hostToDevFis->h.command)
5521 {
5522 case SAT_READ_VERIFY_SECTORS: /* fall through */
5523 case SAT_READ_VERIFY_SECTORS_EXT:
5524 TI_DBG5(("satChainedVerifyCB: SAT_WRITE_DMA_EXT success \n"));
5525
5526 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5527
5528 satFreeIntIoResource( tiRoot,
5529 satDevData,
5530 satIntIo);
5531
5532 /* let's loop till TL */
5533
5534 /* lba = lba + tl
5535 loopnum--;
5536 if (loopnum == 0) done
5537 */
5538 (satOrgIOContext->LoopNum)--;
5539 if (satOrgIOContext->LoopNum == 0)
5540 {
5541 /*
5542 done with write and verify
5543 */
5544 ostiInitiatorIOCompleted( tiRoot,
5545
5546 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5547 tiIOSuccess,
5548 SCSI_STAT_GOOD,
5549 agNULL,
5550 satOrgIOContext->interruptContext );
5551 return;
5552 }
5553
5554 if (satOrgIOContext->superIOFlag)
5555 {
5556 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5557 }
5558 else
5559 {
5560 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
5561 }
5562
5563 satNewIntIo = satAllocIntIoResource( tiRoot,
5564 tiOrgIORequest,
5565 satDevData,
5566 dataLength,
5567 satNewIntIo);
5568 if (satNewIntIo == agNULL)
5569 {
5570 /* memory allocation failure */
5571 satFreeIntIoResource( tiRoot,
5572 satDevData,
5573 satNewIntIo);
5574 ostiInitiatorIOCompleted( tiRoot,
5575 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5576 tiIOFailed,
5577 tiDetailOtherError,
5578 agNULL,
5579 satOrgIOContext->interruptContext );
5580
5581 TI_DBG1(("satChainedVerifyCB: momory allocation fails\n"));
5582 return;
5583 } /* end of memory allocation failure */
5584
5585 /*
5586 * Need to initialize all the fields within satIOContext
5587 */
5588
5589 satNewIOContext = satPrepareNewIO(
5590 satNewIntIo,
5591 tiOrgIORequest,
5592 satDevData,
5593 scsiCmnd,
5594 satOrgIOContext
5595 );
5596 status = satChainedVerify(tiRoot,
5597 &satNewIntIo->satIntTiIORequest,
5598 satNewIOContext->ptiDeviceHandle,
5599 &satNewIntIo->satIntTiScsiXchg,
5600 satNewIOContext);
5601
5602 if (status != tiSuccess)
5603 {
5604 satFreeIntIoResource( tiRoot,
5605 satDevData,
5606 satNewIntIo);
5607 ostiInitiatorIOCompleted( tiRoot,
5608 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5609 tiIOFailed,
5610 tiDetailOtherError,
5611 agNULL,
5612 satOrgIOContext->interruptContext );
5613 TI_DBG1(("satChainedVerifyCB: calling satChainedVerify fails\n"));
5614 return;
5615 }
5616
5617 break;
5618 default:
5619 TI_DBG1(("satChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
5620
5621 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5622
5623 satFreeIntIoResource( tiRoot,
5624 satDevData,
5625 satIntIo);
5626
5627 satSetSensePayload( pSense,
5628 SCSI_SNSKEY_NO_SENSE,
5629 0,
5630 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
5631 satOrgIOContext);
5632
5633 ostiInitiatorIOCompleted( tiRoot,
5634 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5635 tiIOSuccess,
5636 SCSI_STAT_CHECK_CONDITION,
5637 satOrgIOContext->pTiSenseData,
5638 satOrgIOContext->interruptContext );
5639
5640 break;
5641 }
5642 return;
5643 }
5644
5645 /*****************************************************************************
5646 *! \brief satTestUnitReadyCB
5647 *
5648 * This routine is a callback function for satTestUnitReady()
5649 *
5650 * \param agRoot: Handles for this instance of SAS/SATA hardware
5651 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
5652 * \param agIOStatus: Status of completed I/O.
5653 * \param agFirstDword:Pointer to the four bytes of FIS.
5654 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
5655 * length.
5656 * \param agParam: Additional info based on status.
5657 * \param ioContext: Pointer to satIOContext_t.
5658 *
5659 * \return: none
5660 *
5661 *****************************************************************************/
5662 void satTestUnitReadyCB(
5663 agsaRoot_t *agRoot,
5664 agsaIORequest_t *agIORequest,
5665 bit32 agIOStatus,
5666 agsaFisHeader_t *agFirstDword,
5667 bit32 agIOInfoLen,
5668 void *agParam,
5669 void *ioContext
5670 )
5671 {
5672 /*
5673 In the process of TestUnitReady
5674 Process SAT_GET_MEDIA_STATUS
5675 Process SAT_CHECK_POWER_MODE
5676 */
5677 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
5678 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
5679 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
5680 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5681 tdIORequestBody_t *tdIORequestBody;
5682 tdIORequestBody_t *tdOrgIORequestBody;
5683 satIOContext_t *satIOContext;
5684 satIOContext_t *satOrgIOContext;
5685 satIOContext_t *satNewIOContext;
5686 satInternalIo_t *satIntIo;
5687 satInternalIo_t *satNewIntIo = agNULL;
5688 satDeviceData_t *satDevData;
5689 scsiRspSense_t *pSense;
5690 tiIniScsiCmnd_t *scsiCmnd;
5691 tiIORequest_t *tiOrgIORequest;
5692
5693 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
5694 bit32 ataStatus = 0;
5695 bit32 ataError;
5696
5697 bit32 status;
5698 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
5699
5700 TI_DBG6(("satTestUnitReadyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
5701
5702 /* internally generate tiIOContext */
5703 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5704 satIOContext = (satIOContext_t *) ioContext;
5705 satIntIo = satIOContext->satIntIoContext;
5706 satDevData = satIOContext->pSatDevData;
5707 hostToDevFis = satIOContext->pFis;
5708
5709 if (satIntIo == agNULL)
5710 {
5711 TI_DBG5(("satTestUnitReadyCB: no internal satInternalIo_t satIntIoContext\n"));
5712 pSense = satIOContext->pSense;
5713 scsiCmnd = satIOContext->pScsiCmnd;
5714 satOrgIOContext = satIOContext;
5715 tiOrgIORequest = tdIORequestBody->tiIORequest;
5716 }
5717 else
5718 {
5719 TI_DBG5(("satTestUnitReadyCB: yes internal satInternalIo_t satIntIoContext\n"));
5720
5721 /* orginal tiIOContext */
5722 tiOrgIORequest = (tiIORequest_t *)satIOContext->satIntIoContext->satOrgTiIORequest;
5723 tdOrgIORequestBody = (tdIORequestBody_t *)tiOrgIORequest->tdData;
5724 satOrgIOContext = &(tdOrgIORequestBody->transport.SATA.satIOContext);
5725
5726 pSense = satOrgIOContext->pSense;
5727 scsiCmnd = satOrgIOContext->pScsiCmnd;
5728 }
5729
5730 tdIORequestBody->ioCompleted = agTRUE;
5731 tdIORequestBody->ioStarted = agFALSE;
5732
5733 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
5734 {
5735 TI_DBG1(("satTestUnitReadyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
5736 satSetSensePayload( pSense,
5737 SCSI_SNSKEY_NOT_READY,
5738 0,
5739 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5740 satOrgIOContext);
5741
5742 ostiInitiatorIOCompleted( tiRoot,
5743 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5744 tiIOSuccess,
5745 SCSI_STAT_CHECK_CONDITION,
5746 satOrgIOContext->pTiSenseData,
5747 satOrgIOContext->interruptContext );
5748
5749 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5750
5751 satFreeIntIoResource( tiRoot,
5752 satDevData,
5753 satIntIo);
5754
5755 return;
5756 }
5757 /*
5758 HW checks an error for us and the results is agIOStatus
5759 */
5760 if (agIOStatus != OSSA_IO_SUCCESS)
5761 {
5762 /* only agsaFisRegDeviceToHost_t is expected */
5763 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
5764 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
5765 ataError = statDevToHostFisHeader->error; /* ATA Eror register */
5766
5767 if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
5768 {
5769 TI_DBG1(("satTestUnitReadyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
5770 }
5771 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
5772 (ataStatus & DF_ATA_STATUS_MASK)
5773 )
5774 {
5775 TI_DBG1(("satTestUnitReadyCB: FAILED, FAILED, error status\n"));
5776 }
5777
5778 /* Process abort case */
5779 if (agIOStatus == OSSA_IO_ABORTED)
5780 {
5781 satProcessAbort(tiRoot,
5782 tiOrgIORequest,
5783 satOrgIOContext
5784 );
5785
5786 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5787
5788 satFreeIntIoResource( tiRoot,
5789 satDevData,
5790 satIntIo);
5791 return;
5792 }
5793
5794 switch (hostToDevFis->h.command)
5795 {
5796 case SAT_GET_MEDIA_STATUS:
5797 TI_DBG1(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS failed \n"));
5798
5799 /* checking NM bit */
5800 if (ataError & SCSI_NM_MASK)
5801 {
5802 satSetSensePayload( pSense,
5803 SCSI_SNSKEY_NOT_READY,
5804 0,
5805 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
5806 satOrgIOContext);
5807 }
5808 else
5809 {
5810 satSetSensePayload( pSense,
5811 SCSI_SNSKEY_NOT_READY,
5812 0,
5813 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5814 satOrgIOContext);
5815 }
5816
5817 ostiInitiatorIOCompleted( tiRoot,
5818 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5819 tiIOSuccess,
5820 SCSI_STAT_CHECK_CONDITION,
5821 satOrgIOContext->pTiSenseData,
5822 satOrgIOContext->interruptContext );
5823
5824 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5825
5826 satFreeIntIoResource( tiRoot,
5827 satDevData,
5828 satIntIo);
5829 break;
5830 case SAT_CHECK_POWER_MODE:
5831 TI_DBG1(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE failed \n"));
5832 satSetSensePayload( pSense,
5833 SCSI_SNSKEY_NOT_READY,
5834 0,
5835 SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION,
5836 satOrgIOContext);
5837
5838 ostiInitiatorIOCompleted( tiRoot,
5839 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5840 tiIOSuccess,
5841 SCSI_STAT_CHECK_CONDITION,
5842 satOrgIOContext->pTiSenseData,
5843 satOrgIOContext->interruptContext );
5844
5845 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5846
5847 satFreeIntIoResource( tiRoot,
5848 satDevData,
5849 satIntIo);
5850 break;
5851 default:
5852 TI_DBG1(("satTestUnitReadyCB: default failed command %d\n", hostToDevFis->h.command));
5853
5854 satSetSensePayload( pSense,
5855 SCSI_SNSKEY_NOT_READY,
5856 0,
5857 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5858 satOrgIOContext);
5859
5860 ostiInitiatorIOCompleted( tiRoot,
5861 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5862 tiIOSuccess,
5863 SCSI_STAT_CHECK_CONDITION,
5864 satOrgIOContext->pTiSenseData,
5865 satOrgIOContext->interruptContext );
5866
5867 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5868
5869 satFreeIntIoResource( tiRoot,
5870 satDevData,
5871 satIntIo);
5872 break;
5873
5874 }
5875 return;
5876 }/* end error */
5877
5878 /* ATA command completes sucessfully */
5879 switch (hostToDevFis->h.command)
5880 {
5881 case SAT_GET_MEDIA_STATUS:
5882
5883 TI_DBG5(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS success\n"));
5884
5885 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5886
5887 satFreeIntIoResource( tiRoot,
5888 satDevData,
5889 satIntIo);
5890
5891 satNewIntIo = satAllocIntIoResource( tiRoot,
5892 tiOrgIORequest,
5893 satDevData,
5894 0,
5895 satNewIntIo);
5896 if (satNewIntIo == agNULL)
5897 {
5898 /* memory allocation failure */
5899 satFreeIntIoResource( tiRoot,
5900 satDevData,
5901 satNewIntIo);
5902 satSetSensePayload( pSense,
5903 SCSI_SNSKEY_NOT_READY,
5904 0,
5905 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5906 satOrgIOContext);
5907
5908 ostiInitiatorIOCompleted( tiRoot,
5909 tiOrgIORequest,
5910 tiIOSuccess,
5911 SCSI_STAT_CHECK_CONDITION,
5912 satOrgIOContext->pTiSenseData,
5913 satOrgIOContext->interruptContext );
5914
5915 TI_DBG1(("satTestUnitReadyCB: momory allocation fails\n"));
5916 return;
5917 }
5918
5919 /*
5920 * Need to initialize all the fields within satIOContext
5921 */
5922
5923 satNewIOContext = satPrepareNewIO(
5924 satNewIntIo,
5925 tiOrgIORequest,
5926 satDevData,
5927 scsiCmnd,
5928 satOrgIOContext
5929 );
5930
5931 /* sends SAT_CHECK_POWER_MODE */
5932 status = satTestUnitReady_1( tiRoot,
5933 &satNewIntIo->satIntTiIORequest,
5934 satNewIOContext->ptiDeviceHandle,
5935 &satNewIntIo->satIntTiScsiXchg,
5936 satNewIOContext);
5937
5938 if (status != tiSuccess)
5939 {
5940 /* sending SAT_CHECK_POWER_MODE fails */
5941 satFreeIntIoResource( tiRoot,
5942 satDevData,
5943 satNewIntIo);
5944 satSetSensePayload( pSense,
5945 SCSI_SNSKEY_NOT_READY,
5946 0,
5947 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5948 satOrgIOContext);
5949
5950 ostiInitiatorIOCompleted( tiRoot,
5951 tiOrgIORequest,
5952 tiIOSuccess,
5953 SCSI_STAT_CHECK_CONDITION,
5954 satOrgIOContext->pTiSenseData,
5955 satOrgIOContext->interruptContext );
5956
5957 TI_DBG1(("satTestUnitReadyCB: calling satTestUnitReady_1 fails\n"));
5958 return;
5959 }
5960
5961 break;
5962 case SAT_CHECK_POWER_MODE:
5963 TI_DBG5(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE success\n"));
5964
5965
5966 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5967
5968 satFreeIntIoResource( tiRoot,
5969 satDevData,
5970 satIntIo);
5971
5972 /* returns good status */
5973 ostiInitiatorIOCompleted( tiRoot,
5974 tiOrgIORequest,
5975 tiIOSuccess,
5976 SCSI_STAT_GOOD,
5977 agNULL,
5978 satOrgIOContext->interruptContext );
5979
5980 break;
5981 default:
5982 TI_DBG1(("satTestUnitReadyCB: default success command %d\n", hostToDevFis->h.command));
5983 satSetSensePayload( pSense,
5984 SCSI_SNSKEY_NOT_READY,
5985 0,
5986 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE,
5987 satOrgIOContext);
5988
5989 ostiInitiatorIOCompleted( tiRoot,
5990 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
5991 tiIOSuccess,
5992 SCSI_STAT_CHECK_CONDITION,
5993 satOrgIOContext->pTiSenseData,
5994 satOrgIOContext->interruptContext );
5995
5996
5997 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
5998
5999 satFreeIntIoResource( tiRoot,
6000 satDevData,
6001 satIntIo);
6002 break;
6003 }
6004
6005 return;
6006 }
6007
6008 /*****************************************************************************
6009 *! \brief satWriteSame10CB
6010 *
6011 * This routine is a callback function for satWriteSame10()
6012 *
6013 * \param agRoot: Handles for this instance of SAS/SATA hardware
6014 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
6015 * \param agIOStatus: Status of completed I/O.
6016 * \param agFirstDword:Pointer to the four bytes of FIS.
6017 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6018 * length.
6019 * \param agParam: Additional info based on status.
6020 * \param ioContext: Pointer to satIOContext_t.
6021 *
6022 * \return: none
6023 *
6024 *****************************************************************************/
6025 void satWriteSame10CB(
6026 agsaRoot_t *agRoot,
6027 agsaIORequest_t *agIORequest,
6028 bit32 agIOStatus,
6029 agsaFisHeader_t *agFirstDword,
6030 bit32 agIOInfoLen,
6031 void *agParam,
6032 void *ioContext
6033 )
6034 {
6035 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6036 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6037 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6038 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6039 tdIORequestBody_t *tdIORequestBody;
6040 tdIORequestBody_t *tdOrgIORequestBody;
6041 tdIORequestBody_t *tdNewIORequestBody;
6042 satIOContext_t *satIOContext;
6043 satIOContext_t *satOrgIOContext;
6044 satIOContext_t *satNewIOContext;
6045 satInternalIo_t *satIntIo;
6046 satInternalIo_t *satNewIntIo = agNULL;
6047 satDeviceData_t *satDevData;
6048 scsiRspSense_t *pSense;
6049 tiIniScsiCmnd_t *scsiCmnd;
6050 tiIORequest_t *tiOrgIORequest;
6051
6052 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
6053 bit32 ataStatus = 0;
6054 bit32 status;
6055
6056 bit32 sectorcount = 0;
6057 bit32 lba = 0, tl = 0;
6058 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
6059 agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL;
6060
6061 TI_DBG5(("satWriteSame10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6062
6063 /* internally generate tiIOContext */
6064 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
6065 satIOContext = (satIOContext_t *) ioContext;
6066 satIntIo = satIOContext->satIntIoContext;
6067 satDevData = satIOContext->pSatDevData;
6068 hostToDevFis = satIOContext->pFis;
6069
6070 if (satIntIo == agNULL)
6071 {
6072 TI_DBG4(("satWriteSame10CB: External satInternalIo_t satIntIoContext\n"));
6073 satOrgIOContext = satIOContext;
6074 tiOrgIORequest = tdIORequestBody->tiIORequest;
6075 pSense = satIOContext->pSense;
6076 scsiCmnd = satIOContext->pScsiCmnd;
6077 }
6078 else
6079 {
6080 TI_DBG4(("satWriteSame10CB: Internal satInternalIo_t satIntIoContext\n"));
6081 satOrgIOContext = satIOContext->satOrgIOContext;
6082 if (satOrgIOContext == agNULL)
6083 {
6084 TI_DBG4(("satWriteSame10CB: satOrgIOContext is NULL, wrong\n"));
6085 return;
6086 }
6087 else
6088 {
6089 TI_DBG4(("satWriteSame10CB: satOrgIOContext is NOT NULL\n"));
6090 }
6091 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6092 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6093
6094 pSense = satOrgIOContext->pSense;
6095 scsiCmnd = satOrgIOContext->pScsiCmnd;
6096 }
6097
6098
6099 tdIORequestBody->ioCompleted = agTRUE;
6100 tdIORequestBody->ioStarted = agFALSE;
6101
6102 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6103 {
6104 TI_DBG1(("satWriteSame10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6105 satSetSensePayload( pSense,
6106 SCSI_SNSKEY_NO_SENSE,
6107 0,
6108 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6109 satOrgIOContext);
6110
6111 ostiInitiatorIOCompleted( tiRoot,
6112 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6113 tiIOSuccess,
6114 SCSI_STAT_CHECK_CONDITION,
6115 satOrgIOContext->pTiSenseData,
6116 satOrgIOContext->interruptContext );
6117
6118 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6119
6120 satFreeIntIoResource( tiRoot,
6121 satDevData,
6122 satIntIo);
6123 return;
6124 }
6125
6126 if (agIOStatus != OSSA_IO_SUCCESS)
6127 {
6128 /* FP, DMA and PIO write */
6129 /* First, assumed to be Reg Device to Host FIS */
6130 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6131 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
6132 }
6133
6134 if (agIOStatus != OSSA_IO_SUCCESS)
6135 {
6136 if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS)
6137 {
6138 statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H);
6139
6140 /* Get ATA Status register */
6141 ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */
6142 ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */
6143
6144 /* ATA Eror register */
6145
6146 }
6147 }
6148
6149 if( agIOStatus != OSSA_IO_SUCCESS)
6150 {
6151 /*
6152 checking IO status, FIS type and error status
6153 FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS
6154 */
6155 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
6156 (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) ||
6157 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6158 )
6159 {
6160 /* for debugging */
6161 if( agIOStatus != OSSA_IO_SUCCESS)
6162 {
6163 TI_DBG1(("satWriteSame10CB: FAILED, NOT IO_SUCCESS\n"));
6164 }
6165 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6166 {
6167 TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6168 }
6169 else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)
6170 {
6171 TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6172 }
6173 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6174 (ataStatus & DF_ATA_STATUS_MASK)
6175 )
6176 {
6177 TI_DBG1(("satWriteSame10CB: FAILED, FAILED, error status\n"));
6178 }
6179
6180 /* Process abort case */
6181 if (agIOStatus == OSSA_IO_ABORTED)
6182 {
6183 satProcessAbort(tiRoot,
6184 tiOrgIORequest,
6185 satOrgIOContext
6186 );
6187
6188
6189 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6190
6191 satFreeIntIoResource( tiRoot,
6192 satDevData,
6193 satIntIo);
6194 return;
6195 }
6196
6197 /* for debugging */
6198 switch (hostToDevFis->h.command)
6199 {
6200 case SAT_WRITE_DMA_EXT:
6201 TI_DBG1(("satWriteSame10CB: SAT_WRITE_DMA_EXT\n"));
6202 break;
6203 case SAT_WRITE_SECTORS_EXT:
6204 TI_DBG1(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT\n"));
6205 break;
6206 case SAT_WRITE_FPDMA_QUEUED:
6207 TI_DBG1(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED\n"));
6208 break;
6209 default:
6210 TI_DBG1(("satWriteSame10CB: error default case command 0x%x\n", hostToDevFis->h.command));
6211 break;
6212 }
6213
6214 satSetSensePayload( pSense,
6215 SCSI_SNSKEY_NO_SENSE,
6216 0,
6217 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6218 satOrgIOContext);
6219
6220 ostiInitiatorIOCompleted( tiRoot,
6221 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6222 tiIOSuccess,
6223 SCSI_STAT_CHECK_CONDITION,
6224 satOrgIOContext->pTiSenseData,
6225 satOrgIOContext->interruptContext );
6226
6227
6228 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6229
6230 satFreeIntIoResource( tiRoot,
6231 satDevData,
6232 satIntIo);
6233 return;
6234 } /* end error */
6235 }
6236
6237 /* process success from this point on */
6238 /*
6239 note: inefficient implementation until a single block can be manipulated
6240 */
6241
6242 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6243 {
6244 TI_DBG5(("satWriteSame10CB: SAT_WRITE_DMA_EXT success\n"));
6245 }
6246 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6247 {
6248 TI_DBG5(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT success\n"));
6249 }
6250 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6251 {
6252 TI_DBG5(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED success\n"));
6253 }
6254 else
6255 {
6256 TI_DBG1(("satWriteSame10CB: error case command 0x%x success\n", hostToDevFis->h.command));
6257 satSetSensePayload( pSense,
6258 SCSI_SNSKEY_NO_SENSE,
6259 0,
6260 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6261 satOrgIOContext);
6262
6263 ostiInitiatorIOCompleted( tiRoot,
6264 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6265 tiIOSuccess,
6266 SCSI_STAT_CHECK_CONDITION,
6267 satOrgIOContext->pTiSenseData,
6268 satOrgIOContext->interruptContext );
6269
6270
6271 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6272
6273 satFreeIntIoResource( tiRoot,
6274 satDevData,
6275 satIntIo);
6276 return;
6277 }
6278
6279
6280 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6281
6282 /* free */
6283 satFreeIntIoResource( tiRoot,
6284 satDevData,
6285 satIntIo);
6286
6287 /*
6288 increment LBA by one, keeping the same sector count(1)
6289 sends another ATA command with the changed parameters
6290 */
6291
6292 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
6293 satDevData->satSectorDone++;
6294 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
6295
6296 TI_DBG1(("satWriteSame10CB: sectordone %d\n", satDevData->satSectorDone));
6297
6298 lba = (scsiCmnd->cdb[2] << (8*3)) + (scsiCmnd->cdb[3] << (8*2))
6299 + (scsiCmnd->cdb[4] << 8) + scsiCmnd->cdb[5];
6300 tl = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
6301
6302 TI_DBG5(("satWriteSame10CB: lba 0x%x tl 0x%x\n", lba, tl));
6303
6304 if (tl == 0)
6305 {
6306 /* (satDevData->satMaxUserAddrSectors - 1) - lba*/
6307 sectorcount = (0x0FFFFFFF - 1) - lba;
6308 }
6309 else
6310 {
6311 sectorcount = tl;
6312 }
6313
6314 if (sectorcount <= 0)
6315 {
6316 satSetSensePayload( pSense,
6317 SCSI_SNSKEY_NO_SENSE,
6318 0,
6319 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6320 satOrgIOContext);
6321
6322 ostiInitiatorIOCompleted( tiRoot,
6323 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6324 tiIOSuccess,
6325 SCSI_STAT_CHECK_CONDITION,
6326 satOrgIOContext->pTiSenseData,
6327 satOrgIOContext->interruptContext );
6328 TI_DBG1(("satWriteSame10CB: incorrect sectorcount 0x%x\n", sectorcount));
6329 return;
6330 }
6331
6332 if (sectorcount == satDevData->satSectorDone)
6333 {
6334 /*
6335 done with writesame
6336 */
6337 TI_DBG1(("satWriteSame10CB: return writesame done\n"));
6338 satDevData->satSectorDone = 0;
6339
6340 ostiInitiatorIOCompleted( tiRoot,
6341 tiOrgIORequest,
6342 tiIOSuccess,
6343 SCSI_STAT_GOOD,
6344 agNULL,
6345 satOrgIOContext->interruptContext );
6346 }
6347 else
6348 {
6349 /* sends another ATA command */
6350 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6351 {
6352 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_DMA_EXT\n"));
6353 }
6354 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6355 {
6356 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_SECTORS_EXT\n"));
6357 }
6358 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6359 {
6360 TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_FPDMA_QUEUED\n"));
6361 }
6362
6363 satNewIntIo = satAllocIntIoResource( tiRoot,
6364 tiOrgIORequest,
6365 satDevData,
6366 0,
6367 satNewIntIo);
6368 if (satNewIntIo == agNULL)
6369 {
6370 /* memory allocation failure */
6371 satFreeIntIoResource( tiRoot,
6372 satDevData,
6373 satNewIntIo);
6374
6375 satSetSensePayload( pSense,
6376 SCSI_SNSKEY_NO_SENSE,
6377 0,
6378 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6379 satOrgIOContext);
6380
6381 ostiInitiatorIOCompleted( tiRoot,
6382 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6383 tiIOSuccess,
6384 SCSI_STAT_CHECK_CONDITION,
6385 satOrgIOContext->pTiSenseData,
6386 satOrgIOContext->interruptContext );
6387 TI_DBG1(("satWriteSame10CB: momory allocation fails\n"));
6388 return;
6389 } /* end memory allocation */
6390
6391 /* the one to be used */
6392 tdNewIORequestBody = satNewIntIo->satIntRequestBody;
6393 satNewIOContext = &tdNewIORequestBody->transport.SATA.satIOContext;
6394
6395 satNewIOContext->pSatDevData = satDevData;
6396 satNewIOContext->pFis = &tdNewIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev;
6397 satNewIOContext->pScsiCmnd = &satNewIntIo->satIntTiScsiXchg.scsiCmnd;
6398 /* saves scsi command for LBA and number of blocks */
6399 osti_memcpy(satNewIOContext->pScsiCmnd, scsiCmnd, sizeof(tiIniScsiCmnd_t));
6400 satNewIOContext->pSense = &tdNewIORequestBody->transport.SATA.sensePayload;
6401 satNewIOContext->pTiSenseData = &tdNewIORequestBody->transport.SATA.tiSenseData;
6402 satNewIOContext->pTiSenseData->senseData = satNewIOContext->pSense;
6403 satNewIOContext->tiRequestBody = satNewIntIo->satIntRequestBody;
6404 satNewIOContext->interruptContext = satNewIOContext->interruptContext;
6405 satNewIOContext->satIntIoContext = satNewIntIo;
6406 satNewIOContext->ptiDeviceHandle = satIOContext->ptiDeviceHandle;
6407 /* saves tiScsiXchg; only for writesame10() */
6408 satNewIOContext->tiScsiXchg = satOrgIOContext->tiScsiXchg;
6409
6410 if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT)
6411 {
6412 status = satWriteSame10_1( tiRoot,
6413 &satNewIntIo->satIntTiIORequest,
6414 satNewIOContext->ptiDeviceHandle,
6415 &satNewIntIo->satIntTiScsiXchg,
6416 satNewIOContext,
6417 lba + satDevData->satSectorDone
6418 );
6419 }
6420 else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT)
6421 {
6422 status = satWriteSame10_2( tiRoot,
6423 &satNewIntIo->satIntTiIORequest,
6424 satNewIOContext->ptiDeviceHandle,
6425 &satNewIntIo->satIntTiScsiXchg,
6426 satNewIOContext,
6427 lba + satDevData->satSectorDone
6428 );
6429 }
6430 else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED)
6431 {
6432 status = satWriteSame10_3( tiRoot,
6433 &satNewIntIo->satIntTiIORequest,
6434 satNewIOContext->ptiDeviceHandle,
6435 &satNewIntIo->satIntTiScsiXchg,
6436 satNewIOContext,
6437 lba + satDevData->satSectorDone
6438 );
6439 }
6440 else
6441 {
6442 status = tiError;
6443 TI_DBG1(("satWriteSame10CB: sucess but error in command 0x%x\n", hostToDevFis->h.command));
6444 }
6445
6446 if (status != tiSuccess)
6447 {
6448 /* sending ATA command fails */
6449 satFreeIntIoResource( tiRoot,
6450 satDevData,
6451 satNewIntIo);
6452 satSetSensePayload( pSense,
6453 SCSI_SNSKEY_NO_SENSE,
6454 0,
6455 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6456 satOrgIOContext);
6457
6458 ostiInitiatorIOCompleted( tiRoot,
6459 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6460 tiIOSuccess,
6461 SCSI_STAT_CHECK_CONDITION,
6462 satOrgIOContext->pTiSenseData,
6463 satOrgIOContext->interruptContext );
6464 TI_DBG1(("satWriteSame10CB:calling satWriteSame10_1 fails\n"));
6465 return;
6466 } /* end send fails */
6467
6468 } /* end sends another ATA command */
6469
6470 return;
6471 }
6472 /*****************************************************************************
6473 *! \brief satStartStopUnitCB
6474 *
6475 * This routine is a callback function called from ossaSATACompleted().
6476 * This CB routine deals with Send Diagnostic completion.
6477 *
6478 * \param agRoot: Handles for this instance of SAS/SATA hardware
6479 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
6480 * \param agIOStatus: Status of completed I/O.
6481 * \param agFirstDword:Pointer to the four bytes of FIS.
6482 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
6483 * length.
6484 * \param agParam: Additional info based on status.
6485 * \param ioContext: Pointer to satIOContext_t.
6486 *
6487 * \return: none
6488 *
6489 *****************************************************************************/
6490 void satStartStopUnitCB(
6491 agsaRoot_t *agRoot,
6492 agsaIORequest_t *agIORequest,
6493 bit32 agIOStatus,
6494 agsaFisHeader_t *agFirstDword,
6495 bit32 agIOInfoLen,
6496 void *agParam,
6497 void *ioContext
6498 )
6499 {
6500 /*
6501 In the process of StartStopUnit
6502 Process FLUSH CACHE (EXT)
6503 Process STANDBY
6504 Process READ VERIFY SECTOR(S) EXT
6505 Process MEDIA EJECT
6506 */
6507 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
6508 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
6509 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
6510 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6511 tdIORequestBody_t *tdIORequestBody;
6512 tdIORequestBody_t *tdOrgIORequestBody;
6513 satIOContext_t *satIOContext;
6514 satIOContext_t *satOrgIOContext;
6515 satIOContext_t *satNewIOContext;
6516 satInternalIo_t *satIntIo;
6517 satInternalIo_t *satNewIntIo = agNULL;
6518 satDeviceData_t *satDevData;
6519 scsiRspSense_t *pSense;
6520 tiIniScsiCmnd_t *scsiCmnd;
6521 tiIORequest_t *tiOrgIORequest;
6522
6523 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
6524 bit32 ataStatus = 0;
6525 bit32 status;
6526 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
6527
6528 TI_DBG5(("satStartStopUnitCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
6529
6530 /* internally generate tiIOContext */
6531 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
6532 satIOContext = (satIOContext_t *) ioContext;
6533 satIntIo = satIOContext->satIntIoContext;
6534 satDevData = satIOContext->pSatDevData;
6535 hostToDevFis = satIOContext->pFis;
6536
6537 if (satIntIo == agNULL)
6538 {
6539 TI_DBG4(("satStartStopUnitCB: External satInternalIo_t satIntIoContext\n"));
6540 satOrgIOContext = satIOContext;
6541 tiOrgIORequest = tdIORequestBody->tiIORequest;
6542 pSense = satIOContext->pSense;
6543 scsiCmnd = satIOContext->pScsiCmnd;
6544 }
6545 else
6546 {
6547 TI_DBG4(("satStartStopUnitCB: Internal satInternalIo_t satIntIoContext\n"));
6548 satOrgIOContext = satIOContext->satOrgIOContext;
6549 if (satOrgIOContext == agNULL)
6550 {
6551 TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NULL, wrong\n"));
6552 return;
6553 }
6554 else
6555 {
6556 TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NOT NULL\n"));
6557 }
6558 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
6559 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
6560
6561 pSense = satOrgIOContext->pSense;
6562 scsiCmnd = satOrgIOContext->pScsiCmnd;
6563 }
6564
6565 tdIORequestBody->ioCompleted = agTRUE;
6566 tdIORequestBody->ioStarted = agFALSE;
6567
6568 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
6569 {
6570 TI_DBG1(("satStartStopUnitCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
6571
6572 /* IMMED == 0 */
6573 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6574 {
6575 TI_DBG1(("satStartStopUnitCB: immed bit 0\n"));
6576 satSetSensePayload( pSense,
6577 SCSI_SNSKEY_ABORTED_COMMAND,
6578 0,
6579 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6580 satOrgIOContext);
6581
6582 ostiInitiatorIOCompleted( tiRoot,
6583 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6584 tiIOSuccess,
6585 SCSI_STAT_CHECK_CONDITION,
6586 satOrgIOContext->pTiSenseData,
6587 satOrgIOContext->interruptContext );
6588
6589
6590 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6591 satFreeIntIoResource( tiRoot,
6592 satDevData,
6593 satIntIo);
6594 }
6595 /* IMMED == 1 */
6596 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6597 {
6598 TI_DBG1(("satStartStopUnitCB: immed bit 1\n"));
6599 satSetDeferredSensePayload( pSense,
6600 SCSI_SNSKEY_ABORTED_COMMAND,
6601 0,
6602 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6603 satOrgIOContext);
6604
6605 ostiInitiatorIOCompleted( tiRoot,
6606 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6607 tiIOSuccess,
6608 SCSI_STAT_CHECK_CONDITION,
6609 satOrgIOContext->pTiSenseData,
6610 satOrgIOContext->interruptContext );
6611
6612
6613 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6614 satFreeIntIoResource( tiRoot,
6615 satDevData,
6616 satIntIo);
6617 }
6618
6619
6620
6621 return;
6622 }
6623
6624 if (agIOStatus != OSSA_IO_SUCCESS)
6625 {
6626 /* only agsaFisRegDeviceToHost_t is expected */
6627 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
6628 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
6629 }
6630 /*
6631 checking IO status, FIS type and error status
6632 */
6633 if( agIOStatus != OSSA_IO_SUCCESS)
6634 {
6635 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
6636 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
6637 )
6638 {
6639 /* for debugging */
6640 if( agIOStatus != OSSA_IO_SUCCESS)
6641 {
6642 TI_DBG1(("satStartStopUnitCB: FAILED, NOT IO_SUCCESS\n"));
6643 }
6644 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
6645 {
6646 TI_DBG1(("satStartStopUnitCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
6647 }
6648 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
6649 (ataStatus & DF_ATA_STATUS_MASK)
6650 )
6651 {
6652 TI_DBG1(("satStartStopUnitCB: FAILED, FAILED, error status\n"));
6653 }
6654
6655
6656 /* Process abort case */
6657 if (agIOStatus == OSSA_IO_ABORTED)
6658 {
6659 satProcessAbort(tiRoot,
6660 tiOrgIORequest,
6661 satOrgIOContext
6662 );
6663
6664
6665 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6666
6667 satFreeIntIoResource( tiRoot,
6668 satDevData,
6669 satIntIo);
6670 return;
6671 }
6672
6673 switch (hostToDevFis->h.command)
6674 {
6675 case SAT_FLUSH_CACHE: /* fall through */
6676 case SAT_FLUSH_CACHE_EXT:
6677 TI_DBG1(("satStartStopUnitCB: SAT_FLUSH_CACHE(_EXT)\n"));
6678 /* check immed bit in scsi command */
6679 /* IMMED == 0 */
6680 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6681 {
6682 satSetSensePayload( pSense,
6683 SCSI_SNSKEY_ABORTED_COMMAND,
6684 0,
6685 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6686 satOrgIOContext);
6687
6688 ostiInitiatorIOCompleted( tiRoot,
6689 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6690 tiIOSuccess,
6691 SCSI_STAT_CHECK_CONDITION,
6692 satOrgIOContext->pTiSenseData,
6693 satOrgIOContext->interruptContext );
6694
6695
6696 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6697
6698 satFreeIntIoResource( tiRoot,
6699 satDevData,
6700 satIntIo);
6701 }
6702 /* IMMED == 1 */
6703 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6704 {
6705 satSetDeferredSensePayload( pSense,
6706 SCSI_SNSKEY_ABORTED_COMMAND,
6707 0,
6708 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6709 satOrgIOContext);
6710
6711 ostiInitiatorIOCompleted( tiRoot,
6712 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6713 tiIOSuccess,
6714 SCSI_STAT_CHECK_CONDITION,
6715 satOrgIOContext->pTiSenseData,
6716 satOrgIOContext->interruptContext );
6717
6718
6719 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6720
6721 satFreeIntIoResource( tiRoot,
6722 satDevData,
6723 satIntIo);
6724 }
6725 break;
6726 case SAT_STANDBY:
6727 TI_DBG5(("satStartStopUnitCB: SAT_STANDBY\n"));
6728 /* check immed bit in scsi command */
6729 /* IMMED == 0 */
6730 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6731 {
6732 satSetSensePayload( pSense,
6733 SCSI_SNSKEY_ABORTED_COMMAND,
6734 0,
6735 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6736 satOrgIOContext);
6737
6738 ostiInitiatorIOCompleted( tiRoot,
6739 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6740 tiIOSuccess,
6741 SCSI_STAT_CHECK_CONDITION,
6742 satOrgIOContext->pTiSenseData,
6743 satOrgIOContext->interruptContext );
6744
6745
6746 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6747
6748 satFreeIntIoResource( tiRoot,
6749 satDevData,
6750 satIntIo);
6751 }
6752 /* IMMED == 1 */
6753 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6754 {
6755 satSetDeferredSensePayload( pSense,
6756 SCSI_SNSKEY_ABORTED_COMMAND,
6757 0,
6758 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6759 satOrgIOContext);
6760
6761 ostiInitiatorIOCompleted( tiRoot,
6762 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6763 tiIOSuccess,
6764 SCSI_STAT_CHECK_CONDITION,
6765 satOrgIOContext->pTiSenseData,
6766 satOrgIOContext->interruptContext );
6767
6768
6769 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6770
6771 satFreeIntIoResource( tiRoot,
6772 satDevData,
6773 satIntIo);
6774 }
6775 break;
6776 case SAT_READ_VERIFY_SECTORS: /* fall through */
6777 case SAT_READ_VERIFY_SECTORS_EXT:
6778 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT)\n"));
6779 /* IMMED == 0 */
6780 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6781 {
6782 satSetSensePayload( pSense,
6783 SCSI_SNSKEY_ABORTED_COMMAND,
6784 0,
6785 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6786 satOrgIOContext);
6787
6788 ostiInitiatorIOCompleted( tiRoot,
6789 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6790 tiIOSuccess,
6791 SCSI_STAT_CHECK_CONDITION,
6792 satOrgIOContext->pTiSenseData,
6793 satOrgIOContext->interruptContext );
6794
6795
6796 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6797
6798 satFreeIntIoResource( tiRoot,
6799 satDevData,
6800 satIntIo);
6801 }
6802 /* IMMED == 1 */
6803 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6804 {
6805 satSetDeferredSensePayload( pSense,
6806 SCSI_SNSKEY_ABORTED_COMMAND,
6807 0,
6808 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6809 satOrgIOContext);
6810
6811 ostiInitiatorIOCompleted( tiRoot,
6812 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6813 tiIOSuccess,
6814 SCSI_STAT_CHECK_CONDITION,
6815 satOrgIOContext->pTiSenseData,
6816 satOrgIOContext->interruptContext );
6817
6818
6819 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6820
6821 satFreeIntIoResource( tiRoot,
6822 satDevData,
6823 satIntIo);
6824 }
6825 break;
6826 case SAT_MEDIA_EJECT:
6827 TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT\n"));
6828 /* IMMED == 0 */
6829 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6830 {
6831 satSetSensePayload( pSense,
6832 SCSI_SNSKEY_ABORTED_COMMAND,
6833 0,
6834 SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6835 satOrgIOContext);
6836
6837 ostiInitiatorIOCompleted( tiRoot,
6838 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6839 tiIOSuccess,
6840 SCSI_STAT_CHECK_CONDITION,
6841 satOrgIOContext->pTiSenseData,
6842 satOrgIOContext->interruptContext );
6843
6844
6845 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6846
6847 satFreeIntIoResource( tiRoot,
6848 satDevData,
6849 satIntIo);
6850 }
6851 /* IMMED == 1 */
6852 if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)
6853 {
6854 satSetDeferredSensePayload( pSense,
6855 SCSI_SNSKEY_ABORTED_COMMAND,
6856 0,
6857 SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED,
6858 satOrgIOContext);
6859
6860 ostiInitiatorIOCompleted( tiRoot,
6861 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
6862 tiIOSuccess,
6863 SCSI_STAT_CHECK_CONDITION,
6864 satOrgIOContext->pTiSenseData,
6865 satOrgIOContext->interruptContext );
6866
6867 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6868
6869 satFreeIntIoResource( tiRoot,
6870 satDevData,
6871 satIntIo);
6872 }
6873 break;
6874 default:
6875 /* unspecified case, return no sense and no addition info */
6876 TI_DBG5(("satStartStopUnitCB: default command %d\n", hostToDevFis->h.command));
6877 satSetSensePayload( pSense,
6878 SCSI_SNSKEY_NO_SENSE,
6879 0,
6880 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
6881 satOrgIOContext);
6882
6883 ostiInitiatorIOCompleted( tiRoot,
6884 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
6885 tiIOSuccess,
6886 SCSI_STAT_CHECK_CONDITION,
6887 satOrgIOContext->pTiSenseData,
6888 satOrgIOContext->interruptContext );
6889
6890
6891 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6892
6893 satFreeIntIoResource( tiRoot,
6894 satDevData,
6895 satIntIo);
6896 break;
6897 } /* switch */
6898
6899 return;
6900 } /* error check */
6901 }
6902
6903 /* ATA command completes sucessfully */
6904 switch (hostToDevFis->h.command)
6905 {
6906 case SAT_FLUSH_CACHE: /* fall through */
6907 case SAT_FLUSH_CACHE_EXT:
6908 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
6909
6910
6911 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
6912
6913 /* done with SAT_FLUSH_CACHE(_EXT) */
6914 satFreeIntIoResource( tiRoot,
6915 satDevData,
6916 satIntIo);
6917
6918 /* at this point, successful SAT_READ_VERIFY_SECTORS(_EXT)
6919 send SAT_SATNDBY
6920 */
6921 satNewIntIo = satAllocIntIoResource( tiRoot,
6922 tiOrgIORequest,
6923 satDevData,
6924 0,
6925 satNewIntIo);
6926 if (satNewIntIo == agNULL)
6927 {
6928 /* memory allocation failure */
6929 satFreeIntIoResource( tiRoot,
6930 satDevData,
6931 satNewIntIo);
6932 /* IMMED == 0 */
6933 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6934 {
6935 satSetSensePayload( pSense,
6936 SCSI_SNSKEY_ABORTED_COMMAND,
6937 0,
6938 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6939 satOrgIOContext);
6940 }
6941 else /* IMMED == 1 */
6942 {
6943 satSetDeferredSensePayload( pSense,
6944 SCSI_SNSKEY_ABORTED_COMMAND,
6945 0,
6946 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6947 satOrgIOContext);
6948 }
6949 ostiInitiatorIOCompleted( tiRoot,
6950 tiOrgIORequest,
6951 tiIOSuccess,
6952 SCSI_STAT_CHECK_CONDITION,
6953 satOrgIOContext->pTiSenseData,
6954 satOrgIOContext->interruptContext );
6955
6956 TI_DBG1(("satStartStopUnitCB: momory allocation fails\n"));
6957 return;
6958 } /* end of memory allocation failure */
6959
6960 /*
6961 * Need to initialize all the fields within satIOContext
6962 */
6963
6964 satNewIOContext = satPrepareNewIO(
6965 satNewIntIo,
6966 tiOrgIORequest,
6967 satDevData,
6968 scsiCmnd,
6969 satOrgIOContext
6970 );
6971
6972 /* sending SAT_STANDBY */
6973 status = satStartStopUnit_1( tiRoot,
6974 &satNewIntIo->satIntTiIORequest,
6975 satNewIOContext->ptiDeviceHandle,
6976 &satNewIntIo->satIntTiScsiXchg,
6977 satNewIOContext);
6978
6979 if (status != tiSuccess)
6980 {
6981 /* sending SAT_CHECK_POWER_MODE fails */
6982 satFreeIntIoResource( tiRoot,
6983 satDevData,
6984 satNewIntIo);
6985
6986 /* IMMED == 0 */
6987 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
6988 {
6989 satSetSensePayload( pSense,
6990 SCSI_SNSKEY_ABORTED_COMMAND,
6991 0,
6992 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
6993 satOrgIOContext);
6994 }
6995 else /* IMMED == 1 */
6996 {
6997 satSetDeferredSensePayload( pSense,
6998 SCSI_SNSKEY_ABORTED_COMMAND,
6999 0,
7000 SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR,
7001 satOrgIOContext);
7002 }
7003 ostiInitiatorIOCompleted( tiRoot,
7004 tiOrgIORequest,
7005 tiIOSuccess,
7006 SCSI_STAT_CHECK_CONDITION,
7007 satOrgIOContext->pTiSenseData,
7008 satOrgIOContext->interruptContext );
7009
7010 TI_DBG1(("satStartStopUnitCB: calling satStartStopUnit_1 fails\n"));
7011 return;
7012 }
7013 break;
7014 case SAT_STANDBY:
7015 TI_DBG5(("satStartStopUnitCB: SAT_STANDBY success case\n"));
7016
7017 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7018
7019 /* done with SAT_STANDBY */
7020 satFreeIntIoResource( tiRoot,
7021 satDevData,
7022 satIntIo);
7023 /*
7024 if immed == 0, return good status
7025 */
7026 /* IMMED == 0 */
7027 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7028 {
7029 ostiInitiatorIOCompleted( tiRoot,
7030 tiOrgIORequest,
7031 tiIOSuccess,
7032 SCSI_STAT_GOOD,
7033 agNULL,
7034 satOrgIOContext->interruptContext );
7035 }
7036 satDevData->satStopState = agTRUE;
7037 break;
7038 case SAT_READ_VERIFY_SECTORS: /* fall through */
7039 case SAT_READ_VERIFY_SECTORS_EXT:
7040 TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n"));
7041
7042 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7043
7044 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7045 satFreeIntIoResource( tiRoot,
7046 satDevData,
7047 satIntIo);
7048 /*
7049 if immed == 0, return good status
7050 */
7051 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7052 {
7053 ostiInitiatorIOCompleted( tiRoot,
7054 tiOrgIORequest,
7055 tiIOSuccess,
7056 SCSI_STAT_GOOD,
7057 agNULL,
7058 satOrgIOContext->interruptContext );
7059 }
7060 /*
7061 if immed == 0, return good status
7062 */
7063 /*
7064 don't forget to check and set driver state; Active power state
7065 */
7066 satDevData->satStopState = agFALSE;
7067 break;
7068 case SAT_MEDIA_EJECT:
7069 TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT success case\n"));
7070
7071 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7072
7073 /* done with SAT_READ_VERIFY_SECTORS(_EXT) */
7074 satFreeIntIoResource( tiRoot,
7075 satDevData,
7076 satIntIo);
7077 /*
7078 if immed == 0, return good status
7079 */
7080 if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK))
7081 {
7082 ostiInitiatorIOCompleted( tiRoot,
7083 tiOrgIORequest,
7084 tiIOSuccess,
7085 SCSI_STAT_GOOD,
7086 agNULL,
7087 satOrgIOContext->interruptContext );
7088 }
7089 break;
7090 default:
7091 TI_DBG1(("satStartStopUnitCB:success but error default case command 0x%x\n", hostToDevFis->h.command));
7092
7093 /* unspecified case, return no sense and no addition info */
7094 satSetSensePayload( pSense,
7095 SCSI_SNSKEY_NO_SENSE,
7096 0,
7097 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7098 satOrgIOContext);
7099
7100 ostiInitiatorIOCompleted( tiRoot,
7101 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7102 tiIOSuccess,
7103 SCSI_STAT_CHECK_CONDITION,
7104 satOrgIOContext->pTiSenseData,
7105 satOrgIOContext->interruptContext );
7106
7107 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7108
7109 satFreeIntIoResource( tiRoot,
7110 satDevData,
7111 satIntIo);
7112 break;
7113 }
7114 return;
7115 }
7116
7117 /*****************************************************************************
7118 *! \brief satSendDiagnosticCB
7119 *
7120 * This routine is a callback function called from ossaSATACompleted().
7121 * This CB routine deals with Send Diagnostic completion.
7122 *
7123 * \param agRoot: Handles for this instance of SAS/SATA hardware
7124 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
7125 * \param agIOStatus: Status of completed I/O.
7126 * \param agFirstDword:Pointer to the four bytes of FIS.
7127 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7128 * length.
7129 * \param agParam: Additional info based on status.
7130 * \param ioContext: Pointer to satIOContext_t.
7131 *
7132 * \return: none
7133 *
7134 *****************************************************************************/
7135 void satSendDiagnosticCB(
7136 agsaRoot_t *agRoot,
7137 agsaIORequest_t *agIORequest,
7138 bit32 agIOStatus,
7139 agsaFisHeader_t *agFirstDword,
7140 bit32 agIOInfoLen,
7141 void *agParam,
7142 void *ioContext
7143 )
7144 {
7145 /*
7146 In the process of SendDiagnotic
7147 Process READ VERIFY SECTOR(S) EXT two time
7148 Process SMART ECECUTE OFF-LINE IMMEDIATE
7149 */
7150 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7151 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7152 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
7153 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7154 tdIORequestBody_t *tdIORequestBody;
7155 tdIORequestBody_t *tdOrgIORequestBody;
7156 satIOContext_t *satIOContext;
7157 satIOContext_t *satOrgIOContext;
7158 satIOContext_t *satNewIOContext;
7159 satInternalIo_t *satIntIo;
7160 satInternalIo_t *satNewIntIo = agNULL;
7161 satDeviceData_t *satDevData;
7162 scsiRspSense_t *pSense;
7163 tiIniScsiCmnd_t *scsiCmnd;
7164 tiIORequest_t *tiOrgIORequest;
7165
7166 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
7167 bit32 ataStatus = 0;
7168 bit32 status;
7169 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
7170
7171
7172 TI_DBG5(("satSendDiagnosticCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7173
7174 /* internally generate tiIOContext */
7175 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
7176 satIOContext = (satIOContext_t *) ioContext;
7177 satIntIo = satIOContext->satIntIoContext;
7178 satDevData = satIOContext->pSatDevData;
7179 hostToDevFis = satIOContext->pFis;
7180
7181 if (satIntIo == agNULL)
7182 {
7183 TI_DBG4(("satSendDiagnosticCB: External satInternalIo_t satIntIoContext\n"));
7184 satOrgIOContext = satIOContext;
7185 tiOrgIORequest = tdIORequestBody->tiIORequest;
7186 pSense = satOrgIOContext->pSense;
7187 scsiCmnd = satOrgIOContext->pScsiCmnd;
7188 }
7189 else
7190 {
7191 TI_DBG4(("satSendDiagnosticCB: Internal satInternalIo_t satIntIoContext\n"));
7192 satOrgIOContext = satIOContext->satOrgIOContext;
7193 if (satOrgIOContext == agNULL)
7194 {
7195 TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NULL, wrong\n"));
7196 return;
7197 }
7198 else
7199 {
7200 TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NOT NULL\n"));
7201 }
7202 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7203 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7204 pSense = satOrgIOContext->pSense;
7205 scsiCmnd = satOrgIOContext->pScsiCmnd;
7206 }
7207
7208 tdIORequestBody->ioCompleted = agTRUE;
7209 tdIORequestBody->ioStarted = agFALSE;
7210
7211 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7212 {
7213 TI_DBG1(("satSendDiagnosticCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7214 satDevData->satVerifyState = 0;
7215 satDevData->satBGPendingDiag = agFALSE;
7216
7217 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7218 {
7219 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7220 ostiInitiatorIOCompleted (
7221 tiRoot,
7222 tiOrgIORequest,
7223 tiIOFailed,
7224 tiDetailOtherError,
7225 agNULL,
7226 satOrgIOContext->interruptContext
7227 );
7228 }
7229 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7230
7231 satFreeIntIoResource( tiRoot,
7232 satDevData,
7233 satIntIo);
7234 return;
7235
7236 }
7237
7238 if (agIOStatus != OSSA_IO_SUCCESS)
7239 {
7240 /* only agsaFisRegDeviceToHost_t is expected */
7241 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7242 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
7243 }
7244
7245 TI_DBG5(("satSendDiagnosticCB: fis command 0x%x\n", hostToDevFis->h.command));
7246
7247 if( agIOStatus != OSSA_IO_SUCCESS)
7248 {
7249 /*
7250 checking IO status, FIS type and error status
7251 */
7252 satDevData->satVerifyState = 0;
7253 satDevData->satBGPendingDiag = agFALSE;
7254
7255 if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
7256 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
7257 )
7258 {
7259
7260 /* for debugging */
7261 if( agIOStatus != OSSA_IO_SUCCESS)
7262 {
7263 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7264 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7265 {
7266 TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7267 }
7268 else
7269 {
7270 TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7271 }
7272 }
7273
7274 /* for debugging */
7275 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7276 {
7277 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7278 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7279 {
7280 TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_READ_VERIFY_SECTORS(_EXT)\n", statDevToHostFisHeader->fisType));
7281 }
7282 else
7283 {
7284 TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n",statDevToHostFisHeader->fisType));
7285 }
7286 }
7287
7288 /* for debugging */
7289 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7290 (ataStatus & DF_ATA_STATUS_MASK)
7291 )
7292 {
7293 if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) ||
7294 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7295 {
7296 TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_READ_VERIFY_SECTORS(_EXT)\n"));
7297 }
7298 else
7299 {
7300 TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n"));
7301 }
7302 }
7303
7304 /* Process abort case */
7305 if (agIOStatus == OSSA_IO_ABORTED)
7306 {
7307 satProcessAbort(tiRoot,
7308 tiOrgIORequest,
7309 satOrgIOContext
7310 );
7311
7312 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7313
7314 satFreeIntIoResource( tiRoot,
7315 satDevData,
7316 satIntIo);
7317 return;
7318 }
7319
7320 if ( (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS) ||
7321 (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) )
7322 {
7323 /* report using the original tiIOrequst */
7324 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7325 satSetSensePayload( pSense,
7326 SCSI_SNSKEY_HARDWARE_ERROR,
7327 0,
7328 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7329 satOrgIOContext);
7330
7331 ostiInitiatorIOCompleted( tiRoot,
7332 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7333 tiIOSuccess,
7334 SCSI_STAT_CHECK_CONDITION,
7335 satOrgIOContext->pTiSenseData,
7336 satOrgIOContext->interruptContext );
7337
7338 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7339
7340 satFreeIntIoResource( tiRoot,
7341 satDevData,
7342 satIntIo);
7343 return;
7344 }
7345 else
7346 {
7347 /* report using the original tiIOrequst */
7348 /* failed during sending SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7349 satSetSensePayload( pSense,
7350 SCSI_SNSKEY_HARDWARE_ERROR,
7351 0,
7352 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7353 satOrgIOContext);
7354
7355 if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02)
7356 {
7357 /* no completion for background send diagnotic. It is done in satSendDiagnostic() */
7358 ostiInitiatorIOCompleted( tiRoot,
7359 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7360 tiIOSuccess,
7361 SCSI_STAT_CHECK_CONDITION,
7362 satOrgIOContext->pTiSenseData,
7363 satOrgIOContext->interruptContext );
7364
7365 }
7366 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7367
7368 satFreeIntIoResource( tiRoot,
7369 satDevData,
7370 satIntIo);
7371 return;
7372 }
7373 }
7374 }
7375
7376 /* processing success case */
7377 switch (hostToDevFis->h.command)
7378 {
7379 case SAT_READ_VERIFY_SECTORS: /* fall through */
7380 case SAT_READ_VERIFY_SECTORS_EXT:
7381 TI_DBG5(("satSendDiagnosticCB: SAT_READ_VERIFY_SECTORS(_EXT) case\n"));
7382 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
7383 satDevData->satVerifyState++;
7384 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
7385 TI_DBG5(("satSendDiagnosticCB: satVerifyState %d\n",satDevData->satVerifyState));
7386
7387 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7388
7389 /* done with internally genereated AT_READ_VERIFY_SECTORS(_EXT) */
7390 satFreeIntIoResource( tiRoot,
7391 satDevData,
7392 satIntIo);
7393
7394 if (satDevData->satVerifyState == 3)
7395 {
7396 /* reset satVerifyState */
7397 satDevData->satVerifyState = 0;
7398 /* return GOOD status */
7399 TI_DBG5(("satSendDiagnosticCB: return GOOD status\n"));
7400 ostiInitiatorIOCompleted( tiRoot,
7401 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7402 tiIOSuccess,
7403 SCSI_STAT_GOOD,
7404 agNULL,
7405 satOrgIOContext->interruptContext );
7406 return;
7407 }
7408 else
7409 {
7410
7411 /* prepare SAT_READ_VERIFY_SECTORS(_EXT) */
7412 satNewIntIo = satAllocIntIoResource( tiRoot,
7413 tiOrgIORequest,
7414 satDevData,
7415 0,
7416 satNewIntIo);
7417 if (satNewIntIo == agNULL)
7418 {
7419 /* reset satVerifyState */
7420 satDevData->satVerifyState = 0;
7421 /* memory allocation failure */
7422 satFreeIntIoResource( tiRoot,
7423 satDevData,
7424 satNewIntIo);
7425
7426 /* failed as a part of sending SAT_READ_VERIFY_SECTORS(_EXT) */
7427 satSetSensePayload( pSense,
7428 SCSI_SNSKEY_HARDWARE_ERROR,
7429 0,
7430 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7431 satOrgIOContext);
7432
7433 ostiInitiatorIOCompleted( tiRoot,
7434 tiOrgIORequest,
7435 tiIOSuccess,
7436 SCSI_STAT_CHECK_CONDITION,
7437 satOrgIOContext->pTiSenseData,
7438 satOrgIOContext->interruptContext );
7439
7440 TI_DBG1(("satSendDiagnosticCB: momory allocation fails\n"));
7441 return;
7442 } /* end of memory allocation failure */
7443
7444 /*
7445 * Need to initialize all the fields within satIOContext
7446 */
7447
7448 satNewIOContext = satPrepareNewIO(
7449 satNewIntIo,
7450 tiOrgIORequest,
7451 satDevData,
7452 scsiCmnd,
7453 satOrgIOContext
7454 );
7455
7456 if (satDevData->satVerifyState == 1)
7457 {
7458 /* sending SAT_CHECK_POWER_MODE */
7459 status = satSendDiagnostic_1( tiRoot,
7460 &satNewIntIo->satIntTiIORequest,
7461 satNewIOContext->ptiDeviceHandle,
7462 &satNewIntIo->satIntTiScsiXchg,
7463 satNewIOContext);
7464 }
7465 else
7466 {
7467 /* satDevData->satVerifyState == 2 */
7468 status = satSendDiagnostic_2( tiRoot,
7469 &satNewIntIo->satIntTiIORequest,
7470 satNewIOContext->ptiDeviceHandle,
7471 &satNewIntIo->satIntTiScsiXchg,
7472 satNewIOContext);
7473 }
7474
7475 if (status != tiSuccess)
7476 {
7477 /* sending SAT_READ_VERIFY_SECTORS(_EXT) fails */
7478 satFreeIntIoResource( tiRoot,
7479 satDevData,
7480 satNewIntIo);
7481
7482 /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */
7483 satSetSensePayload( pSense,
7484 SCSI_SNSKEY_HARDWARE_ERROR,
7485 0,
7486 SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST,
7487 satOrgIOContext);
7488
7489 ostiInitiatorIOCompleted( tiRoot,
7490 tiOrgIORequest,
7491 tiIOSuccess,
7492 SCSI_STAT_CHECK_CONDITION,
7493 satOrgIOContext->pTiSenseData,
7494 satOrgIOContext->interruptContext );
7495
7496 /* reset satVerifyState */
7497 satDevData->satVerifyState = 0;
7498 TI_DBG1(("satSendDiagnosticCB: calling satSendDiagnostic_1 or _2 fails\n"));
7499 return;
7500 }
7501 } /* satDevData->satVerifyState == 1 or 2 */
7502
7503 break;
7504 case SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE:
7505 TI_DBG5(("satSendDiagnosticCB: SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE case\n"));
7506
7507 satDevData->satBGPendingDiag = agFALSE;
7508
7509 if (hostToDevFis->d.lbaLow == 0x01 || hostToDevFis->d.lbaLow == 0x02)
7510 {
7511 /* for background send diagnostic, no completion here. It is done already. */
7512 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7513
7514 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7515 satFreeIntIoResource( tiRoot,
7516 satDevData,
7517 satIntIo);
7518 TI_DBG5(("satSendDiagnosticCB: returning but no IOCompleted\n"));
7519 }
7520 else
7521 {
7522 TI_DBG5(("satSendDiagnosticCB: returning good status for senddiagnostic\n"));
7523 ostiInitiatorIOCompleted( tiRoot,
7524 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7525 tiIOSuccess,
7526 SCSI_STAT_GOOD,
7527 agNULL,
7528 satOrgIOContext->interruptContext );
7529
7530
7531 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7532
7533 /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */
7534 satFreeIntIoResource( tiRoot,
7535 satDevData,
7536 satIntIo);
7537 }
7538
7539 break;
7540 default:
7541 TI_DBG1(("satSendDiagnosticCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
7542 /* unspecified case, return no sense and no addition info */
7543 satSetSensePayload( pSense,
7544 SCSI_SNSKEY_NO_SENSE,
7545 0,
7546 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
7547 satOrgIOContext);
7548
7549 ostiInitiatorIOCompleted( tiRoot,
7550 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7551 tiIOSuccess,
7552 SCSI_STAT_CHECK_CONDITION,
7553 satOrgIOContext->pTiSenseData,
7554 satOrgIOContext->interruptContext );
7555
7556 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7557
7558 satFreeIntIoResource( tiRoot,
7559 satDevData,
7560 satIntIo);
7561 break;
7562 }
7563 return;
7564 }
7565 /*****************************************************************************
7566 *! \brief satRequestSenseCB
7567 *
7568 * This routine is a callback function called from ossaSATACompleted().
7569 * This CB routine deals with Request Sense completion.
7570 *
7571 * \param agRoot: Handles for this instance of SAS/SATA hardware
7572 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
7573 * \param agIOStatus: Status of completed I/O.
7574 * \param agFirstDword:Pointer to the four bytes of FIS.
7575 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
7576 * length.
7577 * \param agParam: Additional info based on status.
7578 * \param ioContext: Pointer to satIOContext_t.
7579 *
7580 * \return: none
7581 *
7582 *****************************************************************************/
7583 /*
7584 CB for internnaly generated SMART_RETURN_STATUS and SAT_CHECK_POWER_MODE
7585 in the process of RequestSense
7586
7587 */
7588 void satRequestSenseCB(
7589 agsaRoot_t *agRoot,
7590 agsaIORequest_t *agIORequest,
7591 bit32 agIOStatus,
7592 agsaFisHeader_t *agFirstDword,
7593 bit32 agIOInfoLen,
7594 void *agParam,
7595 void *ioContext
7596 )
7597 {
7598 /* ATA Vol 1, p299 SAT_SMART_RETURN_STATUS */
7599 /*
7600 if threshold exceeds, return SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE
7601 else call satRequestSense_1 to send CHECK_POWER_MODE
7602 */
7603
7604 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
7605 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
7606 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
7607 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
7608 tdIORequestBody_t *tdIORequestBody;
7609 tdIORequestBody_t *tdOrgIORequestBody;
7610 satIOContext_t *satIOContext;
7611 satIOContext_t *satOrgIOContext;
7612 satIOContext_t *satNewIOContext;
7613 satInternalIo_t *satIntIo;
7614 satInternalIo_t *satNewIntIo = agNULL;
7615 satDeviceData_t *satDevData;
7616 scsiRspSense_t *pSense;
7617 tiIORequest_t *tiOrgIORequest;
7618 tiIniScsiCmnd_t *scsiCmnd;
7619
7620 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
7621 bit32 ataStatus = 0;
7622 bit32 status;
7623 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
7624 agsaFisRegD2HData_t statDevToHostFisData;
7625 bit32 lenReceived = 0;
7626 bit32 dataLength;
7627
7628 TI_DBG4(("satRequestSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
7629
7630 /* internally generate tiIOContext */
7631 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
7632 satIOContext = (satIOContext_t *) ioContext;
7633 satIntIo = satIOContext->satIntIoContext;
7634 satDevData = satIOContext->pSatDevData;
7635 hostToDevFis = satIOContext->pFis;
7636
7637 /*ttttttthe one */
7638 if (satIntIo == agNULL)
7639 {
7640 TI_DBG4(("satRequestSenseCB: External satInternalIo_t satIntIoContext\n"));
7641 satOrgIOContext = satIOContext;
7642 tiOrgIORequest = tdIORequestBody->tiIORequest;
7643 if (satOrgIOContext->superIOFlag)
7644 {
7645 pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7646 }
7647 else
7648 {
7649 pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7650 }
7651 scsiCmnd = satOrgIOContext->pScsiCmnd;
7652 }
7653 else
7654 {
7655 TI_DBG4(("satRequestSenseCB: Internal satInternalIo_t satIntIoContext\n"));
7656 satOrgIOContext = satIOContext->satOrgIOContext;
7657 if (satOrgIOContext == agNULL)
7658 {
7659 TI_DBG4(("satRequestSenseCB: satOrgIOContext is NULL, wrong\n"));
7660 return;
7661 }
7662 else
7663 {
7664 TI_DBG4(("satRequestSenseCB: satOrgIOContext is NOT NULL\n"));
7665 }
7666 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
7667 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
7668
7669 if (satOrgIOContext->superIOFlag)
7670 {
7671 pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7672 }
7673 else
7674 {
7675 pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense;
7676 }
7677 scsiCmnd = satOrgIOContext->pScsiCmnd;
7678 }
7679
7680 tdIORequestBody->ioCompleted = agTRUE;
7681 tdIORequestBody->ioStarted = agFALSE;
7682
7683 TI_DBG4(("satRequestSenseCB: fis command 0x%x\n", hostToDevFis->h.command));
7684
7685 lenReceived = scsiCmnd->cdb[4];
7686 TI_DBG1(("satRequestSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
7687
7688 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
7689 {
7690 TI_DBG1(("satRequestSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
7691 ostiInitiatorIOCompleted (
7692 tiRoot,
7693 tiOrgIORequest,
7694 tiIOFailed,
7695 tiDetailOtherError,
7696 agNULL,
7697 satOrgIOContext->interruptContext
7698 );
7699
7700 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7701
7702 satFreeIntIoResource( tiRoot,
7703 satDevData,
7704 satIntIo);
7705
7706 return;
7707 }
7708
7709 /*
7710 checking IO status, FIS type and error status
7711 */
7712 if (agIOStatus != OSSA_IO_SUCCESS)
7713 {
7714 /* only agsaFisRegDeviceToHost_t is expected */
7715 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
7716 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
7717
7718 /* for debugging */
7719 if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
7720 {
7721 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7722 {
7723 TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_RETURN_STATU\n", statDevToHostFisHeader->fisType));
7724 }
7725 else
7726 {
7727 TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_CHECK_POWER_MODE\n",statDevToHostFisHeader->fisType));
7728 }
7729 }
7730
7731 /* for debugging */
7732 if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
7733 (ataStatus & DF_ATA_STATUS_MASK)
7734 )
7735 {
7736 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7737 {
7738 TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_SMART_RETURN_STATU\n"));
7739 }
7740 else
7741 {
7742 TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_CHECK_POWER_MODE\n"));
7743 }
7744 }
7745
7746 /* Process abort case */
7747 if (agIOStatus == OSSA_IO_ABORTED)
7748 {
7749 satProcessAbort(tiRoot,
7750 tiOrgIORequest,
7751 satOrgIOContext
7752 );
7753
7754 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7755
7756 satFreeIntIoResource( tiRoot,
7757 satDevData,
7758 satIntIo);
7759 return;
7760 }
7761
7762 if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
7763 {
7764 /* report using the original tiIOrequst */
7765 /* failed during sending SMART RETURN STATUS */
7766 satSetSensePayload( pSense,
7767 SCSI_SNSKEY_NO_SENSE,
7768 0,
7769 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7770 satOrgIOContext);
7771
7772 if (SENSE_DATA_LENGTH < lenReceived)
7773 {
7774 /* underrun */
7775 ostiInitiatorIOCompleted( tiRoot,
7776 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7777 tiIOUnderRun,
7778 lenReceived - SENSE_DATA_LENGTH,
7779 agNULL,
7780 satOrgIOContext->interruptContext );
7781 }
7782 else
7783 {
7784 ostiInitiatorIOCompleted( tiRoot,
7785 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7786 tiIOSuccess,
7787 SCSI_STAT_GOOD,
7788 agNULL,
7789 satOrgIOContext->interruptContext );
7790 }
7791 }
7792 else
7793 {
7794 /* report using the original tiIOrequst */
7795 /* failed during sending SAT_CHECK_POWER_MODE */
7796 satSetSensePayload( pSense,
7797 SCSI_SNSKEY_NO_SENSE,
7798 0,
7799 SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7800 satOrgIOContext);
7801
7802 if (SENSE_DATA_LENGTH < lenReceived)
7803 {
7804 /* underrun */
7805 ostiInitiatorIOCompleted( tiRoot,
7806 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7807 tiIOUnderRun,
7808 lenReceived - SENSE_DATA_LENGTH,
7809 agNULL,
7810 satOrgIOContext->interruptContext );
7811 }
7812 else
7813 {
7814 ostiInitiatorIOCompleted( tiRoot,
7815 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
7816 tiIOSuccess,
7817 SCSI_STAT_GOOD,
7818 agNULL,
7819 satOrgIOContext->interruptContext );
7820 }
7821 }
7822
7823
7824 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7825
7826 satFreeIntIoResource( tiRoot,
7827 satDevData,
7828 satIntIo);
7829 return;
7830 }
7831
7832 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
7833
7834 switch (hostToDevFis->h.command)
7835 {
7836 case SAT_SMART_RETURN_STATUS:
7837 TI_DBG4(("satRequestSenseCB: SAT_SMART_RETURN_STATUS case\n"));
7838 if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
7839 {
7840 /* threshold exceeds */
7841 TI_DBG1(("satRequestSenseCB: threshold exceeds\n"));
7842
7843
7844 /* report using the original tiIOrequst */
7845 /* failed during sending SMART RETURN STATUS */
7846 satSetSensePayload( pSense,
7847 SCSI_SNSKEY_NO_SENSE,
7848 0,
7849 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7850 satOrgIOContext);
7851
7852 if (SENSE_DATA_LENGTH < lenReceived)
7853 {
7854 /* underrun */
7855 ostiInitiatorIOCompleted( tiRoot,
7856 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7857 tiIOUnderRun,
7858 lenReceived - SENSE_DATA_LENGTH,
7859 agNULL,
7860 satOrgIOContext->interruptContext ); }
7861 else
7862 {
7863 ostiInitiatorIOCompleted( tiRoot,
7864 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
7865 tiIOSuccess,
7866 SCSI_STAT_GOOD,
7867 agNULL,
7868 satOrgIOContext->interruptContext ); }
7869
7870
7871 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7872
7873 satFreeIntIoResource( tiRoot,
7874 satDevData,
7875 satIntIo);
7876 return;
7877 }
7878
7879
7880 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
7881
7882 /* done with internally genereated SAT_SMART_RETURN_STATUS */
7883 satFreeIntIoResource( tiRoot,
7884 satDevData,
7885 satIntIo);
7886
7887 /* at this point, successful SMART_RETURN_STATUS
7888 xmit SAT_CHECK_POWER_MODE
7889 */
7890 if (satOrgIOContext->superIOFlag)
7891 {
7892 dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7893 }
7894 else
7895 {
7896 dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength;
7897 }
7898
7899 satNewIntIo = satAllocIntIoResource( tiRoot,
7900 tiOrgIORequest,
7901 satDevData,
7902 dataLength,
7903 satNewIntIo);
7904 if (satNewIntIo == agNULL)
7905 {
7906 /* memory allocation failure */
7907 satFreeIntIoResource( tiRoot,
7908 satDevData,
7909 satNewIntIo);
7910
7911 /* failed as a part of sending SMART RETURN STATUS */
7912 satSetSensePayload( pSense,
7913 SCSI_SNSKEY_NO_SENSE,
7914 0,
7915 SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE,
7916 satOrgIOContext);
7917
7918 if (SENSE_DATA_LENGTH < lenReceived)
7919 {
7920 /* underrun */
7921 ostiInitiatorIOCompleted( tiRoot,
7922 tiOrgIORequest,
7923 tiIOUnderRun,
7924 lenReceived - SENSE_DATA_LENGTH,
7925 agNULL,
7926 satOrgIOContext->interruptContext );
7927 }
7928 else
7929 {
7930 ostiInitiatorIOCompleted( tiRoot,
7931 tiOrgIORequest,
7932 tiIOSuccess,
7933 SCSI_STAT_GOOD,
7934 agNULL,
7935 satOrgIOContext->interruptContext );
7936 }
7937
7938 TI_DBG1(("satRequestSenseCB: momory allocation fails\n"));
7939 return;
7940 } /* end of memory allocation failure */
7941
7942
7943 /*
7944 * Need to initialize all the fields within satIOContext
7945 */
7946
7947 satNewIOContext = satPrepareNewIO(
7948 satNewIntIo,
7949 tiOrgIORequest,
7950 satDevData,
7951 scsiCmnd,
7952 satOrgIOContext
7953 );
7954
7955 /* sending SAT_CHECK_POWER_MODE */
7956 status = satRequestSense_1( tiRoot,
7957 &satNewIntIo->satIntTiIORequest,
7958 satNewIOContext->ptiDeviceHandle,
7959 &satNewIntIo->satIntTiScsiXchg,
7960 satNewIOContext);
7961
7962 if (status != tiSuccess)
7963 {
7964 /* sending SAT_CHECK_POWER_MODE fails */
7965 satFreeIntIoResource( tiRoot,
7966 satDevData,
7967 satNewIntIo);
7968
7969 /* failed during sending SAT_CHECK_POWER_MODE */
7970 satSetSensePayload( pSense,
7971 SCSI_SNSKEY_NO_SENSE,
7972 0,
7973 SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
7974 satOrgIOContext);
7975
7976 if (SENSE_DATA_LENGTH < lenReceived)
7977 {
7978 /* underrun */
7979 ostiInitiatorIOCompleted( tiRoot,
7980 tiOrgIORequest,
7981 tiIOUnderRun,
7982 lenReceived - SENSE_DATA_LENGTH,
7983 agNULL,
7984 satOrgIOContext->interruptContext );
7985 }
7986 else
7987 {
7988 ostiInitiatorIOCompleted( tiRoot,
7989 tiOrgIORequest,
7990 tiIOSuccess,
7991 SCSI_STAT_GOOD,
7992 agNULL,
7993 satOrgIOContext->interruptContext );
7994 }
7995
7996 TI_DBG1(("satRequestSenseCB: calling satRequestSense_1 fails\n"));
7997 return;
7998 }
7999
8000 break;
8001 case SAT_CHECK_POWER_MODE:
8002 TI_DBG4(("satRequestSenseCB: SAT_CHECK_POWER_MODE case\n"));
8003
8004 /* check ATA STANDBY state */
8005 if (statDevToHostFisData.sectorCount == 0x00)
8006 {
8007 /* in STANDBY */
8008 TI_DBG1(("satRequestSenseCB: in standby\n"));
8009
8010
8011 /* report using the original tiIOrequst */
8012 /* failed during sending SAT_CHECK_POWER_MODE */
8013 satSetSensePayload( pSense,
8014 SCSI_SNSKEY_NO_SENSE,
8015 0,
8016 SCSI_SNSCODE_LOW_POWER_CONDITION_ON,
8017 satOrgIOContext);
8018
8019 if (SENSE_DATA_LENGTH < lenReceived)
8020 {
8021 /* underrun */
8022 ostiInitiatorIOCompleted( tiRoot,
8023 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8024 tiIOUnderRun,
8025 lenReceived - SENSE_DATA_LENGTH,
8026 agNULL,
8027 satOrgIOContext->interruptContext );
8028 }
8029 else
8030 {
8031 ostiInitiatorIOCompleted( tiRoot,
8032 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8033 tiIOSuccess,
8034 SCSI_STAT_GOOD,
8035 agNULL,
8036 satOrgIOContext->interruptContext );
8037 }
8038
8039 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8040
8041 satFreeIntIoResource( tiRoot,
8042 satDevData,
8043 satIntIo);
8044 return;
8045 }
8046
8047 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8048
8049 /* done with internnaly generated SAT_CHECK_POWER_MODE */
8050 satFreeIntIoResource( tiRoot,
8051 satDevData,
8052 satIntIo);
8053
8054 if (satDevData->satFormatState == agTRUE)
8055 {
8056 TI_DBG1(("satRequestSenseCB: in format\n"));
8057
8058
8059 /* report using the original tiIOrequst */
8060 satSetSensePayload( pSense,
8061 SCSI_SNSKEY_NOT_READY,
8062 0,
8063 SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS,
8064 satOrgIOContext);
8065
8066 if (SENSE_DATA_LENGTH < lenReceived)
8067 {
8068 /* underrun */
8069 ostiInitiatorIOCompleted( tiRoot,
8070 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8071 tiIOUnderRun,
8072 lenReceived - SENSE_DATA_LENGTH,
8073 agNULL,
8074 satOrgIOContext->interruptContext );
8075 }
8076 else
8077 {
8078 ostiInitiatorIOCompleted( tiRoot,
8079 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8080 tiIOSuccess,
8081 SCSI_STAT_GOOD,
8082 agNULL,
8083 satOrgIOContext->interruptContext );
8084 }
8085
8086 return;
8087 }
8088
8089 /* normal: returns good status for requestsense */
8090 /* report using the original tiIOrequst */
8091 satSetSensePayload( pSense,
8092 SCSI_SNSKEY_NO_SENSE,
8093 0,
8094 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8095 satOrgIOContext);
8096 TI_DBG4(("satRequestSenseCB: returning good status for requestsense\n"));
8097 if (SENSE_DATA_LENGTH < lenReceived)
8098 {
8099 /* underrun */
8100 TI_DBG6(("satRequestSenseCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n",
8101 SENSE_DATA_LENGTH, lenReceived, tiOrgIORequest));
8102 ostiInitiatorIOCompleted( tiRoot,
8103 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8104 tiIOUnderRun,
8105 lenReceived - SENSE_DATA_LENGTH,
8106 agNULL,
8107 satOrgIOContext->interruptContext );
8108
8109 }
8110 else
8111 {
8112 ostiInitiatorIOCompleted( tiRoot,
8113 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8114 tiIOSuccess,
8115 SCSI_STAT_GOOD,
8116 agNULL,
8117 satOrgIOContext->interruptContext );
8118 }
8119
8120 break;
8121 default:
8122 TI_DBG1(("satRequestSenseCB: success but error default case command 0x%x\n", hostToDevFis->h.command));
8123 /* pSense here is a part of satOrgIOContext */
8124 pSense = satOrgIOContext->pTiSenseData->senseData;
8125 satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH;
8126 /* unspecified case, return no sense and no addition info */
8127 satSetSensePayload( pSense,
8128 SCSI_SNSKEY_NO_SENSE,
8129 0,
8130 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8131 satOrgIOContext);
8132
8133 ostiInitiatorIOCompleted( tiRoot,
8134 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8135 tiIOSuccess,
8136 SCSI_STAT_CHECK_CONDITION,
8137 satOrgIOContext->pTiSenseData,
8138 satOrgIOContext->interruptContext );
8139
8140 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8141
8142 satFreeIntIoResource( tiRoot,
8143 satDevData,
8144 satIntIo);
8145 break;
8146 } /* switch */
8147
8148 return;
8149 }
8150
8151 /*****************************************************************************
8152 *! \brief satSynchronizeCache10n16CB
8153 *
8154 * This routine is a callback function for satSynchronizeCache10 and
8155 * satSynchronizeCache1016()
8156 *
8157 * \param agRoot: Handles for this instance of SAS/SATA hardware
8158 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
8159 * \param agIOStatus: Status of completed I/O.
8160 * \param agFirstDword:Pointer to the four bytes of FIS.
8161 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8162 * length.
8163 * \param agParam: Additional info based on status.
8164 * \param ioContext: Pointer to satIOContext_t.
8165 *
8166 * \return: none
8167 *
8168 *****************************************************************************/
8169 void satSynchronizeCache10n16CB(
8170 agsaRoot_t *agRoot,
8171 agsaIORequest_t *agIORequest,
8172 bit32 agIOStatus,
8173 agsaFisHeader_t *agFirstDword,
8174 bit32 agIOInfoLen,
8175 void *agParam,
8176 void *ioContext
8177 )
8178 {
8179 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8180 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8181 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8182 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8183 tdIORequestBody_t *tdIORequestBody;
8184 tdIORequestBody_t *tdOrgIORequestBody;
8185 satIOContext_t *satIOContext;
8186 satIOContext_t *satOrgIOContext;
8187 satInternalIo_t *satIntIo;
8188 satDeviceData_t *satDevData;
8189
8190 scsiRspSense_t *pSense;
8191 tiIniScsiCmnd_t *scsiCmnd;
8192 tiIORequest_t *tiOrgIORequest;
8193
8194 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
8195 bit32 ataStatus = 0;
8196 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
8197
8198 TI_DBG5(("satSynchronizeCache10n16CB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8199
8200 /* internally generate tiIOContext */
8201 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8202 satIOContext = (satIOContext_t *) ioContext;
8203 satIntIo = satIOContext->satIntIoContext;
8204 satDevData = satIOContext->pSatDevData;
8205 hostToDevFis = satIOContext->pFis;
8206
8207 /* SPC: Self-Test Result Log page */
8208
8209 if (satIntIo == agNULL)
8210 {
8211 TI_DBG4(("satSynchronizeCache10n16CB: External satInternalIo_t satIntIoContext\n"));
8212 satOrgIOContext = satIOContext;
8213 tiOrgIORequest = tdIORequestBody->tiIORequest;
8214 pSense = satIOContext->pSense;
8215 scsiCmnd = satIOContext->pScsiCmnd;
8216 }
8217 else
8218 {
8219 TI_DBG4(("satSynchronizeCache10n16CB: Internal satInternalIo_t satIntIoContext\n"));
8220 satOrgIOContext = satIOContext->satOrgIOContext;
8221 if (satOrgIOContext == agNULL)
8222 {
8223 TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NULL, wrong\n"));
8224 return;
8225 }
8226 else
8227 {
8228 TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NOT NULL\n"));
8229 }
8230 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8231 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8232
8233 pSense = satOrgIOContext->pSense;
8234 scsiCmnd = satOrgIOContext->pScsiCmnd;
8235 }
8236
8237 tdIORequestBody->ioCompleted = agTRUE;
8238 tdIORequestBody->ioStarted = agFALSE;
8239
8240 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8241 {
8242 TI_DBG1(("satSynchronizeCache10n16CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8243
8244 ostiInitiatorIOCompleted (
8245 tiRoot,
8246 tiOrgIORequest,
8247 tiIOFailed,
8248 tiDetailOtherError,
8249 agNULL,
8250 satOrgIOContext->interruptContext
8251 );
8252 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8253
8254 satFreeIntIoResource( tiRoot,
8255 satDevData,
8256 satIntIo);
8257 return;
8258 }
8259
8260 if( agIOStatus != OSSA_IO_SUCCESS)
8261 {
8262 /* only agsaFisRegDeviceToHost_t is expected */
8263 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8264 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
8265 }
8266
8267 if( agIOStatus != OSSA_IO_SUCCESS)
8268 {
8269 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8270 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8271 )
8272 {
8273 /* for debugging */
8274 if( agIOStatus != OSSA_IO_SUCCESS)
8275 {
8276 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, NOT IO_SUCCESS\n"));
8277 }
8278 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8279 {
8280 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8281 }
8282 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8283 (ataStatus & DF_ATA_STATUS_MASK)
8284 )
8285 {
8286 TI_DBG1(("satSynchronizeCache10n16CB: FAILED, FAILED, error status\n"));
8287 }
8288
8289
8290 /* Process abort case */
8291 if (agIOStatus == OSSA_IO_ABORTED)
8292 {
8293 satProcessAbort(tiRoot,
8294 tiOrgIORequest,
8295 satOrgIOContext
8296 );
8297
8298 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8299
8300 satFreeIntIoResource( tiRoot,
8301 satDevData,
8302 satIntIo);
8303 return;
8304 }
8305
8306 switch (hostToDevFis->h.command)
8307 {
8308 case SAT_FLUSH_CACHE:
8309 TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE failed\n"));
8310 /* checking IMMED bit */
8311 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8312 {
8313 satSetDeferredSensePayload( pSense,
8314 SCSI_SNSKEY_NO_SENSE,
8315 0,
8316 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8317 satOrgIOContext);
8318 }
8319 else
8320 {
8321 satSetDeferredSensePayload( pSense,
8322 SCSI_SNSKEY_NO_SENSE,
8323 0,
8324 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8325 satOrgIOContext);
8326 }
8327
8328
8329 ostiInitiatorIOCompleted( tiRoot,
8330 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8331 tiIOSuccess,
8332 SCSI_STAT_CHECK_CONDITION,
8333 satOrgIOContext->pTiSenseData,
8334 satOrgIOContext->interruptContext );
8335
8336 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8337
8338 satFreeIntIoResource( tiRoot,
8339 satDevData,
8340 satIntIo);
8341 return;
8342 break;
8343 case SAT_FLUSH_CACHE_EXT:
8344 TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT failed\n"));
8345 /* checking IMMED bit */
8346 if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)
8347 {
8348 satSetDeferredSensePayload( pSense,
8349 SCSI_SNSKEY_NO_SENSE,
8350 0,
8351 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8352 satOrgIOContext);
8353 }
8354 else
8355 {
8356 satSetDeferredSensePayload( pSense,
8357 SCSI_SNSKEY_NO_SENSE,
8358 0,
8359 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8360 satOrgIOContext);
8361 }
8362
8363
8364 ostiInitiatorIOCompleted( tiRoot,
8365 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8366 tiIOSuccess,
8367 SCSI_STAT_CHECK_CONDITION,
8368 satOrgIOContext->pTiSenseData,
8369 satOrgIOContext->interruptContext );
8370
8371 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8372
8373 satFreeIntIoResource( tiRoot,
8374 satDevData,
8375 satIntIo);
8376 return;
8377 break;
8378 default:
8379 TI_DBG1(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8380 satSetSensePayload( pSense,
8381 SCSI_SNSKEY_NO_SENSE,
8382 0,
8383 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8384 satOrgIOContext);
8385
8386
8387 ostiInitiatorIOCompleted( tiRoot,
8388 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8389 tiIOSuccess,
8390 SCSI_STAT_CHECK_CONDITION,
8391 satOrgIOContext->pTiSenseData,
8392 satOrgIOContext->interruptContext );
8393
8394 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8395
8396 satFreeIntIoResource( tiRoot,
8397 satDevData,
8398 satIntIo);
8399 return;
8400 break;
8401 }
8402
8403 return;
8404 } /* end of error checking */
8405 }
8406
8407 /* prcessing the success case */
8408 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8409
8410 satFreeIntIoResource( tiRoot,
8411 satDevData,
8412 satIntIo);
8413
8414
8415 switch (hostToDevFis->h.command)
8416 {
8417 case SAT_FLUSH_CACHE:
8418 TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE success\n"));
8419
8420 /* checking IMMED bit */
8421 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8422 {
8423 ostiInitiatorIOCompleted( tiRoot,
8424 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8425 tiIOSuccess,
8426 SCSI_STAT_GOOD,
8427 agNULL,
8428 satOrgIOContext->interruptContext );
8429 return;
8430 }
8431
8432
8433 break;
8434 case SAT_FLUSH_CACHE_EXT:
8435 TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT success\n"));
8436
8437 /* checking IMMED bit */
8438 if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK))
8439 {
8440 ostiInitiatorIOCompleted( tiRoot,
8441 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8442 tiIOSuccess,
8443 SCSI_STAT_GOOD,
8444 agNULL,
8445 satOrgIOContext->interruptContext );
8446 return;
8447 }
8448
8449 break;
8450 default:
8451 TI_DBG5(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command));
8452 satSetSensePayload( pSense,
8453 SCSI_SNSKEY_NO_SENSE,
8454 0,
8455 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8456 satOrgIOContext);
8457
8458
8459 ostiInitiatorIOCompleted( tiRoot,
8460 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8461 tiIOSuccess,
8462 SCSI_STAT_CHECK_CONDITION,
8463 satOrgIOContext->pTiSenseData,
8464 satOrgIOContext->interruptContext );
8465
8466 return;
8467 break;
8468 }
8469
8470 return;
8471 }
8472
8473 /*****************************************************************************
8474 *! \brief satModeSelect6n10CB
8475 *
8476 * This routine is a callback function for satModeSelect6() and
8477 * satModeSelect10()
8478 *
8479 * \param agRoot: Handles for this instance of SAS/SATA hardware
8480 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
8481 * \param agIOStatus: Status of completed I/O.
8482 * \param agFirstDword:Pointer to the four bytes of FIS.
8483 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8484 * length.
8485 * \param agParam: Additional info based on status.
8486 * \param ioContext: Pointer to satIOContext_t.
8487 *
8488 * \return: none
8489 *
8490 *****************************************************************************/
8491 void satModeSelect6n10CB(
8492 agsaRoot_t *agRoot,
8493 agsaIORequest_t *agIORequest,
8494 bit32 agIOStatus,
8495 agsaFisHeader_t *agFirstDword,
8496 bit32 agIOInfoLen,
8497 void *agParam,
8498 void *ioContext
8499 )
8500 {
8501 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8502 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8503 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8504 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8505 tdIORequestBody_t *tdIORequestBody;
8506 tdIORequestBody_t *tdOrgIORequestBody;
8507 satIOContext_t *satIOContext;
8508 satIOContext_t *satOrgIOContext;
8509 satIOContext_t *satNewIOContext;
8510 satInternalIo_t *satIntIo;
8511 satInternalIo_t *satNewIntIo = agNULL;
8512 satDeviceData_t *satDevData;
8513 scsiRspSense_t *pSense;
8514 tiIniScsiCmnd_t *scsiCmnd;
8515 tiIORequest_t *tiOrgIORequest;
8516
8517 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
8518 bit32 ataStatus = 0;
8519 bit32 status;
8520 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
8521 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
8522
8523 TI_DBG5(("satModeSelect6n10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8524
8525 /* internally generate tiIOContext */
8526 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8527 satIOContext = (satIOContext_t *) ioContext;
8528 satIntIo = satIOContext->satIntIoContext;
8529 satDevData = satIOContext->pSatDevData;
8530 hostToDevFis = satIOContext->pFis;
8531
8532 if (satIntIo == agNULL)
8533 {
8534 TI_DBG4(("satModeSelect6n10CB: External satInternalIo_t satIntIoContext\n"));
8535 satOrgIOContext = satIOContext;
8536 tiOrgIORequest = tdIORequestBody->tiIORequest;
8537 tiScsiRequest = satOrgIOContext->tiScsiXchg;
8538 pSense = satOrgIOContext->pSense;
8539 scsiCmnd = satOrgIOContext->pScsiCmnd;
8540 }
8541 else
8542 {
8543 TI_DBG4(("satModeSelect6n10CB: Internal satInternalIo_t satIntIoContext\n"));
8544 satOrgIOContext = satIOContext->satOrgIOContext;
8545 if (satOrgIOContext == agNULL)
8546 {
8547 TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NULL, wrong\n"));
8548 return;
8549 }
8550 else
8551 {
8552 TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NOT NULL\n"));
8553 }
8554 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8555 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8556
8557 tiScsiRequest = satOrgIOContext->tiScsiXchg;
8558 pSense = satOrgIOContext->pSense;
8559 scsiCmnd = satOrgIOContext->pScsiCmnd;
8560 }
8561
8562 tdIORequestBody->ioCompleted = agTRUE;
8563 tdIORequestBody->ioStarted = agFALSE;
8564
8565 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8566 {
8567 TI_DBG1(("satModeSelect6n10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8568 ostiInitiatorIOCompleted (
8569 tiRoot,
8570 tiOrgIORequest,
8571 tiIOFailed,
8572 tiDetailOtherError,
8573 agNULL,
8574 satOrgIOContext->interruptContext
8575 );
8576 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8577
8578 satFreeIntIoResource( tiRoot,
8579 satDevData,
8580 satIntIo);
8581 return;
8582 }
8583
8584 if (agIOStatus != OSSA_IO_SUCCESS)
8585 {
8586 /* only agsaFisRegDeviceToHost_t is expected */
8587 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
8588 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
8589 }
8590
8591 if (agIOStatus != OSSA_IO_SUCCESS)
8592 {
8593 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
8594 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
8595 )
8596 {
8597 /* for debugging */
8598 if( agIOStatus != OSSA_IO_SUCCESS)
8599 {
8600 TI_DBG1(("satModeSelect6n10CB FAILED, NOT IO_SUCCESS\n"));
8601 }
8602 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
8603 {
8604 TI_DBG1(("satModeSelect6n10CB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
8605 }
8606 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
8607 (ataStatus & DF_ATA_STATUS_MASK)
8608 )
8609 {
8610 TI_DBG1(("satModeSelect6n10CB FAILED, FAILED, error status\n"));
8611 }
8612
8613 /* Process abort case */
8614 if (agIOStatus == OSSA_IO_ABORTED)
8615 {
8616 satProcessAbort(tiRoot,
8617 tiOrgIORequest,
8618 satOrgIOContext
8619 );
8620
8621 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8622
8623 satFreeIntIoResource( tiRoot,
8624 satDevData,
8625 satIntIo);
8626 return;
8627 }
8628
8629 /* for debugging */
8630 if (hostToDevFis->h.command == SAT_SET_FEATURES)
8631 {
8632 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8633 {
8634 TI_DBG1(("satModeSelect6n10CB 1 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8635 }
8636 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8637 {
8638 TI_DBG1(("ssatModeSelect6n10CB 2 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features));
8639 }
8640 else
8641 {
8642 TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8643 }
8644 }
8645 else if (hostToDevFis->h.command == SAT_SMART)
8646 {
8647 if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS))
8648 {
8649 TI_DBG1(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS failed, feature 0x%x\n", hostToDevFis->h.features));
8650 }
8651 else
8652 {
8653 TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8654 }
8655 }
8656 else
8657 {
8658 TI_DBG1(("satModeSelect6n10CB error default case command 0x%x\n", hostToDevFis->h.command));
8659 }
8660
8661
8662 satSetSensePayload( pSense,
8663 SCSI_SNSKEY_NO_SENSE,
8664 0,
8665 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8666 satOrgIOContext);
8667
8668 ostiInitiatorIOCompleted( tiRoot,
8669 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8670 tiIOSuccess,
8671 SCSI_STAT_CHECK_CONDITION,
8672 satOrgIOContext->pTiSenseData,
8673 satOrgIOContext->interruptContext );
8674
8675
8676 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8677
8678 satFreeIntIoResource( tiRoot,
8679 satDevData,
8680 satIntIo);
8681 return;
8682 } /* error checking */
8683 }
8684
8685
8686 /* prcessing the success case */
8687
8688
8689 if (hostToDevFis->h.command == SAT_SET_FEATURES)
8690 {
8691 if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02))
8692 {
8693 TI_DBG5(("satModeSelect6n10CB 1 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8694
8695 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8696
8697 satFreeIntIoResource( tiRoot,
8698 satDevData,
8699 satIntIo);
8700
8701 satNewIntIo = satAllocIntIoResource( tiRoot,
8702 tiOrgIORequest,
8703 satDevData,
8704 0,
8705 satNewIntIo);
8706 if (satNewIntIo == agNULL)
8707 {
8708 /* memory allocation failure */
8709 satFreeIntIoResource( tiRoot,
8710 satDevData,
8711 satNewIntIo);
8712
8713 satSetSensePayload( pSense,
8714 SCSI_SNSKEY_NO_SENSE,
8715 0,
8716 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8717 satOrgIOContext);
8718
8719 ostiInitiatorIOCompleted( tiRoot,
8720 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8721 tiIOSuccess,
8722 SCSI_STAT_CHECK_CONDITION,
8723 satOrgIOContext->pTiSenseData,
8724 satOrgIOContext->interruptContext );
8725 TI_DBG1(("satModeSelect6n10CB: momory allocation fails\n"));
8726 return;
8727 } /* end memory allocation */
8728
8729 satNewIOContext = satPrepareNewIO(
8730 satNewIntIo,
8731 tiOrgIORequest,
8732 satDevData,
8733 scsiCmnd,
8734 satOrgIOContext
8735 );
8736 /* sends either ATA SET FEATURES based on DRA bit */
8737 status = satModeSelect6n10_1( tiRoot,
8738 &satNewIntIo->satIntTiIORequest,
8739 satNewIOContext->ptiDeviceHandle,
8740 tiScsiRequest, /* orginal from OS layer */
8741 satNewIOContext
8742 );
8743
8744 if (status != tiSuccess)
8745 {
8746 /* sending ATA command fails */
8747 satFreeIntIoResource( tiRoot,
8748 satDevData,
8749 satNewIntIo);
8750 satSetSensePayload( pSense,
8751 SCSI_SNSKEY_NO_SENSE,
8752 0,
8753 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8754 satOrgIOContext);
8755
8756 ostiInitiatorIOCompleted( tiRoot,
8757 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8758 tiIOSuccess,
8759 SCSI_STAT_CHECK_CONDITION,
8760 satOrgIOContext->pTiSenseData,
8761 satOrgIOContext->interruptContext );
8762 TI_DBG1(("satModeSelect6n10CB calling satModeSelect6_1 fails\n"));
8763 return;
8764 } /* end send fails */
8765 return;
8766 }
8767 else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55))
8768 {
8769 TI_DBG5(("satModeSelect6n10CB 2 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features));
8770
8771 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8772
8773 satFreeIntIoResource( tiRoot,
8774 satDevData,
8775 satIntIo);
8776
8777 /* return stat_good */
8778 ostiInitiatorIOCompleted( tiRoot,
8779 tiOrgIORequest,
8780 tiIOSuccess,
8781 SCSI_STAT_GOOD,
8782 agNULL,
8783 satOrgIOContext->interruptContext );
8784 return;
8785 }
8786 else
8787 {
8788 TI_DBG1(("satModeSelect6n10CB error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8789
8790 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8791
8792 satFreeIntIoResource( tiRoot,
8793 satDevData,
8794 satIntIo);
8795 satSetSensePayload( pSense,
8796 SCSI_SNSKEY_NO_SENSE,
8797 0,
8798 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8799 satOrgIOContext);
8800
8801 ostiInitiatorIOCompleted( tiRoot,
8802 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8803 tiIOSuccess,
8804 SCSI_STAT_CHECK_CONDITION,
8805 satOrgIOContext->pTiSenseData,
8806 satOrgIOContext->interruptContext );
8807 return;
8808 }
8809 }
8810 else if (hostToDevFis->h.command == SAT_SMART_ENABLE_OPERATIONS ||
8811 hostToDevFis->h.command == SAT_SMART_DISABLE_OPERATIONS
8812 )
8813 {
8814 if ((hostToDevFis->h.features == 0xD8) || (hostToDevFis->h.features == 0xD9))
8815 {
8816 TI_DBG5(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS success, feature 0x%x\n", hostToDevFis->h.features));
8817
8818 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8819
8820 satFreeIntIoResource( tiRoot,
8821 satDevData,
8822 satIntIo);
8823 /* return stat_good */
8824 ostiInitiatorIOCompleted( tiRoot,
8825 tiOrgIORequest,
8826 tiIOSuccess,
8827 SCSI_STAT_GOOD,
8828 agNULL,
8829 satOrgIOContext->interruptContext );
8830 return;
8831 }
8832 else
8833 {
8834 TI_DBG1(("satModeSelect6n10CB error unknown command failed 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
8835
8836 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8837
8838 satFreeIntIoResource( tiRoot,
8839 satDevData,
8840 satIntIo);
8841 satSetSensePayload( pSense,
8842 SCSI_SNSKEY_NO_SENSE,
8843 0,
8844 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8845 satOrgIOContext);
8846
8847 ostiInitiatorIOCompleted( tiRoot,
8848 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8849 tiIOSuccess,
8850 SCSI_STAT_CHECK_CONDITION,
8851 satOrgIOContext->pTiSenseData,
8852 satOrgIOContext->interruptContext );
8853 return;
8854 }
8855 }
8856
8857 else
8858 {
8859 TI_DBG1(("satModeSelect6n10CB error default case command success 0x%x\n", hostToDevFis->h.command));
8860
8861 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8862
8863 satFreeIntIoResource( tiRoot,
8864 satDevData,
8865 satIntIo);
8866
8867 satSetSensePayload( pSense,
8868 SCSI_SNSKEY_NO_SENSE,
8869 0,
8870 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
8871 satOrgIOContext);
8872
8873 ostiInitiatorIOCompleted( tiRoot,
8874 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
8875 tiIOSuccess,
8876 SCSI_STAT_CHECK_CONDITION,
8877 satOrgIOContext->pTiSenseData,
8878 satOrgIOContext->interruptContext );
8879 return;
8880 }
8881
8882 return;
8883 }
8884
8885 /*****************************************************************************
8886 *! \brief satSMARTEnableCB
8887 *
8888 * This routine is a callback function for satSMARTEnable()
8889 *
8890 * \param agRoot: Handles for this instance of SAS/SATA hardware
8891 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
8892 * \param agIOStatus: Status of completed I/O.
8893 * \param agFirstDword:Pointer to the four bytes of FIS.
8894 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8895 * length.
8896 * \param agParam: Additional info based on status.
8897 * \param ioContext: Pointer to satIOContext_t.
8898 *
8899 * \return: none
8900 *
8901 *****************************************************************************/
8902 void satSMARTEnableCB(
8903 agsaRoot_t *agRoot,
8904 agsaIORequest_t *agIORequest,
8905 bit32 agIOStatus,
8906 agsaFisHeader_t *agFirstDword,
8907 bit32 agIOInfoLen,
8908 void *agParam,
8909 void *ioContext
8910 )
8911 {
8912 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
8913 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
8914 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
8915 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8916 tdIORequestBody_t *tdIORequestBody;
8917 tdIORequestBody_t *tdOrgIORequestBody;
8918 satIOContext_t *satIOContext;
8919 satIOContext_t *satOrgIOContext;
8920 satIOContext_t *satNewIOContext;
8921 satInternalIo_t *satIntIo;
8922 satInternalIo_t *satNewIntIo = agNULL;
8923 satDeviceData_t *satDevData;
8924 tiIORequest_t *tiOrgIORequest;
8925 tiIniScsiCmnd_t *scsiCmnd;
8926 bit32 status;
8927
8928 TI_DBG4(("satSMARTEnableCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
8929
8930 /* internally generate tiIOContext */
8931 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8932 satIOContext = (satIOContext_t *) ioContext;
8933 satIntIo = satIOContext->satIntIoContext;
8934 satDevData = satIOContext->pSatDevData;
8935
8936 /*ttttttthe one */
8937 if (satIntIo == agNULL)
8938 {
8939 TI_DBG4(("satSMARTEnableCB: External satInternalIo_t satIntIoContext\n"));
8940 satOrgIOContext = satIOContext;
8941 tiOrgIORequest = tdIORequestBody->tiIORequest;
8942 scsiCmnd = satOrgIOContext->pScsiCmnd;
8943 }
8944 else
8945 {
8946 TI_DBG4(("satSMARTEnableCB: Internal satInternalIo_t satIntIoContext\n"));
8947 satOrgIOContext = satIOContext->satOrgIOContext;
8948 if (satOrgIOContext == agNULL)
8949 {
8950 TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NULL, wrong\n"));
8951 return;
8952 }
8953 else
8954 {
8955 TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NOT NULL\n"));
8956 }
8957 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
8958 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
8959
8960 scsiCmnd = satOrgIOContext->pScsiCmnd;
8961 }
8962
8963 tdIORequestBody->ioCompleted = agTRUE;
8964 tdIORequestBody->ioStarted = agFALSE;
8965
8966 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
8967 {
8968 TI_DBG1(("satSMARTEnableCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
8969 ostiInitiatorIOCompleted (
8970 tiRoot,
8971 tiOrgIORequest,
8972 tiIOFailed,
8973 tiDetailOtherError,
8974 agNULL,
8975 satOrgIOContext->interruptContext
8976 );
8977
8978 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
8979
8980 satFreeIntIoResource( tiRoot,
8981 satDevData,
8982 satIntIo);
8983
8984 return;
8985 }
8986
8987 /*
8988 checking IO status, FIS type and error status
8989 */
8990 if (agIOStatus != OSSA_IO_SUCCESS)
8991 {
8992 TI_DBG1(("satSMARTEnableCB: not success status, status %d\n", agIOStatus));
8993 ostiInitiatorIOCompleted (
8994 tiRoot,
8995 tiOrgIORequest,
8996 tiIOFailed,
8997 tiDetailOtherError,
8998 agNULL,
8999 satOrgIOContext->interruptContext
9000 );
9001
9002 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9003
9004 satFreeIntIoResource( tiRoot,
9005 satDevData,
9006 satIntIo);
9007
9008 return;
9009 }
9010
9011 /* process success case */
9012 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9013
9014 satFreeIntIoResource( tiRoot,
9015 satDevData,
9016 satIntIo);
9017
9018 satNewIntIo = satAllocIntIoResource( tiRoot,
9019 tiOrgIORequest,
9020 satDevData,
9021 512,
9022 satNewIntIo);
9023
9024 if (satNewIntIo == agNULL)
9025 {
9026 /* memory allocation failure */
9027 satFreeIntIoResource( tiRoot,
9028 satDevData,
9029 satNewIntIo);
9030
9031 ostiInitiatorIOCompleted (
9032 tiRoot,
9033 tiOrgIORequest,
9034 tiIOFailed,
9035 tiDetailOtherError,
9036 agNULL,
9037 satOrgIOContext->interruptContext
9038 );
9039 return;
9040 }
9041
9042 satNewIOContext = satPrepareNewIO(
9043 satNewIntIo,
9044 tiOrgIORequest,
9045 satDevData,
9046 scsiCmnd,
9047 satOrgIOContext
9048 );
9049
9050 status = satLogSense_1(tiRoot,
9051 &satNewIntIo->satIntTiIORequest,
9052 satNewIOContext->ptiDeviceHandle,
9053 &satNewIntIo->satIntTiScsiXchg,
9054 satNewIOContext);
9055
9056 if (status != tiSuccess)
9057 {
9058 /* sending SAT_CHECK_POWER_MODE fails */
9059 satFreeIntIoResource( tiRoot,
9060 satDevData,
9061 satNewIntIo);
9062
9063 ostiInitiatorIOCompleted (
9064 tiRoot,
9065 tiOrgIORequest,
9066 tiIOFailed,
9067 tiDetailOtherError,
9068 agNULL,
9069 satOrgIOContext->interruptContext
9070 );
9071
9072 return;
9073 }
9074
9075 return;
9076 }
9077
9078
9079 /*****************************************************************************
9080 *! \brief satLogSenseCB
9081 *
9082 * This routine is a callback function for satLogSense()
9083 *
9084 * \param agRoot: Handles for this instance of SAS/SATA hardware
9085 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
9086 * \param agIOStatus: Status of completed I/O.
9087 * \param agFirstDword:Pointer to the four bytes of FIS.
9088 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
9089 * length.
9090 * \param agParam: Additional info based on status.
9091 * \param ioContext: Pointer to satIOContext_t.
9092 *
9093 * \return: none
9094 *
9095 *****************************************************************************/
9096 void satLogSenseCB(
9097 agsaRoot_t *agRoot,
9098 agsaIORequest_t *agIORequest,
9099 bit32 agIOStatus,
9100 agsaFisHeader_t *agFirstDword,
9101 bit32 agIOInfoLen,
9102 void *agParam,
9103 void *ioContext
9104 )
9105 {
9106
9107 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
9108 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
9109 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
9110 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9111 tdIORequestBody_t *tdIORequestBody;
9112 tdIORequestBody_t *tdOrgIORequestBody;
9113 satIOContext_t *satIOContext;
9114 satIOContext_t *satOrgIOContext;
9115 satInternalIo_t *satIntIo;
9116 satDeviceData_t *satDevData;
9117
9118 scsiRspSense_t *pSense;
9119 tiIORequest_t *tiOrgIORequest;
9120
9121 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
9122 bit32 ataStatus = 0;
9123 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
9124 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9125 satReadLogExtSelfTest_t *virtAddr1;
9126 satSmartReadLogSelfTest_t *virtAddr2;
9127 bit8 *pLogPage;
9128 bit8 SelfTestExecutionStatus = 0;
9129 bit32 i = 0;
9130
9131 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
9132 agsaFisRegD2HData_t statDevToHostFisData;
9133 tiIniScsiCmnd_t *scsiCmnd;
9134 bit32 lenReceived = 0;
9135
9136 TI_DBG5(("satLogSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9137
9138 /* internally generate tiIOContext */
9139 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
9140 satIOContext = (satIOContext_t *) ioContext;
9141 if (satIOContext == agNULL)
9142 {
9143 TI_DBG1(("satLogSenseCB: satIOContext is NULL\n"));
9144 return;
9145 }
9146 satIntIo = satIOContext->satIntIoContext;
9147 satDevData = satIOContext->pSatDevData;
9148 hostToDevFis = satIOContext->pFis;
9149
9150 if (satIntIo == agNULL)
9151 {
9152 TI_DBG4(("satLogSenseCB: External satInternalIo_t satIntIoContext\n"));
9153 satOrgIOContext = satIOContext;
9154 tiOrgIORequest = tdIORequestBody->tiIORequest;
9155 pSense = satOrgIOContext->pSense;
9156 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9157 /* SCSI command response payload to OS layer */
9158 pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9159 /* ATA command response payload */
9160 tiScsiRequest = satOrgIOContext->tiScsiXchg;
9161 scsiCmnd = satOrgIOContext->pScsiCmnd;
9162 }
9163 else
9164 {
9165 TI_DBG4(("satLogSenseCB: Internal satInternalIo_t satIntIoContext\n"));
9166 satOrgIOContext = satIOContext->satOrgIOContext;
9167 if (satOrgIOContext == agNULL)
9168 {
9169 TI_DBG4(("satLogSenseCB: satOrgIOContext is NULL\n"));
9170 }
9171 else
9172 {
9173 TI_DBG4(("satLogSenseCB: satOrgIOContext is NOT NULL\n"));
9174 }
9175
9176 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9177 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9178
9179 pSense = satOrgIOContext->pSense;
9180 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9181 /* SCSI command response payload to OS layer */
9182 pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9183 /* ATA command response payload */
9184 tiScsiRequest = (tiScsiInitiatorRequest_t *)&(satIntIo->satIntTiScsiXchg);
9185 scsiCmnd = satOrgIOContext->pScsiCmnd;
9186 }
9187
9188 tdIORequestBody->ioCompleted = agTRUE;
9189 tdIORequestBody->ioStarted = agFALSE;
9190
9191 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9192 {
9193 TI_DBG1(("satLogSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9194 ostiInitiatorIOCompleted (
9195 tiRoot,
9196 tiOrgIORequest,
9197 tiIOFailed,
9198 tiDetailOtherError,
9199 agNULL,
9200 satOrgIOContext->interruptContext
9201 );
9202 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9203
9204 satFreeIntIoResource( tiRoot,
9205 satDevData,
9206 satIntIo);
9207 return;
9208 }
9209
9210 if (agIOStatus != OSSA_IO_SUCCESS)
9211 {
9212 /* non-data and pio read -> device to host and pio setup fis are expected */
9213 /*
9214 first, assumed to be Reg Device to Host FIS
9215 This is OK to just find fis type
9216 */
9217 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
9218 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
9219 }
9220
9221 if( agIOStatus != OSSA_IO_SUCCESS)
9222 {
9223 if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) &&
9224 (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) ||
9225 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
9226 )
9227 {
9228 /* for debugging */
9229 if( agIOStatus != OSSA_IO_SUCCESS)
9230 {
9231 TI_DBG1(("satLogSenseCB: FAILED, NOT IO_SUCCESS\n"));
9232 }
9233 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
9234 {
9235 TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9236 }
9237 else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)
9238 {
9239 TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
9240 }
9241 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
9242 (ataStatus & DF_ATA_STATUS_MASK)
9243 )
9244 {
9245 TI_DBG1(("satLogSenseCB: FAILED, FAILED, error status\n"));
9246 }
9247
9248 /* Process abort case */
9249 if (agIOStatus == OSSA_IO_ABORTED)
9250 {
9251 satProcessAbort(tiRoot,
9252 tiOrgIORequest,
9253 satOrgIOContext
9254 );
9255
9256 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9257
9258 satFreeIntIoResource( tiRoot,
9259 satDevData,
9260 satIntIo);
9261 return;
9262 }
9263
9264 /* for debugging */
9265 if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9266 {
9267 TI_DBG1(("satLogSenseCB: SAT_READ_LOG_EXT failed\n"));
9268 }
9269 else if (hostToDevFis->h.command == SAT_SMART)
9270 {
9271 if (hostToDevFis->h.features == SAT_SMART_READ_LOG)
9272 {
9273 TI_DBG1(("satLogSenseCB: SAT_SMART_READ_LOG failed\n"));
9274 }
9275 else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS)
9276 {
9277 TI_DBG1(("satLogSenseCB: SAT_SMART_RETURN_STATUS failed\n"));
9278 }
9279 else
9280 {
9281 TI_DBG1(("satLogSenseCB: error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9282 }
9283 }
9284 else
9285 {
9286 TI_DBG1(("satLogSenseCB: error default case command 0x%x\n", hostToDevFis->h.command));
9287 }
9288
9289 satSetSensePayload( pSense,
9290 SCSI_SNSKEY_NO_SENSE,
9291 0,
9292 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9293 satOrgIOContext);
9294
9295 ostiInitiatorIOCompleted( tiRoot,
9296 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9297 tiIOSuccess,
9298 SCSI_STAT_CHECK_CONDITION,
9299 satOrgIOContext->pTiSenseData,
9300 satOrgIOContext->interruptContext );
9301
9302 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9303
9304 satFreeIntIoResource( tiRoot,
9305 satDevData,
9306 satIntIo);
9307 return;
9308
9309 } /* error checking */
9310 }
9311
9312 /* prcessing the success case */
9313 saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t));
9314
9315 lenReceived = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8];
9316 TI_DBG5(("satLogSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9317
9318
9319 if (hostToDevFis->h.command == SAT_READ_LOG_EXT)
9320 {
9321 TI_DBG5(("satLogSenseCB: SAT_READ_LOG_EXT success\n"));
9322
9323 /* process log data and sends it to upper */
9324
9325 /* ATA: Extended Self-Test Log */
9326 virtAddr1 = (satReadLogExtSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9327 /*
9328 ATA/ATAPI VOLII, p197, 287
9329 self-test execution status (4 bits); ((virtAddr1->byte[5] & 0xF0) >> 4)
9330 */
9331 SelfTestExecutionStatus = (bit8)(((virtAddr1->byte[5] & 0xF0) >> 4));
9332
9333 /* fills in the log page from ATA log page */
9334 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9335 pLogPage[0] = 0x10; /* page code */
9336 pLogPage[1] = 0;
9337 pLogPage[2] = 0x01; /* 0x190, page length */
9338 pLogPage[3] = 0x90;
9339
9340 /* SPC-4, Table 217 */
9341 pLogPage[4] = 0; /* Parameter Code */
9342 pLogPage[5] = 0x01; /* Parameter Code, unspecfied but ... */
9343 pLogPage[6] = 3; /* unspecified but ... */
9344 pLogPage[7] = 0x10; /* Parameter Length */
9345 pLogPage[8] = (bit8)(0 | ((virtAddr1->byte[5] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9346 pLogPage[9] = 0; /* self test number */
9347 pLogPage[10] = virtAddr1->byte[7]; /* time stamp, MSB */
9348 pLogPage[11] = virtAddr1->byte[6]; /* time stamp, LSB */
9349
9350 pLogPage[12] = 0; /* address of first failure MSB*/
9351 pLogPage[13] = 0; /* address of first failure */
9352 pLogPage[14] = virtAddr1->byte[14]; /* address of first failure */
9353 pLogPage[15] = virtAddr1->byte[13]; /* address of first failure */
9354 pLogPage[16] = virtAddr1->byte[12]; /* address of first failure */
9355 pLogPage[17] = virtAddr1->byte[11]; /* address of first failure */
9356 pLogPage[18] = virtAddr1->byte[10]; /* address of first failure */
9357 pLogPage[19] = virtAddr1->byte[9]; /* address of first failure LSB */
9358
9359 /* SAT rev8 Table75, p 76 */
9360 switch (SelfTestExecutionStatus)
9361 {
9362 case 0:
9363 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9364 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9365 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9366 break;
9367 case 1:
9368 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9369 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9370 pLogPage[22] = 0x81;
9371 break;
9372 case 2:
9373 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9374 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9375 pLogPage[22] = 0x82;
9376 break;
9377 case 3:
9378 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9379 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9380 pLogPage[22] = 0x83;
9381 break;
9382 case 4:
9383 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9384 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9385 pLogPage[22] = 0x84;
9386 break;
9387 case 5:
9388 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9389 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9390 pLogPage[22] = 0x85;
9391 break;
9392 case 6:
9393 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9394 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9395 pLogPage[22] = 0x86;
9396 break;
9397 case 7:
9398 pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9399 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9400 pLogPage[22] = 0x87;
9401 break;
9402 case 8:
9403 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9404 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9405 pLogPage[22] = 0x88;
9406 break;
9407 case 9: /* fall through */
9408 case 10:/* fall through */
9409 case 11:/* fall through */
9410 case 12:/* fall through */
9411 case 13:/* fall through */
9412 case 14:
9413 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9414 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9415 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9416 break;
9417 case 15:
9418 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9419 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9420 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9421 break;
9422 default:
9423 TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9424
9425 satSetSensePayload( pSense,
9426 SCSI_SNSKEY_NO_SENSE,
9427 0,
9428 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9429 satOrgIOContext);
9430
9431 ostiInitiatorIOCompleted( tiRoot,
9432 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9433 tiIOSuccess,
9434 SCSI_STAT_CHECK_CONDITION,
9435 satOrgIOContext->pTiSenseData,
9436 satOrgIOContext->interruptContext );
9437
9438 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9439
9440 satFreeIntIoResource( tiRoot,
9441 satDevData,
9442 satIntIo);
9443
9444 return;
9445 }
9446
9447 pLogPage[23] = 0; /* vendor specific */
9448
9449 /* the rest of Self-test results log */
9450 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9451 for (i=24;i<=403;i++)
9452 {
9453 pLogPage[i] = 0; /* vendor specific */
9454 }
9455
9456 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9457 {
9458 TI_DBG6(("satLogSenseCB: 1st underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9459
9460 /* underrun */
9461 ostiInitiatorIOCompleted( tiRoot,
9462 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9463 tiIOUnderRun,
9464 lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9465 agNULL,
9466 satOrgIOContext->interruptContext );
9467
9468 }
9469 else
9470 {
9471 ostiInitiatorIOCompleted( tiRoot,
9472 tiOrgIORequest,
9473 tiIOSuccess,
9474 SCSI_STAT_GOOD,
9475 agNULL,
9476 satOrgIOContext->interruptContext);
9477 }
9478
9479 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9480
9481 satFreeIntIoResource( tiRoot,
9482 satDevData,
9483 satIntIo);
9484
9485 return;
9486 }
9487 else if (hostToDevFis->h.command == SAT_SMART_READ_LOG
9488 || hostToDevFis->h.command == SAT_SMART_RETURN_STATUS)
9489 {
9490 if (hostToDevFis->h.features == 0xd5)
9491 {
9492 TI_DBG5(("satLogSenseCB: SAT_SMART_READ_LOG success\n"));
9493 /* process log data and sends it to upper */
9494
9495 /* ATA: Extended Self-Test Log */
9496 virtAddr2 = (satSmartReadLogSelfTest_t *)(tiScsiRequest->sglVirtualAddr);
9497 /*
9498 SPC-4, p197, 287
9499 self-test execution status (4 bits); ((virtAddr2->byte[3] & 0xF0) >> 4)
9500 */
9501 SelfTestExecutionStatus = (bit8)(((virtAddr2->byte[3] & 0xF0) >> 4));
9502
9503 /* fills in the log page from ATA log page */
9504 /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */
9505 pLogPage[0] = 0x10; /* page code */
9506 pLogPage[1] = 0;
9507 pLogPage[2] = 0x01; /* 0x190, page length */
9508 pLogPage[3] = 0x90; /* 0x190, page length */
9509
9510 /* SPC-4, Table 217 */
9511 pLogPage[4] = 0; /* Parameter Code */
9512 pLogPage[5] = 0x01; /* Parameter Code unspecfied but ... */
9513 pLogPage[6] = 3; /* unspecified but ... */
9514 pLogPage[7] = 0x10; /* Parameter Length */
9515 pLogPage[8] = (bit8)(0 | ((virtAddr2->byte[3] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */
9516 pLogPage[9] = 0; /* self test number */
9517 pLogPage[10] = virtAddr2->byte[5]; /* time stamp, MSB */
9518 pLogPage[11] = virtAddr2->byte[4]; /* time stamp, LSB */
9519
9520 pLogPage[12] = 0; /* address of first failure MSB*/
9521 pLogPage[13] = 0; /* address of first failure */
9522 pLogPage[14] = 0; /* address of first failure */
9523 pLogPage[15] = 0; /* address of first failure */
9524 pLogPage[16] = virtAddr2->byte[10]; /* address of first failure */
9525 pLogPage[17] = virtAddr2->byte[9]; /* address of first failure */
9526 pLogPage[18] = virtAddr2->byte[8]; /* address of first failure */
9527 pLogPage[19] = virtAddr2->byte[7]; /* address of first failure LSB */
9528
9529 /* SAT rev8 Table75, p 76 */
9530 switch (SelfTestExecutionStatus)
9531 {
9532 case 0:
9533 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9534 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9535 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9536 break;
9537 case 1:
9538 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9539 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9540 pLogPage[22] = 0x81;
9541 break;
9542 case 2:
9543 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9544 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9545 pLogPage[22] = 0x82;
9546 break;
9547 case 3:
9548 pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND;
9549 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9550 pLogPage[22] = 0x83;
9551 break;
9552 case 4:
9553 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9554 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9555 pLogPage[22] = 0x84;
9556 break;
9557 case 5:
9558 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9559 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9560 pLogPage[22] = 0x85;
9561 break;
9562 case 6:
9563 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9564 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9565 pLogPage[22] = 0x86;
9566 break;
9567 case 7:
9568 pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR;
9569 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9570 pLogPage[22] = 0x87;
9571 break;
9572 case 8:
9573 pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR;
9574 pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF;
9575 pLogPage[22] = 0x88;
9576 break;
9577 case 9: /* fall through */
9578 case 10:/* fall through */
9579 case 11:/* fall through */
9580 case 12:/* fall through */
9581 case 13:/* fall through */
9582 case 14:
9583 /* unspecified */
9584 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9585 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9586 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9587 break;
9588 case 15:
9589 pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE;
9590 pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF;
9591 pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF;
9592 break;
9593 default:
9594 TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus));
9595
9596 satSetSensePayload( pSense,
9597 SCSI_SNSKEY_NO_SENSE,
9598 0,
9599 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9600 satOrgIOContext);
9601
9602 ostiInitiatorIOCompleted( tiRoot,
9603 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9604 tiIOSuccess,
9605 SCSI_STAT_CHECK_CONDITION,
9606 satOrgIOContext->pTiSenseData,
9607 satOrgIOContext->interruptContext );
9608
9609 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9610
9611 satFreeIntIoResource( tiRoot,
9612 satDevData,
9613 satIntIo);
9614
9615 return;
9616 }
9617
9618 pLogPage[23] = 0; /* vendor specific */
9619
9620 /* the rest of Self-test results log */
9621 /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/
9622 for (i=24;i<=403;i++)
9623 {
9624 pLogPage[i] = 0; /* vendor specific */
9625 }
9626
9627 if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived)
9628 {
9629 TI_DBG6(("satLogSenseCB: 2nd underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH));
9630
9631 /* underrun */
9632 ostiInitiatorIOCompleted( tiRoot,
9633 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9634 tiIOUnderRun,
9635 lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH,
9636 agNULL,
9637 satOrgIOContext->interruptContext );
9638
9639 }
9640 else
9641 {
9642 ostiInitiatorIOCompleted( tiRoot,
9643 tiOrgIORequest,
9644 tiIOSuccess,
9645 SCSI_STAT_GOOD,
9646 agNULL,
9647 satOrgIOContext->interruptContext);
9648 }
9649 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9650
9651 satFreeIntIoResource( tiRoot,
9652 satDevData,
9653 satIntIo);
9654
9655 return;
9656 }
9657 else if (hostToDevFis->h.features == 0xda)
9658 {
9659 TI_DBG5(("satLogSenseCB: SAT_SMART_RETURN_STATUS success\n"));
9660
9661 /* fills in the log page from ATA output */
9662 /* SPC-4, 7.2.5, Table 209, 211, p 255 */
9663 pLogPage[0] = 0x2F; /* page code unspecified */
9664 pLogPage[1] = 0; /* reserved */
9665 pLogPage[2] = 0; /* page length */
9666 pLogPage[3] = 0x07; /* page length */
9667
9668 /*
9669 SPC-4, 7.2.5, Table 211, p 255
9670 no vendor specific field
9671 */
9672 pLogPage[4] = 0; /* Parameter Code */
9673 pLogPage[5] = 0; /* Parameter Code unspecfied but to do: */
9674 pLogPage[6] = 0; /* unspecified */
9675 pLogPage[7] = 0x03; /* Parameter length, unspecified */
9676
9677 /* SAT rev8, 10.2.3.1 Table 72, p 73 */
9678 if (statDevToHostFisData.lbaMid == 0x4F || statDevToHostFisData.lbaHigh == 0xC2)
9679 {
9680 pLogPage[8] = 0; /* Sense code */
9681 pLogPage[9] = 0; /* Sense code qualifier */
9682 }
9683 else if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C)
9684 {
9685 pLogPage[8] = 0x5D; /* Sense code */
9686 pLogPage[9] = 0x10; /* Sense code qualifier */
9687 }
9688
9689 /* Assumption: No support for SCT */
9690 pLogPage[10] = 0xFF; /* Most Recent Temperature Reading */
9691
9692 if (INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH < lenReceived)
9693 {
9694 TI_DBG6(("satLogSenseCB: 3rd underrun lenReceived %d len %d \n", lenReceived, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH));
9695
9696 /* underrun */
9697 ostiInitiatorIOCompleted( tiRoot,
9698 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9699 tiIOUnderRun,
9700 lenReceived - INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH,
9701 agNULL,
9702 satOrgIOContext->interruptContext );
9703
9704 }
9705 else
9706 {
9707 ostiInitiatorIOCompleted( tiRoot,
9708 tiOrgIORequest,
9709 tiIOSuccess,
9710 SCSI_STAT_GOOD,
9711 agNULL,
9712 satOrgIOContext->interruptContext);
9713 }
9714
9715 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9716
9717 satFreeIntIoResource( tiRoot,
9718 satDevData,
9719 satIntIo);
9720
9721
9722 return;
9723 }
9724 else
9725 {
9726 TI_DBG1(("satLogSenseCB: error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features));
9727 satSetSensePayload( pSense,
9728 SCSI_SNSKEY_NO_SENSE,
9729 0,
9730 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9731 satOrgIOContext);
9732
9733 ostiInitiatorIOCompleted( tiRoot,
9734 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9735 tiIOSuccess,
9736 SCSI_STAT_CHECK_CONDITION,
9737 satOrgIOContext->pTiSenseData,
9738 satOrgIOContext->interruptContext );
9739 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9740
9741 satFreeIntIoResource( tiRoot,
9742 satDevData,
9743 satIntIo);
9744
9745 return;
9746 }
9747 }
9748 else
9749 {
9750 TI_DBG1(("satLogSenseCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9751 satSetSensePayload( pSense,
9752 SCSI_SNSKEY_NO_SENSE,
9753 0,
9754 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9755 satOrgIOContext);
9756
9757 ostiInitiatorIOCompleted( tiRoot,
9758 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9759 tiIOSuccess,
9760 SCSI_STAT_CHECK_CONDITION,
9761 satOrgIOContext->pTiSenseData,
9762 satOrgIOContext->interruptContext );
9763
9764 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9765
9766 satFreeIntIoResource( tiRoot,
9767 satDevData,
9768 satIntIo);
9769
9770 return;
9771 }
9772
9773 return;
9774 }
9775
9776 /*****************************************************************************
9777 *! \brief satReadMediaSerialNumberCB
9778 *
9779 * This routine is a callback function called from ossaSATACompleted().
9780 * This CB routine deals with Read Media Serial Number completion.
9781 *
9782 * \param agRoot: Handles for this instance of SAS/SATA hardware
9783 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
9784 * \param agIOStatus: Status of completed I/O.
9785 * \param agSATAParm1: Additional info based on status.
9786 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
9787 * length.
9788 * \param ioContext: Pointer to satIOContext_t.
9789 *
9790 * \return: none
9791 *
9792 *****************************************************************************/
9793 void satReadMediaSerialNumberCB(
9794 agsaRoot_t *agRoot,
9795 agsaIORequest_t *agIORequest,
9796 bit32 agIOStatus,
9797 agsaFisHeader_t *agFirstDword,
9798 bit32 agIOInfoLen,
9799 agsaFrameHandle_t agFrameHandle,
9800 void *ioContext
9801 )
9802 {
9803 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
9804 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
9805 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
9806 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
9807 tdIORequestBody_t *tdIORequestBody;
9808 tdIORequestBody_t *tdOrgIORequestBody;
9809 satIOContext_t *satIOContext;
9810 satIOContext_t *satOrgIOContext;
9811 satInternalIo_t *satIntIo;
9812 satDeviceData_t *satDevData;
9813
9814 scsiRspSense_t *pSense;
9815 tiIORequest_t *tiOrgIORequest;
9816
9817 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
9818 tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */
9819 bit8 *pMediaSerialNumber;
9820
9821 tiIniScsiCmnd_t *scsiCmnd;
9822 bit32 lenReceived = 0;
9823
9824 TI_DBG4(("satReadMediaSerialNumberCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
9825
9826 /* internally generate tiIOContext */
9827 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
9828 satIOContext = (satIOContext_t *) ioContext;
9829 satIntIo = satIOContext->satIntIoContext;
9830 satDevData = satIOContext->pSatDevData;
9831 hostToDevFis = satIOContext->pFis;
9832
9833 if (satIntIo == agNULL)
9834 {
9835 TI_DBG4(("satReadMediaSerialNumberCB: External satInternalIo_t satIntIoContext\n"));
9836 satOrgIOContext = satIOContext;
9837 tiOrgIORequest = tdIORequestBody->tiIORequest;
9838 pSense = satOrgIOContext->pSense;
9839 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9840 /* SCSI command response payload to OS layer */
9841 pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9842 /* ATA command response payload */
9843 scsiCmnd = satOrgIOContext->pScsiCmnd;
9844
9845
9846 }
9847 else
9848 {
9849 TI_DBG4(("satReadMediaSerialNumberCB: Internal satInternalIo_t satIntIoContext\n"));
9850 satOrgIOContext = satIOContext->satOrgIOContext;
9851 if (satOrgIOContext == agNULL)
9852 {
9853 TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NULL, wrong\n"));
9854 return;
9855 }
9856 else
9857 {
9858 TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NOT NULL\n"));
9859 }
9860 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
9861 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
9862
9863 pSense = satOrgIOContext->pSense;
9864 tiOrgScsiRequest = satOrgIOContext->tiScsiXchg;
9865 /* SCSI command response payload to OS layer */
9866 pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr;
9867 /* ATA command response payload */
9868 scsiCmnd = satOrgIOContext->pScsiCmnd;
9869 }
9870
9871 tdIORequestBody->ioCompleted = agTRUE;
9872 tdIORequestBody->ioStarted = agFALSE;
9873
9874 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
9875 {
9876 TI_DBG1(("satReadMediaSerialNumberCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
9877 ostiInitiatorIOCompleted (
9878 tiRoot,
9879 tiOrgIORequest,
9880 tiIOFailed,
9881 tiDetailOtherError,
9882 agNULL,
9883 satOrgIOContext->interruptContext
9884 );
9885 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9886
9887 satFreeIntIoResource( tiRoot,
9888 satDevData,
9889 satIntIo);
9890 return;
9891 }
9892
9893 if( agIOStatus != OSSA_IO_SUCCESS)
9894 {
9895 /* Process abort case */
9896 if (agIOStatus == OSSA_IO_ABORTED)
9897 {
9898 satProcessAbort(tiRoot,
9899 tiOrgIORequest,
9900 satOrgIOContext
9901 );
9902
9903 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9904
9905 satFreeIntIoResource( tiRoot,
9906 satDevData,
9907 satIntIo);
9908 return;
9909 }
9910 satSetSensePayload( pSense,
9911 SCSI_SNSKEY_NOT_READY,
9912 0,
9913 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
9914 satOrgIOContext);
9915
9916 ostiInitiatorIOCompleted( tiRoot,
9917 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9918 tiIOSuccess,
9919 SCSI_STAT_CHECK_CONDITION,
9920 satOrgIOContext->pTiSenseData,
9921 satOrgIOContext->interruptContext );
9922
9923 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9924
9925 satFreeIntIoResource( tiRoot,
9926 satDevData,
9927 satIntIo);
9928 return;
9929 }
9930
9931 /* process success case */
9932 lenReceived = (scsiCmnd->cdb[6] << (8*3)) + (scsiCmnd->cdb[7] << (8*2))
9933 + (scsiCmnd->cdb[8] << 8) + scsiCmnd->cdb[9];
9934 TI_DBG5(("satReadMediaSerialNumberCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived));
9935
9936 if (hostToDevFis->h.command == SAT_READ_SECTORS ||
9937 hostToDevFis->h.command == SAT_READ_SECTORS_EXT
9938 )
9939 {
9940 pMediaSerialNumber[0] = 0;
9941 pMediaSerialNumber[1] = 0;
9942 pMediaSerialNumber[2] = 0;
9943 pMediaSerialNumber[3] = 4;
9944 pMediaSerialNumber[4] = 0;
9945 pMediaSerialNumber[5] = 0;
9946 pMediaSerialNumber[6] = 0;
9947 pMediaSerialNumber[7] = 0;
9948
9949 if (ZERO_MEDIA_SERIAL_NUMBER_LENGTH < lenReceived)
9950 {
9951 TI_DBG1(("satReadMediaSerialNumberCB: 1st underrun lenReceived %d len %d \n", lenReceived, ZERO_MEDIA_SERIAL_NUMBER_LENGTH));
9952
9953 /* underrun */
9954 ostiInitiatorIOCompleted( tiRoot,
9955 tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */
9956 tiIOUnderRun,
9957 lenReceived - ZERO_MEDIA_SERIAL_NUMBER_LENGTH,
9958 agNULL,
9959 satOrgIOContext->interruptContext );
9960
9961 }
9962 else
9963 {
9964 ostiInitiatorIOCompleted( tiRoot,
9965 tiOrgIORequest,
9966 tiIOSuccess,
9967 SCSI_STAT_GOOD,
9968 agNULL,
9969 satOrgIOContext->interruptContext);
9970 }
9971 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9972
9973 satFreeIntIoResource( tiRoot,
9974 satDevData,
9975 satIntIo);
9976 return;
9977 }
9978 else
9979 {
9980 TI_DBG1(("satReadMediaSerialNumberCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
9981 satSetSensePayload( pSense,
9982 SCSI_SNSKEY_NO_SENSE,
9983 0,
9984 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
9985 satOrgIOContext);
9986
9987 ostiInitiatorIOCompleted( tiRoot,
9988 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
9989 tiIOSuccess,
9990 SCSI_STAT_CHECK_CONDITION,
9991 satOrgIOContext->pTiSenseData,
9992 satOrgIOContext->interruptContext );
9993
9994 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
9995
9996 satFreeIntIoResource( tiRoot,
9997 satDevData,
9998 satIntIo);
9999
10000 return;
10001 }
10002 return;
10003 }
10004
10005 /*****************************************************************************
10006 *! \brief satReadBufferCB
10007 *
10008 * This routine is a callback function called from ossaSATACompleted().
10009 * This CB routine deals with Read Buffer.
10010 *
10011 * \param agRoot: Handles for this instance of SAS/SATA hardware
10012 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10013 * \param agIOStatus: Status of completed I/O.
10014 * \param agSATAParm1: Additional info based on status.
10015 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10016 * length.
10017 * \param ioContext: Pointer to satIOContext_t.
10018 *
10019 * \return: none
10020 *
10021 *****************************************************************************/
10022 void satReadBufferCB(
10023 agsaRoot_t *agRoot,
10024 agsaIORequest_t *agIORequest,
10025 bit32 agIOStatus,
10026 agsaFisHeader_t *agFirstDword,
10027 bit32 agIOInfoLen,
10028 agsaFrameHandle_t agFrameHandle,
10029 void *ioContext
10030 )
10031 {
10032 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10033 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10034 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10035 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10036 tdIORequestBody_t *tdIORequestBody;
10037 tdIORequestBody_t *tdOrgIORequestBody;
10038 satIOContext_t *satIOContext;
10039 satIOContext_t *satOrgIOContext;
10040 satInternalIo_t *satIntIo;
10041 satDeviceData_t *satDevData;
10042 scsiRspSense_t *pSense;
10043 tiIORequest_t *tiOrgIORequest;
10044 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
10045
10046 TI_DBG4(("satReadBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10047
10048 /* internally generate tiIOContext */
10049 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10050 satIOContext = (satIOContext_t *) ioContext;
10051 satIntIo = satIOContext->satIntIoContext;
10052 satDevData = satIOContext->pSatDevData;
10053 hostToDevFis = satIOContext->pFis;
10054
10055
10056 if (satIntIo == agNULL)
10057 {
10058 TI_DBG4(("satReadBufferCB: External satInternalIo_t satIntIoContext\n"));
10059 satOrgIOContext = satIOContext;
10060 tiOrgIORequest = tdIORequestBody->tiIORequest;
10061 pSense = satOrgIOContext->pSense;
10062
10063 /* SCSI command response payload to OS layer */
10064
10065 /* ATA command response payload */
10066
10067 }
10068 else
10069 {
10070 TI_DBG4(("satReadBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10071 satOrgIOContext = satIOContext->satOrgIOContext;
10072 if (satOrgIOContext == agNULL)
10073 {
10074 TI_DBG4(("satReadBufferCB: satOrgIOContext is NULL, wrong\n"));
10075 return;
10076 }
10077 else
10078 {
10079 TI_DBG4(("satReadBufferCB: satOrgIOContext is NOT NULL\n"));
10080 }
10081 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10082 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10083
10084 pSense = satOrgIOContext->pSense;
10085
10086 /* SCSI command response payload to OS layer */
10087
10088 /* ATA command response payload */
10089
10090 }
10091
10092 tdIORequestBody->ioCompleted = agTRUE;
10093 tdIORequestBody->ioStarted = agFALSE;
10094
10095 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10096 {
10097 TI_DBG1(("satReadBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10098 ostiInitiatorIOCompleted (
10099 tiRoot,
10100 tiOrgIORequest,
10101 tiIOFailed,
10102 tiDetailOtherError,
10103 agNULL,
10104 satOrgIOContext->interruptContext
10105 );
10106 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10107
10108 satFreeIntIoResource( tiRoot,
10109 satDevData,
10110 satIntIo);
10111 return;
10112 }
10113
10114 if( agIOStatus != OSSA_IO_SUCCESS)
10115 {
10116 /* Process abort case */
10117 if (agIOStatus == OSSA_IO_ABORTED)
10118 {
10119 satProcessAbort(tiRoot,
10120 tiOrgIORequest,
10121 satOrgIOContext
10122 );
10123
10124 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10125
10126 satFreeIntIoResource( tiRoot,
10127 satDevData,
10128 satIntIo);
10129 return;
10130 }
10131 satSetSensePayload( pSense,
10132 SCSI_SNSKEY_NOT_READY,
10133 0,
10134 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10135 satOrgIOContext);
10136
10137 ostiInitiatorIOCompleted( tiRoot,
10138 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10139 tiIOSuccess,
10140 SCSI_STAT_CHECK_CONDITION,
10141 satOrgIOContext->pTiSenseData,
10142 satOrgIOContext->interruptContext );
10143
10144 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10145
10146 satFreeIntIoResource( tiRoot,
10147 satDevData,
10148 satIntIo);
10149 return;
10150 }
10151
10152 /* process success case */
10153 if (hostToDevFis->h.command == SAT_READ_BUFFER )
10154 {
10155
10156 ostiInitiatorIOCompleted( tiRoot,
10157 tiOrgIORequest,
10158 tiIOSuccess,
10159 SCSI_STAT_GOOD,
10160 agNULL,
10161 satOrgIOContext->interruptContext);
10162 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10163
10164 satFreeIntIoResource( tiRoot,
10165 satDevData,
10166 satIntIo);
10167 return;
10168 }
10169 else
10170 {
10171 TI_DBG1(("satReadBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10172 satSetSensePayload( pSense,
10173 SCSI_SNSKEY_NO_SENSE,
10174 0,
10175 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10176 satOrgIOContext);
10177
10178 ostiInitiatorIOCompleted( tiRoot,
10179 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10180 tiIOSuccess,
10181 SCSI_STAT_CHECK_CONDITION,
10182 satOrgIOContext->pTiSenseData,
10183 satOrgIOContext->interruptContext );
10184
10185 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10186
10187 satFreeIntIoResource( tiRoot,
10188 satDevData,
10189 satIntIo);
10190
10191 return;
10192 }
10193
10194 return;
10195 }
10196
10197 /*****************************************************************************
10198 *! \brief satWriteBufferCB
10199 *
10200 * This routine is a callback function called from ossaSATACompleted().
10201 * This CB routine deals with Write Buffer.
10202 *
10203 * \param agRoot: Handles for this instance of SAS/SATA hardware
10204 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10205 * \param agIOStatus: Status of completed I/O.
10206 * \param agSATAParm1: Additional info based on status.
10207 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10208 * length.
10209 * \param ioContext: Pointer to satIOContext_t.
10210 *
10211 * \return: none
10212 *
10213 *****************************************************************************/
10214 void satWriteBufferCB(
10215 agsaRoot_t *agRoot,
10216 agsaIORequest_t *agIORequest,
10217 bit32 agIOStatus,
10218 agsaFisHeader_t *agFirstDword,
10219 bit32 agIOInfoLen,
10220 agsaFrameHandle_t agFrameHandle,
10221 void *ioContext
10222 )
10223 {
10224 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10225 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10226 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10227 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10228 tdIORequestBody_t *tdIORequestBody;
10229 tdIORequestBody_t *tdOrgIORequestBody;
10230 satIOContext_t *satIOContext;
10231 satIOContext_t *satOrgIOContext;
10232 satInternalIo_t *satIntIo;
10233 satDeviceData_t *satDevData;
10234 scsiRspSense_t *pSense;
10235 tiIORequest_t *tiOrgIORequest;
10236 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
10237
10238 TI_DBG4(("satWriteBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10239
10240 /* internally generate tiIOContext */
10241 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10242 satIOContext = (satIOContext_t *) ioContext;
10243 satIntIo = satIOContext->satIntIoContext;
10244 satDevData = satIOContext->pSatDevData;
10245 hostToDevFis = satIOContext->pFis;
10246
10247
10248 if (satIntIo == agNULL)
10249 {
10250 TI_DBG4(("satWriteBufferCB: External satInternalIo_t satIntIoContext\n"));
10251 satOrgIOContext = satIOContext;
10252 tiOrgIORequest = tdIORequestBody->tiIORequest;
10253 pSense = satOrgIOContext->pSense;
10254 /* SCSI command response payload to OS layer */
10255
10256 /* ATA command response payload */
10257
10258 }
10259 else
10260 {
10261 TI_DBG4(("satWriteBufferCB: Internal satInternalIo_t satIntIoContext\n"));
10262 satOrgIOContext = satIOContext->satOrgIOContext;
10263 if (satOrgIOContext == agNULL)
10264 {
10265 TI_DBG4(("satWriteBufferCB: satOrgIOContext is NULL, wrong\n"));
10266 return;
10267 }
10268 else
10269 {
10270 TI_DBG4(("satWriteBufferCB: satOrgIOContext is NOT NULL\n"));
10271 }
10272 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10273 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10274
10275 pSense = satOrgIOContext->pSense;
10276 /* SCSI command response payload to OS layer */
10277
10278 /* ATA command response payload */
10279
10280 }
10281
10282 tdIORequestBody->ioCompleted = agTRUE;
10283 tdIORequestBody->ioStarted = agFALSE;
10284
10285 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10286 {
10287 TI_DBG1(("satWriteBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10288 ostiInitiatorIOCompleted (
10289 tiRoot,
10290 tiOrgIORequest,
10291 tiIOFailed,
10292 tiDetailOtherError,
10293 agNULL,
10294 satOrgIOContext->interruptContext
10295 );
10296 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10297
10298 satFreeIntIoResource( tiRoot,
10299 satDevData,
10300 satIntIo);
10301 return;
10302 }
10303
10304 if( agIOStatus != OSSA_IO_SUCCESS)
10305 {
10306 /* Process abort case */
10307 if (agIOStatus == OSSA_IO_ABORTED)
10308 {
10309 satProcessAbort(tiRoot,
10310 tiOrgIORequest,
10311 satOrgIOContext
10312 );
10313
10314 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10315
10316 satFreeIntIoResource( tiRoot,
10317 satDevData,
10318 satIntIo);
10319 return;
10320 }
10321 satSetSensePayload( pSense,
10322 SCSI_SNSKEY_NOT_READY,
10323 0,
10324 SCSI_SNSCODE_MEDIUM_NOT_PRESENT,
10325 satOrgIOContext);
10326
10327 ostiInitiatorIOCompleted( tiRoot,
10328 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10329 tiIOSuccess,
10330 SCSI_STAT_CHECK_CONDITION,
10331 satOrgIOContext->pTiSenseData,
10332 satOrgIOContext->interruptContext );
10333
10334 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10335
10336 satFreeIntIoResource( tiRoot,
10337 satDevData,
10338 satIntIo);
10339 return;
10340 }
10341 /* process success case */
10342 if (hostToDevFis->h.command == SAT_WRITE_BUFFER )
10343 {
10344
10345 ostiInitiatorIOCompleted( tiRoot,
10346 tiOrgIORequest,
10347 tiIOSuccess,
10348 SCSI_STAT_GOOD,
10349 agNULL,
10350 satOrgIOContext->interruptContext);
10351 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10352
10353 satFreeIntIoResource( tiRoot,
10354 satDevData,
10355 satIntIo);
10356 return;
10357 }
10358 else
10359 {
10360 TI_DBG1(("satWriteBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command));
10361 satSetSensePayload( pSense,
10362 SCSI_SNSKEY_NO_SENSE,
10363 0,
10364 SCSI_SNSCODE_NO_ADDITIONAL_INFO,
10365 satOrgIOContext);
10366
10367 ostiInitiatorIOCompleted( tiRoot,
10368 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10369 tiIOSuccess,
10370 SCSI_STAT_CHECK_CONDITION,
10371 satOrgIOContext->pTiSenseData,
10372 satOrgIOContext->interruptContext );
10373
10374 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10375
10376 satFreeIntIoResource( tiRoot,
10377 satDevData,
10378 satIntIo);
10379
10380 return;
10381 }
10382
10383 return;
10384 }
10385
10386 /*****************************************************************************
10387 *! \brief satReassignBlocksCB
10388 *
10389 * This routine is a callback function called from ossaSATACompleted().
10390 * This CB routine deals with Reassign Blocks.
10391 *
10392 * \param agRoot: Handles for this instance of SAS/SATA hardware
10393 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10394 * \param agIOStatus: Status of completed I/O.
10395 * \param agSATAParm1: Additional info based on status.
10396 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10397 * length.
10398 * \param ioContext: Pointer to satIOContext_t.
10399 *
10400 * \return: none
10401 *
10402 *****************************************************************************/
10403 void satReassignBlocksCB(
10404 agsaRoot_t *agRoot,
10405 agsaIORequest_t *agIORequest,
10406 bit32 agIOStatus,
10407 agsaFisHeader_t *agFirstDword,
10408 bit32 agIOInfoLen,
10409 agsaFrameHandle_t agFrameHandle,
10410 void *ioContext
10411 )
10412 {
10413 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10414 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10415 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10416 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10417 tdIORequestBody_t *tdIORequestBody;
10418 tdIORequestBody_t *tdOrgIORequestBody;
10419 satIOContext_t *satIOContext;
10420 satIOContext_t *satOrgIOContext;
10421 satIOContext_t *satNewIOContext;
10422 satInternalIo_t *satIntIo;
10423 satInternalIo_t *satNewIntIo = agNULL;
10424 satDeviceData_t *satDevData;
10425
10426 scsiRspSense_t *pSense;
10427 tiIniScsiCmnd_t *scsiCmnd;
10428 tiIORequest_t *tiOrgIORequest;
10429
10430 agsaFisRegHostToDevice_t *hostToDevFis = agNULL;
10431 bit32 ataStatus = 0;
10432 bit32 status;
10433 tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */
10434 agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL;
10435
10436 TI_DBG5(("satReassignBlocksCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen));
10437
10438 /* internally generate tiIOContext */
10439 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10440 satIOContext = (satIOContext_t *) ioContext;
10441 satIntIo = satIOContext->satIntIoContext;
10442 satDevData = satIOContext->pSatDevData;
10443 hostToDevFis = satIOContext->pFis;
10444
10445 if (satIntIo == agNULL)
10446 {
10447 TI_DBG4(("satReassignBlocksCB: External satInternalIo_t satIntIoContext\n"));
10448 satOrgIOContext = satIOContext;
10449 tiOrgIORequest = tdIORequestBody->tiIORequest;
10450 tiScsiRequest = satOrgIOContext->tiScsiXchg;
10451 pSense = satOrgIOContext->pSense;
10452 scsiCmnd = satOrgIOContext->pScsiCmnd;
10453 }
10454 else
10455 {
10456 TI_DBG4(("satReassignBlocksCB: Internal satInternalIo_t satIntIoContext\n"));
10457 satOrgIOContext = satIOContext->satOrgIOContext;
10458 if (satOrgIOContext == agNULL)
10459 {
10460 TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NULL, Wrong\n"));
10461 return;
10462 }
10463 else
10464 {
10465 TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NOT NULL, Wrong\n"));
10466 }
10467 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
10468 tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest;
10469
10470 tiScsiRequest = satOrgIOContext->tiScsiXchg;
10471 pSense = satOrgIOContext->pSense;
10472 scsiCmnd = satOrgIOContext->pScsiCmnd;
10473 }
10474
10475 tdIORequestBody->ioCompleted = agTRUE;
10476 tdIORequestBody->ioStarted = agFALSE;
10477
10478 if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS)
10479 {
10480 TI_DBG1(("satReassignBlocksCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus));
10481 ostiInitiatorIOCompleted (
10482 tiRoot,
10483 tiOrgIORequest,
10484 tiIOFailed,
10485 tiDetailOtherError,
10486 agNULL,
10487 satOrgIOContext->interruptContext
10488 );
10489 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10490
10491 satFreeIntIoResource( tiRoot,
10492 satDevData,
10493 satIntIo);
10494 return;
10495 }
10496
10497 if (agIOStatus != OSSA_IO_SUCCESS)
10498 {
10499 /* only agsaFisRegDeviceToHost_t is expected */
10500 statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H);
10501 ataStatus = statDevToHostFisHeader->status; /* ATA Status register */
10502 }
10503
10504 if (agIOStatus != OSSA_IO_SUCCESS)
10505 {
10506 if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) ||
10507 ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK))
10508 )
10509 {
10510 /* for debugging */
10511 if( agIOStatus != OSSA_IO_SUCCESS)
10512 {
10513 TI_DBG1(("satReassignBlocksCB FAILED, NOT IO_SUCCESS\n"));
10514 }
10515 else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS)
10516 {
10517 TI_DBG1(("satReassignBlocksCB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType));
10518 }
10519 else if ( (ataStatus & ERR_ATA_STATUS_MASK) ||
10520 (ataStatus & DF_ATA_STATUS_MASK)
10521 )
10522 {
10523 TI_DBG1(("satReassignBlocksCB FAILED, FAILED, error status\n"));
10524 }
10525
10526 /* Process abort case */
10527 if (agIOStatus == OSSA_IO_ABORTED)
10528 {
10529 satProcessAbort(tiRoot,
10530 tiOrgIORequest,
10531 satOrgIOContext
10532 );
10533
10534 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10535
10536 satFreeIntIoResource( tiRoot,
10537 satDevData,
10538 satIntIo);
10539 return;
10540 }
10541
10542 /* for debugging */
10543 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10544 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT
10545 )
10546 {
10547 TI_DBG1(("satReassignBlocksCB SAT_READ_VERIFY_SECTORS(_EXT) failed\n"));
10548 /* Verify failed; send Write with same LBA */
10549 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10550
10551 satFreeIntIoResource( tiRoot,
10552 satDevData,
10553 satIntIo);
10554
10555 satNewIntIo = satAllocIntIoResource( tiRoot,
10556 tiOrgIORequest,
10557 satDevData,
10558 512, /* writing 1 sector */
10559 satNewIntIo);
10560 if (satNewIntIo == agNULL)
10561 {
10562 /* memory allocation failure */
10563 satFreeIntIoResource( tiRoot,
10564 satDevData,
10565 satNewIntIo);
10566
10567 satSetSensePayload( pSense,
10568 SCSI_SNSKEY_HARDWARE_ERROR,
10569 0,
10570 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10571 satOrgIOContext);
10572
10573 ostiInitiatorIOCompleted( tiRoot,
10574 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10575 tiIOSuccess,
10576 SCSI_STAT_CHECK_CONDITION,
10577 satOrgIOContext->pTiSenseData,
10578 satOrgIOContext->interruptContext );
10579 TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10580 return;
10581 } /* end memory allocation */
10582
10583 satNewIOContext = satPrepareNewIO(
10584 satNewIntIo,
10585 tiOrgIORequest,
10586 satDevData,
10587 scsiCmnd,
10588 satOrgIOContext
10589 );
10590
10591 /* send Write with same LBA */
10592 status = satReassignBlocks_2(
10593 tiRoot,
10594 &satNewIntIo->satIntTiIORequest,
10595 satNewIOContext->ptiDeviceHandle,
10596 &satNewIntIo->satIntTiScsiXchg,
10597 satNewIOContext,
10598 satOrgIOContext->LBA
10599 );
10600
10601 if (status != tiSuccess)
10602 {
10603 /* sending ATA command fails */
10604 satFreeIntIoResource( tiRoot,
10605 satDevData,
10606 satNewIntIo);
10607 satSetSensePayload( pSense,
10608 SCSI_SNSKEY_HARDWARE_ERROR,
10609 0,
10610 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10611 satOrgIOContext);
10612
10613 ostiInitiatorIOCompleted( tiRoot,
10614 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10615 tiIOSuccess,
10616 SCSI_STAT_CHECK_CONDITION,
10617 satOrgIOContext->pTiSenseData,
10618 satOrgIOContext->interruptContext );
10619 TI_DBG1(("satReassignBlocksCB calling fail 1\n"));
10620 return;
10621 } /* end send fails */
10622
10623 return;
10624 }
10625 else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10626 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10627 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10628 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10629 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10630 )
10631 {
10632 TI_DBG1(("satReassignBlocksCB SAT_WRITE failed\n"));
10633 /* fall through */
10634 }
10635 else
10636 {
10637 TI_DBG1(("satReassignBlocksCB error default case unexpected command 0x%x\n", hostToDevFis->h.command));
10638 }
10639
10640
10641 satSetSensePayload( pSense,
10642 SCSI_SNSKEY_HARDWARE_ERROR,
10643 0,
10644 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10645 satOrgIOContext);
10646
10647 ostiInitiatorIOCompleted( tiRoot,
10648 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10649 tiIOSuccess,
10650 SCSI_STAT_CHECK_CONDITION,
10651 satOrgIOContext->pTiSenseData,
10652 satOrgIOContext->interruptContext );
10653
10654
10655 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10656
10657 satFreeIntIoResource( tiRoot,
10658 satDevData,
10659 satIntIo);
10660 return;
10661 } /* error checking */
10662 }
10663
10664
10665 /* prcessing the success case */
10666 if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS ||
10667 hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT ||
10668 hostToDevFis->h.command == SAT_WRITE_DMA ||
10669 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10670 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10671 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10672 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10673 )
10674 {
10675 /* next LBA; verify */
10676 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10677
10678 satFreeIntIoResource( tiRoot,
10679 satDevData,
10680 satIntIo);
10681
10682 if (satOrgIOContext->ParmIndex >= satOrgIOContext->ParmLen)
10683 {
10684 TI_DBG5(("satReassignBlocksCB: GOOD status\n"));
10685 /* return stat_good */
10686 ostiInitiatorIOCompleted( tiRoot,
10687 tiOrgIORequest,
10688 tiIOSuccess,
10689 SCSI_STAT_GOOD,
10690 agNULL,
10691 satOrgIOContext->interruptContext );
10692 return;
10693 }
10694 else
10695 {
10696 TI_DBG5(("satReassignBlocksCB: processing next LBA\n"));
10697 satNewIntIo = satAllocIntIoResource( tiRoot,
10698 tiOrgIORequest,
10699 satDevData,
10700 0,
10701 satNewIntIo);
10702 if (satNewIntIo == agNULL)
10703 {
10704 /* memory allocation failure */
10705 satFreeIntIoResource( tiRoot,
10706 satDevData,
10707 satNewIntIo);
10708
10709 satSetSensePayload( pSense,
10710 SCSI_SNSKEY_HARDWARE_ERROR,
10711 0,
10712 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10713 satOrgIOContext);
10714
10715 ostiInitiatorIOCompleted( tiRoot,
10716 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10717 tiIOSuccess,
10718 SCSI_STAT_CHECK_CONDITION,
10719 satOrgIOContext->pTiSenseData,
10720 satOrgIOContext->interruptContext );
10721 TI_DBG1(("satReassignBlocksCB: momory allocation fails\n"));
10722 return;
10723 } /* end memory allocation */
10724
10725 satNewIOContext = satPrepareNewIO(
10726 satNewIntIo,
10727 tiOrgIORequest,
10728 satDevData,
10729 scsiCmnd,
10730 satOrgIOContext
10731 );
10732
10733 /* send Verify with the next LBA */
10734 status = satReassignBlocks_1(
10735 tiRoot,
10736 &satNewIntIo->satIntTiIORequest,
10737 satNewIOContext->ptiDeviceHandle,
10738 tiScsiRequest, /* orginal from OS layer */
10739 satNewIOContext,
10740 satOrgIOContext
10741 );
10742
10743 if (status != tiSuccess)
10744 {
10745 /* sending ATA command fails */
10746 satFreeIntIoResource( tiRoot,
10747 satDevData,
10748 satNewIntIo);
10749 satSetSensePayload( pSense,
10750 SCSI_SNSKEY_HARDWARE_ERROR,
10751 0,
10752 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10753 satOrgIOContext);
10754
10755 ostiInitiatorIOCompleted( tiRoot,
10756 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10757 tiIOSuccess,
10758 SCSI_STAT_CHECK_CONDITION,
10759 satOrgIOContext->pTiSenseData,
10760 satOrgIOContext->interruptContext );
10761 TI_DBG1(("satReassignBlocksCB calling satModeSelect6_1 fails\n"));
10762 return;
10763 } /* end send fails */
10764 } /* else */
10765 return;
10766
10767 }
10768 else if (hostToDevFis->h.command == SAT_WRITE_DMA ||
10769 hostToDevFis->h.command == SAT_WRITE_SECTORS ||
10770 hostToDevFis->h.command == SAT_WRITE_DMA_EXT ||
10771 hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT ||
10772 hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED
10773 )
10774 {
10775 /* next LBA; verify */
10776 }
10777 else
10778 {
10779 TI_DBG1(("satReassignBlocksCB error unknown command success 0x%x \n", hostToDevFis->h.command));
10780
10781 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
10782
10783 satFreeIntIoResource( tiRoot,
10784 satDevData,
10785 satIntIo);
10786 satSetSensePayload( pSense,
10787 SCSI_SNSKEY_HARDWARE_ERROR,
10788 0,
10789 SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED,
10790 satOrgIOContext);
10791
10792 ostiInitiatorIOCompleted( tiRoot,
10793 tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */
10794 tiIOSuccess,
10795 SCSI_STAT_CHECK_CONDITION,
10796 satOrgIOContext->pTiSenseData,
10797 satOrgIOContext->interruptContext );
10798 return;
10799 }
10800 return;
10801 }
10802 /*****************************************************************************
10803 *! \brief satReadLogExtCB
10804 *
10805 * This routine is a callback function called from ossaSATACompleted().
10806 * This CB routine deals READ LOG EXT completion.
10807 *
10808 * \param agRoot: Handles for this instance of SAS/SATA hardware
10809 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10810 * \param agIOStatus: Status of completed I/O.
10811 * \param agFirstDword:Pointer to the four bytes of FIS.
10812 * \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
10813 * length.
10814 * \param agParam: Additional info based on status.
10815 * \param ioContext: Pointer to satIOContext_t.
10816 *
10817 * \return: none
10818 *
10819 *****************************************************************************/
10820 /*
10821 SATAII spec p42
10822
10823 */
10824 void satReadLogExtCB(
10825 agsaRoot_t *agRoot,
10826 agsaIORequest_t *agIORequest,
10827 bit32 agIOStatus,
10828 agsaFisHeader_t *agFirstDword,
10829 bit32 agIOInfoLen,
10830 void *agParam,
10831 void *ioContext
10832 )
10833
10834 {
10835
10836 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
10837 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
10838 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
10839 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
10840 tdIORequestBody_t *tdIORequestBody;
10841 satIOContext_t *satReadLogExtIOContext;
10842 satInternalIo_t *satIntIo;
10843 satDeviceData_t *satDevData;
10844 tdsaDeviceData_t *tdsaDeviceData;
10845 agsaIORequest_t *agAbortIORequest;
10846 tdIORequestBody_t *tdAbortIORequestBody;
10847 bit32 PhysUpper32;
10848 bit32 PhysLower32;
10849 bit32 memAllocStatus;
10850 void *osMemHandle;
10851
10852 TI_DBG1(("satReadLogExtCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n",
10853 agIORequest, agIOStatus, agIOInfoLen));
10854
10855 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
10856 satReadLogExtIOContext = (satIOContext_t *) ioContext;
10857 satIntIo = satReadLogExtIOContext->satIntIoContext;
10858 satDevData = satReadLogExtIOContext->pSatDevData;
10859 tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData;
10860
10861 TI_DBG1(("satReadLogExtCB: did %d\n", tdsaDeviceData->id));
10862 satDecrementPendingIO(tiRoot, tdsaAllShared, satReadLogExtIOContext);
10863
10864
10865 tdIORequestBody->ioCompleted = agTRUE;
10866 tdIORequestBody->ioStarted = agFALSE;
10867
10868 /*
10869 * If READ LOG EXT failed, we issue device reset.
10870 */
10871 if ( agIOStatus != OSSA_IO_SUCCESS ||
10872 (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0)
10873 )
10874 {
10875 TI_DBG1(("satReadLogExtCB: FAILED.\n"));
10876
10877 satFreeIntIoResource( tiRoot,
10878 satDevData,
10879 satIntIo);
10880 /* Abort I/O after completion of device reset */
10881 satDevData->satAbortAfterReset = agTRUE;
10882 #ifdef NOT_YET
10883 /* needs to investigate this case */
10884 /* no report to OS layer */
10885 satSubTM(tiRoot,
10886 satReadLogExtIOContext->ptiDeviceHandle,
10887 TD_INTERNAL_TM_RESET,
10888 agNULL,
10889 agNULL,
10890 agNULL,
10891 agFALSE);
10892 #endif
10893 return;
10894 }
10895
10896
10897 /***************************************************************************
10898 * The following steps take place when READ LOG EXT successfully completed.
10899 ***************************************************************************/
10900
10901 /************************************************************************
10902 *
10903 * 1. Issue abort to LL layer to all other pending I/Os for the same SATA
10904 * drive.
10905 *
10906 * 2. Free resource allocated for the internally generated READ LOG EXT.
10907 *
10908 * 3. At the completion of abort, in the context of ossaSATACompleted(),
10909 * return the I/O with error status to the OS-App Specific layer.
10910 * When all I/O aborts are completed, clear SATA device flag to
10911 * indicate ready to process new request.
10912 *
10913 ***********************************************************************/
10914
10915 /*
10916 * Issue abort to LL layer to all other pending I/Os for the same SATA drive
10917 */
10918 /*
10919 replace the single IO abort with device abort
10920 */
10921
10922 TI_DBG1(("satReadLogExtCB: issuing saSATAAbort. Device Abort\n"));
10923 /* do not deregister this device */
10924 tdsaDeviceData->OSAbortAll = agTRUE;
10925
10926 /* allocating agIORequest for abort itself */
10927 memAllocStatus = ostiAllocMemory(
10928 tiRoot,
10929 &osMemHandle,
10930 (void **)&tdAbortIORequestBody,
10931 &PhysUpper32,
10932 &PhysLower32,
10933 8,
10934 sizeof(tdIORequestBody_t),
10935 agTRUE
10936 );
10937
10938 if (memAllocStatus != tiSuccess)
10939 {
10940 /* let os process IO */
10941 TI_DBG1(("satReadLogExtCB: ostiAllocMemory failed...\n"));
10942 return;
10943 }
10944
10945 if (tdAbortIORequestBody == agNULL)
10946 {
10947 /* let os process IO */
10948 TI_DBG1(("satReadLogExtCB: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
10949 return;
10950 }
10951
10952 /* setup task management structure */
10953 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
10954 tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(tdsaDeviceData->tiDeviceHandle);
10955 /* initialize agIORequest */
10956 agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
10957 agAbortIORequest->osData = (void *) tdAbortIORequestBody;
10958 agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
10959
10960 /*
10961 * Issue abort
10962 */
10963 saSATAAbort( agRoot, agAbortIORequest, 0, tdsaDeviceData->agDevHandle, 1, agNULL, agNULL);
10964
10965
10966 /*
10967 * Free resource allocated for the internally generated READ LOG EXT.
10968 */
10969 satFreeIntIoResource( tiRoot,
10970 satDevData,
10971 satIntIo);
10972
10973 /*
10974 * Sequence of recovery continue at some other context:
10975 * At the completion of abort, in the context of ossaSATACompleted(),
10976 * return the I/O with error status to the OS-App Specific layer.
10977 * When all I/O aborts are completed, clear SATA device flag to
10978 * indicate ready to process new request.
10979 */
10980
10981 satDevData->satDriveState = SAT_DEV_STATE_NORMAL;
10982
10983 TI_DBG1(("satReadLogExtCB: end return\n"));
10984 return;
10985 }
10986
10987 #ifndef FDS_SM
10988 /*****************************************************************************
10989 *! \brief ossaSATAEvent
10990 *
10991 * This routine is called to notify the OS Layer of an event associated with
10992 * SATA port or SATA device
10993 *
10994 * \param agRoot: Handles for this instance of SAS/SATA hardware
10995 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
10996 * \param agPortContext Pointer to the port context of TD and Lower layer
10997 * \param agDevHandle: Pointer to a device handle
10998 * \param event: event type
10999 *
11000 * \return: none
11001 *
11002 *****************************************************************************/
11003 osGLOBAL void ossaSATAEvent(
11004 agsaRoot_t *agRoot,
11005 agsaIORequest_t *agIORequest,
11006 agsaPortContext_t *agPortContext,
11007 agsaDevHandle_t *agDevHandle,
11008 bit32 event,
11009 bit32 agIOInfoLen,
11010 void *agParam
11011 )
11012 {
11013
11014 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11015 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11016 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11017 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11018 bit32 interruptContext = osData->IntContext;
11019 tdsaDeviceData_t *pDeviceData;
11020 satDeviceData_t *pSatDevData;
11021 satInternalIo_t *satIntIo = agNULL;
11022 bit32 status;
11023 satIOContext_t *satIOContext2;
11024 tdIORequestBody_t *tdIORequestBody;
11025 tiDeviceHandle_t *tiDeviceHandle;
11026 tiIORequest_t tiIORequestTMP;
11027 agsaDifDetails_t agDifDetails;
11028 bit8 framePayload[256];
11029 bit16 frameOffset = 0;
11030 bit16 frameLen = 0;
11031
11032 /* new */
11033 tdsaDeviceData_t *tdsaDeviceData = agNULL;
11034 satIOContext_t *satIOContext;
11035 tdsaPortContext_t *onePortContext;
11036
11037 if (event == OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE)
11038 {
11039
11040 /**************************************************************************
11041 *
11042 * !!!! See Section 13.5.2.4 of SATA 2.5 specs. !!!!
11043 * !!!! If the NCQ error ends up here, it means that the device sent !!!!
11044 * !!!! Register Device To Host FIS (which does not have SActive !!!!
11045 * !!!! register) instead of Set Device Bit FIS (which has SActive !!!!
11046 * !!!! register). The routine osSatIOCompleted() deals with the case !!!!
11047 * !!!! where Set Device Bit FIS was sent by the device. !!!!
11048 *
11049 * For NCQ we need to issue READ LOG EXT command with log page 10h
11050 * to get the error and to allow other I/Os to continue.
11051 *
11052 * Here is the basic flow or sequence of error recovery, this sequence is
11053 * similar to the one described in SATA 2.5:
11054 *
11055 * 1. Set SATA device flag to indicate error condition and returning busy
11056 * for all new request.
11057 *
11058 * 2. Prepare READ LOG EXT page 10h command. Set flag to indicate that
11059 * the failed I/O has NOT been returned to the OS Layer. Send command.
11060 *
11061 * 3. When the device receives READ LOG EXT page 10h request all other
11062 * pending I/O are implicitly aborted. No completion (aborted) status
11063 * will be sent to the host for these aborted commands.
11064 *
11065 * 4. SATL receives the completion for READ LOG EXT command in
11066 * satReadLogExtCB(). Steps 5,6,7,8 below are the step 1,2,3,4 in
11067 * satReadLogExtCB().
11068 *
11069 * 5. Check flag that indicates whether the failed I/O has been returned
11070 * to the OS Layer. If not, search the I/O context in device data
11071 * looking for a matched tag. Then return the completion of the failed
11072 * NCQ command with the appopriate/trasnlated SCSI status.
11073 *
11074 * 6. Issue abort to LL layer to all other pending I/Os for the same SATA
11075 * drive.
11076 *
11077 * 7. Free resource allocated for the internally generated READ LOG EXT.
11078 *
11079 * 8. At the completion of abort, in the context of ossaSATACompleted(),
11080 * return the I/O with error status to the OS-App Specific layer.
11081 * When all I/O aborts are completed, clear SATA device flag to
11082 * indicate ready to process new request.
11083 *
11084 *************************************************************************/
11085
11086 pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11087 pSatDevData = &pDeviceData->satDevData;
11088 tiDeviceHandle = &((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->tiDeviceHandle;
11089
11090 TI_DBG1(("ossaSATAEvent: did %d\n", pDeviceData->id));
11091
11092 if (pSatDevData->satDriveState == SAT_DEV_STATE_NORMAL)
11093 {
11094 TI_DBG1(("ossaSATAEvent: NCQ ERROR agDevHandle=%p.\n", agDevHandle ));
11095
11096 /* Set flag to indicate we are in recovery */
11097 pSatDevData->satDriveState = SAT_DEV_STATE_IN_RECOVERY;
11098
11099 /*
11100 * Allocate resource for READ LOG EXIT page 10h
11101 */
11102 satIntIo = satAllocIntIoResource( tiRoot,
11103 &(tiIORequestTMP), /* anything but NULL */
11104 pSatDevData,
11105 sizeof (satReadLogExtPage10h_t),
11106 satIntIo);
11107
11108 /*
11109 * If we cannot allocate resource to do the normal NCQ recovery, we
11110 * will do SATA device reset.
11111 */
11112 if (satIntIo == agNULL)
11113 {
11114 /* Abort I/O after completion of device reset */
11115 pSatDevData->satAbortAfterReset = agTRUE;
11116 TI_DBG1(("ossaSATAEvent: can't send RLE due to resource lack\n"));
11117
11118 #ifdef NOT_YET
11119 /* needs to investigate this case */
11120 /* no report to OS layer */
11121 satSubTM(tiRoot,
11122 tiDeviceHandle,
11123 TD_INTERNAL_TM_RESET,
11124 agNULL,
11125 agNULL,
11126 agNULL,
11127 agFALSE);
11128 #endif
11129
11130 return;
11131 }
11132
11133
11134 /*
11135 * Clear flag to indicate that the failed I/O has NOT been returned to the
11136 * OS-App specific Layer.
11137 */
11138 satIntIo->satIntFlag = 0;
11139
11140 /* compare to satPrepareNewIO() */
11141 /* Send READ LOG EXIT page 10h command */
11142
11143 /*
11144 * Need to initialize all the fields within satIOContext except
11145 * reqType and satCompleteCB which will be set depending on cmd.
11146 */
11147
11148 tdIORequestBody = (tdIORequestBody_t *)satIntIo->satIntRequestBody;
11149 satIOContext2 = &(tdIORequestBody->transport.SATA.satIOContext);
11150
11151 satIOContext2->pSatDevData = pSatDevData;
11152 satIOContext2->pFis = &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev);
11153 satIOContext2->pScsiCmnd = &(satIntIo->satIntTiScsiXchg.scsiCmnd);
11154 satIOContext2->pSense = &(tdIORequestBody->transport.SATA.sensePayload);
11155 satIOContext2->pTiSenseData = &(tdIORequestBody->transport.SATA.tiSenseData);
11156 satIOContext2->pTiSenseData->senseData = satIOContext2->pSense;
11157
11158 satIOContext2->tiRequestBody = satIntIo->satIntRequestBody;
11159 satIOContext2->interruptContext = interruptContext;
11160 satIOContext2->satIntIoContext = satIntIo;
11161
11162 satIOContext2->ptiDeviceHandle = tiDeviceHandle;
11163 satIOContext2->satOrgIOContext = agNULL;
11164 satIOContext2->tiScsiXchg = agNULL;
11165
11166 status = satSendReadLogExt( tiRoot,
11167 &satIntIo->satIntTiIORequest,
11168 tiDeviceHandle,
11169 &satIntIo->satIntTiScsiXchg,
11170 satIOContext2);
11171
11172 if (status !=tiSuccess)
11173 {
11174 TI_DBG1(("ossaSATAEvent: can't send RLE due to LL api failure\n"));
11175 satFreeIntIoResource( tiRoot,
11176 pSatDevData,
11177 satIntIo);
11178 /* Abort I/O after completion of device reset */
11179 pSatDevData->satAbortAfterReset = agTRUE;
11180 #ifdef NOT_YET
11181 /* needs to investigate this case */
11182 /* no report to OS layer */
11183 satSubTM(tiRoot,
11184 tiDeviceHandle,
11185 TD_INTERNAL_TM_RESET,
11186 agNULL,
11187 agNULL,
11188 agNULL,
11189 agFALSE);
11190 #endif
11191
11192 return;
11193 }
11194 }
11195 else
11196 {
11197 TI_DBG1(("ossaSATAEvent: NCQ ERROR but recovery in progress\n"));
11198 }
11199
11200 }
11201 else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
11202 {
11203 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
11204 }
11205 else if (event == OSSA_IO_XFER_PIO_SETUP_ERROR)
11206 {
11207 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR\n"));
11208
11209 }
11210 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
11211 {
11212 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
11213 }
11214 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
11215 {
11216 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
11217 }
11218 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
11219 {
11220 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
11221 }
11222 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
11223 {
11224 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
11225 }
11226 else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
11227 {
11228 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
11229 }
11230 else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
11231 {
11232 TI_DBG1(("ossaSATAEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
11233 }
11234 else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
11235 event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
11236 {
11237 TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event));
11238 /* process DIF detail information */
11239 TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen));
11240 if (agParam == agNULL)
11241 {
11242 TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
11243 return;
11244 }
11245 if (agIOInfoLen < sizeof(agsaDifDetails_t))
11246 {
11247 TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, sizeof(agsaDifDetails_t)));
11248 return;
11249 }
11250 /* reads agsaDifDetails_t */
11251 saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
11252 frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
11253 frameLen = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16;
11254
11255 TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
11256 TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
11257 TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo)));
11258 TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n",
11259 (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
11260 if (frameLen != 0 && frameLen <= 256)
11261 {
11262 saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
11263 tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
11264 }
11265 }
11266 else
11267 {
11268 TI_DBG1(("ossaSATAEvent: ERROR event %d agDevHandle=%p.\n", event, agDevHandle ));
11269
11270 tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11271 satIOContext = &(tdIORequestBody->transport.SATA.satIOContext);
11272 pSatDevData = satIOContext->pSatDevData;
11273 tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData;
11274 onePortContext = tdsaDeviceData->tdPortContext;
11275 TI_DBG1(("ossaSATAEvent: did %d\n", tdsaDeviceData->id));
11276
11277 /* send SMP_PHY_CONTROL_HARD_RESET */
11278 if (event == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA)
11279 {
11280 if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
11281 {
11282 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
11283 pSatDevData->NumOfFCA++;
11284 tdsaPhyControlSend(tiRoot,
11285 tdsaDeviceData,
11286 SMP_PHY_CONTROL_HARD_RESET,
11287 agNULL);
11288 }
11289 else
11290 {
11291 /* given up after one time of SMP HARD RESET; */
11292 TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n"));
11293 if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0)
11294 {
11295 /*
11296 1. remove this device
11297 2. device removal event
11298 */
11299 tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData);
11300 tdsaDeviceData->valid = agFALSE;
11301 tdsaDeviceData->valid2 = agFALSE;
11302 tdsaDeviceData->registered = agFALSE;
11303 ostiInitiatorEvent(
11304 tiRoot,
11305 onePortContext->tiPortalContext,
11306 agNULL,
11307 tiIntrEventTypeDeviceChange,
11308 tiDeviceRemoval,
11309 agNULL
11310 );
11311 }
11312 }
11313 }
11314
11315 }
11316 }
11317 #endif /* FDS_SM */
11318
11319 /*****************************************************************************
11320 *! \brief itdsatErrorSATAEventHandle
11321 *
11322 * This routine is called to handle SATA error event
11323 *
11324 * \param agRoot: Handles for this instance of SAS/SATA hardware
11325 * \param agIORequest: Pointer to the LL I/O request context for this I/O.
11326 * \param agPortContext Pointer to the port context of TD and Lower layer
11327 * \param agDevHandle: Pointer to a device handle
11328 * \param event: event type
11329 * \param ioContext: Pointer to satIOContext_t
11330 *
11331 * \return: none
11332 *
11333 *****************************************************************************/
11334 osGLOBAL void itdsatErrorSATAEventHandle(
11335 agsaRoot_t *agRoot,
11336 agsaIORequest_t *agIORequest,
11337 agsaPortContext_t *agPortContext,
11338 agsaDevHandle_t *agDevHandle,
11339 bit32 event,
11340 satIOContext_t *ioContext
11341 )
11342 {
11343 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11344 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11345 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
11346 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
11347 tdIORequestBody_t *tdOrgIORequestBody;
11348 satIOContext_t *satIOContext;
11349 satIOContext_t *satOrgIOContext;
11350 satInternalIo_t *satIntIo;
11351 satDeviceData_t *satDevData;
11352 bit32 interruptContext = osData->IntContext;
11353
11354 TI_DBG1(("itdsatErrorSATAEventHandle: start\n"));
11355 satIOContext = (satIOContext_t *) ioContext;
11356 satIntIo = satIOContext->satIntIoContext;
11357 satDevData = satIOContext->pSatDevData;
11358
11359
11360 TI_DBG1(("itdsatErrorSATAEventHandle: event 0x%x\n", event));
11361
11362 if (satIntIo == agNULL)
11363 {
11364 TI_DBG1(("itdsatErrorSATAEventHandle: External, OS generated\n"));
11365 satOrgIOContext = satIOContext;
11366 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11367
11368 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11369
11370 satFreeIntIoResource( tiRoot,
11371 satDevData,
11372 satIntIo);
11373
11374 if (event == OSSA_IO_OVERFLOW)
11375 {
11376 TI_DBG1(("itdsatErrorSATAEventHandle: tiIOOverRun\n"));
11377 ostiInitiatorIOCompleted( tiRoot,
11378 tdOrgIORequestBody->tiIORequest,
11379 tiIOOverRun,
11380 0,
11381 agNULL,
11382 interruptContext);
11383 }
11384 else
11385 {
11386 TI_DBG1(("itdsatErrorSATAEventHandle: else\n"));
11387 ostiInitiatorIOCompleted( tiRoot,
11388 tdOrgIORequestBody->tiIORequest,
11389 tiIOFailed,
11390 tiDetailOtherError,
11391 agNULL,
11392 interruptContext);
11393 }
11394 }
11395 else
11396 {
11397 TI_DBG1(("itdsatErrorSATAEventHandle: Internal, TD generated\n"));
11398 satOrgIOContext = satIOContext->satOrgIOContext;
11399 if (satOrgIOContext == agNULL)
11400 {
11401 TI_DBG1(("itdsatErrorSATAEventHandle: satOrgIOContext is NULL, wrong\n"));
11402 return;
11403 }
11404 else
11405 {
11406 TI_DBG6(("itdsatErrorSATAEventHandle: satOrgIOContext is NOT NULL\n"));
11407 }
11408 tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody;
11409 satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext);
11410
11411 satFreeIntIoResource( tiRoot,
11412 satDevData,
11413 satIntIo);
11414
11415 /* clean up TD layer's IORequestBody */
11416 ostiFreeMemory(
11417 tiRoot,
11418 tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11419 sizeof(tdIORequestBody_t)
11420 );
11421
11422 }
11423 return;
11424 }
11425
11426 osGLOBAL void ossaSATAAbortCB(
11427 agsaRoot_t *agRoot,
11428 agsaIORequest_t *agIORequest,
11429 bit32 flag,
11430 bit32 status)
11431 {
11432 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11433 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11434 tdIORequestBody_t *tdAbortIORequestBody = agNULL;
11435 tdsaDeviceData_t *oneDeviceData = agNULL;
11436 tiDeviceHandle_t *tiDeviceHandle = agNULL;
11437 tiIORequest_t *taskTag = agNULL;
11438
11439 TI_DBG1(("ossaSATAAbortCB: start\n"));
11440
11441 tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
11442 if (tdAbortIORequestBody == agNULL)
11443 {
11444 TI_DBG1(("ossaSATAAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
11445 return;
11446 }
11447
11448 if (flag == 2)
11449 {
11450 /* abort per port */
11451 TI_DBG1(("ossaSATAAbortCB: abort per port\n"));
11452 }
11453 else if (flag == 1)
11454 {
11455 TI_DBG1(("ossaSATAAbortCB: abort all\n"));
11456 tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
11457 if (tiDeviceHandle == agNULL)
11458 {
11459 TI_DBG1(("ossaSATAAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
11460 ostiFreeMemory(
11461 tiRoot,
11462 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11463 sizeof(tdIORequestBody_t)
11464 );
11465 return;
11466 }
11467
11468 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
11469 if (oneDeviceData == agNULL)
11470 {
11471 TI_DBG1(("ossaSATAAbortCB: oneDeviceData is NULL warning!!!!\n"));
11472 ostiFreeMemory(
11473 tiRoot,
11474 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11475 sizeof(tdIORequestBody_t)
11476 );
11477 return;
11478 }
11479
11480 if (status == OSSA_IO_SUCCESS)
11481 {
11482 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11483 /* clean up TD layer's IORequestBody */
11484 if (oneDeviceData->OSAbortAll == agTRUE)
11485 {
11486 oneDeviceData->OSAbortAll = agFALSE;
11487 ostiInitiatorEvent( tiRoot,
11488 agNULL,
11489 tiDeviceHandle,
11490 tiIntrEventTypeLocalAbort,
11491 tiAbortOK,
11492 agNULL);
11493 }
11494 else
11495 {
11496 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11497 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11498 }
11499 /* callback to OS layer here ??? */
11500 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11501 ostiFreeMemory(
11502 tiRoot,
11503 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11504 sizeof(tdIORequestBody_t)
11505 );
11506
11507 }
11508 else if (status == OSSA_IO_NOT_VALID)
11509 {
11510 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11511 /*
11512 Nothing is reproted to OS layer
11513 */
11514 if (oneDeviceData->OSAbortAll == agTRUE)
11515 {
11516 oneDeviceData->OSAbortAll = agFALSE;
11517 ostiInitiatorEvent( tiRoot,
11518 agNULL,
11519 tiDeviceHandle,
11520 tiIntrEventTypeLocalAbort,
11521 tiAbortFailed,
11522 agNULL );
11523 }
11524 else
11525 {
11526 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11527 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11528 }
11529 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11530 ostiFreeMemory(
11531 tiRoot,
11532 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11533 sizeof(tdIORequestBody_t)
11534 );
11535 }
11536 else if (status == OSSA_IO_NO_DEVICE)
11537 {
11538 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11539 /*
11540 Nothing is reproted to OS layer
11541 */
11542 if (oneDeviceData->OSAbortAll == agTRUE)
11543 {
11544 oneDeviceData->OSAbortAll = agFALSE;
11545 ostiInitiatorEvent( tiRoot,
11546 agNULL,
11547 tiDeviceHandle,
11548 tiIntrEventTypeLocalAbort,
11549 tiAbortInProgress,
11550 agNULL );
11551 }
11552 else
11553 {
11554 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11555 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11556 }
11557 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11558 ostiFreeMemory(
11559 tiRoot,
11560 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11561 sizeof(tdIORequestBody_t)
11562 );
11563 }
11564 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11565 {
11566 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11567 /*
11568 Nothing is reproted to OS layer
11569 */
11570 if (oneDeviceData->OSAbortAll == agTRUE)
11571 {
11572 oneDeviceData->OSAbortAll = agFALSE;
11573 ostiInitiatorEvent( tiRoot,
11574 agNULL,
11575 tiDeviceHandle,
11576 tiIntrEventTypeLocalAbort,
11577 tiAbortInProgress,
11578 agNULL );
11579 }
11580 else
11581 {
11582 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11583 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11584 }
11585 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11586 ostiFreeMemory(
11587 tiRoot,
11588 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11589 sizeof(tdIORequestBody_t)
11590 );
11591 }
11592 else
11593 {
11594 TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11595 /*
11596 Nothing is reproted to OS layer
11597 */
11598 if (oneDeviceData->OSAbortAll == agTRUE)
11599 {
11600 oneDeviceData->OSAbortAll = agFALSE;
11601 ostiInitiatorEvent( tiRoot,
11602 agNULL,
11603 tiDeviceHandle,
11604 tiIntrEventTypeLocalAbort,
11605 tiAbortInProgress,
11606 agNULL );
11607 }
11608 else
11609 {
11610 TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id));
11611 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
11612 }
11613 TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id));
11614 ostiFreeMemory(
11615 tiRoot,
11616 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11617 sizeof(tdIORequestBody_t)
11618 );
11619 }
11620 }
11621 else if (flag == 0)
11622 {
11623 TI_DBG1(("ossaSATAAbortCB: abort one\n"));
11624 taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
11625
11626 if (status == OSSA_IO_SUCCESS)
11627 {
11628 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n"));
11629
11630 ostiInitiatorEvent( tiRoot,
11631 agNULL,
11632 agNULL,
11633 tiIntrEventTypeLocalAbort,
11634 tiAbortOK,
11635 taskTag );
11636 ostiFreeMemory(
11637 tiRoot,
11638 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11639 sizeof(tdIORequestBody_t)
11640 );
11641
11642 }
11643 else if (status == OSSA_IO_NOT_VALID)
11644 {
11645 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n"));
11646
11647 ostiInitiatorEvent( tiRoot,
11648 agNULL,
11649 agNULL,
11650 tiIntrEventTypeLocalAbort,
11651 tiAbortFailed,
11652 taskTag );
11653
11654 ostiFreeMemory(
11655 tiRoot,
11656 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11657 sizeof(tdIORequestBody_t)
11658 );
11659 }
11660 else if (status == OSSA_IO_NO_DEVICE)
11661 {
11662 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n"));
11663
11664 ostiInitiatorEvent( tiRoot,
11665 agNULL,
11666 agNULL,
11667 tiIntrEventTypeLocalAbort,
11668 tiAbortInProgress,
11669 taskTag );
11670
11671 ostiFreeMemory(
11672 tiRoot,
11673 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11674 sizeof(tdIORequestBody_t)
11675 );
11676 }
11677 else if (status == OSSA_IO_ABORT_IN_PROGRESS)
11678 {
11679 TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
11680
11681 ostiInitiatorEvent( tiRoot,
11682 agNULL,
11683 agNULL,
11684 tiIntrEventTypeLocalAbort,
11685 tiAbortInProgress,
11686 taskTag );
11687
11688 ostiFreeMemory(
11689 tiRoot,
11690 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11691 sizeof(tdIORequestBody_t)
11692 );
11693 }
11694 else
11695 {
11696 TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status ));
11697
11698 ostiInitiatorEvent( tiRoot,
11699 agNULL,
11700 agNULL,
11701 tiIntrEventTypeLocalAbort,
11702 tiAbortFailed,
11703 taskTag );
11704
11705 ostiFreeMemory(
11706 tiRoot,
11707 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
11708 sizeof(tdIORequestBody_t)
11709 );
11710 }
11711 }
11712 else
11713 {
11714 TI_DBG1(("ossaSATAAbortCB: wrong flag %d\n", flag));
11715 }
11716 return;
11717 }
11718
11719 /*****************************************************************************
11720 *! \brief ossaSATADeviceResetCB
11721 *
11722 * This routine is called to complete a SATA device reset request previously
11723 * issued to the LL Layer in saSATADeviceReset().
11724 *
11725 * \param agRoot: Handles for this instance of SAS/SATA hardware
11726 * \param agDevHandle: Pointer to a device handle
11727 * \param resetStatus: Reset status:
11728 * OSSA_SUCCESS: The reset operation completed successfully.
11729 * OSSA_FAILURE: The reset operation failed.
11730 * \param resetparm: Pointer to the Device-To-Host FIS received from the device.
11731 *
11732 * \return: none
11733 *
11734 *****************************************************************************/
11735 osGLOBAL void
11736 ossaSATADeviceResetCB(
11737 agsaRoot_t *agRoot,
11738 agsaDevHandle_t *agDevHandle,
11739 bit32 resetStatus,
11740 void *resetparm)
11741 {
11742 bit32 tiResetStatus;
11743 tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
11744 tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
11745 tdsaDeviceData_t *pDeviceData;
11746 tiDeviceHandle_t *tiDeviceHandle;
11747
11748 TI_DBG1(("ossaSATADeviceResetCB: agDevHandle=%p resetStatus=0x%x\n",
11749 agDevHandle, resetStatus ));
11750
11751 pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
11752 tiDeviceHandle = &(pDeviceData->tiDeviceHandle);
11753
11754 if (resetStatus == OSSA_SUCCESS )
11755 tiResetStatus = tiSuccess;
11756 else
11757 tiResetStatus = tiError;
11758
11759 osSatResetCB( tiRoot,
11760 tiDeviceHandle,
11761 tiResetStatus,
11762 resetparm);
11763
11764 }
11765
11766
11767 /*****************************************************************************/
11768 /*! \brief satDecrementPendingIO
11769 *
11770 * This function decrements the number of pending IO's
11771 *
11772 * \param tiRoot: Pointer to TISA initiator driver/port instance.
11773 * \param tdsaAllShared: Pointer to TD context.
11774 * \param satIOContext_t: Pointer to the SAT IO Context
11775 *
11776 * \return
11777 * None
11778 */
11779 /*****************************************************************************/
11780 GLOBAL void
11781 satDecrementPendingIO(
11782 tiRoot_t *tiRoot,
11783 tdsaContext_t *tdsaAllShared,
11784 satIOContext_t *satIOContext
11785 )
11786 {
11787 satDeviceData_t *satDevData;
11788
11789 TI_DBG4(("satDecrementPendingIO: start\n"));
11790
11791 satDevData = satIOContext->pSatDevData;
11792
11793 if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) ||
11794 (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) )
11795 {
11796 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11797 satDevData->satPendingNCQIO--;
11798 satIOContext->pSatDevData->satPendingIO--;
11799 TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11800 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11801 }
11802 else
11803 {
11804 tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK);
11805 satDevData->satPendingNONNCQIO--;
11806 satIOContext->pSatDevData->satPendingIO--;
11807 TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink);
11808 tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK);
11809 }
11810
11811 return;
11812 }
11813
11814 GLOBAL void
11815 satTranslateATAPIErrorsToSCSIErrors(
11816 bit8 bCommand,
11817 bit8 bATAStatus,
11818 bit8 bATAError,
11819 bit8 *pSenseKey,
11820 bit16 *pSenseCodeInfo
11821 )
11822 {
11823 if (pSenseKey == agNULL || pSenseCodeInfo == agNULL)
11824 {
11825 TI_DBG0(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n"));
11826 return;
11827 }
11828
11829 if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & NM_ATA_ERROR_MASK))
11830 {
11831 *pSenseKey = SCSI_SNSKEY_NOT_READY;
11832 *pSenseCodeInfo = 0x3a00;
11833 }
11834 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ABRT_ATA_ERROR_MASK))
11835 {
11836 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11837 *pSenseCodeInfo = 0;
11838 }
11839 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MCR_ATA_ERROR_MASK))
11840 {
11841 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11842 *pSenseCodeInfo = 0x5a01;
11843 }
11844 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & IDNF_ATA_ERROR_MASK))
11845 {
11846 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11847 *pSenseCodeInfo = 0x1401;
11848 }
11849 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MC_ATA_ERROR_MASK))
11850 {
11851 *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION;
11852 *pSenseCodeInfo = 0x2800;
11853 }
11854 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & UNC_ATA_ERROR_MASK))
11855 {
11856 /*READ*/
11857 *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR;
11858 *pSenseCodeInfo = 0x1100;
11859
11860 /*add WRITE here */
11861 }
11862 else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ICRC_ATA_ERROR_MASK))
11863 {
11864 *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND;
11865 *pSenseCodeInfo = 0x4703;
11866 }
11867 else if((bATAStatus & DF_ATA_STATUS_MASK))
11868 {
11869 *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR;
11870 *pSenseCodeInfo = 0x4400;
11871 }
11872 else
11873 {
11874 TI_DBG0(("unhandled ata error: bATAStatus = 0x%x, bATAError = 0x%x\n",
11875 bATAStatus, bATAError));
11876 }
11877
11878 }
11879
11880 #endif /* #ifdef SATA_ENABLE */
11881
Cache object: 8b4b31ecaf9552147792d57d69bb3fe5
|